$ontext Sudoku solver September 2005, updated feb 2011 Original code written by: Paul van der Eijk Sherman Robinson $offtext sets r 'rows' c 'columns' v 'values' bc 'block cols' br 'block rows' bcmap(bc, c) brmap(br, r) ; parameter problem(r,c); *$gdxin sudoku25.gdx $gdxin sudoku81.gdx $load r c v bc br $loaddc bcmap brmap problem Parameter value(v) "Values"; value(v) = ord(v) ; binary variable x(r,c,v); variable dummy; equations eq1(r,c) "exactly one value for each cell" eq2(c, v) "columns entries have to be unique" eq3(r, v) "row entries have to be unique" eq4(br, bc, v) "sub-squares have to be unique" nobj "definition of objective - anything" ; eq1(r, c).. sum(v, x(r, c, v)) =E= 1; eq2(c, v).. sum(r, x(r, c, v)) =E= 1; eq3(r, v).. sum(c, x(r, c, v)) =E= 1; eq4(br, bc, v).. sum((bcmap(bc, c),brmap(br, r)), x(r, c, v)) =E= 1; nobj.. dummy =E= 0; * Fix values in the problem x.fx(r,c,v)$(problem(r,c) = value(v)) = 1 ; option limrow=0, limcol=0; model sudoku /eq1, eq2, eq3, eq4, nobj/; solve sudoku minimizing dummy using mip; parameter solution(r,c) "Display of results"; loop(v, solution(r, c)$(x.l(r, c, v) and (not problem(r,c))) = Ord(v); ); option problem:0:1:1,solution:0:1:1; display problem, solution;