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,和肉眼判断的结果一致。

  • 相关阅读:
    通用权限管理设计 之 数据库结构设计
    jQuery LigerUI 插件介绍及使用之ligerDateEditor
    jQuery LigerUI 插件介绍及使用之ligerTree
    jQuery LigerUI V1.01(包括API和全部源码) 发布
    jQuery liger ui ligerGrid 打造通用的分页排序查询表格(提供下载)
    jQuery LigerUI V1.1.5 (包括API和全部源码) 发布
    jQuery LigerUI 使用教程表格篇(1)
    jQuery LigerUI V1.0(包括API和全部源码) 发布
    jQuery LigerUI V1.1.0 (包括API和全部源码) 发布
    nginx keepalived
  • 原文地址:https://www.cnblogs.com/leafer20/p/13746866.html
Copyright © 2011-2022 走看看