set NODES ordered; param hpos {NODES} >= 0; param vpos {NODES} >= 0; set PAIRS := {i in NODES, j in NODES: i != j}; param dist {(i,j) in PAIRS} := sqrt((hpos[j]-hpos[i])**2 + (vpos[j]-vpos[i])**2); var X {PAIRS} binary; minimize Tour_Length: sum {(i,j) in PAIRS} dist[i,j] * X[i,j]; subject to LeaveOnce {i in NODES}: sum {(i,j) in PAIRS} X[i,j] = 1; subject to VisitOnce {j in NODES}: sum {(i,j) in PAIRS} X[i,j] = 1; # subtour elimination: param n := card(NODES); param start symbolic := first(NODES); var u{i in NODES}, >= 0; # Miller, Tucker and Zemlin (MTZ) (1960) subject to MTZ{(i,j) in PAIRS: i != start}: u[i]-u[j]+(n-1)*X[i,j] <= n-2; # Desrochers and Laporte (1991) subject to DL{(i,j) in PAIRS: i != start}: u[i]-u[j]+(n-1)*X[i,j]+(n-3)*X[j,i] <= n-2;