zoukankan      html  css  js  c++  java
  • 在CPLEX中求解最短路径问题

            最短路径问题顾名思义,即求问题的最短路。
            如有以下问题,图中有1-5五个结点,求node1到node4的最短路径。答案非常明显,即1->2->4.

            表示各个结点之间的路径需要一个二元矩阵。假设(t_{i,j})为路径值,(x_{i,j})用以表示是否选择node i到node j的路径,取值为0或1.
            首先求解的目标函数是使得路径上的数字和最小,即目标函数z为:

    [min z = sum_{i,j}t_{i,j}*x_{i,j} ]

            为了保证每一步的每个结点(除了起点和终点)都只有一个进路和一个出路,需要以下三个约束条件:
    (s.t.hspace{1cm}) $$sum_{j} x_{o,j} = 1$$

    [sum_{i}x_{i,d} = 1 ]

    [sum_{i}x_{i,j} = sum_{k}x_{j,k} ({forall}j{ eq}o,d) ]

    [x_{i,j} = 0,1 ]

            其中o为起点,d为终点。第一条限制了起点只有一个,第二条限制了终点只有一个,而第三条对其他结点做出了限制。确保i->j,j->k都只有一条线路,即中间结点j只有一条进路一条出路。
            先创建一个Excel表格,命名为traveltime,用于存放结点路劲的二元矩阵,放入cplex模型的文件夹中,无路径的值设置为一个较大的值:

            CPLEX中.mod代码如下:

    range I=1..5;
    int t[I][I]=...;
    dvar boolean x[I][I];
    
    constraint originNodeBalance;
    constraint destinationNodeBalance;
    constraint otherNodeBalance;
    
    minimize sum(i in I,j in I) t[i][j]*x[i][j];
    
    subject to
    {
    	originNodeBalance=sum(j in I) x[1][j]==1;
        destinationNodeBalance=sum(i in I) x[i][4]==1;
    	otherNodeBalance=forall(j in I:j!=1&&j!=4) sum(i in I) x[i][j]-sum(k in I) x[j][k]==0;
    }
    

            CPLEX中.dat代码如下:

    SheetConnection sheet("traveltime.xlsx");
    t from SheetRead(sheet,"Sheet1! B2:F6");
    

            这样CPLEX中的模型就建好了,看看运行结果:

            结果中的最短路径为1->2->4,和肉眼判断的结果一致。

  • 相关阅读:
    字母次数
    hdu 2051 Bitset(十进制到二进制)
    练习1升级
    实验一写能自动生成小学四则运算题目的程序
    TCP/IP bad check sum
    Lua GC 之 Ephemeron
    RHEL6下VNC安装和配置
    qpid安装
    关闭中国电信无线客户端自动更新
    Python GC
  • 原文地址:https://www.cnblogs.com/leafer20/p/13746866.html
Copyright © 2011-2022 走看看