这是我自己的运筹学笔记,由于老师讲的实在一言难尽,导致自己不得不对着英文教材自学,以下的例子就出自英文教材。
问题介绍
有3条河流向4个城市供水,表格9.10中显示了运费,没有运费则表示无法供水。城市有其最小需求(刚需,第一行),还有奢侈性需求(刚需+额外需求,第二行),首先满足城市的刚需,在此基础上尽量满足其奢侈性需求,并使得费用最小化。
难点在于每个城市的需求是不确定的,有一个上界和下界,上界为其他城市的刚需满足后剩下的,下界即为刚需。因此Hollyglass的上界就是(50+60+50)-(30+70+0)=60而非无穷大。
然而在运输问题中需求得是常数而不能是变量,因此要对问题做一些变形。引入一个虚拟产地用来满足奢侈性需求。虚拟产地的产量即为需求的上界减去真实的产量:(50+70+30+60)-(50+60+50)=50。注意虚拟产地的运费都是0,并且由于Calorie不能运到Hollyglass, 故将其运费设为一个极大值M。
接下来对模型做出调整以便把奢侈性需求纳入考虑。
Hollyglass不需要调整,因为它的奢侈性需求减去虚拟产量等于10,正好为它的刚需,即这部分刚需一定能由真实产量提供。Los Devils的刚需等于奢侈性需求,即必须全部由真实产量提供,因此在虚拟产量中将它的运费设为M。对于Berdo,虚拟产量在满足奢侈性需求的前提下还能满足部分刚需,由于其刚需是30,上界是50,故虚拟产量提供不能超过20。因此将Berdo分成2块,一块需求为30,虚拟产地运费为M,另一块需求为20,虚拟产地运费为0。
R语言解决
library(lpSolve)
M = 10000
a1 = c(16,16,13,22,17)
a2 = c(14,14,13,19,15)
a3 = c(19,19,20,23,M)
a4 = c(M,0,M,0,0)
a = rbind(a1,a2,a3,a4) #系数矩阵
row.rhs = c(50,60,50,50) #供给约束值
row.dir = rep('=',4) #约束方向
col.rhs = c(30,20,70,30,60) #需求约束值
col.dir = rep("=",5) #约束方向
solution = lp.transport(a, row.signs = row.dir, row.rhs = row.rhs, col.signs = col.dir, col.rhs = col.rhs)
solution$solution
结果为
忽略最后一行虚拟产量的结果,该矩阵即为运输量矩阵。
参考教材:Introduction to Operations Research,Frederick S. Hillier • Gerald J. Lieberman