Есть ли способ инициализировать начальную точку scipy.optimize.linprog?

#scipy #scipy-optimize

#scipy #scipy-оптимизировать

Вопрос:

У меня есть последовательность линейных программ для решения. Каждый экземпляр отличается от предыдущего только тем, что A, границы и затраты немного отличаются. Интуитивно понятно, что решения предыдущих проблем должны помочь. Как я могу это реализовать?

у scipy.optimize.linprog есть опция x0

x0: 1-D массив, необязательно

Начальные значения независимых переменных, которые будут уточнены алгоритмом оптимизации. Для пересмотренного симплексного метода они должны соответствовать базовому возможному решению.

который, похоже, делает это, но, похоже, не работает, если я просто инициализирую результаты предыдущей оптимизации ( res.x ). Сбой со следующей ошибкой:

 6 : Guess x0 cannot be converted to a basic feasible solution
  

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

1. Я бы не возлагал на это слишком больших надежд, поскольку A: реализация scipy довольно ограничена по сравнению с современными коммерческими решателями (которые могут предлагать больше функций, подобных ремонту ) и, что более важно, B: мутации, которые вы делаете, без дальнейших предположений, убивают все хорошие гарантии. Вещи, в которых симплекс используется поэтапно, обычно являются случаями, когда изменения либо приводят к сохранению первичной осуществимости , либо к сохранению двойной осуществимости . В вашем случае ни то, ни другое не гарантируется. Если производительность так важна, начните использовать самый современный решатель (не scipy).

Ответ №1:

Ошибка в основном означает, что res.x проблема, которую вы только что решили, не удовлетворяет ограничениям проблемы, которую вы пытаетесь решить при передаче res.x as x0 .

Почему это? Решение задачи линейного программирования всегда находится в одной из вершин допустимого множества, в основном на границе того, что разрешено вашими ограничениями. Если ваша следующая проблема немного отличается от той, которую вы решили, весьма вероятно, что решение предыдущей проблемы не удовлетворяет ограничениям новой — оно было на границе, и небольшие изменения в проблеме немного сдвинули границу и сделали предыдущую точку внешней. Не зная деталей вашей проблемы оптимизации, здесь трудно рекомендовать разумную стратегию. Например, если вы знаете, что точка (0, …,0) всегда выполнима, вы можете масштабировать все координаты res.x вниз, пока не попадете в допустимый набор.

Прошло некоторое время, поэтому я не уверен, но вы можете попробовать method='interior-point' , поскольку это может быть более щадящим для x0 нахождения за пределами допустимого набора. В противном случае Google «как найти возможное решение проблемы линейного программирования»