如果我使用二进制可分配对象,则 CPLEX 找不到解决方案



我使用CPLEX 12.9和Python来解决MILP(混合整数线性问题(。我尝试了两种方法;我预计会有同样的结果,但尽管第一种方法有效,但第二种方法无效。

1(第一种方法:

此方法成功运行。在生成的";。lp";文件(一个包含人类可读的问题公式的文本文件:有一个必须最小化的目标函数和一些约束(可以看出,x6, x7, x8, x9, x10, x11continuous变量,并且它们都等于500(我将它们的upperlower边界都定义为等于500;所以它们实际上是常数(。

2(第二种方法:

它返回CPLEX Error 1217: No solution exists,所以CPLEX无法找到解决方案,但我不明白为什么。

我唯一改变的是:

  • 我将x6, x7, x8, x9, x10, x11设置为binary变量
  • 对于它们中的每一个,我定义了等于0lower界和等于500upper

因此,生成的";。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变量。

注意:即使(在第二种方法中(我将lowerupper的边界都设置为等于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

最新更新