【发布时间】:2021-11-23 17:10:46
【问题描述】:
我无法理解为什么下面的代码没有产生最佳结果。我正在尝试创建一个阶跃函数,但这显然不能作为模型的解决方案值。Z 不是指定的范围点之一。
非常感谢任何有助于理解/纠正此问题的帮助。
我要做什么
最大化Z * X,受制于:
/ 20.5 , X <= 5
Z(X) = | 10 , 5 <= X <= 10
\ 9 , 10 <= X <= 11
更好的是,我想在以下条件下求解(断点不相交):
/ 20.5 , X <= 5
Z(X) = | 10 , 5 < X <= 10
\ 9 , 10 < X <= 11
其中X 和Z 是浮点数。
我希望 X 是 5 和 Z 是 20.5,但是模型结果是 7.37 和 15.53。
代码
from pyomo.core import *
# Break points for step-function
DOMAIN_PTS = [5., 10., 11.]
RANGE_PTS = [20.5, 10., 9.]
# Define model and variables
model = ConcreteModel()
model.X = Var(bounds=(5,11))
model.Z = Var()
# Set piecewise constraint
model.con = Piecewise(model.Z,model.X,
pw_pts=DOMAIN_PTS ,
pw_constr_type='EQ',
f_rule=RANGE_PTS,
force_pw=True,
pw_repn='SOS2')
model.obj = Objective(expr= model.Z * model.X, sense=maximize)
opt = SolverFactory('gurobi')
opt.options['NonConvex'] = 2
obj_val = opt.solve(model)
print(value(model.X))
print(value(model.Z))
print(model.obj())
【问题讨论】:
-
正如 pybegginer 的回答已经提到的那样,您想要建模分段常数函数,而不是分段线性函数。有关建模技巧,请参阅 here。