Повторное использование модели решателя choco для дальнейшего ограничения решения - PullRequest
0 голосов
/ 06 ноября 2019

Я использую библиотеку choco solver для генерации набора головоломок. Мне нужно запустить решатель, проверить, сколько существует решений, и, если их несколько, добавить дополнительное ограничение. Повторение этого даст мне набор ограничений (подсказок), который имеет уникальное решение.

Однако, как только я запустил model.getSolver (findAllSolutions ()), любые дополнительные проверки возвращают ноль решений.

Я предполагаю, что мне нужно каким-то образом сбросить решатель моделей, но я не могу найти способ достижения этого - я бы предпочел не создавать новую модель и не воссоздавать существующие ограничения, если потребуется.

Оригинальный код имеет 110 IntVar и огромное количество ограничений, но я создал гораздо меньший пример.

Примечание: в реальном приложении я использую model.getSolver (). findAllSolutions (new SolutionCounter (model, 2). )), чтобы ускорить процесс, но я пропустил этот шаг здесь.

Model model = new Model();
// setup two doors A and B, one has the value 0 the other 1
IntVar doorA = model.intVar("Door A", 0, 1);
IntVar doorB = model.intVar("Door B", 0, 1);
model.allDifferent(new IntVar[]{doorA, doorB}).post();
// setup two windows A and B, one has the value 0 the other 1
IntVar windowA = model.intVar("Window A", 0, 1);
IntVar windowB = model.intVar("Window B", 0, 1);
model.allDifferent(new IntVar[]{windowA, windowB}).post();
// assign the first constraint and count the solutions
model.arithm(doorA,"=",0).post();
// this should force door B to be 1 - there are two remaining solutions
List<Solution> solutions = model.getSolver().findAllSolutions();
System.out.println("results after first clue");
for (Solution s : solutions) {
     System.out.println(">"+s.toString());
}
assertEquals("First clue leaves two solutions",2,solutions.size());
// add second clue
model.arithm(windowA,"=",1).post();
// this should force window B to by 0 - only one valid solution
List<Solution> solutions2 = model.getSolver().findAllSolutions();
System.out.println("results after second clue");
for (Solution s : solutions2) {
   System.out.println(">"+s.toString());
}
assertEquals("Second clue leaves one solution",1,solutions2.size());

1 Ответ

0 голосов
/ 07 ноября 2019

Для всех, кто ищет это, оказывается, что ответ прост.

model.getSolver().reset();
...