Использование scipy.optimize.fmin_slsqp

Я пытаюсь использовать пакет scipy.optimize, чтобы найти максимум моей функции стоимости.

В этом конкретном случае: у меня есть список цен, которые меняются в течение дня. Чтобы это стало проще, давайте предположим, что день имеет 8 часов, а цена в каждый час выглядит следующим образом:

price_list = np.array([1,2,6,8,8,5,2,1]) 

В этом упрощенном случае я хочу выбрать 4 самых высоких цены из этого price_list. И по разным причинам я не хочу просто сортировать и выбирать лучшие четыре цены, но использовать некоторый алгоритм оптимизации. У меня есть несколько ограничений, поэтому я решил использовать алгоритм наименьшего квадрата из scipy, scipy.optimize.fmin_slsqp.

Сначала я создаю расписание для выбранных часов:

 schedule_list = np.zeros( len(price_list), dtype=float) 

Затем мне нужно определить мою обратную функцию profit_function. За все выбранные часы я хочу подвести итоги своей прибыли. Хотя я хочу оптимизировать свое расписание, price_list фиксирован, поэтому мне нужно поместить его в * args:

 def price_func( schedule_list, *price_list ): return -1.*np.sum( np.dot( schedule_list, price_list ) ) 

Как только я понимаю, как все работает в принципе, я буду перемещать кое-что. До тех пор я просто избегаю использовать больше аргументов * args и определяю свое ограничение с помощью жесткого кодированного количества часов для запуска. И я хочу, чтобы мои выбранные часы были ровно 4, поэтому я использую ограничение равенства:

 def eqcon(x, *price_list): return sum( schedule_list ) - 4 

Кроме того, я хочу ограничить мои значения расписания как 0 или 1. Я не уверен, как реализовать это прямо сейчас, поэтому я просто использую ключевые слова bounds.

Неограниченная оптимизация с границами работает нормально. Я просто передаю свой список расписаний как первое предположение.

 scipy.optimize.fmin_slsqp( price_func, schedule_list, args=price_list, bounds=[[0,1]]*len(schedule_list) ) 

и выход так же хорош, как это может быть:

 Optimization terminated successfully. (Exit mode 0) Current function value: -33.0 Iterations: 2 Function evaluations: 20 Gradient evaluations: 2 Out[8]: array([ 1., 1., 1., 1., 1., 1., 1., 1.]) 

Без каких-либо дополнительных ограничений это оптимальное решение!

Используя ограниченную оптимизацию с помощью следующей команды:

 scipy.optimize.fmin_slsqp( price_func, schedule_list, args=price_list, bounds=[[0,1]]*len(schedule_list), eqcons=[eqcon, ] ) 

дает мне ошибку:

 Singular matrix C in LSQ subproblem (Exit mode 6) Current function value: -0.0 Iterations: 1 Function evaluations: 10 Gradient evaluations: 1 Out[9]: array([ 0., 0., 0., 0., 0., 0., 0., 0.]) 

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

На следующем шаге я уже сформулировал ограничения неравенства. Правильно ли я понимаю, что в скопированной минимизирующей оболочке предполагается, что неравенства больше 0, а в fmin_slsqp – наоборот. Решения ограничены функциями отрицательного ограничения?

2 Solutions collect form web for “Использование scipy.optimize.fmin_slsqp”

У вас простая линейная программа, верно?

 min: - prices . x constrain: x >= 0, sum x = 4 

поэтому вторая производная матрица aka Hessian равна точно 0.
slsqp пытается инвертировать это – невозможно. Согласившись, сообщение об ошибке может быть лучше.
(То же самое произойдет с другими квадратичными методами, в любом пакете: они будут сходиться намного быстрее на гладких функциях, но сбой на грубых скалах.)

См. Также почему-cant-i-rig-scipys-constrained-optimization-for-integer-programming –
но LP должен выполнять задание (макс. 4), программирование целых чисел сложнее.

Алгоритм SLSQP представляет собой оптимизатор на основе градиента, то есть он ожидает, что производные объектива и ограничений будут непрерывными. По моему мнению, кажется, что вы пытаетесь решить проблему целочисленного программирования (непрерывные значения в списке расписания неприемлемы). Вам нужен алгоритм, который выбирает соответствующие значения (0 или 1) для независимых переменных, а не пытается найти минимум непрерывного пространства значений. К сожалению, я не уверен, что в scipy есть что-то подобное.

  • Полосовой фильтр в питоне
  • Как получить доступ к полям в структуре, импортированной из файла .mat с помощью loadmat в Python?
  • Проверить положительную или полуположительную определенную матрицу
  • Разреженная матричная нарезка с использованием списка int
  • Вычисление локальных средств в массиве 1D numpy
  • Python SciPy IndexError: длина границ несовместима с длиной x0
  • Разберите столбец Pandas в Datetime
  • Можно ли использовать BLAS для ускорения размножения малой матрицы?
  •  
    Interesting Posts for Van-Lav

    Есть ли эквивалент PHP hash_hmac в Python / Django?

    Лучше понять проблемы SQLalchemy `yield_per ()`

    Какую IDE использовать для Python?

    Преимущество списка над строкой в ​​методах подпроцесса

    Как выполнять импорт в модуле python без загрязнения его пространства имен?

    Ошибка «неизвестного столбца X.id» в django с использованием существующей базы данных

    Автоматическое создание выходного документа с расширением Sphinx

    Почему «ключ в d.keys ()» заканчивается в O (n) времени, пока «ключ в d» заканчивается в O (1)?

    Как получить автора офисного файла в python?

    Алгоритм решения обрезания для обрушения этого дерева?

    Как запустить несколько версий Python в Windows

    как я могу использовать pip с pypy, установленным с панели запуска?

    python: взаимодействие с сеансом в скриптах cgi

    Объекты Django F () и пользовательские данные сохраняют странность

    Как взять максимум 2 столбца в фрейме данных и сделать его еще одним столбцом?

    Python - лучший язык программирования в мире.