我使用CPLEX 12.9和Python来解决MILP(混合整数线性问题(。我尝试了两种方法;我预计会有同样的结果,但尽管第一种方法有效,但第二种方法无效。
1(第一种方法:
此方法成功运行。在生成的";。lp";文件(一个包含人类可读的问题公式的文本文件:有一个必须最小化的目标函数和一些约束(可以看出,x6, x7, x8, x9, x10, x11
是continuous
变量,并且它们都等于500
(我将它们的upper
和lower
边界都定义为等于500
;所以它们实际上是常数(。
2(第二种方法:
它返回CPLEX Error 1217: No solution exists
,所以CPLEX无法找到解决方案,但我不明白为什么。
我唯一改变的是:
- 我将
x6, x7, x8, x9, x10, x11
设置为binary
变量 - 对于它们中的每一个,我定义了等于
0
的lower
界和等于500
的upper
界
因此,生成的";。lp";文件与使用第一种方法生成的文件非常相似;唯一不同的是:
-
x6, x7, x8, x9, x10, x11
被定义为范围(而不是常数(,因此它们是:0 <= x6 <= 500 0 <= x7 <= 500 0 <= x8 <= 500 0 <= x9 <= 500 0 <= x10 <= 500 0 <= x11 <= 500
-
Binaries
部分(在".lp"文件的末尾(现在也包含x6, x7, x8, x9, x10, x11
变量。
注意:即使(在第二种方法中(我将lower
和upper
的边界都设置为等于500
,问题也会持续存在。
如果使用二进制,则意味着决策变量将为0或1,即使后来添加了一些约束,该约束也应小于500。
如果您希望您的决策变量允许500作为值,则应该使用float或integer作为类型。
如果我使用zoo示例并将整数更改为二进制:
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)
给出:
integer infeasible