61 lines
1.7 KiB
Text
61 lines
1.7 KiB
Text
/*Knights.mathprog
|
|
|
|
Find a Knights Tour
|
|
|
|
Nigel_Galloway
|
|
January 11th., 2012
|
|
*/
|
|
|
|
param ZBLS;
|
|
param ROWS;
|
|
param COLS;
|
|
param D := 2;
|
|
set ROWSR := 1..ROWS;
|
|
set COLSR := 1..COLS;
|
|
set ROWSV := (1-D)..(ROWS+D);
|
|
set COLSV := (1-D)..(COLS+D);
|
|
param Iz{ROWSR,COLSR}, integer, default 0;
|
|
set ZBLSV := 1..(ZBLS+1);
|
|
set ZBLSR := 1..ZBLS;
|
|
|
|
var BR{ROWSV,COLSV,ZBLSV}, binary;
|
|
|
|
void0{r in ROWSV, z in ZBLSR,c in (1-D)..0}: BR[r,c,z] = 0;
|
|
void1{r in ROWSV, z in ZBLSR,c in (COLS+1)..(COLS+D)}: BR[r,c,z] = 0;
|
|
void2{c in COLSV, z in ZBLSR,r in (1-D)..0}: BR[r,c,z] = 0;
|
|
void3{c in COLSV, z in ZBLSR,r in (ROWS+1)..(ROWS+D)}: BR[r,c,z] = 0;
|
|
void4{r in ROWSV,c in (1-D)..0}: BR[r,c,ZBLS+1] = 1;
|
|
void5{r in ROWSV,c in (COLS+1)..(COLS+D)}: BR[r,c,ZBLS+1] = 1;
|
|
void6{c in COLSV,r in (1-D)..0}: BR[r,c,ZBLS+1] = 1;
|
|
void7{c in COLSV,r in (ROWS+1)..(ROWS+D)}: BR[r,c,ZBLS+1] = 1;
|
|
|
|
Izfree{r in ROWSR, c in COLSR, z in ZBLSR : Iz[r,c] = -1}: BR[r,c,z] = 0;
|
|
Iz1{Izr in ROWSR, Izc in COLSR, r in ROWSR, c in COLSR, z in ZBLSR : Izr=r and Izc=c and Iz[Izr,Izc]=z}: BR[r,c,z] = 1;
|
|
|
|
rule1{z in ZBLSR}: sum{r in ROWSR, c in COLSR} BR[r,c,z] = 1;
|
|
rule2{r in ROWSR, c in COLSR}: sum{z in ZBLSV} BR[r,c,z] = 1;
|
|
rule3{r in ROWSR, c in COLSR, z in ZBLSR}: BR[0,0,z+1] + BR[r-1,c-2,z+1] + BR[r-1,c+2,z+1] + BR[r-2,c-1,z+1] + BR[r-2,c+1,z+1] + BR[r+1,c+2,z+1] + BR[r+1,c-2,z+1] + BR[r+2,c-1,z+1] + BR[r+2,c+1,z+1] - BR[r,c,z] >= 0;
|
|
|
|
solve;
|
|
|
|
for {r in ROWSR} {
|
|
for {c in COLSR} {
|
|
printf " %2d", sum{z in ZBLSR} BR[r,c,z]*z;
|
|
}
|
|
printf "\n";
|
|
}
|
|
data;
|
|
|
|
param ROWS := 5;
|
|
param COLS := 5;
|
|
param ZBLS := 25;
|
|
param
|
|
Iz: 1 2 3 4 5 :=
|
|
1 . . . . .
|
|
2 . 19 2 . .
|
|
3 . . . . .
|
|
4 . . . . .
|
|
5 . . . . .
|
|
;
|
|
|
|
end;
|