图论模型
以下是根据MOOC西北工业大学肖老师数学建模课程整理的学习笔记(MOOC指路:MOOC数学建模)
1. 图论中最短路算法与程序实现
(1) Dijkstra算法
假定给出一个网络 N = ( V , E , W ) N= (V,E,W) N=(V,E,W) ,现在要求出任意点 i i i 到任意点 j j j 之间的最短路,算法描述如下:
-
给出初始点集合 P = { i } P= \{i\} P={i} ,剩余点集合 Q = { 1 , 2 , … , n } − P Q = \{1,2, \dots, n\} - P Q={1,2,…,n}−P 。初始 i i i 点到各点的直接距离 U r = w i r ( r = 1 , 2 , … , n ) U_r = w_{ir} (r=1,2,\dots,n) Ur=wir(r=1,2,…,n)。
-
在 Q Q Q 中寻找到 i i i 点距离最小的点 k k k ,使得 U k = m i n r ∈ Q { U r } U_k = min_{r\in Q} \{U_r\} Uk=minr∈Q{Ur},并置 P ∪ { k } → P P\cup\{k\} \rightarrow P P∪{k}→P, Q − { k } → Q Q - \{k\} \rightarrow Q Q−{k}→Q
-
对 Q Q Q 中每个 r r r ,如果 U k + w k r < U r U_k + w_{kr} < U_r Uk+wkr<Ur ,则 U k + w k r → U r U_k + w_{kr} \rightarrow U_r Uk+wkr→Ur ,然后返回2直到找到 j j j 点为止。
该算法经过 n − 1 n-1 n−1 次循环结束。在整个算法过程中,步骤2最多作 1 2 ( n − 1 ) ( n − 2 ) \frac{1}{2} (n-1)(n-2) 21(n−1)(n−2) 次比较,步骤3最多作 1 2 ( n − 1 ) ( n − 2 ) \frac{1}{2} (n-1)(n-2) 21(n−1)(n−2) 次加法和比较,因此总的计算量是 O ( n 2 ) O(n^2) O(n2)阶。
流程图:
(2) Floyd算法
-
根据已知的部分节点之间的连接信息,建立初始距离矩阵 B ( i , j ) B(i,j) B(i,j) ,其中没有给出距离的赋予一个充分大数值,以便于更新。 ( i , j = 1 , 2 , … , n ) (i,j=1,2, \dots, n) (i,j=1,2,…,n)
-
进行迭代计算。对任意两点 ( i , j ) (i,j) (i,j) ,若存在k,使 B ( i , k ) + B ( k , j ) < B ( i , j ) B(i,k)+B(k,j)<B(i,j) B(i,k)+B(k,j)<B(i,j) , 则更新 B ( i , j ) = B ( i , k ) + B ( k , j ) B(i,j)= B(i,k)+ B(k,j) B(i,j)=B(i,k)+B(k,j)
-
直到所有点距离不再更新停止计算。得到最短路距离矩阵 B ( i , j ) B(i,j) B(i,j)
算法程序(Matlab)为:
for k=1:n
for i=1:n
for j=1:n
t=B(i,k)+B(k,j);
if t<B(i,j)
B(i,j)=t;
end
end
end
end
2. 图论中TSP问题的LINGO求解与应用
- 问题描述:设有一个售货员从10个城市中的某一个城市出发,去其它9个城市推销产品。10个城市相互距离如下表。要求每个城市到达一次仅一次后,回到原出发城市。问他应如何选择旅行路线,使总路程最短。
10个城市距离表
城市 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
1 | 0 | 7 | 4 | 5 | 8 | 6 | 12 | 13 | 11 | 18 |
2 | 7 | 0 | 3 | 10 | 9 | 14 | 5 | 14 | 17 | 17 |
3 | 4 | 3 | 0 | 5 | 9 | 10 | 21 | 8 | 27 | 12 |
4 | 5 | 10 | 5 | 0 | 14 | 9 | 10 | 9 | 23 | 16 |
5 | 8 | 9 | 9 | 14 | 0 | 7 | 8 | 7 | 20 | 19 |
6 | 6 | 14 | 10 | 9 | 7 | 0 | 13 | 5 | 25 | 13 |
7 | 12 | 5 | 21 | 10 | 8 | 13 | 0 | 23 | 21 | 18 |
8 | 13 | 14 | 8 | 9 | 7 | 5 | 23 | 0 | 18 | 12 |
9 | 11 | 17 | 27 | 23 | 20 | 25 | 21 | 18 | 0 | 16 |
10 | 18 | 17 | 12 | 16 | 19 | 13 | 18 | 12 | 16 | 0 |
-
建立线性规划模型
设城市之间距离用矩阵 d d d 表示, d i j d_{ij} dij 表示城市 i i i 与城市 j j j 距离。设0-1矩阵 X X X 用来表示经过的各城市之间的路线。设
x i j = { 0 若 城 市 i 不 到 城 市 j 1 若 城 市 i 到 城 市 j x_{ij} = \begin {cases} 0 \quad 若城市i不到城市j \\ \\ 1 \quad 若城市i到城市j \\ \end {cases} xij=⎩⎪⎨⎪⎧0若城市i不到城市j1若城市i到城市j
考虑每个城市后只有一个城市,则: ∑ j = 1 , j ≠ i n x i j = 1 , i = 1 , … , n \sum_{j=1, j \ne i}^{n} \quad x_{ij} = 1, \quad i=1,\dots,n ∑j=1,j=inxij=1,i=1,…,n考虑每个城市前只有一个城市,则: ∑ i = 1 , i ≠ j n x i j = 1 , j = 1 , … , n \sum_{i=1, i \ne j}^{n} \quad x_{ij} = 1, \quad j=1,\dots,n ∑i=1,i=jnxij=1,j=1,…,n
**但该约束不能避免产生子圈。**为此引入额外变量 u i u_i ui ,附加以下约束:
u i − u j + n x i j ≤ n − 1 , 1 < i ≠ j ≤ n u_i - u_j + nx_{ij} \leq n-1, \quad 1 < i \ne j \leq n ui−uj+nxij≤n−1,1<i=j≤n ; (敲黑板,重点!注意是 1 < i 1 < i 1<i ,不是 1 ≤ i 1 \leq i 1≤i )
该约束的解释:
如 i i i 与 j j j 不会构成回路,若构成回路,有:
x i j = 1 x_{ij} = 1 xij=1 , x j i = 1 x_{ji} = 1 xji=1 ,则:
u i − u j ≤ − 1 u_i - u_j \leq -1 ui−uj≤−1 , u j − u i ≤ − 1 u_j - u_i \leq -1 uj−ui≤−1 ,从而 0 ≤ − 2 0 \leq -2 0≤−2 ,导致矛盾。
如 i i i , j j j 与 k k k 不会构成回路若,构成回路,有:
x i j = 1 x_{ij} = 1 xij=1 , x j k = 1 x_{jk} = 1 xjk=1 , x k i = 1 x_{ki} = 1 xki=1 ,则:
u i − u j ≤ − 1 u_i - u_j \leq -1 ui−uj≤−1 , u j − u k ≤ − 1 u_j - u_k \leq -1 uj−uk≤−1 , u k − u i ≤ − 1 u_k - u_i \leq -1 uk−ui≤−1 ,从而 0 ≤ − 3 0 \leq -3 0≤−3 ,导致矛盾。
其它情况以此类推。
(n个点是可以形成一个圈的,所以,上面的式子是 1 < i 1 < i 1<i ,不是 1 ≤ i 1 \leq i 1≤i)
-
总的线性规划模型
m i n z = ∑ i = 1 n ∑ j = 1 n d i j x i j s . t . { ∑ i = 1 , i ≠ j n x i j = 1 , j = 1 , … , n ∑ j = 1 , j ≠ i n x i j = 1 , i = 1 , … , n u i − u j + n x i j ≤ n − 1 , 1 < i ≠ j ≤ n x i j = 0 或 1 , i , j = 1 , … , n u i 为 实 数 , i = 1 , … , n min \quad z = \sum_{i=1}^n \sum_{j=1}^n d_{ij} x_{ij} \\ s.t. \begin {cases} \sum_{i=1,i \ne j}^n x_{ij} = 1, \quad j = 1,\dots,n \\ \\ \sum_{j=1,j \ne i}^n x_{ij} = 1, \quad i = 1,\dots,n \\ \\ u_i - u_j + nx_{ij} \leq n - 1, \quad 1 < i \ne j \leq n \\ \\ x_{ij} = 0或1, \quad i,j=1,\dots,n \\ \\ u_i为实数,i=1,\dots,n \end {cases} minz=i=1∑nj=1∑ndijxijs.t.⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧∑i=1,i=jnxij=1,j=1,…,n∑j=1,j=inxij=1,i=1,…,nui−uj+nxij≤n−1,1<i=j≤nxij=0或1,i,j=1,…,nui为实数,i=1,…,n -
LINGO程序:
model: sets: city/1..10/:u; link(city,city):d,x; endsets data: d = 0 7 4 5 8 6 12 13 11 18 7 0 3 10 9 14 5 14 17 17 4 3 0 5 9 10 21 8 27 12 5 10 5 0 14 9 10 9 23 16 8 9 9 14 0 7 8 7 20 19 6 14 10 9 7 0 13 5 25 13 12 5 21 10 8 13 0 23 21 18 13 14 8 9 7 5 23 0 18 12 11 17 27 23 20 25 21 18 0 16 18 17 12 16 19 13 18 12 16 0; @text()=@writefor(link(i,j)|x(i,j)#GT#0:' x(',i,',',j,')=',x(i,j)); enddata min = @sum(link:d*x); @for(city(j):@sum(city(i)|j#ne#i:x(i,j))=1); @for(city(i):@sum(city(j)|j#ne#i:x(i,j))=1); @for(link(i,j)|i#ne#j#and#i#gt#1:u(i)-u(j)+10*x(i,j)<=9); @for(link:@BIN(x)); end
程序运行结果:
3. 图论中最优树问题的LINGO求解
-
图论中最优树的求解通常有两种算法
- Kruskal算法
- Prim算法
LINGO求解最优树的程序与求解TSP问题的程序类似,区别主要在于避免产生子圈的条件限制(n个点时不能构成圈)