Performance improvement in nqueens
authorHamed Gorjiara <hgorjiar@uci.edu>
Thu, 26 Jul 2018 21:27:21 +0000 (14:27 -0700)
committerHamed Gorjiara <hgorjiar@uci.edu>
Thu, 26 Jul 2018 21:27:21 +0000 (14:27 -0700)
nqueens/nqueens.cc

index 56fa2f6e45b2f299ba104f4458c8402eaaa873c2..48b1068c03bcce6adb724b1d0722eaffa77cb04c 100644 (file)
@@ -337,6 +337,29 @@ void differentInEachRow(CSolver* solver, int N, vector<Element*> &elems){
 
 }
 
+void oneQueenInEachRow(CSolver* solver, vector<Element*> &elems){
+       Predicate *eq = solver->createPredicateOperator(SATC_EQUALS);
+       int N = elems.size();
+       for(int i=0; i<N; i++){
+               vector<BooleanEdge> rowConstr;
+               for(int j=0; j<N; j++){
+                       Element* e1 = elems[j];
+                       Element* e2 = solver->getElementConst(3, (uint64_t) i);
+                       Element* in[] = {e1, e2};
+                        BooleanEdge equals = solver->applyPredicate(eq, in, 2);
+                        rowConstr.push_back(equals);
+               }
+               if(rowConstr.size()>0){
+                       solver->addConstraint(solver->applyLogicalOperation(SATC_OR, &rowConstr[0], rowConstr.size()) );
+               }
+       }
+}
+
+void generateRowConstraints(CSolver* solver, int N, vector<Element*> &elems){
+       oneQueenInEachRow(solver, elems);
+       differentInEachRow(solver, N, elems);
+}
+
 void diagonallyDifferentConstraint(CSolver *solver, int N, vector<Element*> &elems){
        Predicate *eq = solver->createPredicateOperator(SATC_EQUALS);
        for(int i=N-1; i>0; i--){
@@ -399,7 +422,7 @@ void csolverNQueens(int N){
                elems.push_back(solver->getElementVar(domainSet));
        }
        mustHaveValueConstraint(solver, elems);
-       differentInEachRow(solver, N, elems);
+       generateRowConstraints(solver, N, elems);
        diagonallyDifferentConstraintBothDir(solver, N, elems);
 //     solver->printConstraints();
 //     solver->serialize();