Как можно вызывать функции в ограничениях PuLP (Python)?

#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
 

Вопросы

  1. Есть ли способы решить эту проблему с помощью вызова функции? (В более сложном случае, например, вам пришлось бы выполнять различные запросы и итерации внутри функции.)
  2. Если это невозможно с PuLP, существуют ли другие библиотеки ИЛИ библиотеки, которые могут обрабатывать подобные вещи?

Спасибо!

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

1. Нет, это невозможно. И нет, полезной альтернативы нет (если мы попросим о поддержке черного ящика ). Каждый из этих решателей дискретной оптимизации общего назначения определяет математическую основную теорию. Вы должны играть по правилам, вытекающим из этого. В discrete-opt существуют разные концепции / решатели, и некоторые из них проще в использовании, чем другие (например, Программирование ограничений более естественно для неспециалистов по сравнению с MILP или даже хуже: SAT), но, конечно, они также ведут себя по-разному (преимущества и недостатки). Общие советы сложны (в деталях); но рассмотрите ortools cp-sat (похоже на CP).

2. Pyomo работает с функциями Python. Конечно, для линейной модели вам нужно убедиться, что все остается линейным.