如果我使用二进制vabriable,CPLEX找不到解决方案

问题描述

我将CPLEX 12.9与Python结合使用来解决MILP(混合整数线性问题)。 我尝试了两种方法;我期望得到相同的结果,但是尽管第一种方法可行,但是第二种却没有。

1)第一种方法

方法成功。在生成的“ .lp”文件(包含问题的人类可读表达的文本文件:必须最小化目标函数和某些约束)的情况下,可以看到x6,x7,x8,x9,x10,x11是{{1 }}变量,它们都等于continuous(我定义了它们的500upper的边界都等于lower,因此它们实际上是常量)。>

2)第二种方法

它返回500,因此CPLEX无法找到解决方案,但我不明白为什么。

我唯一更改的是:

  • 我将CPLEX Error 1217: No solution exists设置为x6,x11变量;
  • 对于每个对象,我都定义了binary的边界等于lower0的边界等于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,x11lower的边界都设置为等于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)