【发布时间】: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