#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, вы найдете все решения, близкие к оптимальным.