Skip to content

Instantly share code, notes, and snippets.

@ymakino
Last active December 11, 2015 13:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ymakino/4605973 to your computer and use it in GitHub Desktop.
Save ymakino/4605973 to your computer and use it in GitHub Desktop.
A simple sudoku solver for GLPK.
#
# Usage: glpsol -m sudoku.mod -o sudoku.sol
#
set Number := 1..9;
set GNumber := 0..2;
set Group{i in GNumber} := i*3+1..i*3+3;
var cell{Number, Number, 0..9} binary;
var answer_cell{Number, Number} integer;
param fixed_cell{Number, Number} integer;
minimize total: sum{n1 in Number, n2 in Number, n3 in Number} cell[n1,n2,n3];
s.t. unique{n1 in Number, n2 in Number}: sum{n in Number} cell[n1,n2,n]=1;
s.t. column{n1 in Number, n in Number}: sum{n2 in Number} cell[n1,n2,n]=1;
s.t. row{n2 in Number, n in Number}: sum{n1 in Number} cell[n1,n2,n]=1;
s.t. group{g1 in GNumber, g2 in GNumber, n in Number}: sum{n1 in Group[g1], n2 in Group[g2]} cell[n1,n2,n]=1;
s.t. fixed{n1 in Number, n2 in Number}: cell[n1, n2, fixed_cell[n1,n2]]=1;
s.t. answer{n1 in Number, n2 in Number}: answer_cell[n1,n2] = sum{n in Number} cell[n1, n2, n] * n;
solve;
printf 'Question:\n';
for { i in Number } {
for { j in Number } {
for {{0}: fixed_cell[i,j] == 0} {
printf '. ';
} for {{0}: fixed_cell[i,j] != 0} {
printf '%d ', fixed_cell[i,j];
}
}
printf '\n';
}
printf '\n';
printf 'Answer:\n';
for { i in Number } {
for { j in Number } {
printf '%d ', answer_cell[i,j];
}
printf '\n';
}
printf '\n';
data;
param fixed_cell: 1 2 3 4 5 6 7 8 9 :=
1 0 0 5 3 0 0 0 0 0
2 8 0 0 0 0 0 0 2 0
3 0 7 0 0 1 0 5 0 0
4 4 0 0 0 0 5 3 0 0
5 0 1 0 0 7 0 0 0 6
6 0 0 3 2 0 0 0 8 0
7 0 6 0 5 0 0 0 0 9
8 0 0 4 0 0 0 0 3 0
9 0 0 0 0 0 9 7 0 0;
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment