通过Simplex方法获取对象的顶点

时间:2016-03-13 20:34:03

标签: java c++ math linear-algebra simplex

我想找到一个对象的顶点,这是由一些方程确定的。 例如。

Eq1:   2x + y +  z <= 12;
Eq2:    x + y      >= 23;
Eq3:    x + y +  z <= 10;

受到

的限制
x >= 0
y >= 0
z => 0

它给出了一个六面体。我想知道这个对象是从哪个顶点开始的位置。

这样做的唯一方法是制作一个能够检查这些方程的所有可能变化的代码吗?

array = array with this equations (6 elements)

for( i = 1; i <= array.lenght; i++ ){
 for( j = 1; j <= array.lenght; j++ ){
  for( k = 1; k <= array.lenght; k++ ){
    //and there check is solve of a variation is possible
  }   
 }    
}

1 个答案:

答案 0 :(得分:3)

这被称为vertex enumeration problem:将多面体从半空间表示(这是你有一组不等式)转换为顶点表示。在一般情况下,文献中有许多算法可以有效地做到这一点。如果您需要尽可能高效,您应该研究其中一种算法。

但是只知道六个半空间形成一个有界的,非退化的六面体,蛮力可能就好了。每个顶点都在三个面的交点处。因此,取三个不等式的每个子集并计算相应方程的交点。 (请参阅下文,了解如何执行此操作。)如果交叉点不存在(例如,两个平面是平行的)或交点不能满足其他三个不等式中的任何一个,则这三个方面不符合顶点;否则该点是顶点之一。对每个 6 C 3 = 20种组合重复,你应该最终得到8个顶点。

要计算三个不等式的交点,可以使用一些简单的线性代数。采取任何三个不等式,例如:

2x +  y +  z <= 12
 x +  y      >= 23
 x           >= 0

将它们写成矩阵方程式:

┌             ┐┌   ┐   ┌    ┐
│ 2    1    1 ││ x │   │ 12 │
│             ││   │   │    │
│ 1    1    0 ││ y │ = │ 23 │
│             ││   │   │    │
│ 1    0    0 ││ z │   │  0 │
└             ┘└   ┘   └    ┘

(矩阵行是每个不等式中xyz的系数。)如果左边的矩阵是单数(即行列式为零) ,没有共同的交叉点。否则,通过反转矩阵来计算解决方案:

┌   ┐   ┌             ┐-1┌    ┐
│ x │   │ 2    1    1 │  │ 12 │
│   │   │             │  │    │
│ y │ = │ 1    1    0 │  │ 23 │
│   │   │             │  │    │
│ z │   │ 1    0    0 │  │  0 │
└   ┘   └             ┘  └    ┘

任何线性代数库都应该能够为你做这个计算,或者 - 因为这是3D - 你可以使用Cramer's Rule。然后检查[x y z]与其他三个不等式,以确定它是否是顶点。