网络优化|单源最短路|Dijkstra|Floyd|Matlab

图和网络可以用来描述集合元素和元素之间关系。大量的最优化问题都可以抽象为网络模型加以解释,描述和求解。
图与网络模型在建模时具有直观、易理解、适应性强等,广泛应用在管理科学、物理学、化学、计算机科学、信息论、控制论、社会科学以及军事科学等领域。
一些实际网络,如运输网络、电话网络、电力网络、计算机网络、社交媒体网络等,都可以用图的理论加以描述和分析,并借助计算机算法直接求解。
图与网络理论和线性规划、整数规划等最优化理论和方法相互渗透,促进了图论方法在实际问题建模中的应用。

在数学建模竞赛中,图论与网络模型也是比较常见的一种模型,它经常和其他模型结合共同完成建模任务。例如:
1998B灾情巡视路线
2001B公交车调度
2007B乘公交,看奥运
2011B交巡警服务平台的设置与调度
2013B碎纸片的拼接复原
2021B穿越沙漠等赛题就采用了图论相关模型和算法来分析建模和求解

图与网络基础

图的概念与表示

一个图主要由两部分组成。元素构成的顶点集,和元素之间关系构成的边集
(点)
我们把元素画成一个小圆圈,若两个元素之间存在某种关系,就用一条线段连接这两个小圆圈,这个线段就称为是这两点之间的边
图的表示方法有很多,例如集合法、画图法、矩阵表示邻接表等。

图的集合表示与画图表示

![[Pasted image 20240825085306.png]]

集合表示为
V ( G ) = { v 1 , v 2 , v 3 , v 4 , v 5 } V(G)=\left\{ v_{1},v_{2},v_{3},v_{4},v_{5} \right\} V(G)={v1,v2,v3,v4,v5}
E ( G ) = { e 1 , e 2 , e 3 , e 4 , e 5 , e 6 } E(G)=\left\{ e_{1},e_{2},e_{3},e_{4},e_{5},e_{6} \right\} E(G)={e1,e2,e3,e4,e5,e6}
其中
e 1 = v 1 v 2 ,   e 2 = v 2 v 3 ,   e 3 = v 3 v 5 e_{1}=v_{1}v_{2},\ e_{2}=v_{2}v_{3},\ e_{3}=v_{3}v_{5} e1=v1v2, e2=v2v3, e3=v3v5
e 4 = v 4 v 1 ,   e 5 = v 4 v 5 ,   e 6 = v 5 v 1 e_{4}=v_{4}v_{1},\ e_{5}=v_{4}v_{5},\ e_{6}=v_{5}v_{1} e4=v4v1, e5=v4v5, e6=v5v1
![[Pasted image 20240825085825.png]]
![[Pasted image 20240825090008.png]]

赋权图(网络)
每条边都有一个非负实数对应的图,这个实数称为这条边的权
![[Pasted image 20240825090030.png]]

子图,生成图,生成子图
点集包含在另一个图的点集里面,边集也包含在另一个图的边集里面
生成子图,包含另一个图的所有顶点
![[Pasted image 20240825090228.png]]

顶点的度:依附于某个顶点的边的数目
正则图:所有顶点的度都相同
![[Pasted image 20240825090914.png]]

二部(分)图:所有顶点可以分为不相交的两个集合。
![[Pasted image 20240825090933.png]]

![[Pasted image 20240825091006.png]]

W = v 0 e 1 v 1 e 2 … e k v k W=v_{0}e_{1}v_{1}e_{2}\dots e_{k}v_{k} W=v0e1v1e2ekvk,其中
v i ∈ V , i ∈ { 0 , 1 , 2 , … , k } ,   e j ∈ E ,   j ∈ { 1 , 2 , … , k } v_{i}\in V,i\in \left\{ 0,1,2,\dots,k \right\},\ e_{j}\in E,\ j\in \left\{ 1,2,\dots,k \right\} viV,i{0,1,2,,k}, ejE, j{1,2,,k}
e i e_{i} ei v i − 1 v_{i-1} vi1 v i v_{i} vi关联,称W是图G的一条道路(walk)
简称路,k为路长, v 0 v_{0} v0为起点, v k v_{k} vk为终点各边相异的道路称为迹(trail);
各顶点相异的道路称为轨道(path);
起点和终点重合的道路称为回路;
起点和终点重合的轨道称为圈。

在无向图中,
如果从顶点u到顶点v存在道路,则称顶点u和v是连通的。
如果图中的任意两个顶点u和v都是连通的,则称图是连通图,否则称为非连通图。
非连通图中的连通子图,称为连通分支
![[Pasted image 20240825091708.png]]

在有向图中,如果从顶点u到顶点v存在有向道路,则称顶点u和v是连通的。
如果图中的任意两个顶点u和v都是连通的,则称图是强连通图。
若忽略边方向后得到的无向图是连通的,则称为是弱连通图
![[Pasted image 20240825091846.png]]

图和网络的矩阵表示

图和网络的表示有很多种,最直观的是图示法
图示法不方便用计算机处理,因此图和网络经常表示成矩阵形式,方便计算机存储和计算
常用矩阵表示:邻接矩阵和边权矩阵

图的邻接矩阵

A i j = { 1 , 如果 v i 和 v j 相邻 0 , 否则 A_{ij}=\left\{\begin{matrix} 1,\quad 如果v_{i}和v_{j}相邻 \\ 0,\quad 否则 \end{matrix}\right. Aij={1,如果vivj相邻0,否则
A = ( 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 ) A=\begin{pmatrix} 0&&1&&1&&0 \\ 0&&0&&0&&1 \\ 0&&0&&0&&0 \\ 1&&0&&0&&0 \end{pmatrix} A= 0001100010000100
![[Pasted image 20240825092632.png]]

A = ( 0 1 0 1 1 1 0 1 0 0 0 1 0 0 1 1 0 0 0 1 1 0 1 1 0 ) A=\begin{pmatrix} 0&& 1&& 0&&1&&1 \\ 1&&0&&1&&0&&0 \\ 0&&1&&0&&0&&1 \\ 1&&0&&0&&0&&1 \\ 1&&0&&1&&1&&0 \end{pmatrix} A= 0101110100010011000110110
![[Pasted image 20240825092818.png]]

赋权图的邻接矩阵

对赋权图,其邻接矩阵 W = ( w i j ) n × n W=(w_{ij})_{n\times n} W=(wij)n×n,其中
w i j = { 顶点 v i 和 v j 之间的边的权值 ,   v i v j ∈ E 0 , 或 ∞ , v i v j ∉ E w_{ij}= \left\{\begin{matrix} 顶点v_{i}和v_{j} 之间的边的权值,\ v_{i}v_{j}\in E \\ 0, 或\infty,\qquad v_{i}v_{j} \not\in E \end{matrix}\right. wij={顶点vivj之间的边的权值, vivjE0,,vivjE
![[Pasted image 20240825094253.png]]

W = ( 0 1 2 ∞ ∞ ∞ 1 0 3 5 ∞ ∞ 2 3 0 ∞ 4 ∞ ∞ 5 ∞ 0 3 2 ∞ ∞ 4 3 0 1 ∞ ∞ ∞ 2 1 0 ) W=\begin{pmatrix} 0&&1&&2&&\infty&&\infty&&\infty \\ 1&&0&&3&&5&&\infty&&\infty \\ 2&&3&&0&&\infty&&4&&\infty \\ \infty&&5&&\infty&&0&&3&&2 \\ \infty&&\infty&&4&&3&&0&&1 \\ \infty&&\infty&&\infty&&2&&1&&0 \end{pmatrix} W= 0121035230450324301210

赋权图的边权矩阵

![[Pasted image 20240825095057.png]]

B = ( 1 1 2 2 3 4 4 5 2 3 3 4 5 5 6 6 1 2 3 5 4 3 2 1 ) B=\begin{pmatrix} 1&&1&&2&&2&&3&&4&&4&&5 \\ 2&&3&&3&&4&&5&&5&&6&&6 \\ 1&&2&&3&&5&&4&&3&&2&&1 \end{pmatrix} B= 121132233245354453462561

单源最短路问题

最短路问题

构造网络中两点间的最短路就是找到连接这两个点的路径中所有边的权值之和为最小的通路
注意:在有向图中,通路中所有的弧应是首尾相连的。
应用背景
管道铺设、线路安排、厂区布局、设备更新等
单源最短路问题就是求从一个点出发,到网络其他各点的最短路

单源最短路问题

![[Pasted image 20240825103344.png]]

单源最短路问题就是求从一个点出发,到网络其他各点的最短路

Dijkstra算法

本算法由Dijkstra在1959年提出,可用于求解指定两点间的最短路,或从指定点到其余各点的最短路。目前被认为是求无负权网络最短路问题的最好方法。算法思路基于以下原理:
若序列 { v s , v 1 , … , v n − 1 , v n } \left\{ v_{s},v_{1},\dots,v_{n-1},v_{n} \right\} {vs,v1,,vn1,vn}是从 v s v_{s} vs v n v_{n} vn的最短路,则序列 v s , v 1 … , v n − 1 {v_{s},v_{1}\dots,v_{n-1}} vs,v1,vn1是从 v s v_{s} vs v n − 1 v_{n-1} vn1的最短路。
此算法采用标号法,可用两种标号:T标号(试探性)与P标号(永久性)
v i v_{i} vi点一个P标号表示从 v s v_{s} vs v i v_{i} vi点的最短路权, v i v_{i} vi点的标号不再改变。
v i v_{i} vi点一个T标号时,表示从 v s v_{s} vs v i v_{i} vi的估计最短路的上界,是一种临时标号,凡没有得到P标号的都有T标号。

算法步骤
  1. v s v_{s} vs P P P标号, P ( V s = 0 ) P(V_{s}=0) P(Vs=0),其余各点均给 T T T标号, T ( v ) = + ∞ T(v)=+\infty T(v)=+
  2. v i v_{i} vi点为刚得到 P P P标号的点,考虑这样的点 v j : ( v i , v j ) v_{j}:(v_{i},v_{j}) vj:(vi,vj)属于E,且 v j v_{j} vj T T T 标号。对 v j v_{j} vj T T T标号进行如下的更改:
    T ( v j ) = m i n [ T ( v j ) ,   P ( v i ) + l i j ] T(v_{j})=min[T(v_{j}),\ P(v_{i})+l_{ij}] T(vj)=min[T(vj), P(vi)+lij]
  3. 比较所有具有 T T T标号的点,把最小者改为 P P P标号,即
    P ( v i ˉ ) = m i n [ T ( v i ) ] P(\bar{v_{i}})=min[T(v_{i})] P(viˉ)=min[T(vi)]
    当存在两个以上最小者时,可同时改为 P P P标号。若全部点均为 P P P标号时,则停止,否则用 v ˉ \bar{v} vˉ v i v_{i} vi转回1
Dijkstra算法示例

![[Pasted image 20240825130420.png]]

第0步
![[Pasted image 20240825163708.png]]

给起点 v 1 v_{1} v1 P P P标号赋值,记作 P ( v 1 ) = 0 P(v_{1})=0 P(v1)=0
其他顶点都给出 T T T标号,记作 T ( v i ) = ∞ ,   i = 2 , 3 , 4 , 5 , 6 T(v_{i})=\infty,\ i=2,3,4,5,6 T(vi)=, i=2,3,4,5,6
![[Pasted image 20240825191854.png]]

v 1 v_{1} v1是刚获得 P P P标号的顶点,我们考虑更新和 v 1 v_{1} v1相邻的顶点 v 2 v_{2} v2 v 3 v_{3} v3 T T T标号
![[Pasted image 20240825192122.png]]

计算并更新顶点 v 2 v_{2} v2 v 3 v_{3} v3 T T T标号
T ( v 2 ) = m i n { T ( v 2 ) ,   P ( v 1 ) + l 12 } = m i n { ∞ ,   0 + 1 } = 1 T(v_{2})=min\left\{ T(v_{2}),\ P(v_{1})+l_{12} \right\}=min\left\{ \infty,\ 0+1 \right\}=1 T(v2)=min{T(v2), P(v1)+l12}=min{, 0+1}=1
T ( v 3 ) = m i n { T ( v 3 ) ,   P ( v 1 ) + l 13 } = m i n { ∞ ,   0 + 2 } = 2 T(v_{3})=min\left\{ T(v_{3}),\ P(v_{1})+l_{13} \right\}=min\left\{ \infty,\ 0+2 \right\}=2 T(v3)=min{T(v3), P(v1)+l13}=min{, 0+2}=2
![[Pasted image 20240825192501.png]]

比较所有T标号,取其最小的, T ( v 2 ) = 1 T(v_{2})=1 T(v2)=1,改为P标号并记录相应的路径
![[Pasted image 20240825192632.png]]

v 2 v_{2} v2是刚获得P标号的顶点,我们考虑更新和 v 2 v_{2} v2相邻的顶点 v 3 v_{3} v3 v 4 v_{4} v4的T标号
![[Pasted image 20240825192752.png]]

计算并更新顶点 v 3 v_{3} v3 v 4 v_{4} v4 T T T标号
T ( v 3 ) = m i n { T ( v 3 ) ,   P ( v 2 ) + l 23 } = m i n { 2 ,   1 + 3 } = 2 T(v_{3})=min\left\{ T(v_{3}),\ P(v_{2})+l_{23} \right\}=min\left\{ 2,\ 1+3 \right\}=2 T(v3)=min{T(v3), P(v2)+l23}=min{2, 1+3}=2
T ( v 4 ) = m i n { T ( v 4 ) ,   P ( v 2 ) + l 24 } = m i n { ∞ ,   1 + 5 } = 6 T(v_{4})=min\left\{ T(v_{4}),\ P(v_{2})+l_{24} \right\}=min\left\{ \infty,\ 1+5 \right\}=6 T(v4)=min{T(v4), P(v2)+l24}=min{, 1+5}=6
![[Pasted image 20240825200526.png]]

比较所有T标号,取其最小的, T ( v 3 ) = 2 T(v_{3})=2 T(v3)=2,改为P标号并记录相应路径
![[Pasted image 20240825200701.png]]

v 3 v_{3} v3是刚获得 P P P标号的顶点,我们考虑更新和 v 3 v_{3} v3相邻的顶点 v 5 v_{5} v5 T T T标号
![[Pasted image 20240825200746.png]]

计算并更新顶点 v 5 v_{5} v5 T T T标号
T ( v 5 ) = m i n { T ( v 5 ) ,   P ( v 3 ) + l 35 } = m i n { ∞ ,   2 + 4 } = 6 T(v_{5})=min\left\{ T(v_{5}),\ P(v_{3})+l_{35} \right\}=min\left\{ \infty,\ 2+4 \right\}=6 T(v5)=min{T(v5), P(v3)+l35}=min{, 2+4}=6
![[Pasted image 20240825204604.png]]

比较所有T标号,取其最小的, T ( v 4 ) = 6 , T ( v 5 ) = 6 T(v_{4})=6,T(v_{5})=6 T(v4)=6,T(v5)=6,改为P标号并记录相应路径
![[Pasted image 20240825204718.png]]

v 4 v_{4} v4 v 5 v_{5} v5是刚获得 P P P标号的顶点,我们考虑更新和它们相邻的顶点 v 6 v_{6} v6 T T T标号
![[Pasted image 20240825204829.png]]

计算并更新顶点 v 6 v_{6} v6 T T T标号
T ( v 6 ) = m i n { T ( v 6 ) ,   P ( v 4 ) + l 4 , 6 ,   P ( v 5 + l 5 , 6 ) } = m i n { ∞ ,   6 + 2 ,   6 + 1 } = 7 T(v_{6})=min\left\{ T(v_{6}),\ P(v_{4})+l_{4,6},\ P(v_{5}+l_{5,6}) \right\}=min\left\{ \infty,\ 6+2,\ 6+1 \right\}=7 T(v6)=min{T(v6), P(v4)+l4,6, P(v5+l5,6)}=min{, 6+2, 6+1}=7
![[Pasted image 20240825205016.png]]

比较所有T标号,取其最小的, T ( v 6 ) = 7 T(v_{6})=7 T(v6)=7,改为P标号并记录相应路径,至此所有顶点均有P标号,从 v 1 v_{1} v1到其余各点的最短路均已得到。

所有点对最短路问题

任意两点间距离

最常用算法:Floyd算法
弗洛伊德算法是解决任意两点间的最短路径的一种算法,可以正确处理有向图或有向图或负权(但不可存在负权回路)的最短路径问题,同时也被用于计算有向图的传递闭包。

Floyd算法

矩阵D
元素 d [ i ] [ j ] d[i][j] d[i][j]表示顶点 i i i(第 i i i个顶点)到顶点 j j j(第 j j j个顶点)的距离·矩阵 p a t h [ i ] [ j ] path[i][j] path[i][j],元素 p a t h [ i ] [ j ] path[i][j] path[i][j],表示顶点 i i i到顶点 j j j经过了 p a t h [ i ] [ j ] path[i][j] path[i][j]记录的值所表示的顶点

假设图G中顶点个数为N, d [ i ] [ j ] = d[i][j]= d[i][j]=顶点 i i i j j j的权值, p a t h [ i ] [ j ] = j path[i][j]=j path[i][j]=j; 如果 d [ i ] [ j ] = ∞ d[i][j]=\infty d[i][j]= p a t h [ i ] [ j ] = 0 path[i][j] =0 path[i][j]=0
For k = 1 to N;
For i = 1 to N;
For j = 1 to N;
如果 d [ i ] [ j ] > d [ i ] [ k ] + d [ k ] [ j ] d[i][j]>d[i][k]+d[k][j] d[i][j]>d[i][k]+d[k][j],则
d [ i ] [ j ] = d [ i ] [ k ] + d [ k ] [ j ] d[i][j] =d[i][k] +d[k][j] d[i][j]=d[i][k]+d[k][j]
p a t h [ i ] [ j ] = p a t h [ i ] [ k ] path[i][j]=path[i][k] path[i][j]=path[i][k]

Floyd算法实例

求下图任意顶点间的最短距离
![[Pasted image 20240825215409.png]]

初始化
距离矩阵D
路径矩阵path
D = ( 0 9 ∞ 3 ∞ 9 0 2 ∞ 7 ∞ 2 0 2 4 3 i n g t y 2 0 ∞ ∞ 7 4 ∞ 0 ) D=\begin{pmatrix} 0&&9&&\infty&&3&&\infty \\ 9&&0&&2&&\infty&&7 \\ \infty&&2&&0&&2&&4 \\ 3&&ingty&&2&&0&&\infty \\ \infty&&7&&4&&\infty&&0 \end{pmatrix} D= 093902ingty72024320740
p a t h = ( 1 2 0 4 0 1 2 3 0 5 0 2 3 4 5 1 0 3 4 5 0 2 3 0 5 ) path=\begin{pmatrix} 1&&2&&0&&4&&0 \\ 1&&2&&3&&0&&5 \\ 0&&2&&3&&4&&5 \\ 1&&0&&3&&4&&5 \\ 0&&2&&3&&0&&5 \end{pmatrix} path= 1101022202033334044005555

  1. 第一次迭代,k=1,插入顶点1
    我们以 d [ 2 ] [ 4 ] d[2][4] d[2][4]为例,看如何计算更新 d [ 2 ] [ 4 ] = ∞ d[2][4]=\infty d[2][4]=
    首先计算 d [ 2 ] [ 1 ] + d [ 1 ] [ 4 ] = 9 + 3 = 12 d[2][1]+d[1][4]=9+3=12 d[2][1]+d[1][4]=9+3=12
    然后比较 d [ 2 ] [ 1 ] + d [ 1 ] [ 4 ] 和 d [ 2 ] [ 4 ] d[2][1]+d[1][4]和d[2][4] d[2][1]+d[1][4]d[2][4]
    d [ 2 ] [ 1 ] + d [ 1 ] [ 4 ] = 12 < ∞ = d [ 2 ] [ 4 ] d[2][1]+d[1][4] =12<\infty=d[2][4] d[2][1]+d[1][4]=12<=d[2][4]
    因此 d [ 2 ] [ 4 ] = d [ 2 ] [ 1 ] + d [ 1 ] [ 4 ] = 12 d[2][4]=d[2][1]+d[1][4]=12 d[2][4]=d[2][1]+d[1][4]=12
    p [ 2 ] [ 4 ] = p [ 2 ] [ 1 ] = 1 p[2][4] =p[2][1] =1 p[2][4]=p[2][1]=1
    第一次迭代结果

D = ( 0 9 ∞ 3 ∞ 9 0 2 12 7 ∞ 2 0 2 4 3 i n g t y 2 0 ∞ ∞ 7 4 ∞ 0 ) D=\begin{pmatrix} 0&&9&&\infty&&3&&\infty \\ 9&&0&&2&&12&&7 \\ \infty&&2&&0&&2&&4 \\ 3&&ingty&&2&&0&&\infty \\ \infty&&7&&4&&\infty&&0 \end{pmatrix} D= 093902ingty7202431220740
p a t h = ( 1 2 0 4 0 1 2 3 1 5 0 2 3 4 5 1 0 3 4 5 0 2 3 0 5 ) path=\begin{pmatrix} 1&&2&&0&&4&&0 \\ 1&&2&&3&&1&&5 \\ 0&&2&&3&&4&&5 \\ 1&&0&&3&&4&&5 \\ 0&&2&&3&&0&&5 \end{pmatrix} path= 1101022202033334144005555
全部迭代完毕的结果

D = ( 0 7 5 3 9 7 0 2 4 6 5 2 0 2 4 3 4 2 0 6 9 6 4 6 0 ) D=\begin{pmatrix} 0&&7&&5&&3&&9 \\ 7&&0&&2&&4&&6 \\ 5&&2&&0&&2&&4 \\ 3&&4&&2&&0&&6 \\ 9&&6&&4&&6&&0 \end{pmatrix} D= 0753970246520243420696460
p a t h = ( 1 4 4 4 4 3 2 3 3 3 4 2 3 4 5 1 3 3 4 3 3 3 3 3 5 ) path=\begin{pmatrix} 1&&4&&4&&4&&4 \\ 3&&2&&3&&3&&3 \\ 4&&2&&3&&4&&5 \\ 1&&3&&3&&4&&3 \\ 3&&3&&3&&3&&5 \end{pmatrix} path= 1341342233433334344343535
d 15 = 9 ,   r 15 = 4 d_{15}=9,\ r_{15}=4 d15=9, r15=4
r 14 = 4 ,   r 45 = 3 r_{14}=4,\ r_{45}=3 r14=4, r45=3
r 43 = 3 ,   r 35 = 5 r_{43}=3,\ r_{35}=5 r43=3, r35=5
所以从顶点1到5的最短路径为1-4-3-5,长度为9

任意两点间距离的Matlab计算

![[Pasted image 20240825223031.png]]

s = [1 1 2 2 3 3]; 
t = [2 4 3 5 4 5];
weights = [9 3 2 7 2 4]; 
g = graph(s, t, weights); 
d = g.distances()
[path, dlength] = g.shortestpath(1,5)

![[Pasted image 20240825223429.png]]

最短路问题的应用

选址问题——中心问题

![[Pasted image 20240825223736.png]]
![[Pasted image 20240825223743.png]]

  1. 用Floyd算法求出距离矩阵 D = ( d i j ) v × v D=(d_{ij})_{v\times v} D=dijv×v
  2. 计算在各点 v i v_{i} vi设立服务设施的最大服务距离 S ( v i ) S(v_{i}) S(vi)
    S ( v i ) = m a x 1 ≤ j ≤ v { d i j } i = 1 , 2 , … , v S(v_{i}) = max_{1\le j\le v}\left\{ d_{ij} \right\}\quad i = 1,2,\dots,v S(vi)=max1jv{dij}i=1,2,,v
  3. 求出顶点 v k v_{k} vk,使 S ( v k ) = m i n 1 ≤ i ≤ v { S ( v i ) } S(v_{k})=min_{1\le i\le v}\left\{S(v_{i})\right\} S(vk)=min1iv{Svi)}
    v k v_{k} vk就是要求的建立消防站的地点,此点称为图的中心点
s = [1 2 2 2 3 3 4 5 6]; 
t = [2 3 5 6 4 5 5 6 7];
weights = [3 2 1 8 2.5 6 2 3 4 1.5]; 
g = graph(s, t, weights);
d = g.distances(s = max(d, [], 2)
[mins, site] = min(s)

结果
![[Pasted image 20240825225540.png]]
![[Pasted image 20240825225631.png]]

S ( v 1 ) = 10 , S ( v 2 ) = 7 , S ( v 3 ) = 6 , S ( v 4 ) = 10 , S ( v 5 ) = 7 , S ( v 6 ) = 7 , S ( v 7 ) = 8.5 S(v_{1})=10,S(v_{2})=7,S(v_{3})=6,S(v_{4})=10,S(v_{5})=7,S(v_{6})=7,S(v_{7})=8.5 S(v1)=10,S(v2)=7,S(v3)=6,S(v4)=10,S(v5)=7,S(v6)=7,S(v7)=8.5
S ( v 3 ) = 6 S(v_{3})=6 S(v3)=6,故应将消防站设在 v 3 v_{3} v3

选址问题——中心问题

![[Pasted image 20240825225915.png]]
![[Pasted image 20240825230131.png]]

  1. 求距离矩阵 D = ( d i j ) v × v D=(d_{ij})_{v\times v} D=dijv×v
  2. 计算各顶点作为选矿厂的总运力 m ( v i ) m(v_{i}) m(vi)
    m ( v i ) = ∑ j = 1 v ( v j ) × d i j i = 1 , 2 , … , v m(v_{i})=\sum_{j=1}^{v}(v_{j})\times d_{ij} i=1,2,\dots,v mvi)=j=1v(vj)×diji=1,2,,v
  3. v k v_{k} vk使 m ( v k ) = m i n 1 ≤ i ≤ v { m ( v i ) } m(v_{k})=min_{1\le i\le v}\left\{m(v_{i})\right\} mvk=min1iv{m(vi)}
    v k v_{k} vk就是选矿厂应选的矿点,此点称为图G的重心或中位点
s = [1 2 2 3 3 4 5 6]; 
t = [2 3 6 4 5 5 6 7];
weights = [3 2 4 6 2 1 4 1.5];
vw = [3 2 7 1 6 1 4]; 
g = graph(s, t, weights);
d = g.distances()
m = vw*d
[mins,site] = min(m)

![[Pasted image 20240825230947.png]]

2011B 交巡警服务平台的设置与调度

![[Pasted image 20240825231027.png]]

opts = detectlmportOptions('2011B\fj2.xls');
opts.Sheet = '全市交通路口节点数据'; opts.SelectedVariableNames = [1: 3]; 
opts.DataRange = '2: 93';
site = readmatrix('2011B\fj2.xls',opts); 
opts.Sheet='全市交通路口的路线'; 
opts.SelectedVariableNames = [1: 2]; 
opts.DataRange = '2: 144';
path = readmatrix(2011B\fj2.xls',opts); 
path1 = path(path(:,2) < 93,:);
plen = size(path1, 1); 
weights = [0] * plen; 
for i = 1 : plen
x1 = site(path1(i, 1), 2); 
y1 = site(path1(i, 1), 3); 
x2 = site(path1(i, 2), 2); 
y2 = site(path1(i, 2), 3);
weights = sqrt((x2 - x1) * (x2 - x1)+(y2 - y1)*(y2 - y1); 
end
G = graph(path1(:,1)', path1(:,2)', weights);
plot(G, "XData", site(:,2), "YData", site(:,3)); 
da = G.distances("all")
writematrix(da, '2011B\a distance.csv');

![[Pasted image 20240825231849.png]]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值