使用Gomory割的双重单纯形算法在做错什么?

时间:2019-04-03 21:44:00

标签: python mixed-integer-programming simplex-algorithm

我正在用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
  解决方案不正确!

0 个答案:

没有答案
相关问题