实验目的:学会使用Matlab编程实现求解运输问题的Vogel法。
实验内容:1.学习Matlab编程;2.熟悉求解运输问题的Vogel法。
3.实验例题:某运输问题的单位运价表如下表所示:
B1 | B2 | B3 | B4 | 产量 | |
A1 | 6 | 7 | 5 | 3 | 14 |
A2 | 8 | 4 | 2 | 7 | 27 |
A3 | 5 | 9 | 10 | 6 | 19 |
销量 | 22 | 13 | 12 | 13 |
请使用Matlab编程实现Vogel法,求解该问题的一个近似最优解。
实验原理:
1.沃格尔(Voge)法——罚数法
沃格尔法要求首先计算出各行各列中最小的cij,与次小的cij之间的差的绝对值,在具有最大差值的那行或列中,选择具有最小的cij的方格来决定基变量值。这样就可以避免将运量分配到该行(或该列)具有次小的cij的方格中,以保证有较小的目标函数值。
最小元素法的缺点是:为了节省一处的费用,有时造成在其他处要多花更多的运费。
伏格尔法考虑到,若一产地的产品不能按最小运费供应,就应考虑次小运费,这就有一个差额,称之为罚数。罚数越大,则说明不能按最小运费调运时,运费将会增加越多。因而对罚数最大处,就应当采用最小运费调运。
伏格尔法一般能得到一个比用西北角法和最小元素法两种方法所得的初始基本可行解更好的初始基本可行解。
2.矩阵表示:
cx=[22,13,12,13,14,27,19;1,1,1,1,1,1,1];第一行为产量与销量,第二行表示是否划去
fs(i)=a(2,i)-a(1,i)行或列计算等等
3.sort命令:
(1)Y=sort(X)
sort()的参数可以是向量,矩阵,数组等等。当X是向量时,sort(X)对X的元素进行升序排序;当X是矩阵时,sort(X)对X的每一列进行升序排序;
(2)Y=sort(X,DIM,MODE)
参数DIM表示对哪一个维数进行排序,例如当X是一个二维矩阵,当DIM=1时表示对X的每一列进行排序,当DIM=2时表示对X的每一行进行排序。
参数MODE表示按哪一种模式进行排序,当MODE=‘ASCEND’的时进行升序排序,当MODE=‘DESCEND’时,进行降序排序。
Y返回已经排好序的X。
(3)[Y,I] = sort(X,DIM,MODE)
有时我们还需要知道Y中的元素对应于原始序列X中的哪一个元素。于是我们可以用上面这个命令:
I返回索引序列,它表示Y中的元素与X中元素的对应。
4.sum命令:
S = sum(A) 返回 A 沿大小不等于 1 的第一个数组维度的元素之和
如果 A 是向量,则 sum(A) 返回元素之和。
如果 A 是矩阵,则 sum(A) 将返回包含每列总和的行向量。
如果 A 是多维数组,则 sum(A) 沿大小不等于 1 的第一个数组维度计算,并将这些元素视为向量。此维度会变为 1,而所有其他维度的大小保持不变。
5.max命令:
(1) C = max(A)
返回一个数组各不同维度中的最大元素。
如果A是一个向量,max(A)返回A中的最大元素。
如果A是一个矩阵,max(A)将A的每一列作为一个向量,返回一个行向量。
行向量的第i个值是A矩阵中第i列中的最大值。
(2) [C,index] = max(A):返回返回行向量C和index,C向量记录矩阵A每列的最大值,index记录A每列最大值的行号(即每列最大值的索引)
程序代码:
c=[6,7,5,3;8,4,2,7;5,9,10,6];
cc=c;
x=zeros(3,4);
cx=[22,13,12,13,14,27,19;1,1,1,1,1,1,1];
fs=[1,1,1,1,1,1,1];
a=sort(c);
for i=1:4
fs(i)=a(2,i)-a(1,i);
end
bb=c';
b=sort(bb);
for i=1:3
fs(i+4)=b(2,i)-b(1,i);
end
while ((sum(cx(2,1:4)))>1)&&((sum(cx(2,5:7)))>1)
[~,mf]=max(fs);
if mf<5
[~,mc]=min(c(:,mf));
x(mc,mf)=min(cx(1,mf),cx(1,mc+4));
cx(1,mf)=cx(1,mf)-x(mc,mf);
if cx(1,mf)==0
cx(2,mf)=0;
c(:,mf)=1000;
end
cx(1,mc+4)=cx(1,mc+4)-x(mc,mf);
if cx(1,mc+4)==0
cx(2,mc+4)=0;
c(mc,:)=1000;
end
end
if mf>4
[minc,mc]=min(c(mf-4,:));
x(mf-4,mc)=min(cx(1,mf),cx(1,mc));
cx(1,mf)=cx(1,mf)-x(mf-4,mc);
if cx(1,mf)==0
cx(2,mf)=0;
c(mf-4,:)=1000;
end
cx(1,mc)=cx(1,mc)-x(mf-4,mc);
if cx(1,mc)==0
cx(2,mc)=0;
c(:,mc)=1000;
end
end
a=sort(c);
for i=1:4
fs(i)=a(2,i)-a(1,i);
end
bb=c';
b=sort(bb);
for i=1:3
fs(i+4)=b(2,i)-b(1,i);
end
[~,mf]=max(fs);
End
while sum(cx(2,1:4))==1
onlyc=find(cx(2,1:4)==1);
for i=1:3
x(i,onlyc)=x(i,onlyc)+cx(1,i+4);
cx(1,i+4)=0;
cx(2,i+4)=0;
end
cx(1,onlyc)=0;
cx(2,onlyc)=0;
c(:,onlyc)=1000;
end
while sum(cx(2,5:7))==1
onlyh=find(cx(2,5:7)==1);
for i=1:4
x(onlyh,i)=x(onlyh,i)+cx(1,i);
cx(1,i)=0;
cx(2,i)=0;
end
cx(1,onlyh+4)=0;
cx(2,onlyh+4)=0;
c(onlyh,:)=1000;
end
z=0;
for i=1:3
for j=1:4
z=z+cc(i,j)*x(i,j);
end
end
x
z
运行结果
实验总结:
通过此次实验,我很好的掌握了沃格尔法解决运输问题的运算过程,以及用matlab编程实现沃格尔法解决运输问题,对沃格尔法的应用更加熟练,掌握的也更加牢固。
在matlab编程时,训练到了sort命令、if结构、while结构、max命令、sum命令、划掉矩阵一行或一列的实现、罚数的计算与比较等等。通过实验能更好的体会到沃格尔法的求解过程。
在此次实验中也是收获满满,希望后面再接再厉。