【问题标题】:Has anyone used Dijkstra's algorithm in OPL?有人在 OPL 中使用过 Dijkstra 算法吗?
【发布时间】:2019-09-22 00:58:50
【问题描述】:

我有一个采矿问题的模型。我正在努力添加到模型中,以使用矿山(露天矿)内的最短路径来运输矿石和废物。为此,我在考虑 Dijkstra 的算法。我找不到任何在 OPL 中使用 Dijkstra 算法的示例。有没有人做过,请您分享一些想法。

【问题讨论】:

    标签: dijkstra opl mining


    【解决方案1】:

    如果您需要编写 Dijsktra 的算法,那么 Daniel 是对的,您宁愿使用脚本部分。现在,如果您需要现有 OPL 模型中的最短路径,可以使用以下最短路径示例:

    .mod

    tuple edge
    {
       key int o;
       key int d;
       int weight;
    }
    
    {edge} edges=...;
    
    {int} nodes={i.o | i in edges} union {i.d | i in edges};
    int st=1; // start
    int en=8; // end
    
    dvar int obj; // distance
    dvar boolean x[edges]; // do we use that edge ?
    
    minimize obj;
    
    subject to
    {
    obj==sum(e in edges) x[e]*e.weight;
    
    forall(i in nodes) 
        sum(e in edges:e.o==i) x[e]
        -sum(e in edges:e.d==i) x[e]    
        ==
        ((i==st)?1:((i==en)?(-1):0));
    }
    
    {edge} shortestPath={e | e in edges : x[e]==1};
    
    execute
    {
    writeln(shortestPath);
    }
    

    .dat

    edges=
    {
    <1,2,9>,
    <1,3,9>,
    <1,4,8>,
    <1,10,18>,
    <2,3,3>,
    <2,6,6>,
    <3,4,9>,
    <3,5,2>,
    <3,6,2>,
    <4,5,8>,
    <4,7,7>,
    <4,9,9>,
    <4,10,10>,
    <5,6,2>,
    <5,7,9>,
    <6,7,9>,
    <7,8,4>,
    <7,9,5>,
    <8,9,1>,
    <8,10,4>,
    <9,10,3>,
    }; 
    

    给了

    // solution (optimal) with objective 19
     {<1 4 8> <4 7 7> <7 8 4>}
    

    【讨论】:

    • 谢谢 Alex 的例子,我会试试的。我需要将它用作另一个优化问题的一部分,因此需要使用 OPL。
    【解决方案2】:

    如果您有一个可以使用 Dijkstra 算法解决的问题,那么使用 OPL 或 CPLEX 来解决它似乎有点矫枉过正。您可以用任何编程语言编写算法并从那里使用它。我想这就是你找不到任何例子的原因。

    如果您仍想在 OPL 中实现,请使用脚本 (execute) 或 main 块。您可以提供的脚本代码是 JavaScript 的超集,因此您可以在 JavaScript 中实现 Dijkstra 算法并将其放在那里。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多