我在解决gurobi的一个简单问题时遇到了问题:
e^x+x=lnP
x=1
在Gurobpy中,它转换为以下形式:
x+y=temp
y=e^x
lnP=temp
x=1
结果如下:
Variable X
x 1
P 749.103
y 2.71828
Temp 3.71828
代码如下:
from gurobipy import *
model = Model('Antoine')
P = model.addVar(vtype=GRB.CONTINUOUS, name='P',lb=0)
x = model.addVar(vtype=GRB.CONTINUOUS, name='x',lb=0)
y = model.addVar(vtype=GRB.CONTINUOUS, name='y',lb=-GRB.INFINITY)
temp = model.addVar(vtype=GRB.CONTINUOUS, name='Temp1',lb=-GRB.INFINITY)
model.addConstr(x == 1)
model.addGenConstrExp(x,y)
model.addConstr(x+y == temp)
model.addGenConstrLog(P,temp)
model.setObjective(P, GRB.MINIMIZE)
model.write("test.lp")
model.optimize()
我不知道为什么p的结果是错误的
Gurobi通过分段线性近似表示非线性函数。当我使用Gurobi Optimizer 9.5.2在计算机上求解原始模型时,我会收到以下警告:
Warning: max constraint violation (2.9006e+00) exceeds tolerance
Warning: max general constraint violation (2.9006e+00) exceeds tolerance
Piecewise linearization of function constraints often causes big violation.
Try to adjust the settings of the related parameters, such as FuncPieces.
这意味着默认的自动线性化对于该模型来说不够精确。如警告消息中所建议的,调整FuncPieces参数以获得此模型的更准确表示。例如,在我的计算机上使用model.Params.FuncPieces=-1
,我得到了更准确的结果:
Variable X
-------------------------
P 41.29
x 1
y 2.71828
Temp1 3.71828