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

news2024/9/23 15:31:47

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

在数学建模竞赛中,图论与网络模型也是比较常见的一种模型,它经常和其他模型结合共同完成建模任务。例如:
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]]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2074414.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C# 循环访问目录树详解与示例

文章目录 一、目录树遍历的概念二、使用System.IO命名空间三、DirectoryInfo和FileInfo类四、递归遍历目录树五、示例&#xff1a;列出目录树中的所有文件和文件夹六、异常处理七、迭代方法八、总结 在C#中&#xff0c;访问文件系统是常见的需求之一。有时我们需要遍历目录树以…

嵌入式开发技术进步带来新机遇

嵌入式开发作为信息技术领域的重要分支&#xff0c;随着科技的不断进步&#xff0c;正迎来新的机遇。本文将从人工智能、物联网、边缘计算等方面探讨嵌入式开发技术的进步如何带来新的发展机遇&#xff0c;并展望未来的发展趋势。 一、引言 嵌入式系统是一种特殊的计算机系统&…

unreal engine5中character角色和怪物交互时发生穿模

UE5系列文章目录 文章目录 UE5系列文章目录前言一、原因定位二、解决方法 前言 在 Unreal Engine 5 中&#xff0c;角色“穿模”通常指的是角色模型与其他物体&#xff08;如墙壁、地面或其他对象&#xff09;发生不正确的穿透或重叠现象。这可能是由多种原因造成的&#xff0…

C++ | Leetcode C++题解之第372题超级次方

题目&#xff1a; 题解&#xff1a; class Solution {const int MOD 1337;int pow(int x, int n) {int res 1;while (n) {if (n % 2) {res (long) res * x % MOD;}x (long) x * x % MOD;n / 2;}return res;}public:int superPow(int a, vector<int> &b) {int an…

C# 泛型类型的约束详解与示例

文章目录 一、泛型约束概述二、泛型约束详解与示例1. 类约束2. 接口约束3. 引用类型约束4. 值类型约束5. 无参数构造函数约束6、多重约束7、默认构造函数约束8、基类和接口的组合约束 三、总结 在C#编程语言中&#xff0c;泛型是一种非常强大的特性&#xff0c;它允许我们编写可…

NetSuite 2024.2 学习笔记

NetSuite一年两次的发版&#xff0c;每次都会带来一些新的东西。这对于顾问来说&#xff0c;应该成为必修课。 每个版本发版内容的学习时长&#xff0c;大约在20小时左右。包括&#xff1a; •Release Notes通读 •Release Preview环境申请 •热点功能验证 •New Release学习笔…

vue中video视频路径改变,dom不更新问题

效果展示 视频切换前 视频切换后 完整代码 <template><!-- 设置v-if只在路径有值时&#xff0c;标签才存在 --><video v-if"state.videoSrc ! null" controls><source :src"state.videoSrc" type"video/mp4"></…

Java | Leetcode Java题解之第372题超级次方

题目&#xff1a; 题解&#xff1a; class Solution {static final int MOD 1337;public int superPow(int a, int[] b) {int ans 1;for (int e : b) {ans (int) ((long) pow(ans, 10) * pow(a, e) % MOD);}return ans;}public int pow(int x, int n) {int res 1;while (n…

Pytorch实现CIFAR10训练模型

文章目录 简述模型结构模型参数、优化器、损失函数参数初始化优化器损失函数 模型训练、测试集预测、模型保存、日志记录训练测试集测试模型保存模型训练完整代码 tensorboard训练可视化结果train_loss测试准确率测试集loss 模型应用模型独立应用代码api.py预测结果 简述 使用…

leetcode1232一点小问题

解法 a x 2 − x 1 y 2 − y 1 &#xff0c; b y 1 − a x 1 a\frac{x_{2}-x_{1}}{y_{2}-y_{1}} &#xff0c;by_{1}-ax_{1} ay2​−y1​x2​−x1​​&#xff0c;by1​−ax1​ d y n − y n − 1 x n − x n − 1 d\frac{y_{n}-y_{n-1}}{x_{n}-x_{n-1}} dxn​−xn−1​yn​…

【初阶数据结构】链表题的证明

环形链表题目方法的证明 证明1&#xff1a;为什么快指针每次⾛两步&#xff0c;慢指针⾛⼀步可以相遇&#xff0c;有没有可能遇不上&#xff0c;请推理证明&#xff01; 证明二&#xff1a;为什么相遇点&#xff08;meet&#xff09;和头结点&#xff08;head&#xff09;到入环…

sql server导入mysql,使用工具SQLyog

概述 需要将sql server的数据导入到mysql中&#xff0c;由于2种数据库存在各种差异&#xff0c;比如表字段类型就有很多不同&#xff0c;因此需要工具来实现。 这里使用SQLyog来实现。 SQLyog安装 安装过程参考文档&#xff1a;https://blog.csdn.net/Sunshine_liang1/article/…

USART之串口发送+接收应用案例

文章目录 前言一、电路接线图二、应用案例代码三、应用案例分析3.1 USART模块初始化3.1.1 RCC开启时钟3.1.2 GPIO初始化3.1.3 配置USART3.1.4 开启中断、配置NVIC3.1.5 开启USART 3.2 USART串口收发模块3.2.1 Serial_SendByte&#xff08;发送一个字节数据&#xff09;3.2.2 US…

JVM对象创建和内存分配机制深度解析

一、对象创建方式 1、new关键字 这是最常见的创建对象的方式。通过调用类的构造方法&#xff08;constructor&#xff09;来创建对象。如&#xff1a;MyClass obj new MyClass()。这种方式会触发类的加载、链接、初始化过程&#xff08;如果类还未被加载过的话&#xff09;&…

递归搜索与回溯专题篇一

目录 组合 目标和 组合总和 字母大小全排列 组合 题目 思路 解决这道题利用DFS&#xff0c;决策树是怎样的&#xff1f;以n4&#xff0c;k3为例&#xff1a; 因为每个数只用到一次&#xff0c;因此需要剪枝&#xff0c;将出现重复数字的枝剪掉&#xff0c;因为组合中元素的…

Vue中的this.$emit()方法详解【父子组件传值常用】

​在Vue中&#xff0c;this.$emit()方法用于触发自定义事件。它是Vue实例的一个方法&#xff0c;可以在组件内部使用。 使用this.$emit()方法&#xff0c;你可以向父组件发送自定义事件&#xff0c;并传递数据给父组件。父组件可以通过监听这个自定义事件来执行相应的逻辑。 …

【PyQt6 应用程序】QTDesigner生成ui文件转成py源码并执行

要使用Qt Designer设计的UI界面生成Python代码并执行需要遵循几个步骤。确保已经安装了PyQt6和Qt Designer。Qt Designer是一个强大的工具,允许通过拖放组件来设计GUI界面,而不需要手写所有的代码。安装PyQt6时 Qt Designer通常会一起被安装。 文章目录 使用Qt Designer设计U…

米联客FDMA3.2源码分析以及控制BRAM、DDR3读写验证

文章目录 一、FDMA简介二、读写操作时序2.1 写时序2.2 读时序 三、FDMA源码分析四、源码仿真验证4.1 FDMA控制代码4.2 系统框图4.3 仿真结果4.3.1 写通道4.3.2 读通道 五、使用FDMA控制BRAM读写测试5.1 系统框图5.2 读写数据控制模块5.3 仿真结果5.4 下板验证 六、使用FDMA控制…

快讯 | 美军500天AI计划启动,“破解AI“与“反AI“策略亮相

在数字化浪潮的推动下&#xff0c;人工智能&#xff08;AI&#xff09;正成为塑造未来的关键力量。硅纪元视角栏目紧跟AI科技的最新发展&#xff0c;捕捉行业动态&#xff1b;提供深入的新闻解读&#xff0c;助您洞悉技术背后的逻辑&#xff1b;汇聚行业专家的见解&#xff0c;…

VBA之正则表达式(46)-- 解析业务逻辑公式

实例需求&#xff1a;某业务系统的逻辑公式如下所示&#xff08;单行文本&#xff09;&#xff0c;保存在活动工作表的A1单元格中。 "DSO_90Day"->"FA_NoFunc"->"FCCS_No Intercompany"->"FCCS_Data Input"->"FCCS_…