sets i /1*2/ j /1*4/ sols 'all possible previous solutions' / s1 * s256 / s(sols) 'solutions found thus far' / system.empty / prevSol(sols,i,j) 'on iff y(i,j) was 1' / system.empty . system.empty . system.empty / ; table alternative(i,j) distance between i and j 1 2 3 4 1 10 12 0 0 2 0 0 8 10 ; variable objective; binary variable y(i,j); equations oDef 'objective function' c2 'logical constraint only one alternative can be selected for each i' cuts(sols) ; oDef.. objective =e= sum((i,j),alternative(i,j) *y(i,j)); c2(i) .. sum(j,y(i,j)) =e= 1; cuts(s).. sum{prevSol(s,i,j), (1-y(i,j))} + sum{(i,j)$[not prevSol(s,i,j)], y(i,j)} =G= 1; model m/all/; * since we want to enumerate all sols, we can ignore the objective m.optcr = 0; m.optca = 1000; parameter report(sols, *); scalar OK 'we got another solution - OK to keep going'; solve m maximize objective using mip; OK = [m.modelStat = %modelStat.optimal% or m.modelStat = %modelStat.integerSolution%]; loop {sols$OK, * record the previous solution report(sols,'time') = m.resUsd; report(sols,'obj') = m.objVal; report(sols,'modelStat') = m.modelStat; report(sols,'solveStat') = m.solveStat; prevSol(sols,i,j) = round(y.L(i,j)); s(sols) = yes; solve m using mip maximize objective; OK = [m.modelStat = %modelStat.optimal% or m.modelStat = %modelStat.integerSolution%]; };