数学建模(八) 图与网络模型

继续划重点。然而我觉得这种模型的话用python就很便捷,但这里先从matlab说起吧(我需要看一下真题有没有大数据量的网络模型)。
图论 (Graph theory) 以图为研究对象, 研究顶点和边组成的图形的数学理论和方法.图论中的图是由若干给定的顶点及连接两顶点的边所构成的图形。
图论中的图通常用来描述某些事物之间的某种特定关系,用顶点代表事物,用边表示相应两个事物间的关系。
表示可以用邻接矩阵;G 中 与 v 关 联 的 边 数,(度)dG(v) = (出度)d−(v) + (入度)d+(v)。
一些指标:点度中心度,接近中心度,中间中心度,特征向量中心度。

matlab有自带的图论工具箱,一些常用函数如下:

函数名 功能
graphallshortestpaths 求图中所有顶点对之间距离
graphconnredcomp 找无 (有) 向图的 (强/弱) 连通分支
graphisreddag 测试有向图是否含有边
graphisomorphism 确定一个图是否含有生成树
graphmaxflow 计算有向图的最大流
graphminspantree 在图中找最小生成树
graphpred2path 把前驱顶点序列变成路径的顶点序列
graphshortestpath 从指定一堆顶点间的最短路径和距离
graphtopoorder 指定有向无圈图的拓扑排序
graphtraverse 求从一顶点出发所能遍历的图中顶点

网络分析工具箱:https://github.com/aeolianine/octave-networks-toolbox
这个函数更多一点。

1.最短路径问题

无向图:

w = [0 0 0 0 0 0    % a
     2 0 0 0 0 0    % b
     3 6 0 0 0 0    % c
     0 5 0 0 0 0    % d
     0 3 1 1 0 0    % e
     0 0 0 2 4 0];  % f
W = sparse(w);      % 将满矩阵转化为稀疏矩阵
                    % 对于无向图,'Directed'属性设为0
[Dist,Path] = graphshortestpath(W, 1, 6,'Directed',0); %求1~6的最短路径
Dist =

       7       


Path =

  1 至 4 列

       1              3              5              4       

  5 列

       6   

有向图:

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

全部结点间:

w = [ 0 2 3 inf inf inf 		% w(i; j) 表示顶点 i 和 j 间的边权
	   inf 0 6 5 3 inf
	   inf inf 0 inf 1 inf
	   inf inf inf 0 inf 2
       inf inf inf 1 0 4
	   inf inf inf inf inf 0];
W = sparse(w); % 将 满 矩 阵 转 化 为 稀 疏 矩 阵
d = graphallshortestpaths(W);
d =

  1 至 4 列

       0              2              3              5       
       1/0            0              6              4       
       1/0            1/0            0              2       
       1/0            1/0            1/0            0       
       1/0            1/0            1/0            1       
       1/0            1/0            1/0            1/0     

  5 至 6 列

       4              7       
       3              6       
       1              4       
       1/0            2       
       0              3       
       1/0            0       

2.最小生成树

w = [ 0   4  inf  5  inf  3          % w(i,j)表示顶点i和j间的边权
      4   0   5  inf  3   3
     inf  5   0   5   3  inf
      5  inf  5   0   2   4
     inf  3   3   2   0   1
      3   3  inf  4   1   0];

W = sparse(w);                       % 将满矩阵转化为稀疏矩阵
[ST, pred] = graphminspantree(W)
ST =

   (6,1)          3       
   (6,2)          3       
   (5,3)          3       
   (5,4)          2       
   (6,5)          1       

3.1 最大流问题

C = [ 0 16 0 13 0 0 % 容量矩阵
		0 0 12 0 0 0 % x
 		0 0 0 9 0 20 % y
 		0 4 0 0 14 0 % u
 		0 0 7 0 0 4 % v
 		0 0 0 0 0 0]; % t
c = sparse(C); % 将 满 矩 阵 转 化 为 稀 疏 矩 阵
[fmax ,flow] = graphmaxflow(c, 1, 6, 'method', 'Edmonds')

3.2 最小费用流问题

用线性规划求解:

M = [-1 -1 0 0 0 0 0 0 0 % s
	3 1 0 -1 0 0 1 0 0 0 % x
	4 0 0 1 -1 -1 0 0 1 0 % y
	5 0 1 0 1 0 -1 -1 0 0 % u
	6 0 0 0 0 0 0 1 -1 -1 % v
	7 0 0 0 0 1 0 0 0 1] % t

C = [ 2 8 2 1 6 5 3 4 7]; % min C * flow% 目 标 函 数 为 总 费 用 最 小

f = 23; % 指 定 网 络 流 量

A = []; % 不 等 式 约 束: A * flow < b
b = []; % 没 有 等 式 约 束 , 所 以A, B 都 为[]

Aeq = M;   % 等 式 约 束: Aeq * flow = beq
beq = [-f 0 0 0 0 f]';

lb= [ 0 0 0 0 0 0 0 0 0]'; % 下 界: flow ≥ lb
ub= [16 13 12 9 20 4 14 7 4]'; % 上 界: flow ≤ ub
flow = linprog(C, A, b, Aeq, beq, lb, ub);
cost = C*flow;

最小哈密顿回路(TSP)问题:函数minhamiltonpath()这里不粘了,可直接调,瞬间觉得模拟退火和遗传算法白学了有没有,没有,因为这里用的函数我没太看懂,原理是整数规划。

4.灾情巡视(1998B)

这里讲一道适合用matlab做的真题,敲黑板!!!

5.network-pagerank

pagerank的原理这里我不想介绍了,下面是粘来的一段:例如 2014 年美国大学生数学建模竞赛 C 题 “Using Networks to Measure Influence and Impact”[51], 该题要求参赛者建立起学者 Paul Erdos 及其超过 500 个共同合作者的合作关系网络, 并据此来找出该网络中最有影响力的人。另一些赛题看起来并不是一个网络问题, 但仍可以应用网络模型来对个体进行评价或排序. 例如 2014 年美国大学生数学建模竞赛 B题 “College Coaching Legends”, 该题要求参赛者建立数学模型找出上个世纪三种体育项目中最好的五名大学体育教练. 这是一个典型的评价问题, 常规思路是找出能反映教练水平的因素并量化, 然后确定各自的权重并进行加权, 以此来评价每一个教练, 最后根据评分来对教练排名. 当年几乎所有特等奖论文都是这种思路, 但其中一篇来自 NC School of Science and Mathematics的特等奖论文 [52] 却另辟蹊径, 作者根据教练们所执教的体育队间的比赛胜负关系, 建立起有向图网络. 每个节点表示一个参赛队, 如果 A 队战胜了 B 队, 则有一条边从 A 指向 B. 然后根据建立的网络求节点的特征向量中心度来确定每个参赛队的水平, 并通过模型把教练水平从参赛队的表现中分离出来, 最终得到教练水平并进行排名。
简单来说我觉得这种模型我不会选,硬要做也要用python,14B的论文我看过后觉得用python比较合适,主要是数据量较大(原作者用的就是python,国内一作者用matlab实现了一遍),A的话我也无法想象500个点的图用matlab,没有别的原因,就是难受。
这里粘一个python的networkx工具包:https://github.com/networkx/networkx

你可能感兴趣的:(数学建模(八) 图与网络模型)