如果我使用二进制变量,CPLEX 找不到解决方案
CPLEX can't find a solution if I use binary vabriables
我正在使用 CPLEX 12.9 和 Python 来解决 MILP(混合整数线性问题)。
我尝试了两种方法;我期望得到相同的结果,但第一种方法有效,而第二种方法无效。
1) 第一种方法:
这种方法成功。在生成的“.lp”文件(一个包含人类可读的问题表述的文本文件:有一个必须最小化的 objective 函数和一些约束)可以看出 x6, x7, x8, x9, x10, x11
是 continuous
变量,它们都等于 500
(我定义它们的 upper
和 lower
边界等于 500
;所以它们实际上是常量).
2) 第二种方法:
它 returns CPLEX Error 1217: No solution exists
,所以 CPLEX 无法找到解决方案,但我不明白为什么。
我唯一改变的是:
- 我将
x6, x7, x8, x9, x10, x11
设置为binary
个变量;
- 对于它们中的每一个,我将
lower
边界定义为 0
,upper
边界等于 500
。
因此,生成的“.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 example 并将整数更改为二进制:
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
我正在使用 CPLEX 12.9 和 Python 来解决 MILP(混合整数线性问题)。 我尝试了两种方法;我期望得到相同的结果,但第一种方法有效,而第二种方法无效。
1) 第一种方法:
这种方法成功。在生成的“.lp”文件(一个包含人类可读的问题表述的文本文件:有一个必须最小化的 objective 函数和一些约束)可以看出 x6, x7, x8, x9, x10, x11
是 continuous
变量,它们都等于 500
(我定义它们的 upper
和 lower
边界等于 500
;所以它们实际上是常量).
2) 第二种方法:
它 returns CPLEX Error 1217: No solution exists
,所以 CPLEX 无法找到解决方案,但我不明白为什么。
我唯一改变的是:
- 我将
x6, x7, x8, x9, x10, x11
设置为binary
个变量; - 对于它们中的每一个,我将
lower
边界定义为0
,upper
边界等于500
。
因此,生成的“.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 example 并将整数更改为二进制:
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