$title shortest path example with intervening lake option limcol=0; set nodes /node1*node8/ coords /x,y/ arcs(nodes,nodes) / node1 . (node2,node3) node2 . node4 node3 . node6 node4 . node7 node6 . node5 node7 . node6 (node5, node6, node7) . node8/ lakeCrossings(nodes,nodes) / node4 . node7 node6 . node8 node7 . node6 /; alias (i,j,nodes); table posn(nodes,coords) x y node1 0 1 node2 0 0 node3 1 2 node4 1 0 node5 2 2 node6 2 1 node7 2 0 node8 3 1; parameter supply(nodes) / node1 1, node8 -1/; * figure the distances parameter distance(nodes, nodes); distance(arcs(i,j)) = sqrt(sum(coords,sqr(posn(i,coords) - posn(j,coords)))); * double the distance if the route goes over a lake distance(lakeCrossings) = 2*distance(lakeCrossings); display distance; variables flow(nodes,nodes), totalDistance; positive variables flow; equations balance(nodes), objective; balance(nodes).. sum(arcs(nodes,j), flow(nodes,j)) - sum(arcs(i,nodes), flow(i,nodes)) =e= supply(nodes); objective.. totalDistance =e= sum(arcs, flow(arcs) * distance(arcs)); model short1/balance, objective/; solve short1 minimizing totalDistance using lp; option flow:5:0:2; display flow.l, totalDistance.l;