Hi,
let me give you an example.
Suppose you want to count all solutions for 12 queens.
You could write
using CP;
int Dim=12;
dvar int queen[1..Dim] in 1..Dim;
dvar int d1[1..Dim];
dvar int d2[1..Dim];
constraints {
forall(ind in 1..Dim) {
d1[ind] == queen[ind]+ind;
d2[ind] == queen[ind]-ind;
};
allDifferent(queen);
allDifferent(d1);
allDifferent(d2);
};
main {
thisOplModel.generate();
cp.startNewSearch();
cp.param.workers=1;
cp.param.searchType = "depthFirst";
var n=0;
while (cp.next()) {
n = n+1;
}
cp.endSearch();
write(n," Solutions ");
}
and it takes a few seconds to give you 14200 solutions
But if you have 4 machines you could divide the problem into 4 sub problems:
.mod
using CP;
int Dim=12;
{int} subDivision=...;
dvar int queen[1..Dim] in 1..Dim;
dvar int d1[1..Dim];
dvar int d2[1..Dim];
constraints {
queen[1] in subDivision;
forall(ind in 1..Dim) {
d1[ind] == queen[ind]+ind;
d2[ind] == queen[ind]-ind;
};
allDifferent(queen);
allDifferent(d1);
allDifferent(d2);
};
main {
thisOplModel.generate();
cp.startNewSearch();
cp.param.workers=1;
cp.param.searchType = "depthFirst";
var n=0;
while (cp.next()) {
n = n+1;
}
cp.endSearch();
write(n," Solutions ");
}
and then you would use 4 dat files
and in the 4 machines you run
oplrun nqueens.mod sub1.dat
oplrun nqueens.mod sub2.dat
oplrun nqueens.mod sub3.dat
oplrun nqueens.mod sub4.dat
and that way you get your result faster.
The total is 14200 and the sub results are 2471, 4629, 4629 and 2471
regards
#DecisionOptimization#OPLusingCPLEXOptimizer