Я использую решатель CP-SAT из ortools https://developers.google.com/optimization/cp/cp_solver
Я выполняю решатель с объектом обратного вызова
solver = cp_model.CpSolver()
solution_agg = SolutionCollector(data, self.variables, self.products, self.vehicles)
status = solver.SearchForAllSolutions(self.model, callback=solution_agg)
Предполагается, что решение agg отфильтровывает все решения, которые имеют некоторые неправильные назначения, я не мог моделировать их как линейные неравенства.
Что я знаю, так это то, что сгенерированные решения могут быть сходимы быстрее, а количество «попаданий» в верификатор может быть уменьшено. Если я могу добавить ограничения на ходу внутри обратного вызова.
Я попытался сделать это внутри обратного вызова, добавив ограничение для поиска решений в меньшем объеме, чем минимальный объем до сих пор.
self.__model.Add(volume_expression <= min_found_yet)
Это не приводит к ошибке, но количество раз, когда проверяющий отклоняет решение, остается прежним.
Можно ли при решении формировать ограничения? Если не в Ortools, то какой-нибудь другой решатель, который предоставляет?