图论模型

图论模型

以下是根据MOOC西北工业大学肖老师数学建模课程整理的学习笔记(MOOC指路:MOOC数学建模

1. 图论中最短路算法与程序实现
(1) Dijkstra算法

假定给出一个网络 N = ( V , E , W ) N= (V,E,W) N=(V,E,W) ,现在要求出任意点 i i i 到任意点 j j j 之间的最短路,算法描述如下:

  1. 给出初始点集合 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)

  2. 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=minrQ{Ur},并置 P ∪ { k } → P P\cup\{k\} \rightarrow P P{k}P, Q − { k } → Q Q - \{k\} \rightarrow Q Q{k}Q

  3. 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+wkrUr ,然后返回2直到找到 j j j 点为止。

    该算法经过 n − 1 n-1 n1 次循环结束。在整个算法过程中,步骤2最多作 1 2 ( n − 1 ) ( n − 2 ) \frac{1}{2} (n-1)(n-2) 21(n1)(n2) 次比较,步骤3最多作 1 2 ( n − 1 ) ( n − 2 ) \frac{1}{2} (n-1)(n-2) 21(n1)(n2) 次加法和比较,因此总的计算量是 O ( n 2 ) O(n^2) O(n2)阶。

流程图:

Created with Raphaël 2.2.0 开始 确定集合P和Q 在Q中找到与i点距离最小的 点k,更新P和Q 对Q中的每个r,如果i点 经 k点到达r点的距离大于原来 i点到的距离,则更新数据 count >= n ? 结束 count++ yes no
(2) Floyd算法
  1. 根据已知的部分节点之间的连接信息,建立初始距离矩阵 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)

  2. 进行迭代计算。对任意两点 ( 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)

  3. 直到所有点距离不再更新停止计算。得到最短路距离矩阵 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个城市距离表

城市12345678910
107458612131118
2703109145141717
343059102182712
4510501491092316
58991407872019
6614109701352513
712521108130232118
8131489752301812
91117272320252118016
101817121619131812160
  • 建立线性规划模型

    设城市之间距离用矩阵 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=0ij1ij
    考虑每个城市后只有一个城市,则: ∑ 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 uiuj+nxijn1,1<i=jn ; (敲黑板,重点!注意是 1 < i 1 < i 1<i ,不是 1 ≤ i 1 \leq i 1i

    该约束的解释:

    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 uiuj1 u j − u i ≤ − 1 u_j - u_i \leq -1 ujui1 ,从而 0 ≤ − 2 0 \leq -2 02 ,导致矛盾。

    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 uiuj1 u j − u k ≤ − 1 u_j - u_k \leq -1 ujuk1 u k − u i ≤ − 1 u_k - u_i \leq -1 ukui1 ,从而 0 ≤ − 3 0 \leq -3 03 ,导致矛盾。

    其它情况以此类推。

    (n个点是可以形成一个圈的,所以,上面的式子是 1 < i 1 < i 1<i ,不是 1 ≤ i 1 \leq i 1i)

  • 总的线性规划模型
    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=1nj=1ndijxijs.t.i=1,i=jnxij=1,j=1,,nj=1,j=inxij=1,i=1,,nuiuj+nxijn1,1<i=jnxij=01ij=1nuii=1n

  • 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个点时不能构成圈)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值