| |||||||||||||||||||
| |||||||||||||||||||
|
Sudoku (CP and MIP models) Description Playing Sudoku: fill in the 9x9 grid so that every row, every column and every 3x3 box contains the numbers 1-9.
Source Files By clicking on a file name, a preview is opened at the bottom of this page.
Data Files sudoku.mos
(!****************************************************************
Mosel example problems
======================
file sudoku.mos
```````````````
Sudoku puzzle - data read from file.
(c) 2008 Fair Isaac Corporation
author: S. Heipcke, Jul 2020
*****************************************************************!)
model "sudoku (MIP)"
uses "mmxprs", "mmsystem"
parameters
DATAFILE = "sudokug290705.dat"
end-parameters
forward procedure print_solution
declarations
XS = {'A','B','C','D','E','F','G','H','I'}
YS = 1..9
VALS = 1..9
VALUE: dynamic array(XS,YS) of integer
v: array(XS,YS) of mpvar
b: array(XS,YS,VALS) of mpvar
end-declarations
initializations from "Data/"+DATAFILE
VALUE
end-initializations
! Fix variables to the given values
forall(x in XS, y in YS | exists(VALUE(x,y))) v(x,y) = VALUE(x,y)
! Associate binaries with cell variables
forall(x in XS, y in YS) do
forall(i in VALS) b(x,y,i) is_binary
v(x,y) = sum(i in VALS) i*b(x,y,i)
sum(i in VALS) b(x,y,i) = 1
end-do
starttime:=gettime
! All-different values in rows
forall(y in YS, i in VALS) sum(x in XS) b(x,y,i) = 1
! All-different values in columns
forall(x in XS, i in VALS) sum(y in YS) b(x,y,i) = 1
! All-different values in 3x3 squares
forall(k in 0..2, i in VALS) do
sum(x in {'A','B','C'}, y in {1+3*k,2+3*k,3+3*k}) b(x,y,i) = 1
sum(x in {'D','E','F'}, y in {1+3*k,2+3*k,3+3*k}) b(x,y,i) = 1
sum(x in {'G','H','I'}, y in {1+3*k,2+3*k,3+3*k}) b(x,y,i) = 1
end-do
! Solve the problem
minimize(0)
if getprobstat=XPRS_OPT then
print_solution
end-if
writeln("Total time: ", gettime-starttime)
!****************************************************************
! Solution printing
procedure print_solution
writeln("Solution:")
write(" "); forall(x in XS) write(x," "); writeln
forall(y in YS) do
write(y, ": ")
forall(x in XS) write(v(x,y).sol," ")
writeln
end-do
returned:=true
end-procedure
end-model
| |||||||||||||||||||
| © Copyright 2025 Fair Isaac Corporation. |