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

#modeling #integer-programming #or-tools #operations-research

#моделирование #целочисленное программирование #или-инструменты #операции-исследование

Вопрос:

Я использую решатель CP-SAT от ortoolshttps://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)
  

Предполагается, что Solution agg отфильтровывает все решения, которые имеют некоторые неправильные назначения, я не мог смоделировать их как линейные неравенства.

Что я знаю, так это то, что сгенерированные решения могут быть сведены быстрее, а «попаданий» в верификатор может быть меньше. Если я смогу добавить ограничения на ходу внутри обратного вызова.

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

 self.__model.Add(volume_expression <= min_found_yet)
  

Это не приводит к ошибке, но количество раз, когда верификатор отклонял решение, остается тем же.

Возможно ли формировать ограничения при решении? Если не в Ortools, то в любом другом решателе, который предоставляет?

Ответ №1:

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

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

Комментарии:

1. Я хотел, но SearchForAllSolutions не поддерживает никакой минимизации. Мне нужны все возможные решения, чтобы функция была наиболее подходящей. Могу ли я получить все возможные решения, которые минимизируют выражение, с помощью метода Solve CP SAT или MIP solver?

2. Если вы решаете с помощью objective и обратного вызова решения, вы соберете все найденные решения, которые могут быть только одним. Теперь, если вы минимизируете цель, сохраняете оптимальное значение, затем выполняете поиск всех решений модели без какой-либо цели, но с ограничением на volume_expression, вы найдете все решения, близкие к оптимальным.