Ortools устанавливает ограничения при решении

Я использую решатель 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, то какой-нибудь другой решатель, который предоставляет?


person Trion    schedule 12.03.2019    source источник


Ответы (1)


Не прямо. Решатель не имеет состояния и считывает cp_model один раз в начале решения.

То, что вы описываете, кажется просто свойством минимизации. Почему бы вам просто не свести к минимуму volume_expression?

person Laurent Perron    schedule 12.03.2019
comment
Я хотел, но SearchForAllSolutions не поддерживает минимизацию. Мне нужны все возможные решения, чтобы функция была наиболее подходящей. Могу ли я получить все возможные решения, которые минимизируют выражение, с помощью метода Solve решателя CP SAT или MIP? - person Trion; 12.03.2019
comment
Если вы решите с целью и обратным вызовом решения, вы соберете все найденные решения, которые могут быть только одним. Теперь, если вы минимизируете цель, сохраните оптимальное значение, а затем выполните поиск всех решений модели без какой-либо цели, но с ограничением на volume_expression, вы найдете все решения, близкие к оптимальному. - person Laurent Perron; 12.03.2019