有没有人在OPL中使用Dijkstra的算法?

时间:2019-09-22 00:58:50

标签: dijkstra opl mining

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

2 个答案:

答案 0 :(得分: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>}

答案 1 :(得分:0)

如果您有可以使用Dijkstra的算法解决的问题,那么使用OPL或CPLEX来解决它似乎有些过大。您可以使用任何编程语言对算法进行编码,然后从那里开始使用它。我想这就是为什么您找不到任何示例的原因。

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