我正在尝试使用线性编程解决分配问题。 我正在使用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无法处理这种情况,或者我缺少什么?
答案 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这样的入门运筹学教科书会更好。祝你好运!