《图论习题及答案(共24页).doc》由会员分享,可在线阅读,更多相关《图论习题及答案(共24页).doc(24页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上作业解答练习题2 利用matlab编程FFD算法完成下题:设有6种物品,它们的体积分别为:60、45、35、20、20和20单位体积,箱子的容积为100个单位体积。解答一:function num,s = BinPackingFFD(w,capacity)%一维装箱问题的FFD(降序首次适应)算法求解:先将物体按长度从大到小排序,%然后按FF算法对物体装箱%输入参数w为物品体积,capacity为箱子容量%输出参数num为所用箱子个数,s为元胞数组,表示装箱方案,si为第i个箱子所装%物品体积数组%例w = 60,45,35,20,20,20; capacity =
2、100;% num=3,s=1,3,2,4,5,6;w = sort(w,descend);n = length(w);s = cell(1,n);bin = capacity * ones(1,n);num = 1;for i = 1:n for j = 1:num + 1 if w(i) =max(V_Left) box_count=box_count+1; x(i,box_count)=1; V_Left=V_Left V-v(i); else j=1; while(v(i)V_Left(j) j=j+1; end x(i,j)=1; V_Left(j)=V_Left(j)-v(i);
3、end temp=find(x(i,:)=1); fprintf(第%d个物品放在第%d个容器n,i,temp)endoutput:第1个物品放在第1个容器第2个物品放在第2个容器第3个物品放在第1个容器第4个物品放在第2个容器第5个物品放在第2个容器第6个物品放在第3个容器解答三:function box_count=FFD(x)%降序首次适应算法v=100;x=fliplr(sort(x);%v=input(请输入箱子的容积:);n=length(x);I=ones(n);E=zeros(1,n);box=v*I;box_count=0;for i=1:n j=1; while(jbox(
4、j) j=j+1; continue; else box(j)=box(j)-x(i); E(i)=j; break; end end if jbox_count box_count=box_count+1; box(box_count)=box(box_count)-x(i); E(i)=j; endenddisp(E);在命令窗口输入: x=60,45,35,20,20,20; FFD(x) 1 2 1 2 2 3ans = 3练习题5 “超市大赢家”提供了50种商品作为奖品供中奖顾客选择,车的容量为1000dm3 , 奖品i占用的空间为wi dm3 ,价值为vi 元, 具体的数据如下:v
5、i = 220, 208, 198, 192, 180, 180, 165, 162, 160, 158,155, 130, 125, 122, 120, 118, 115, 110, 105, 101, 100, 100, 98,96, 95, 90, 88, 82, 80, 77, 75, 73, 72, 70, 69, 66, 65, 63, 60, 58,56, 50, 30, 20, 15, 10, 8, 5, 3, 1wi = 80, 82, 85, 70, 72, 70, 66, 50, 55, 25, 50, 55, 40, 48,50, 32, 22, 60, 30, 32,
6、 40, 38, 35, 32, 25, 28, 30, 22, 50, 30, 45,30, 60, 50, 20, 65, 20, 25, 30, 10, 20, 25, 15, 10, 10, 10, 4, 4, 2,1。问如何装车才能总价值最大。解答:clear;clc;v=220, 208, 198, 192, 180, 180, 165, 162, 160, 158,155, 130, 125, 122, 120, 118, 115, 110, 105, 101, 100, 100, 98,96, 95, 90, 88, 82, 80, 77, 75, 73, 72, 70, 69
7、, 66, 65, 63, 60, 58,56, 50, 30, 20, 15, 10, 8, 5, 3, 1; w=80, 82, 85, 70, 72, 70, 66, 50, 55, 25, 50, 55, 40, 48,50, 32, 22, 60, 30, 32, 40, 38, 35, 32, 25, 28, 30, 22, 50, 30, 45,30, 60, 50, 20, 65, 20, 25, 30, 10, 20, 25, 15, 10, 10, 10, 4, 4, 2,1;totalw=1000;limitw=1000;n=length(w);for i=1:n f(1
8、,i)=v(i)/w(i); f(2,i)=w(i); f(3,i)=i;endfor i=1:(n-1) for j=(i+1):n if f(1,i)f(1,j) t=f(1,i); f(1,i)=f(1,j); f(1,j)=t; t=f(2,i); f(2,i)=f(2,j); f(2,j)=t; t=f(3,i); f(3,i)=f(3,j); f(3,j)=t; end endendtotalv=0;a=;for i=1:n if f(2,i)=limitw a=a,f(3,i); %disp(f(3,i); limitw=limitw-f(2,i); totalv=totalv+
9、f(1,i)*f(2,i); endendatotalvtotalw=totalw-limitw结果a = Columns 1 through 21 10 40 17 25 28 16 19 35 37 8 26 20 13 11 24 27 9 23 41 1 4 Columns 22 through 27 22 6 30 14 2 47totalv = 3103totalw = 1000练习题8 对最后一个求有向圈的示例用matlab程序实现。解答:H= 0 1 0 0 0; 0 0 0 1 1; 1 1 1 0 0; 0 0 1 0 1; 0 1 0 0 0;n=size(H,1);%顶
10、点个数p=zeros(1,n);%存储搜索过的顶点X=zeros(n,n);%用来设置禁止矩阵,往回返的时候设置此路已被搜索k=1;p(1)=1;%第一个点作为初始点开始搜索while p(1)=n %每个顶点都作为初始点搜索包含p(1)的有向圈, i=p(1)+1;%当前点k往后搜索时都是从p(1)+1开始,从而也可以搜索下标小于k的点while in %k点往后的所有点都被搜索 if H(p(k),p(1)=1%有圈,每次搜索的都是包含初始点的圈 disp(p(1:k);%输出圈 end %不管有没有圈,此时k点要往回返 if k1%路径上不止出发点 for j=1:n X(p(k),j)
11、=0;%取消以前的限制通行 end X(p(k-1),p(k)=1;%增加此路已搜索 p(k)=0;%撤销路径上的k点 k=k-1;%返回上一个点作为当前点 else %返回到出发点了 p(1)=p(1)+1; %换下一个出发点(初始点) end endend运行结果:1 2 4 3 2 4 5 2 4 3 2 5 3练习题9 选址问题 现准备在7个居民点中设置一银行,路线与距离如下图,问设在哪个点,可使最大服务距离最小?若设两个点呢?解答:第一步:function D,R=floyd(A)%用floyd算法实现求任意两点之间的最短路程。可以有负权%参数D为连通图的权矩阵 A=0 3 inf
12、inf inf inf inf 3 0 2 inf inf 1.5 inf inf 2 0 6 inf 2.5 4 inf inf 6 0 inf inf 3 inf inf inf inf 0 1.5 inf inf 1.5 2.5 inf 1.5 0 1.8 inf inf 4 3 inf 1.8 0 ;D=A;n=length(D);for i=1:n for j=1:n R(i,j)=i;%赋路径初值 endendfor k=1:n for i=1:n for j=1:n if D(i,k)+D(k,j)D(i,j) D(i,j)=D(i,k)+D(k,j);%更新 D(i,j),说明
13、通过k的路程更短 R(i,j)=R(k,j);%更新R(i,j),需要通过k end end end hl=0; for i=1:n if D(i,i) min_spend(m)XX =69.6000 150.0000 147.6000 90.0000 156.0000 174.0000 189.6000 111.6000 120.0000 122.4000INDEX = 2 1 3 3 1 3 2 3 1 3XX为从各个仓库到三个企业中的最小费用,INDEX为最小费用的企业。练习题14 最小代价流 将上题容量网络的边上增加另一个权数-代价,变为具有代价的容量网络,单位代价为容量数的十位上的数
14、字,求比最大流少30单位的最小代价流。由上题结果可知,最大流为142,则最小代价流的流量应该为112。用迭代算法,预定流量值wf0=112。方法一:C=0 25 0 56 61 0 0 0 0; 0 0 71 0 0 36 0 0 0; 0 0 0 0 0 0 0 34 0; 0 0 0 0 49 0 74 0 0; 0 24 0 0 0 72 57 0 0; 0 0 38 0 0 0 0 53 45; 0 0 0 0 0 38 0 0 67; 0 0 0 0 0 0 0 0 74; 0 0 0 0 0 0 0 0 0;%弧容量b=0 2 0 5 6 0 0 0 0; 0 0 7 0 0 3
15、0 0 0; 0 0 0 0 0 0 0 3 0; 0 0 0 0 4 0 7 0 0; 0 2 0 0 0 7 5 0 0; 0 0 3 0 0 0 0 5 4; 0 0 0 0 0 3 0 0 6; 0 0 0 0 0 0 0 0 7; 0 0 0 0 0 0 0 0 0;%弧上单位流量的费用n=9;wf=0;wf0=112; %wf表示最大流量, wf0表示预定的流量值for(i=1:n) for(j=1:n) f(i,j)=0;end;end%取初始可行流f为零流while(1)for(i=1:n)for(j=1:n)if(j=i)a(i,j)=Inf;end;end;end%构造有向
16、赋权图for(i=1:n)for(j=1:n)if(C(i,j)0&f(i,j)=0)a(i,j)=b(i,j);elseif(C(i,j)0&f(i,j)=C(i,j)a(j,i)=-b(i,j);elseif(C(i,j)0)a(i,j)=b(i,j);a(j,i)=-b(i,j);end;end;endfor(i=2:n)p(i)=Inf;s(i)=i;end%用Ford算法求最短路, 赋初值for(k=1:n)pd=1;%求有向赋权图中vs到vt的最短路for(i=2:n)for(j=1:n)if(p(i)p(j)+a(j,i)p(i)=p(j)+a(j,i);s(i)=j;pd=0;
17、end;end;endif(pd)break;end;end%求最短路的Ford算法结束if(p(n)=Inf)break;end%不存在vs到vt的最短路, 算法终止. 注意在求最小费用最大流时构造有向赋权图中不会含负权回路, 所以不会出现k=ndvt=Inf;t=n;%进入调整过程, dvt表示调整量while(1)%计算调整量if(a(s(t),t)0)dvtt=C(s(t),t)-f(s(t),t);%前向弧调整量elseif(a(s(t),t)dvtt)dvt=dvtt;endif(s(t)=1)break;end%当t的标号为vs时, 终止计算调整量t=s(t);end%继续调整前
18、一段弧上的流fpd=0;if(wf+dvtwf0) dvt=wf0-wf;pd=1;end%如果最大流量大于或等于预定的流量值t=n;while(1)%调整过程if(a(s(t),t)0)f(s(t),t)=f(s(t),t)+dvt;%前向弧调整elseif(a(s(t),t) f = 0 25 0 26 61 0 0 0 0 0 0 0 0 0 36 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 26 0 0 0 11 0 0 0 9 41 0 0 0 0 0 0 0 0 0 0 45 0 0 0 0 0 0 0 0 67 0 0 0 0 0 0 0 0 0 0
19、0 0 0 0 0 0 0 0wf = 112zwf = 1708由程序运行结果可得:比最大流少30单位的最小代价流为f,最小代价为1708。方法二在已知流量上限情况下的Lingo最小费用求解sets: nodes/1.9/:; arcs(nodes, nodes): c,b,f; !f为流,c为网络容量,b为费用;endsetsdata:fmax = 112; !流量上界; c=0 25 0 56 61 0 0 0 0 0 0 71 0 0 36 0 0 0 0 0 0 0 0 0 0 34 0 0 0 0 0 49 0 74 0 0 0 24 0 0 0 72 57 0 0 0 0 38
20、0 0 0 0 53 45 0 0 0 0 0 38 0 0 67 0 0 0 0 0 0 0 0 74 0 0 0 0 0 0 0 0 0;b= 0 2 0 5 6 0 0 0 0 0 0 7 0 0 3 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 4 0 7 0 0 0 2 0 0 0 7 5 0 0 0 0 3 0 0 0 0 5 4 0 0 0 0 0 3 0 0 6 0 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 0 0;enddatamin=sum(arcs:b*f);for(nodes(i) | i #ne# 1 #and# i #ne# si
21、ze(nodes): sum(arcs(i,j):f(i,j) - sum(arcs(j,i):f(j,i)=0);sum(arcs(i,j)|i #eq# 1 : f(i,j)=fmax;for(arcs:bnd(0,f,c);练习题20 现在有8个城市,已知两个城市之间的路费如下表,现在有一个人从A城市出发旅行,应该选择怎样的路线才能刚好每个城市都到达一次又回到A城市,其总路费最少?A B C D E F G HABCDEFG 56 35 21 51 60 43 39 21 57 78 70 64 49 36 68 - 70 60 51 61 65 26 13 45 62 53 26 50
22、解答:方法一建立规划模型:先将一般加权连通图转化成一个等价的加权完全图,设当从到时,否则,则得如下模型:利用lingo求解:model:!TSP问题;sets: cities/A,B,C,D,E,F,G,H/:level; link(cities, cities)|&1#ne#&2: w, x;!W距离矩阵;endsetsdata: w= 56 35 21 51 60 43 39 56 21 57 78 70 64 49 35 21 36 68 1000 70 60 21 57 36 51 61 65 26 51 78 68 51 13 45 61 60 70 1000 61 13 53 26
23、 43 64 70 65 45 53 50 39 49 60 26 61 26 50;enddatan=size(cities); min=sum(link(i,j)|i #ne# j: w(i,j)*x(i,j);for(cities(i) : sum(cities(j)| j #ne# i: x(j,i)=1; sum(cities(j)| j #ne# i: x(i,j)=1; for(cities(j)| j #gt# 1 #and# j #ne# i : level(j) = level(i) + x(i,j) - (n-2)*(1-x(i,j) + (n-3)*x(j,i); );
24、);for(link : bin(x);for(cities(i) | i #gt# 1 : level(i)=1+(n-2)*x(i,1););end由程序运行结果可得,从A城市出发旅行,刚好每个城市都到达一次又回到A城市,且总路费最少的路线为:。最少费用为251。方法二(参考)求一个Hamilton圈,构造新圈:由中删掉边和,添加边和而得到,判断:若+0 flag=0; for m=1:L-3 for n=m+2:L-1 if a(c1(m),c1(n)+a(c1(m+1),c1(n+1)0 flag=0; for m=1:L-3 for n=m+2:L-1 if a(c1(m),c1(n
25、)+a(c1(m+1),c1(n+1). a(c1(m),c1(m+1)+a(c1(n),c1(n+1) flag=1; c1(m+1:n)=c1(n:-1:m+1); end end endendsum1=0;for i=1:L-1 sum1=sum1+a(c1(i),c1(i+1);endsum1=sum1+a(c1(8),c1(1)if sum1c(i,k)+c(k,j) c(i,j)=c(i,k)+c(k,j); Path(i,j)=k; end end end end h1=c(2,4); h2=c(2,6); h3=c(2,7); h4=c(2,8); h5=c(2,10);h6=c(4,6);h7=c(4,7);h8=c(4,8);h9=c(4,10); h10=c(6,7); h11=c(6,8); h12=c(6,10); h13=c(7,8); h14=c(7,10); h15=c(8,10);disp(c(2,6);disp(c(4,8);disp(c(7,10);a=
限制150内