图与网络模型实验
a=zeros(6); %邻接矩阵初始化 a(1,2)=50;a(1,4)=40;a(1,5)=25;a(1,6)=10; a(2,3)=15;a(2,4)=20;a(2,6)=25;a(3,4)=10;a(3,5)=20; a(4,5)=10;a(4,6)=25;a(5,6)=55; a=a; b=sparse(a)
2018/9/28 数学建模1
图与网络模型实验
1. 邻接矩阵表示法 邻接矩阵是表示顶点之间相邻关系的矩阵,邻接矩 阵记作W = ( wij )n´ n ,当G 为赋权图时 ì ï ï 权值,当vi 与v j 之间有边时, wij = í ï 0或¥ ,当vi 与v j 之间无边时. ï ï î 当G 为非赋权图时, ì ï ï 1,当vi 与v j 之间有边时, wij = í ï 0,当v i 与v j 之间无边时. ï ï î 采用邻接矩阵表示图,直观方便,通过查邻接矩阵元
v1
v2
v3
v4
v5
u5
2018/9/28
u4
u3
数学建模1
u2
u1
• 根据题意,人不在场时,狼要吃羊,羊要 吃菜,因此,人不在场时,不能将狼与羊, 羊与蔬菜留在河的任一岸。例如,状态(0, 1,1,0)表示人和菜在对岸,而狼和羊在 此岸,这时人不在场狼要吃羊,因此,这 个状态是不可行的。
• 通过穷举法将所有可行的状态列举出来,可行的状 态有(1,1,1,1),(1,1,1,0),(1,1, 0,1),(1,0,1,1),(1,0,1,0),(0, 1,0,1),(0,1,0,0),(0,0,1,0), (0,0,0,1),(0,0,0,0)可行状态共有十 种。每一次的渡河行为改变现有的状态。现构造赋 权图 ,其中顶点集合 中的顶点(按照上面的顺序 编号)分别表示上述十个可行状态,当且仅当对应 的两个可行状态之间存在一个可行转移时两顶点之 间才有边连接,并且对应的权重取为1,当两个顶 点之间不存在可行转移时,可以把相应的权重取为 inf 。
h = view(biograph(b,[],'ShowArrows','off','ShowWeights','off'))
2018/9/28
数学建模1
实验项目名称: 图论模型MATLAB软件预处理
• 实验目的与原理:掌握图与网络在计算机 中数据存取方法,将图与网络转化为领接 矩阵、稀疏矩阵等多种方法,矩阵的各种 读写方式。
赋权图G 之间的状态转移关系见图 4.8,最终求得的 状态转移顺序为 1 6 3 7 2 8 5 10 , 经过 7 次渡河就可以把狼,羊,蔬菜运过河,第一次运 羊过河,空船返回;第二次运菜过河,带羊返回;第三 次运狼过河,空船返回;第四次运羊过河。
Node 6 Node 7 Node 9 Node 8 Node 10
最短路问题软件求解
(1)用狄克斯屈拉算法写代码 (2)用逐次逼近法写代码 (3)用graphshortestpath() (4)0-1线性整数规划模型 x = intlinprog(f,intcon,A,b,Aeq,beq,lb,ub,options) x = bintprog(f, A, b, Aeq, beq)
Node 1
Node 3
Node 2
Node 4
Node 5
图 4.8 可行状态之间的转移
clc, clear a=[1 1 1 1;1 1 1 0;1 1 0 1;1 0 1 1;1 0 1 0 0 1 0 1;0 1 0 0;0 0 1 0;0 0 0 1; 0 0 0 0]; %每一行是一个可行状态 b=[1 0 0 0;1 1 0 0;1 0 1 0;1 0 0 1]; %每一行是一个转移状态 w=zeros(10); %邻接矩阵初始化 for i=1:9 for j=i+1:10 for k=1:4 if findstr(mod(a(i,:)+b(k,:),2),a(j,:)) w(i,j)=1; end end end end w=w'; %变成下三角矩阵 [i,j,v]=find(w); %找非零元素 c=sparse(i,j,v,10,10) %构造稀疏矩阵 [x,y,z]=graphshortestpath(c,1,10,'Directed',false) % 该图是无向图 h = view(biograph(c,[],'ShowArrows','off','ShowWeights','off')); Edges = getedgesbynodeid(h); %提取句柄h中的边集 set(Edges,'LineColor',[0 0 0]); %为了将来打印清楚,边画成黑色 set(Edges,'LineWidth',1.5); %线型宽度设置为1.5
2018/9/28
数学建模1
• 定义: • 1)人—M(Man),狼—W(Wolf), 羊—G (Goat), 草—H(Hay) • 2) 点—— vi 表示河岸的状态 • 3) 边—— ek 表示由状态 vi 经一次渡河到状 态 vj • 4) 权——边 ek 上的权定为 1
我们可以得到下面的加权有向图
渡河游戏 • 一老汉带了一只狼、一只羊、一棵白菜想要 从南岸过河到北岸,河上只有一条独木舟, 每次除了人以外,只能带一样东西;另外, 如果人不在,狼就要吃羊,羊就要吃白菜, 问应该怎样安排渡河,才能做到既把所有东 西都运过河去,并且在河上来回次数最少? 这个问题就可以用求最短路方法解决。
实验内容与步骤:
• 因此问题变为在图 中寻找一条由初始状态(1, 1,1,1)出发,经最小次数转移达到最终状态 (0,0,0,0)的转移过程,即求从状态(1, 1,1,1)到状态(0,0,0,0)的最短路径。 这就将问题转化成了图论中的最短路问题。 • 该题的难点在于计算邻接矩阵,由于摆渡一次 就改变现有的状态,为此再引入一个四维状态 转移向量,用它来反映摆渡情况。用1表示过河, 0表示未过河。例如,(1,1,0,0)表示人带 狼过河。状态转移只有四种情况,用如下的向 量表示(1,0,0,0),(1,1,0,0),(1, 0,1,0),(1,0,0,1)。
素的值可以很容易地查找图中任两个顶点 v i 和 v j 之间有无 边,以及边上的权值。当图的边数 m 远小于顶点数 n 时, 邻接矩Байду номын сангаас表示法会造成很大的空间浪费。
4. 稀疏矩阵表示法 稀疏矩阵是指矩阵中零元素很多,非零元素很少的矩 阵。对于稀疏矩阵,只要存放非零元素的行标、列标、非零 元素的值即可,可以按如下方式存储(非零元素的行地址, 非零元素的列地址) ,非零元素的值。
最短路问题
2018/9/28
数学建模1
• 状态说明: • v1,u1 =( M,W,G,H ); v2,u2 =(M,W,G); v3,u3 =(M,W,H); 此游戏转化为在下面的二部图中求从 v 到 u 的最短路问题。 • v4,u4=(M,G,H); v5,u5 =(M,G)
1 1
最短路问题
在 Matlab 中无向图和有向图邻接矩阵的使用上有很 大差异。 对于有向图,只要写出邻接矩阵,直接使用 Matlab 的命令 sparse 命令, 就可以把邻接矩阵转化为稀疏矩阵的 表示方式。
对于无向图, 由于邻接矩阵是对称阵, Matlab 中只 需使用邻接矩阵的下三角元素,即 Matlab 只存储邻接 矩阵下三角元素中的非零元素。 稀疏矩阵只是一种存储格式。 Matlab 中, 普通矩阵 使用 sparse 命令变成稀疏矩阵, 稀疏矩阵使用 full 命令 变成普通矩阵。
= {v s , v1 ,L , v5 , vt } 中
?
8 3 0 .
clc, clear a=zeros(7); a(1,2)=4; a(1,3)=2; a(2,3)=3; a(2,4)=2; a(2,5)=6; a(3,4)=5; a(3,6)=4; a(4,5)=2; a(4,6)=7; a(5,6)=4; a(5,7)=8; a(6,7)=3; b=sparse(a); %构造稀疏矩阵,这里给出构造稀疏矩阵 的另一种方法 [x,y,z]=graphshortestpath(b,1,7,'Directed',true,'Method',' Dijkstra') % Directed是有向的 h=view(biograph(b,[],'ShowArrows','on','ShowWeights','o n'))
例 4.11 度。
求图 4.9 所示有向图中 v s 到 v t 的最短路径及长
v1
4
6
2
2
v4
8
vs
2
3
5
v3
4
4
7
vt
3
v2
v5
图 4.9 有向图的最短路
解 该赋权有向图中顶点集V 总共有 7 个顶点,邻接矩阵 轾 0 4 2 ゥ ゥ 犏 犏 ゥ 0 3 2 6 犏 犏 ゥ 0 5 ゥ 4 犏 W= 犏 ゥ ゥ 0 2 7 犏 犏 ゥ ゥ 0 4 犏 犏 ゥ ゥ ? 0 犏 犏 ゥ ゥ ゥ 臌
2018/9/28
数学建模1
S=[1 1 2 2 3 3 4 4 4 4 5 6 6 7 8]; %起始节点向量 E=[2 3 5 4 4 6 5 7 8 6 7 8 9 9 9]; %终止节点向量 W=[1 2 12 6 3 4 4 15 7 2 7 7 15 3 10]; %边权值向量,有向 图,G(9,9)=0; 9个节点 G=sparse(S,E,W); %关联矩阵的稀疏矩阵表示 G(9,9)=0; P=biograph(G,[],'ShowWeights','on');%建立有向图对象P H=view(P);%显示各个路径权值 [Dist,Path]=graphshortestpath(G,1,9,'Method','Dijkstra') % 求节点1到节点9的最短路径 set(H.Nodes(Path),'Color',[1 0.4 0.4]);%以下三条语句用红 色修饰最短路径 edges=getedgesbynodeid(H,get(H.Nodes(Path),'ID')); set(edges,'LineColor',[1 0 0]); set(edges,'LineWidth',2.0);