我正在用Python编写自己的MIP求解器,使用的是双简单表和Gomory剪切(出于培训目的)。我得到原始的,双重的和削减的作品。但是,在实施平衡预缩放时,我注意到了一个问题,现在很难弄清自己在做什么错。
这似乎是算法问题,因为我同意执行的所有表格更改。
让我们考虑一个非常简单的示例:
最大化:x2
第一个约束:3 * x1 + 2 * x2≤6
第二约束:-3 * x1 + 2 * x2≤0
在没有预先缩放的情况下,我的算法效果很好,相应的表格开发如下所示。注意:在我最小化时,第一行是取反的目标函数。
添加松弛变量后的初始画面:
| 0.0 | -1.0 | 0.0 | 0.0 | 0.0 |
| 3.0 | 2.0 | 1.0 | 0.0 | 6.0 |
| -3.0 | 2.0 | 0.0 | 1.0 | 0.0 |
枢轴移动(2,1)之后的Tableau:
| -1.5 | 0.0 | 0.0 | 0.5 | 0.0 |
| 6.0 | 0.0 | 1.0 | -1.0 | 6.0 |
| -1.5 | 1.0 | 0.0 | 0.5 | 0.0 |
枢轴移动(1,0)后的Tableau:
| 0.0 | 0.0 | 0.25 | 0.25 | 1.5 |
| 1.0 | 0.0 | 0.17 | -0.17 | 1.0 |
| 0.0 | 1.0 | 0.25 | 0.25 | 1.5 |
找到的主要解决方案:
s:x1 = 1.0,x2 = 1.5 obj:-1.5
添加Gomory剪切后的Tableau:
| 0.0 | 0.0 | 0.25 | 0.25 | 0.0 | 1.5 |
| 1.0 | 0.0 | 0.17 | -0.17 | 0.0 | 1.0 |
| 0.0 | 1.0 | 0.25 | 0.25 | 0.0 | 1.5 |
| 0.0 | 0.0 | -0.25 | -0.25 | 1.0 | -0.5 |
枢轴移动(3,2)后的Tableau:
| 0.0 | 0.0 | 0.0 | 0.00 | 1.00 | 1.00 |
| 1.0 | 0.0 | 0.0 | -0.33 | 0.67 | 0.67 |
| 0.0 | 1.0 | 0.0 | 0.00 | 1.00 | 1.00 |
| 0.0 | 0.0 | 1.0 | 1.00 | -4.00 | 2.00 |
找到双重解决方案:
s:x1 = 0.67,x2 = 1.0 obj:-1.0
添加Gomory剪切后的Tableau:
| 0.0 | 0.0 | 0.0 | 0.00 | 1.00 | 0.0 | 1.00 |
| 1.0 | 0.0 | 0.0 | -0.33 | 0.67 | 0.0 | 0.67 |
| 0.0 | 1.0 | 0.0 | 0.00 | 1.00 | 0.0 | 1.00 |
| 0.0 | 0.0 | 1.0 | 1.00 | -4.00 | 0.0 | 2.00 |
| 0.0 | 0.0 | 0.0 | -0.67 | -0.67 | 1.0 | -0.67 |
枢轴移动(4,3)后的Tableau:
| 0.0 | 0.0 | 0.0 | 0.0 | 1.0 | 0.0 | 1.0 |
| 1.0 | 0.0 | 0.0 | 0.0 | 1.0 | -0.5 | 1.0 |
| 0.0 | 1.0 | 0.0 | 0.0 | 1.0 | 0.0 | 1.0 |
| 0.0 | 0.0 | 1.0 | 0.0 | -5.0 | 1.5 | 1.0 |
| 0.0 | 0.0 | 0.0 | 1.0 | 1.0 | -1.5 | 1.0 |
找到双重解决方案:
s:x1 = 1.0,x2 = 1.0 obj:-1.0
找到正确的整数解决方案!
现在让我们考虑相同的问题,但第一个约束的比例为1/6(这不会改变问题)。
最大化:x2
第一个约束:0.5 * x1 + 0.33 * x2≤1
第二约束:-3 * x1 + 2 * x2≤0
添加松弛变量后的初始画面:
| 0.0 | -1.00 | 0.0 | 0.0 | 0.0 |
| 0.5 | 0.33 | 1.0 | 0.0 | 1.0 |
| -3.0 | 2.00 | 0.0 | 1.0 | 0.0 |
枢轴移动(2,1)之后的Tableau:
| -1.5 | 0.0 | 0.0 | 0.50 | 0.0 |
| 1.0 | 0.0 | 1.0 | -0.17 | 1.0 |
| -1.5 | 1.0 | 0.0 | 0.50 | 0.0 |
枢轴移动(1,0)后的Tableau:
| 0.0 | 0.0 | 1.5 | 0.25 | 1.5 |
| 1.0 | 0.0 | 1.0 | -0.17 | 1.0 |
| 0.0 | 1.0 | 1.5 | 0.25 | 1.5 |
找到的主要解决方案:
s:x1 = 1.0,x2 = 1.5 obj:-1.5
添加Gomory剪切后的Tableau:
| 0.0 | 0.0 | 1.5 | 0.25 | 0.0 | 1.5 |
| 1.0 | 0.0 | 1.0 | -0.17 | 0.0 | 1.0 |
| 0.0 | 1.0 | 1.5 | 0.25 | 0.0 | 1.5 |
| 0.0 | 0.0 | -0.5 | -0.25 | 1.0 | -0.5 | <-似乎不是有效的削减方法?
枢轴移动(3,3)后的Tableau:
| 0.0 | 0.0 | 1.00 | 0.0 | 1.00 | 1.00 |
| 1.0 | 0.0 | 1.33 | 0.0 | -0.67 | 1.33 |
| 0.0 | 1.0 | 1.00 | 0.0 | 1.00 | 1.00 |
| 0.0 | 0.0 | 2.00 | 1.0 | -4.00 | 2.00 |
找到双重解决方案:
s:x1 = 1.33,x2 = 1.0 obj:-1.0
添加Gomory剪切后的Tableau:
| 0.0 | 0.0 | 1.00 | 0.0 | 1.00 | 0.0 | 1.00 |
| 1.0 | 0.0 | 1.33 | 0.0 | -0.67 | 0.0 | 1.33 |
| 0.0 | 1.0 | 1.00 | 0.0 | 1.00 | 0.0 | 1.00 |
| 0.0 | 0.0 | 2.00 | 1.0 | -4.00 | 0.0 | 2.00 |
| 0.0 | 0.0 | -0.33 | 0.0 | -0.33 | 1.0 | -0.33 |
枢轴移动(4,2)后的Tableau:
| 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 3.0 | 0.0 |
| 1.0 | 0.0 | 0.0 | 0.0 | -2.0 | 4.0 | 0.0 |
| 0.0 | 1.0 | 0.0 | 0.0 | 0.0 | 3.0 | 0.0 |
| 0.0 | 0.0 | 0.0 | 1.0 | -6.0 | 6.0 | 0.0 |
| 0.0 | 0.0 | 1.0 | 0.0 | 1.0 | -3.0 | 1.0 |
找到双重解决方案:
s:x1 = 0.0,x2 = 0.0 obj:-0.0
解决方案不正确!