Initializing help system before first use

Sudoku puzzle: retrieving status information through parameters


Type: Assignment
Rating: 2 (easy-medium)
Description: Sudoku puzzle:
  • 'all-different' constraints; retrieving status information through parameters (sudoku_ka.mos).
  • Changing the propagation algorithm; time measures with "gettime" (sudoku2_ka.mos).
File(s): sudoku_ka.mos, sudoku2_ka.mos


sudoku_ka.mos
(!****************************************************************
   CP example problems
   ===================
   
   file sudoku_ka.mos
   ``````````````````
   Sudoku puzzle.

   *** This model cannot be run with a Community Licence 
       for the provided data instance ***

   (c) 2008 Artelys S.A. and Fair Isaac Corporation
       Creation: 2005, rev. Mar. 2013        
*****************************************************************!)

model "sudoku (CP)"
 uses "kalis"

 forward procedure print_solution(numsol: integer)
 
 setparam("kalis_default_lb", 1)
 setparam("kalis_default_ub", 9)         ! Default variable bounds

 declarations
  XS = {'A','B','C','D','E','F','G','H','I'}   ! Columns
  YS = 1..9                              ! Rows
  v: array(XS,YS) of cpvar               ! Number assigned to cell (x,y)
 end-declarations
 
! Data from "The Guardian", 29 July, 2005. http://www.guardian.co.uk/sudoku
 v('A',1)=8; v('F',1)=3
 v('B',2)=5; v('G',2)=4
 v('A',3)=2; v('E',3)=7; v('H',3)=6
 v('D',4)=1; v('I',4)=5
 v('C',5)=3; v('G',5)=9
 v('A',6)=6; v('F',6)=4
 v('B',7)=7; v('E',7)=2; v('I',7)=3
 v('C',8)=4; v('H',8)=1 
 v('D',9)=9; v('I',9)=8  


! All-different values in rows 
 forall(y in YS) all_different(union(x in XS) {v(x,y)})

! All-different values in columns
 forall(x in XS) all_different(union(y in YS) {v(x,y)})

! All-different values in 3x3 squares
 forall(s in {{'A','B','C'},{'D','E','F'},{'G','H','I'}}, i in 0..2)
  all_different(union(x in s, y in {1+3*i,2+3*i,3+3*i}) {v(x,y)})

! Solve the problem
 solct:= 0
 while (cp_find_next_sol) do
  solct+=1
  print_solution(solct)
 end-do
 
 writeln("Number of solutions: ", solct)  
 writeln("Time spent in enumeration: ", 
         getparam("KALIS_COMPUTATION_TIME"), "sec")
 writeln("Number of nodes: ", getparam("KALIS_NODES"))

!****************************************************************
! Solution printing
 procedure print_solution(numsol: integer)
  writeln(getparam("KALIS_COMPUTATION_TIME"), "sec: Solution ", numsol)
  writeln("   A B C   D E F   G H I")
  forall(y in YS) do
   write(y, ": ")
   forall(x in XS) 
    write(getsol(v(x,y)), if(x in {'C','F'}, " | ", " "))
   writeln
   if y mod 3 = 0 then
    writeln("   ---------------------")
   end-if 
  end-do
 end-procedure
    
end-model 


!****************************************************************

Other data sets:

! "The Times", 26 January, 2005
 v('E',1)=4; v('F',1)=3; v('H',1)=6
 v('B',2)=6; v('C',2)=5; v('G',2)=7
 v('A',3)=8; v('D',3)=7; v('I',3)=3
 v('B',4)=5; v('F',4)=1; v('G',4)=3; v('I',4)=7
 v('A',5)=1; v('B',5)=2; v('H',5)=8; v('I',5)=4
 v('A',6)=9; v('C',6)=7; v('D',6)=5; v('H',6)=2
 v('A',7)=4; v('F',7)=5; v('I',7)=9
 v('C',8)=9; v('G',8)=4; v('H',8)=5 
 v('B',9)=3; v('D',9)=4; v('E',9)=6 

! "The Guardian", 3 August, 2005
 v('B',1)=4; v('C',1)=9; v('D',1)=1; v('F',1)=6
 v('A',2)=7; v('F',2)=3
 v('A',3)=1; v('F',3)=4
 v('A',4)=8; v('G',4)=3; v('H',4)=1; v('I',4)=7
 v('A',6)=6; v('B',6)=2; v('C',6)=7; v('I',6)=9
 v('D',7)=8; v('I',7)=1
 v('D',8)=7; v('I',8)=2 
 v('D',9)=5; v('F',9)=2; v('G',9)=4; v('H',9)=9 

sudoku2_ka.mos
(!****************************************************************
   CP example problems
   ===================
   
   file sudoku2_ka.mos
   ```````````````````
   Sudoku puzzle.
   - Choosing the propagation algorithm -

   *** This model cannot be run with a Community Licence 
       for the provided data instance ***

   (c) 2008 Artelys S.A. and Fair Isaac Corporation
       Creation: 2005, rev. Mar. 2013        
*****************************************************************!)

model "sudoku (CP) - 2"
 uses "kalis", "mmsystem"

 parameters
  ALG = KALIS_GEN_ARC_CONSISTENCY        ! or: KALIS_FORWARD_CHECKING
 end-parameters

 forward procedure print_solution(numsol: integer)
 
 starttime:= gettime

 setparam("kalis_default_lb", 1)
 setparam("kalis_default_ub", 9)         ! Default variable bounds

 declarations
  XS = {'A','B','C','D','E','F','G','H','I'}   ! Columns
  YS = 1..9                              ! Rows
  v: array(XS,YS) of cpvar               ! Number assigned to cell (x,y)
 end-declarations
 
! Data from "The Guardian", 29 July, 2005. http://www.guardian.co.uk/sudoku
 v('A',1)=8; v('F',1)=3
 v('B',2)=5; v('G',2)=4
 v('A',3)=2; v('E',3)=7; v('H',3)=6
 v('D',4)=1; v('I',4)=5
 v('C',5)=3; v('G',5)=9
 v('A',6)=6; v('F',6)=4
 v('B',7)=7; v('E',7)=2; v('I',7)=3
 v('C',8)=4; v('H',8)=1 
 v('D',9)=9; v('I',9)=8  


! All-different values in rows 
 forall(y in YS) all_different(union(x in XS) {v(x,y)}, ALG)

! All-different values in columns
 forall(x in XS) all_different(union(y in YS) {v(x,y)}, ALG)

! All-different values in 3x3 squares
 forall(s in {{'A','B','C'},{'D','E','F'},{'G','H','I'}}, i in 0..2)
  all_different(union(x in s, y in {1+3*i,2+3*i,3+3*i}) {v(x,y)}, ALG)

 writeln("Time for posting constraints: ", gettime-starttime, " sec")

! Solve the problem
 solct:= 0
 while (cp_find_next_sol) do
  solct+=1
  print_solution(solct)
 end-do
 
 writeln("Number of solutions: ", solct)  
 writeln("Time spent in enumeration: ", 
         getparam("KALIS_COMPUTATION_TIME"), "sec")
 writeln("Number of nodes: ", getparam("KALIS_NODES"))
 writeln("Total time: ", gettime-starttime, " sec")

!****************************************************************
! Solution printing
 procedure print_solution(numsol: integer)
  writeln(getparam("KALIS_COMPUTATION_TIME"), "sec: Solution ", numsol)
  writeln("   A B C   D E F   G H I")
  forall(y in YS) do
   write(y, ": ")
   forall(x in XS) 
    write(getsol(v(x,y)), if(x in {'C','F'}, " | ", " "))
   writeln
   if y mod 3 = 0 then
    writeln("   ---------------------")
   end-if 
  end-do
 end-procedure
    
end-model 


!****************************************************************

Other data sets:

! "The Times", 26 January, 2005
 v('E',1)=4; v('F',1)=3; v('H',1)=6
 v('B',2)=6; v('C',2)=5; v('G',2)=7
 v('A',3)=8; v('D',3)=7; v('I',3)=3
 v('B',4)=5; v('F',4)=1; v('G',4)=3; v('I',4)=7
 v('A',5)=1; v('B',5)=2; v('H',5)=8; v('I',5)=4
 v('A',6)=9; v('C',6)=7; v('D',6)=5; v('H',6)=2
 v('A',7)=4; v('F',7)=5; v('I',7)=9
 v('C',8)=9; v('G',8)=4; v('H',8)=5 
 v('B',9)=3; v('D',9)=4; v('E',9)=6 

! "The Guardian", 3 August, 2005
 v('B',1)=4; v('C',1)=9; v('D',1)=1; v('F',1)=6
 v('A',2)=7; v('F',2)=3
 v('A',3)=1; v('F',3)=4
 v('A',4)=8; v('G',4)=3; v('H',4)=1; v('I',4)=7
 v('A',6)=6; v('B',6)=2; v('C',6)=7; v('I',6)=9
 v('D',7)=8; v('I',7)=1
 v('D',8)=7; v('I',8)=2 
 v('D',9)=5; v('F',9)=2; v('G',9)=4; v('H',9)=9 

© 2001-2020 Fair Isaac Corporation. All rights reserved. This documentation is the property of Fair Isaac Corporation (“FICO”). Receipt or possession of this documentation does not convey rights to disclose, reproduce, make derivative works, use, or allow others to use it except solely for internal evaluation purposes to determine whether to purchase a license to the software described in this documentation, or as otherwise set forth in a written software license agreement between you and FICO (or a FICO affiliate). Use of this documentation and the software described in it must conform strictly to the foregoing permitted uses, and no other use is permitted.