【发布时间】:2020-10-15 19:10:36
【问题描述】:
我正在使用 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变量; - 对于它们中的每一个,我定义了
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,问题仍然存在。
【问题讨论】:
-
二进制意味着 lowerbound=0 和 upperbound=1。
-
谢谢!我读到here 那个
"Binary variables are automatically given bounds of 0 (zero) and 1 (one), unless alternative bounds are specified in the BOUNDS section, in which case a warning message is issued."。因此,起初,我认为对二进制变量边界使用非默认值只会生成警告,并且无论如何,CPLEX 都会按预期工作。相反,CPLEX 似乎实际上不允许二进制变量的边界不同于 0/1。 -
我认为您可以使用边界来修复(二进制)变量。
标签: python optimization linear-programming cplex mixed-integer-programming