set VEHICLE ordered; set WAYPNTS {VEHICLE} ordered; param sizeWaypnts{VEHICLE}; #number of waypoints for each vehicle set PAIRS {v in VEHICLE} := {i in WAYPNTS[v], j in WAYPNTS[v]: i!=j}; var E{v in VEHICLE, PAIRS[v]} binary; #sweeping variable var u{v in VEHICLE, WAYPNTS[v]}, >= 0, <= sizeWaypnts[v]-1; #sequence number in a tour subject to LeaveOnce {v in VEHICLE, i in WAYPNTS[v]}: sum {(i,j) in PAIRS[v]} E[v,i,j] = 1; subject to VisitOnce {v in VEHICLE, j in WAYPNTS[v]}: sum {(i,j) in PAIRS[v]} E[v,i,j] = 1; # subtour elimination Miller, Tucker and Zemlin (MTZ) (1960) subject to MTZ{v in VEHICLE,(i,j) in PAIRS[v]: i != 1}: u[v,i]-u[v,j] + (sizeWaypnts[v]-1)*E[v,i,j] <=sizeWaypnts[v]-2;