数学建模

数学建模笔记—图和网络(一)

图的基本存储结构

  • 图的一些概念
    无向图/有向图/;出度/入度;子图/母图等等。
  1. 邻接矩阵表示法
    邻接矩阵表示法是将图以邻接矩阵(adjacency matrix)的形式存储在计算机中。也就是说,如果两节点之间有一条弧,则邻接矩阵中对应的元素为 1;否则为 0。可以看出,这种表示法非常简单、直接。但是,在邻接矩的所有2n 个元素中,只有 m个为非零元。如果网络比较稀疏,这种表示法浪费大量的存储空间,从而增加了在网络中查找弧的时间。
    一个有向图
    该有向图用邻接矩阵表示就如下图所示:
    在这里插入图片描述
    同样,对于网络中的权,也可以用类似邻接矩阵的 n n × 矩阵表示。只是此时一条弧所对应的元素不再是 1,而是相应的权而已。如果网络中每条弧赋有多种权,则可以用多个矩阵表示这些权。

  2. 关联矩阵表示法
    关联矩阵表示法是将图以关联矩阵(incidence matrix)的形式存储在计算机中.
    B=(bij)n*m∈{0,-1,1};
    也就是说,在关联矩阵中,每行对应于图的一个节点,每列对应于图的一条弧。如果一个节点是一条弧的起点,则关联矩阵中对应的元素为 1;如果一个节点是一条弧的终点,则关联矩阵中对应的元素为 -1 ;如果一个节点与一条弧不关联,则关联矩阵中对应的元素为 0。对于简单图,关联矩阵每列只含有两个非零元(一个 +1,一个-1 )。
    可以看出,这种表示法也非常简单、直接。但是,在关联矩阵的所有 nm 个元素中,只有 2m 个为非零元。如果网络比较稀疏,这种表示法也会浪费大量的存储空间。但由于关联矩阵有许多特别重要的理论性质,因此它在网络优化中是非常重要的概念。

  3. 邻接表表示法
    而对每个节点,它的邻接表就是它的所有出弧。邻接表表示法就是对图的每个节点,用一个单向链表列出从该节点出发的所有弧,链表中每个单元对应于一条出弧。为了记录弧上的权,链表中每个单元除列出弧的另一个端点外,还可以包含弧上的权等作为数据域。图的整个邻接表可以用一个指针数组表示。如图所示:
    在这里插入图片描述

例题解析

1.求一个城市到其他地区的最短路径

票价如下:

matlab代码如下

//清除全屏以及所有数据
clc,clear
a=zeros(6);//建立6x6的零矩阵
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+a';  // a‘为矩阵的转置
a(find(a==0))=inf;//将矩阵中原来为0的部分变为无穷大
//行向量 pb 、index1、index2、d 分别用来存放 P 标号信息、标号顶点顺序、标号顶点索引、最短通路的值。
pb(1:length(a))=0;pb(1)=1;index1=1;index2=ones(1,length(a));
d(1:length(a))=inf;d(1)=0;temp=1;
//index2存放始点到第i点最短通路中第i顶点前一顶点的序号,d存放由始点到第 i 点最短通路的值。
while sum(pb)<length(a)
tb=find(pb==0);
d(tb)=min(d(tb),d(temp)+a(temp,tb));
tmpb=find(d(tb)==min(d(tb)));
temp=tb(tmpb(1));
pb(temp)=1;
index1=[index1,temp];
temp2=find(d(index1)==d(temp)-a(temp,index1));
index2(temp)=index1(temp2(1));
end
d, index1, index2

matlab中while执行一次结果

2.求在一个神经网络中两点的最短距离

在图 3 中,用点表示城市,现有 A,B1,B2,C1,C2,C3,D共 7 个城市。点与点之间的连线表示城市间有道路相连。连线旁的数字表示道路的长度。现计划从城市 A到城市 D 铺设一条天然气管道,请设计出最小价格管道铺设方案。
图三

编写lingo程序如下:

model:
sets:
cities/A,B1,B2,C1,C2,C3,D/;
roads(cities,cities)/A B1,A B2,B1 C1,B1 C2,B1 C3,B2 C1,
B2 C2,B2 C3,C1 D,C2 D,C3 D/:w,x;
endsets
data:
w=2 4 3 3 1 2 3 1 1 3 4;
enddata
n=@size(cities); !城市的个数;
min=@sum(roads:w*x);
@for(cities(i)|i #ne#1 #and# i #ne#n:
@sum(roads(i,j):x(i,j))=@sum(roads(j,i):x(j,i)));
@sum(roads(i,j)|i #eq#1:x(i,j))=1;
@sum(roads(i,j)|j #eq#n:x(i,j))=1;
end

3.神经网络不为有向图的两点最短路径求解

(无向图的最短路问题)求图 4 中V1到V11的最短路径。
图四

下面展示 lingo代码片

model:
sets:
cities/1..11/;
roads(cities,cities):w,x;
endsets
data:
w=0;
enddata
calc:
w(1,2)=2;w(1,3)=8;w(1,4)=1;
w(2,3)=6;w(2,5)=1;
w(3,4)=7;w(3,5)=5;w(3,6)=1;w(3,7)=2;
w(4,7)=9;
w(5,6)=3;w(5,8)=2;w(5,9)=9;
w(6,7)=4;w(6,9)=6;
w(7,9)=3;w(7,10)=1;
w(8,9)=7;w(8,11)=9;
w(9,10)=1;w(9,11)=2;w(10,11)=4;
@for(roads(i,j):w(i,j)=w(i,j)+w(j,i));
@for(roads(i,j):w(i,j)=@if(w(i,j) #eq# 0, 1000,w(i,j)));
endcalc
n=@size(cities); !城市的个数;
min=@sum(roads:w*x);
@for(cities(i)|i #ne#1 #and# i #ne#
n:@sum(cities(j):x(i,j))=@sum(cities(j):x(j,i)));
@sum(cities(j):x(1,j))=1;
@sum(cities(j):x(j,1))=0; !不能回到顶点1;
@sum(cities(j):x(j,n))=1;
@for(roads:@bin(x));
end

与无向图的代码编写来比对的话,可以看出只是多了一行代码表示:从顶点1离开后不得再回到该顶点

@sum(cities(j):x(j,1))=0 
  • 17
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值