我使用gurobopy来解决一个简单的问题,但在添加包含指数项的约束并求解后,我得到了错误的结果



我在解决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 

最新更新