【问题标题】:Solving Negative coefficients in linear program求解线性规划中的负系数
【发布时间】:2019-04-16 18:16:05
【问题描述】:

我正在尝试使用线性规划解决分配问题。 我使用的是 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 是作业。

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

Source S 和 Sink t 已添加。

所有边的权重都设置为 1。

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

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

边中的 (a/b) 值表示该边的 (Cost/Flow Capacity)。

我用 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


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


Which reduces to 
   maximize (- { W(sa).f(sa) + W(sb).f(sb) + W(ad).f(ad) + W(ac).f(ac) + W(bd).f(bd) + W(bc).f(bc) + W(dt).f(dt) + W(ct).f(ct) } )

用 x1 代替 sa,x2 代替 sb,x3 代替 ad,x4 代替 ac,x5 代替 bd,x6 代替 bc,x7 代替 dt,x8 代替 ct。

最后,我们得到这样的结果:


    Maximize
        -x1-x2-10(x3)-7(x4)-12(x5)-7(x6)-x7-x8  (objective function)
    Given that (constraints)
      Capacity constraints:
         x{1-8} <= 1
      Flow conversations:
         x1 = x3+x4 --> ( x1-x3-x4 <=0 & -x1+x3+x4 <= 0)
         x2 = x6+x5 --> ( x2-x6-x5 <=0 & -x2+x6+x5 <= 0)
         x7 = x3+x5 --> ( x7-x3-x5 <=0 & -x7+x3+x5 <= 0)
         x8 = x4+x6 --> ( x8-x4-x6 <=0 & -x8+x4+x6 <= 0)
      Demand:
         x1 + x2 =2 --> ( x1+x2 <=2 && -x1-x2 <=2)

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

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

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

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

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

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

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

CLRS 不处理这种情况,还是我遗漏了什么?

【问题讨论】:

  • (1) 选择输入变量是基于降低的成本(而不是目标系数)。 (2) 该算法与实际 Simplex 代码的实现方式几乎没有共同之处。它只应用作教学工具,而不应作为实际实施的蓝图。
  • @ErwinKalvelagen,但根据 CLRS,选择输入变量是基于客观系数。通过增加那些具有+ive系数的非基本变量的值,可以在每次迭代中增加目标值
  • 它可能没有这么说。再次在单纯形法中,选择输入变量是基于降低的成本(不是目标系数)
  • 引用CLRS:“如果目标函数中的所有系数都为负,则while循环终止。否则,第4行选择目标函数中的系数为正的变量xe作为输入变量。 "
  • @Abis 您提供的报价必须在存在PIVOT [从INITIALIZE-SIMPLEX 调用] 对c 所做的情况下进行解释,即“目标函数”——基本上,正如@Erwin 所指出的,将c 处理为“reduced cost”s 的函数。

标签: data-structures linear-programming clrs


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多