大家都在看
MatLab运输问题高手进
最佳答案
简单地写了一些(分析部分,你好好看一下,应当可以看得懂,多看一两遍,自己总结一下,我可能描述得不准)
(1)问题分析:
运输费=运输单价*运输量。这里要求是总运输费最低,也就是说规划的目标函数是使得运输费最小。
约束条件有:
a.ABC三个工厂生产能力存在上限,当然也存在下限(产量为0)
b.至少应甲乙丙丁四个市场的需求量。
(2)符号说明:
xij代表i工厂给j市场的箱数,当然这里i=1,2,3分别代表ABC;j=1,2,3,4分别代表甲乙丙丁
costij代表i工厂运到j市场每箱的运输费。由题意得cost=[2,1,3,2;1,3,2,1;3,4,1,1];
proi代表i工厂生产的总箱数,很明显proi=sum(xij,j,1,4)-----注意这里引入的东西是说对j从1到4求和。即xi1+xi2+xi3+xi4
needj代表j市场的实际进货,很明显needj=sum(xij,i,1,3)----同上
根据"问题分析"我们可以得到规划
目标:min f=sum(sum(costij.*xij,i,1,3),j,1,4)
约束条件:
xij>=0 其中i=1,2,3;j=1,2,3,4
pro1=sum(x1j,j,1,4)<=60
pro2=sum(x2j,j,1,4)<=40
pro3=sum(x3j,j,1,4)<=50
need1=sum(xi1,i,1,3)>=20
need2=sum(x21,i,1,3)>=35
need3=sum(x31,i,1,3)>=33
need4=sum(x41,i,1,3)>=34
(3)程序编写(基于Matlab,注意这里要将Aij转成列向量)
clear
cost=[2,1,3,2;1,3,2,1;3,4,1,1];
f=cost(:);%目标
A=[
1,0,0,1,0,0,1,0,0,1,0,0;
0,1,0,0,1,0,0,1,0,0,1,0;
0,0,1,0,0,1,0,0,1,0,0,1;
-1,-1,-1,0,0,0,0,0,0,0,0,0;
0,0,0,-1,-1,-1,0,0,0,0,0,0;
0,0,0,0,0,0,-1,-1,-1,0,0,0;
0,0,0,0,0,0,0,0,0,-1,-1,-1;
];%约束,注意大于号约束时,我们两边乘以-1,变成小于号约束
b=[60;40;50;-20;-35;-33;-34];
Aeq=[];
beq=[];
xmin=zeros(12,1);
xmax=inf*ones(12,1);
x0=xmin;
[x,fmin]=linprog(f,A,b,Aeq,beq,xmin,xmax,x0);
reshape(x,3,4),fmin
totalbox=sum(x)
(4)结果分析
上述程序的结果是:
ans =
0.0000 35.0000 0.0000 0.0000
20.0000 0.0000 0.0000 17.3777
0.0000 0.0000 33.0000 16.6223
fmin =
122.0000
totalbox =
122.0000
其中ans就是Aij,得到的总费用是122元,运输的总箱数也为122箱。也就是说平均每箱的费用也是1元。
(5)启示
我们注意观察
cost与ans的关系
cost =
2 1 3 2
1 3 2 1
3 4 1 1
ans =
0.0000 35.0000 0.0000 0.0000
20.0000 0.0000 0.0000 17.3777
0.0000 0.0000 33.0000 16.6223
我们可以发现,ans中非元素与cost中的1元素是对应的。
也就是说对于j市场,它可以从ABC三个厂进货。但是要使得费用最近,当然是希望从运费最低的那个厂进货。
先观察甲乙丙和ABC,对于甲乙丙来说,他们分别从BAC三个厂进贷是最合算的,当然BAC的产量都大于甲乙丙三个市场的需求量。这三个市场都从BAC那里进货。
对于丁市场来说,它的最低运费的有BC两个工厂,而BC工厂分别给甲丁两个市场20,33个箱。它们离最大的产量还剩20,17。只要丁市场从这里取34箱就可以了。对于这两个就没有什么优先性,因为它的运输费是一致的。
所以本例存在多解情况,先让BAC三个工厂分别满足甲乙丙三个市场,丁市场从BC两个工厂进货34箱即可(而这34箱从B厂的20箱和C厂的17箱里面运出即可),考虑到箱数一般为整数。BC厂给丁市场的箱数可有以下几种组合
B厂 C厂
20 14
19 15
18 16
17 17
声明:知趣百科所有作品均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请在页面底部查找“联系我们”的链接,并通过该渠道与我们取得联系以便进一步处理。