$ontext Alphametics, stable formulation AN + ACCELERATING + INFERENTIAL + ENGINEERING + TALE + ELITE + GRANT + FEE + ET + CETERA = ------------- ARTIFICIAL + INTELLIGENCE Erwin Kalvelagen, 2009 $offtext set i 'letters' /A,N,C,E,L,R,T,I,G,F/ w 'words' /an,accelerating,inferential,engineering,tale,elite,grant,fee,et,cetera, artificial,intelligence/ w1(w) /an,accelerating,inferential,engineering,tale,elite,grant,fee,et,cetera/ w2(w) /artificial,intelligence/ ; alias (i,j); abort$(card(i) <> 10) "set i should have 10 elements"; set k 'slices (slice1 if rightmost slice)' /slice1*slice12/ lead(i) 'leading letters' /A,I,E,T,G,F,C/ ; set letters(w,i,k) / an.(a.slice2, n.slice1) accelerating.(a.slice12, c.slice11, c.slice10, e.slice9, l.slice8, e.slice7, r.slice6, a.slice5, t.slice4, i.slice3, n.slice2, g.slice1) inferential.(i.slice11, n.slice10, f.slice9, e.slice8, r.slice7, e.slice6, n.slice5, t.slice4, i.slice3, a.slice2, l.slice1) engineering.(e.slice11, n.slice10, g.slice9, i.slice8, n.slice7, e.slice6, e.slice5, r.slice4, i.slice3, n.slice2, g.slice1) tale.(t.slice4, a.slice3, l.slice2, e.slice1) elite.(e.slice5, l.slice4, i.slice3, t.slice2, e.slice1) grant.(g.slice5, r.slice4, a.slice3, n.slice2, t.slice1) fee.(f.slice3, e.slice2, e.slice1) et.(e.slice2, t.slice1) cetera.(c.slice6, e.slice5, t.slice4, e.slice3, r.slice2, a.slice1) artificial.(a.slice10, r.slice9, t.slice8, i.slice7, f.slice6, i.slice5, c.slice4, i.slice3, a.slice2, l.slice1) intelligence.(i.slice12, n.slice11, t.slice10, e.slice9, l.slice8, l.slice7, i.slice6, g.slice5, e.slice4, n.slice3, c.slice2, e.slice1) /; parameter lhs(k,i), rhs(k,i); lhs(k,i) = sum(letters(w1,i,k),1); rhs(k,i) = sum(letters(w2,i,k),1); parameter v(i); v(i) = ord(i)-1; variables y(i) 'decision variables' x(i,j) 'auxiliary variables for uniqueness' carry(k) z 'dummy objective variable' ; binary variable x; integer variable carry; equation addition(k) 'the actual problem' ydef(i) 'calculate y' xrow(i) 'row sums' xcol(j) 'column sums' dummy_objective ; addition(k).. carry(k-1) + sum(i, lhs(k,i)*y(i)) =e= sum(i, rhs(k,i)*y(i)) + 10*carry(k); carry.fx('slice12')=0; ydef(i).. y(i) =e= sum(j, x(i,j)*v(j)); xrow(i).. sum(j, x(i,j)) =e= 1; xcol(j).. sum(i, x(i,j)) =e= 1; * * bounds on leading digits: they can not be 0 * y.lo(lead) = 1; dummy_objective.. z =e= sum(i, y(i)); model m /all/; solve m using mip minimizing z; option y:0; display y.l;