数学建模实验7解答
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告7
1.某产品从仓库运往市场销售,已知各仓库的可供量、各市场需求量及从i 仓库至j市场的路径的运输能力如下表所列(表中数字0代表无路),试求从仓库
解:应用最大流算法必须是单源单汇的网络.构造一个虚拟的源点v s,由于A,B,C 的可供量为20,20,100,则弧v s A,v s B,v s C上的容量分别为20,20,100,构造一个虚拟的汇点v t,由于市场1,2,3,4的需求量分别为20,20,60,20,市场1,2,3,4分别记为D、F、H、I,则弧Dv t,Fv t,Hv t,Iv t的容量分别为20,20,60,20。构造赋权有向图(V,E,W),其中V为顶点集合,E为弧的集合,W为各个弧上的容量构成的权重矩阵,具体计算时把顶点v s,A,B,C,D,F,H,I,v t分别编号为1,2,...,9,从仓库到市场的最大流问题归结为求从v s到v t的最大流,可以使用Ford-Fulkerson算法求最大流。
clc,clear
a=zeros(9);
a(1,[2:4])=[20,20,100];
a(2,[5,6,8])=[30,10,40];
a(3,[7,8])=[10,50];
a(4,[5:8])=[20,10,40,5];
a([5:8],9)=[20,20,60,20];
a=sparse(a);
[b,c]=graphmaxflow(a,1,9)
运行结果为:
b=
110
c=
(1,2)20
(1,3)15
(1,4)75
(4,5)20
(2,6)10
(3,7)10
(4,7)40
(2,8)10
(3,8)5
(4,8)5
(5,9)20
(6,9)20
(7,9)50
(8,9)20
即求得从仓库运往市场的最大流量为110单位,其中市场3只能满足50单位,差10单位。
2.某单位招收懂俄、英、日、德、法文的翻译各一名,有5人应聘。已知乙懂俄文,甲、乙、丙、丁懂英文,甲、丙、丁懂日文,乙、戊懂德文,戊懂法文,问这5个人是否都能得到聘书?最多几个得到聘书,招聘后每人从事哪一方面翻译工作?
解:将5个人与5个外语语种分别用点表示,把各个人与懂得的外语语种之间用弧相连。为了求单源和单汇网络的最大流,再加一个虚拟的单源vs,vs与5个人之间各有一条弧,再加一个虚拟的单汇vt,在5个外语语种和vt之间各有一条弧。规定每条弧的容量为1,求出上述网络的最大流数字即为最多能得到招聘的人数。计算时把源点vs,甲乙丙丁戊5个人,俄英日德法5个外语语种和汇点vt 分别编号为1,2, (12)
clc,clear
a=zeros(12);
a(1,[2:6])=1;
a(2,[8,9])=1;
a(3,[7,8,10])=1;
a(4,[8,9])=1;
a(5,[8,9])=1;
a(6,[10,11])=1;
a([7:11],12)=1;
a=sparse(a);
[b,c]=graphmaxflow(a,1,12)
运行结果:
b=
4
c=
(1,3)1
(1,4)1
(1,6)1
(3,7)1
(5,8)1
(4,9)1
(6,10)1
(7,12)1
(8,12)1
(9,12)1
(10,12)1
求得只有4个人得到招聘,乙—俄,丁—英,丙—日,戊—德,甲未能得到应聘.
3.将下表所列的某运输问题的相关数据转化为最小费用最大流问题,画出
解:为了使用最大流算法,必须构造单源单汇的网络,加一个虚拟的源点v s,一个虚拟的汇点v t,得到的网络图如图,其中弧旁的第一个数字为单位流的费用,第二数字表示容量.
首先求出最大流的流量为15,
n=7
C=zeros(7)
C(1,[2,3])=[8,7]
C(2,[4,5,6])=[8,8,8]
C(3,[4,5,6])=[777]
C(4,7)=4
C(5,7)=5
C(6,7)=6
运行结果为:
wf=
15
No=
8000000
再建立求最小费用的线性规划模型,求得最小费用为240。求最小费用的程序如下:
model:
sets:
nodes/s,a,b,1,2,3,t/:d;
arcs(nodes,nodes)/s a,s b,a1,a2,a3,b1,b2,b3,1t,2t,3t/:b,c,f;
endsets
data:
b=0020245302220000;
c=87888777456;
d=1500000-15;!最大流为15;
enddata
n=@size(nodes);!顶点的个数;
min=@sum(arcs:b*f);
@for(nodes(i):@sum(arcs(i,j):f(i,j))-@sum(arcs(j,i):f(j,i))=d(i));
@for(arcs:@bnd(0,f,c)); end