问题描述
我将CPLEX 12.9与Python结合使用来解决MILP(混合整数线性问题)。 我尝试了两种方法;我期望得到相同的结果,但是尽管第一种方法可行,但是第二种却没有。
1)第一种方法:
此方法成功。在生成的“ .lp”文件(包含问题的人类可读表达的文本文件:必须最小化目标函数和某些约束)的情况下,可以看到x6,x7,x8,x9,x10,x11
是{{1 }}变量,它们都等于continuous
(我定义了它们的500
和upper
的边界都等于lower
,因此它们实际上是常量)。>
2)第二种方法:
它返回500
,因此CPLEX无法找到解决方案,但我不明白为什么。
我唯一更改的是:
- 我将
CPLEX Error 1217: No solution exists
设置为x6,x11
变量; - 对于每个对象,我都定义了
binary
的边界等于lower
和0
的边界等于upper
。
因此,生成的“ .lp”文件与使用第一种方法生成的文件非常相似。唯一不同的是:
-
500
被定义为范围(而不是常量),因此它们是:x6,x11
-
0 <= x6 <= 500 0 <= x7 <= 500 0 <= x8 <= 500 0 <= x9 <= 500 0 <= x10 <= 500 0 <= x11 <= 500
部分(在“ .lp”文件的末尾)现在也包含Binaries
变量。
注意:
即使(在第二种方法中)我将x6,x11
和lower
的边界都设置为等于upper
,问题仍然存在。
解决方法
如果使用二进制,则意味着即使以后添加一些限制,该变量应小于500,决策变量将为0或1。
如果您希望决策变量允许使用500作为值,则应使用float或integer作为类型。
如果我使用zoo example并将整数更改为二进制:
setState
给予:
from docplex.mp.model import Model
mdl = Model(name='buses')
nbbus40 = mdl.binary_var(name='nbBus40')
nbbus30 = mdl.binary_var(name='nbBus30')
mdl.add_constraint(nbbus40*40 + nbbus30*30 >= 300,'kids')
mdl.minimize(nbbus40*500 + nbbus30*400)
mdl.solve()
print(mdl.solve_details.status)