图论习题及答案Word下载.docx

上传人:b****6 文档编号:16821486 上传时间:2022-11-26 格式:DOCX 页数:33 大小:195.89KB
下载 相关 举报
图论习题及答案Word下载.docx_第1页
第1页 / 共33页
图论习题及答案Word下载.docx_第2页
第2页 / 共33页
图论习题及答案Word下载.docx_第3页
第3页 / 共33页
图论习题及答案Word下载.docx_第4页
第4页 / 共33页
图论习题及答案Word下载.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

图论习题及答案Word下载.docx

《图论习题及答案Word下载.docx》由会员分享,可在线阅读,更多相关《图论习题及答案Word下载.docx(33页珍藏版)》请在冰豆网上搜索。

图论习题及答案Word下载.docx

ifv(i)>

=max(V_Left)

box_count=box_count+1;

x(i,box_count)=1;

V_Left=[V_LeftV-v(i)];

else

j=1;

while(v(i)>

V_Left(j))

j=j+1;

x(i,j)=1;

V_Left(j)=V_Left(j)-v(i);

temp=find(x(i,:

)==1);

fprintf('

第%d个物品放在第%d个容器\n'

i,temp)

output:

 

第1个物品放在第1个容器

第2个物品放在第2个容器

第3个物品放在第1个容器

第4个物品放在第2个容器

第5个物品放在第2个容器

第6个物品放在第3个容器

解答三:

functionbox_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;

while(j<

=box_count)

ifx(i)>

box(j)

continue;

box(j)=box(j)-x(i);

E(i)=j;

ifj>

box_count

box(box_count)=box(box_count)-x(i);

disp(E);

在命令窗口输入:

>

x=[60,45,35,20,20,20];

FFD(x)

 

121223

ans=

3

练习题5“超市大赢家”提供了50种商品作为奖品供中奖顾客选择,车的容量为1000dm3,奖品i占用的空间为widm3,价值为vi元,具体的数据如下:

vi={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,1}

wi={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}。

问如何装车才能总价值最大。

解答:

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,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);

f(1,i)=v(i)/w(i);

f(2,i)=w(i);

f(3,i)=i;

(n-1)

forj=(i+1):

iff(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;

totalv=0;

a=[];

iff(2,i)<

=limitw

a=[a,f(3,i)];

%disp(f(3,i));

limitw=limitw-f(2,i);

totalv=totalv+f(1,i)*f(2,i);

a

totalv

totalw=totalw-limitw

结果

a=

Columns1through21

10401725281619353782620131124279234114

Columns22through27

2263014247

totalv=

3103

totalw=

1000

练习题8对最后一个求有向圈的示例用matlab程序实现。

H=[01000;

00011;

11100;

00101;

01000];

n=size(H,1);

%顶点个数

p=zeros(1,n);

%存储搜索过的顶点

X=zeros(n,n);

%用来设置禁止矩阵,往回返的时候设置此路已被搜索

k=1;

p

(1)=1;

%第一个点作为初始点开始搜索

whilep

(1)<

=n%每个顶点都作为初始点搜索包含p

(1)的有向圈,

i=p

(1)+1;

%当前点k往后搜索时都是从p

(1)+1开始,从而也可以搜索下标小于k的点

whilei<

=n%还有后续点没有搜索(这些点有可能比当前点k小)

if(H(p(k),i)==1)&

(X(p(k),i)==0)&

isempty(find(p==i))%满足三个条件

k=k+1;

%搜索路径上增加一个点

p(k)=i;

%搜索路径向前延伸一个点

i=i+1;

%当前被搜索点不满足条件,换下一个点

ifi>

n%k点往后的所有点都被搜索

ifH(p(k),p

(1))==1%有圈,每次搜索的都是包含初始点的圈

disp(p(1:

k));

%输出圈

%不管有没有圈,此时k点要往回返

ifk>

1%路径上不止出发点

forj=1:

X(p(k),j)=0;

%取消以前的限制通行

X(p(k-1),p(k))=1;

%增加此路已搜索

p(k)=0;

%撤销路径上的k点

k=k-1;

%返回上一个点作为当前点

else%返回到出发点了

p

(1)=p

(1)+1;

%换下一个出发点(初始点)

运行结果:

1243

245

243

25

练习题9选址问题现准备在7个居民点中设置一银行,路线与距离如下图,问设在哪个点,可使最大服务距离最小?

若设两个点呢?

第一步:

function[D,R]=floyd(A)

%用floyd算法实现求任意两点之间的最短路程。

可以有负权

%参数D为连通图的权矩阵

A=[03infinfinfinfinf

302infinf1.5inf

inf206inf2.54

infinf60infinf3

infinfinfinf01.5inf

inf1.52.5inf1.501.8

infinf43inf1.80

];

D=A;

n=length(D);

n

R(i,j)=i;

%赋路径初值

fork=1:

fori=1:

ifD(i,k)+D(k,j)<

D(i,j)

D(i,j)=D(i,k)+D(k,j);

%更新D(i,j),说明通过k的路程更短

R(i,j)=R(k,j);

%更新R(i,j),需要通过k

hl=0;

ifD(i,i)<

hl=1;

%跳出内层的for循环

if(hl==1)

有负回路'

%跳出最外层循环

D

D=

03.00005.00009.30006.00004.50006.3000

3.000002.00006.30003.00001.50003.3000

5.00002.000006.00004.00002.50004.0000

9.30006.30006.000006.30004.80003.0000

6.00003.00004.00006.300001.50003.3000

4.50001.50002.50004.80001.500001.8000

6.30003.30004.00003.00003.30001.80000

第二步:

对于第一问

在矩阵D中每一个取大得到一列数,再在这列数中取小,

[m,n]=size(D);

p=[];

m

p(i)=max(D(i,:

));

end

ifp(i)==min(p)

disp(i);

min(p)

在顶点6建立银行,最大服务距离最小,最小是4.8.

第三步:

对于第二问

任取两个点做集合,计算每个点到这个集合的最小值,再在这个最小值中取大,即在矩阵D中任取两行,对应比较取小得一向量,将所有这样的向量写成行向量构成一矩阵,然后用问题一的算法程序即可。

a=0;

b=[];

n=size(D,1);

a=a+1;

fork=1:

s{a}=[ij];

b(a,k)=min(D(i,k),D(j,k));

m=size(b,1);

p(i)=max(b(i,:

disp(s{i});

min(p)

结果,在顶点2,4或2,7点建立银行都使得最大服务距离最小,最小值是3

练习题10货物调运已知该地区有生产该物资的企业三家,大小物资仓库八个,国家级储备库两个,其分布情况见下面的附件1。

经核算该物资的运输成本为高等级公路2元/公里•百件,普通公路1.2元/公里•百件,假设各企业、物资仓库及国家级储备库之间的物资可以通过公路运输互相调运,请给出各个仓库应该从哪个企业调运。

首先建立各个交汇点的距离矩阵m。

然后建立函数文件。

%各仓库到各企业的最小运费

functionmin_spend(m)

c=[28,23,35,31,22,36,29,38];

%仓库

cc=[27,30];

%国家储存库

C=[c,cc];

g=[8,15,11,27,7,10,17,14,28,16,18,25,6,5,39,35,13,40,4,29];

%高级公路上的点

n=length(g);

A=zeros(42);

42

ifm(i,j)~=0

A(i,j)=1.2*m(i,j);

%普通公路上每百件的运费

A(i,j)=inf;

A(g(i),g(j))=2*A(g(i),g(j))/1.2;

%高级公路上每百件的运费

A(i,i)=0;

[D,R]=floyd(A);

10

3

X(i,j)=D(C(i),q(j));

[XX,INDEX]=min(X'

min_spend(m)

XX=

69.6000150.0000147.600090.0000156.0000174.0000189.6000111.6000120.0000122.4000

INDEX=

2133132313

XX为从各个仓库到三个企业中的最小费用,INDEX为最小费用的企业。

练习题14最小代价流将上题容量网络的边上增加另一个权数----代价,变为具有代价的容量网络,单位代价为容量数的十位上的数字,求比最大流少30单位的最小代价流。

由上题结果可知,最大流为142,则最小代价流的流量应该为112。

用迭代算法,预定流量值wf0=112。

方法一:

C=[025056610000;

00710036000;

0000000340;

00004907400;

024000725700;

003800005345;

00000380067;

0000000074;

000000000];

%弧容量

b=[020560000;

007003000;

000000030;

000040700;

020007500;

003000054;

000003006;

000000007;

%弧上单位流量的费用

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%构造有向赋权图

n)if(C(i,j)>

0&

f(i,j)==0)a(i,j)=b(i,j);

elseif(C(i,j)>

f(i,j)==C(i,j))a(j,i)=-b(i,j);

0)a(i,j)=b(i,j);

a(j,i)=-b(i,j);

for(i=2:

n)p(i)=Inf;

s(i)=i;

end%用Ford算法求最短路,赋初值

for(k=1:

n)pd=1;

%求有向赋权图中vs到vt的最短路

for(i=2:

n)if(p(i)>

p(j)+a(j,i))p(i)=p(j)+a(j,i);

s(i)=j;

pd=0;

if(pd)break;

end%求最短路的Ford算法结束

if(p(n)==Inf)break;

end%不存在vs到vt的最短路,算法终止.注意在求最小费用最大流时构造有向赋权图中不会含负权回路,所以不会出现k=n

dvt=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)<

0)dvtt=f(t,s(t));

end%后向弧调整量

if(dvt>

dvtt)dvt=dvtt;

if(s(t)==1)break;

end%当t的标号为vs时,终止计算调整量

t=s(t);

end%继续调整前一段弧上的流f

pd=0;

if(wf+dvt>

wf0)dvt=wf0-wf;

pd=1;

end%如果最大流量大于或等于预定的流量值

t=n;

while

(1)%调整过程

0)f(s(t),t)=f(s(t),t)+dvt;

%前向弧调整

0)f(t,s(t))=f(t,s(t))-dvt;

end%后向弧调整

end%当t的标号为vs时,终止调整过程

if(pd)break;

end%如果最大流量达到预定的流量值

wf=0;

for(j=1:

n)wf=wf+f(1,j);

end%计算最大流量

zwf=0;

n)zwf=zwf+b(i,j)*f(i,j);

end%计算最小费用

f%显示最小费用最大流

wf%显示最小费用最大流量

zwf%显示最小费用

f=

025026610000

0000036000

000000000

0000002600

01100094100

0000000045

0000000067

wf=

112

zwf=

1708

由程序运行结果可得:

比最大流少30单位的最小代价流为f,最小代价为1708。

方法二

在已知流量上限情况下的Lingo最小费用求解

sets:

nodes/1..9/:

;

arcs(nodes,nodes):

c,b,f;

!

f为流,c为网络容量,b为费用;

endsets

data:

fmax=112;

流量上界;

c=025056610000

00710036000

0000000340

00004907400

024000725700

003800005345

00000380067

0000000074

000000000;

b=020560000

007003000

000000030

000040700

020007500

003000054

000003006

000000007

enddata

min=@sum(arcs:

b*f);

@for(nodes(i)|i#ne#1#and#i#ne#@size(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城市,其总路费最少?

ABCDEFGH

A

B

C

E

F

G

56352151604339

215778706449

3668---7060

51616526

134562

5326

50

方法一

建立规划模型:

先将一般加权连通图转化成一个等价的加权完全图,设当从

时,

,否则,

,则得如下模型:

利用lingo求解:

model:

!

TSP问题;

cities/A,B,C,D,E,F,G,H/:

level;

link(cities,cities)|&

1#ne#&

2:

w,x;

W距离矩阵;

w=56352151604339

56215778706449

3521366810007060

21573

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 交通运输

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1