#python #pulp #constraint-programming #operations-research
Вопрос:
Пример использования
Это всего лишь простой пример для понимания того, как и почему он работает не так, как ожидалось.
Существует набор процессов, которые имеют отметку времени начала и окончания. отметка времени начала процесса должна быть после отметки времени окончания его предшественника. Пока все идет хорошо.
Рассмотрение
Что касается ограничений: разве не должно быть возможно выполнять более сложные операции, чем арифметические уравнения (например, запросы и различия в регистре)?
Это проиллюстрировано в приведенном ниже коде.
- Стандартная формулировка ограничения работает правильно.
- Но это не сработает, если вы введете вызов функции в уравнение.
def func(p):
if self.start_timestamps[p] >= self.end_timestamps[p-1]:
return 1
return 0
# constraint for precedences of processes
for process_idx in self.processes:
if process_idx > 0:
# works fine !
model = self.start_timestamps[process_idx] >= self.end_timestamps[process_idx-1]
# doesn't work, but should?!
model = func(process_idx) == 1
Вопросы
- Есть ли способы решить эту проблему с помощью вызова функции? (В более сложном случае, например, вам пришлось бы выполнять различные запросы и итерации внутри функции.)
- Если это невозможно с PuLP, существуют ли другие библиотеки ИЛИ библиотеки, которые могут обрабатывать подобные вещи?
Спасибо!
Комментарии:
1. Нет, это невозможно. И нет, полезной альтернативы нет (если мы попросим о поддержке черного ящика ). Каждый из этих решателей дискретной оптимизации общего назначения определяет математическую основную теорию. Вы должны играть по правилам, вытекающим из этого. В discrete-opt существуют разные концепции / решатели, и некоторые из них проще в использовании, чем другие (например, Программирование ограничений более естественно для неспециалистов по сравнению с MILP или даже хуже: SAT), но, конечно, они также ведут себя по-разному (преимущества и недостатки). Общие советы сложны (в деталях); но рассмотрите ortools cp-sat (похоже на CP).
2. Pyomo работает с функциями Python. Конечно, для линейной модели вам нужно убедиться, что все остается линейным.