求解线性程序中的负系数

时间:2019-04-16 18:16:05

标签: data-structures linear-programming clrs

我正在尝试使用线性编程解决分配问题。 我正在使用CLRS中提到的单纯形算法。

请考虑以下示例:


          --(1/1)--->|a|---(10/1)------>|d|----------->
         |            |                  ^            |
         |            |_(7/1)__          |            |
        |s|            ________|_(12/1)__|           |t|
         |            |        |_______               |
         |            |                |              |
         |            |                v              |
          --(1/1)--->|b|---(10/1)---->|c|--(1/1)----->

顶点a和b是人物。

顶点c和d是作业。

我已将其建模为最小成本最大流量问题。

添加了源S和接收器t。

所有边缘权重已设置为1。

从源到顶点a和b的边成本设置为1。

从d,c到沉的边缘成本设置为1。

边缘的(a / b)值表示该边缘的(成本/流量)。

我用W表示边缘成本,用C表示容量。


    The linear program is:
        Minimize,
             Summation(W(uv).f(uv)) over all uv.

    Such that,
         f(uv) >= 0 , for all (u,v) in E

         f(uv) <= C(u,v) , C(u,v)=1 in this case, for all (u,v) in E

         Flow conservation for each vertex except the source and the sink.
         So Sum(f(uv)) = Sum(f(vu)), for all u,v

         Flow demand of atleast 2, since we need to match 2 persons.
         f(sa) + f(sb) = 2

    Such that,
         f(uv) >= 0 , for all (u,v) in E

         f(uv) <= C(u,v) , C(u,v)=1 in this case, for all (u,v) in E

         Flow conservation for each vertex except the source and the sink.
         So Sum(f(uv)) = Sum(f(vu)), for all u,v

         Flow demand of atleast 2, since we need to match 2 persons.
         f(sa) + f(sb) = 2


The Standard Form is:
    Maximize,
         -(Summation(W(uv).f(uv)) over all uv)

       Such that,
         f(uv) >= 0 , for all (u,v) in E

         f(uv) <= C(u,v) , C(u,v)=1 in this case, for all (u,v) in E

         Flow conservation for each vertex except the source and the sink.
         So Sum(f(uv)) = Sum(f(vu)), for all u,v

         Demand:
         f(sa) + f(sb) = 2

将x1替换为sa,x2替换sb,x3替换为ad,x4替换为ac,x5替换为bd,x6替换为bc,x7替换为dt,x8替换为ct。

最后,我们得到如下信息:

       Such that,
         f(uv) >= 0 , for all (u,v) in E

         f(uv) <= C(u,v) , C(u,v)=1 in this case, for all (u,v) in E

         Flow conservation for each vertex except the source and the sink.
         So Sum(f(uv)) = Sum(f(vu)), for all u,v

         Demand:
         f(sa) + f(sb) = 2

根据CLRS, 单纯形的第一部分是使用 INITIALISE-SIMPLEX 方法获得可行解的初始松弛形式。

此方法检查约束中不等式的右侧是否存在任何负值。 如果不是,它将返回当前设置作为主算法要处理的初始松弛形式。

在主要算法中,第一步是选择目标函数中系数为非负的非基本变量。

但是在这种情况下,目标函数中的所有变量都具有负系数(因为我们将初始obj函数乘以将最小化转换为最大化形式)。

那么单纯形将以0作为所有边的流值终止?

我将上述问题喂给“ google OR-Tools库中的linear_solver”。 并且返回正确的结果为21并且x3 = 1&x4 = 0&x5 = 0&x6 = 1

所以我认为我的方程式是正确的。

CLRS无法处理这种情况,或者我缺少什么?

1 个答案:

答案 0 :(得分:1)

实际上,上述问题的问题在于,在这种情况下,“ Initialize-Simplex”方法将需要更加复杂。由于x_i = 0(总i)不是该问题的可行解决方案,因此您需要执行“阶段1”运算以找到该问题的初始基本可行解决方案。 (满足x1 + x2 = 2的解决方案)。 我建议使用谷歌搜索“ phase-1 simplex method” http://www.math.ubc.ca/~israel/m340/artif.pdf。 我不建议将CLRS当作一本很好的书来解释单纯形方法的所有细节。像Hillier和Lieberman或Winston这样的入门运筹学教科书会更好。祝你好运!