Чи є якісний нелінійний програмувальний вирішувач для Python?


77

У мене є декілька складних проблем, що стосуються невипуклої глобальної оптимізації. В даний час я використовую панель інструментів оптимізації MATLAB (конкретно, fmincon()з алгоритмом = 'sqp'), що є досить ефективним . Однак більша частина мого коду знаходиться в Python, і я хотів би зробити оптимізацію і в Python. Чи є розв'язувач NLP з прив'язками Python, з якими можна конкурувати fmincon()? Це повинно

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

Це добре, якщо це не гарантує глобального оптимуму ( fmincon()ні). Я шукаю щось, що наближено до локального оптимуму навіть для складних проблем, і навіть якщо це трохи повільніше, ніж fmincon().

Я спробував декілька вирішувачів, доступних через OpenOpt, і виявив, що вони поступаються MATLAB fmincon/sqp.

Тільки для акценту я вже маю простежувану формулювання та хороший вирішувач. Моя мета - просто змінити мови, щоб мати більш обтічний робочий процес.

Джефф вказує, що деякі характеристики проблеми можуть бути актуальними. Вони є:

  • 10-400 змінних рішень
  • 4-100 обмежень поліноміальної рівності (ступінь полінома становить від 1 до приблизно 8)
  • Кілька раціональних обмежень нерівності, що дорівнює приблизно вдвічі меншій кількості змінних рішень
  • Цільова функція - одна із змінних рішень

Якобіан обмежень рівності щільний, як і якобіан обмежень нерівності.


2
Девіде, це, на жаль, зовсім інше питання :) Різниця між локальним мінімумом та глобальним є предметом потенційної нескінченної кількості кандидатів наук, а за теоремою «Без вільного обіду» будь-який вирішувач, який корисний для однієї загальної проблеми глобальної оптимізації, - це суттєво поганий для іншого. Я можу запропонувати почати з розгляду варіантів формулювання (Чи є змішана ціла форма? Чи існує опуклий наближення?)
Арон Ахмадія

Девід, Арон добре зазначає. Формулювання, безумовно, є ключовим у плані отримання чисельних рішень невипуклих НЛП, не кажучи вже про швидке отримання хороших рішень. Можливо, варто розглянути альтернативні рецептури, а потім використовувати структуру цих рецептур для керівництва вашим вибором вирішувача. Використання розв'язувача, що експлуатує будь-яку структуру (наприклад, обмеженість, багатоступеневе стохастичне програмування, використання обмежень для генерування скорочень), яке можна викликати у вашій проблемі, є ключовим для отримання хороших рішень.
Джефф Оксберрі

@DavidKetcheson: Оскільки у вас є рецептура, яку ви хочете використовувати, чи можете ви хоча б прокоментувати характеристики вашої рецептури? Якобій Лагрангян щільний чи розріджений? Приблизно скільки змінних він має? Для нас не корисно рекомендувати програмне забезпечення, яке реалізує невідповідні для вашої проблеми методи вирішення, і це єдина причина, коли люди говорять про формулювання в першу чергу.
Джефф Оксберрі

coopr забезпечує прив'язку до ipopt, використовуючи asl: ipopt
denfromufa

Відповіді:


32

fmincon()як ви вже згадували, використовуються кілька добре відомих стратегій нелінійної оптимізації, які намагаються знайти локальний мінімум без особливого врахування, чи був знайдений глобальний оптимум. Якщо ви з цим все гаразд, то, я думаю, ви правильно поставили питання (нелінійна оптимізація).

Найкращий пакет, який мені відомий для загальної нелінійної оптимізації, - це IPOPT [1]. Мабуть, Метью Сю підтримує набір прив'язок Python до IPOPT , тому це може десь почати.

[1]: Андреас Вахтер є особистим другом, тому я, можливо, трохи упереджений.


Андреас робить гарну роботу, але його вирішувач також вимагає матриці якобійської інформації (або, принаймні, інформації про обмеженість для матриці якобіїв). Коли ви говорите, що ви хочете вирішувач, який не потребує якобіанській матриці, ви маєте на увазі, що ви хочете вирішувач, який не вимагає від вас аналітичної матриці якобіана (щоб вистачило обчислення кінцевої різниці) або ви хочете вирішувач, який взагалі не потребує матричної інформації Якобії (що обмежило б методи оптимізації без похідних)?
Джефф Оксберрі

Хороший улов. Я маю на увазі колишнього; Я оновив питання.
Девід Кетчесон

Нарешті я зміг застосувати IPOPT до своєї проблеми за допомогою sage.openopt.org . Це чудово!
Девід Кетчесон

4
Сьогодні (2017 р.) Ви також можете використовувати IPOPT в Python корито Pyomo . Ви отримуєте мову моделювання алгебрики та автоматичну різницю для якобіака та гессі.
Антонелло

@Antonello виправлене посилання pyomo.org
Moonwalker

37

Я працюю в лабораторії, яка займається глобальною оптимізацією змішаних цілих і невипуклих проблем. Мій досвід роботи з вирішенням питань оптимізації з відкритим кодом полягає в тому, що кращі, як правило, написані на компільованій мові, і вони погано працюють у порівнянні з комерційними пакетами оптимізації.

Якщо ви можете сформулювати свою проблему як явну систему рівнянь і вам потрібен безкоштовний вирішувач, найкраща ставка - це, мабуть, IPOPT, як сказав Арон. Інші безкоштовні вирішувачі можна знайти на веб-сайті COIN-OR . Наскільки мені відомо, у нелінійних розв'язувачів немає прив’язок Python, передбачених розробниками; будь-які прив’язки, які ви знайдете, будуть сторонніми. Для отримання хороших рішень вам також доведеться обгортати будь-який нелінійний, опуклий вирішувач, який ви знайдете, у відповідній евристиці стохастичної глобальної оптимізації, або в детермінованому алгоритмі глобальної оптимізації, такому як гілка і пов'язана. Крім того, ви можете використовувати Bonmin або Couenne, обидва вони - детерміновані нерозпуклі оптимізатори для оптимізації, які працюють добре в порівнянні з найсучаснішим рішенням, BARON .

Якщо ви можете придбати комерційний вирішувач оптимізації, ви можете розглянути мову моделювання GAMS , яка включає кілька нелінійних вирішувачів оптимізації. Особливо слід згадати інтерфейси для вирішувачів CONOPT, SNOPT та BARON. (CONOPT і SNOPT - опуклі розв'язувачі.) Рішення kludgey, яке я використовував у минулому, - це використовувати прив'язки мови Fortran (або Matlab) до GAMS, щоб написати файл GAMS і викликати GAMS з Fortran (або Matlab) для обчислення. рішення задачі оптимізації. GAMS володіє мовою Python та дуже чуйним обслуговуючим персоналом, який готовий допомогти, якщо є якісь проблеми. (Відмова: Я не маю приналежності до GAMS, але моя лабораторія має ліцензію GAMS.) Комерційні рішення не повинні бути гіршими, ніжfmincon; насправді я був би здивований, якби вони не були набагато кращими. Якщо ваші проблеми мають достатньо невеликі розміри, можливо, вам навіть не знадобиться купувати ліцензію GAMS та ліцензії для вирішувачів, оскільки оцінювальна копія GAMS може бути завантажена з їх веб-сайту. В іншому випадку ви, мабуть, захочете вирішити, які вирішувати придбати разом із ліцензією GAMS. Варто відзначити, що BARON вимагає змішаного цілого цілого лінійного програмування і що ліцензії на два найкращі рішачі лінійного програмування змішаного цілого числа CPLEX та GUROBI є безкоштовними для науковців, тому, можливо, вам вдасться піти з просто придбання інтерфейсів GAMS ніж інтерфейси та ліцензії на вирішення, які можуть заощадити чималі гроші.

Цей пункт повторюється: для будь-якого з детермінованих невипуклих розв'язків оптимізації, про які я згадував вище, ви повинні мати можливість сформулювати модель як явний набір рівнянь. В іншому випадку алгоритми невипуклої оптимізації не працюватимуть, оскільки всі вони покладаються на символічний аналіз для побудови опуклих релаксацій для алгоритмів, пов'язаних з розгалуженнями та пов'язаними.

ОНОВЛЕННЯ: Одна думка, яка мені спочатку не прийшла в голову , - це те, що ви також можете викликати Інструментарій для розширеної оптимізації ( TAO ) та PETSc, використовуючи tao4py та petsc4py. та засоби ACTS .

ОНОВЛЕННЯ №2: Виходячи з додаткової інформації, яку ви згадали, найкращі ставки для методів послідовного квадратичного програмування (SQP). Методи SQP, як правило, вважаються більш надійними, ніж методи внутрішніх точок, але мають недолік, що вимагає щільних лінійних рішень. Оскільки ви більше піклуєтесь про надійність, ніж про швидкість, SQP стане вашим найкращим вибором. Я не можу знайти хорошого вирішувача SQP там, написаного на Python (і, мабуть, не міг і Свен Лейфер у Argonne у цьому технічному звіті ). Я здогадуюсь, що алгоритми, реалізовані в таких пакетах, як SciPy та OpenOpt, мають базовий скелет деяких алгоритмів SQP, але без спеціалізованої евристики, яку використовують більш досконалі коди для подолання проблем конвергенції. Ви можете спробувати NLopt, написаний Стівеном Джонсоном в MIT. Я не сподіваюся на це, тому що він не має жодної репутації, про яку я знаю, але Стівен Джонсон - геніальний хлопець, який пише гарне програмне забезпечення (адже він написав співпрацю з FFTW). Він реалізує версію SQP; якщо це гарне програмне забезпечення, дайте мені знати.

Я сподівався, що TAO матиме щось на шляху обмеженого рішення оптимізації, але це не так. Ви, звичайно, могли б використати те, що вони мають створити; у них там багато компонентів. Як ви вже зазначали, для вас це буде набагато більше, і якщо ви збираєтеся в таких проблемах, ви також можете бути розробником ТАО.

З цією додатковою інформацією ви, швидше за все, отримаєте кращі результати, викликаючи GAMS від Python (якщо це взагалі є варіант) або намагаєтеся виправити інтерфейс IPOPT Python. Оскільки IPOPT використовує метод внутрішньої точки, він не буде настільки надійним, але, можливо, реалізація методом внутрішніх точок Андреаса значно краща, ніж реалізація SQP від ​​Matlab, і в цьому випадку ви можете зовсім не принести шкоди надійності. Вам доведеться запустити кілька кейсів, щоб точно знати.

Ви вже знаєте хитрість переформулювати обмеження раціональної нерівності як обмеження поліноміальної нерівності (це у вашій книзі); Причина, яка допоможе BARON та деяким іншим невипуклим розв'язкам, полягає в тому, що він може використовувати терміновий аналіз для створення додаткових дійсних нерівностей, які він може використовувати як скорочення для поліпшення та прискорення конвергенції розв'язувача.

Виключаючи прив’язки GAMS Python та інтерфейс Python до IPOPT, відповідь "ні", ще немає якісних нелінійних програмних рішень для програмування Python. Можливо, @Dominique змінить це з NLPy.

ОНОВЛЕННЯ №3: Більше диких ударів при пошуку розв'язувача на основі Python дало PyGMO , який є набором прив'язки Python до PaGMO, глобального багатообективного рішення оптимізації на основі C ++. Хоча він був створений для багатообективної оптимізації, він також може використовуватися для єдиного об'єктивного нелінійного програмування і має інтерфейси Python для IPOPT та SNOPT, серед інших вирішувачів. Він був розроблений в рамках Європейського космічного агентства , тому сподіваємось, що за ним стоїть громада. Він також був випущений порівняно недавно (24 листопада 2011 р.).


зверніть увагу, PaGMO має ліцензію GPL
denfromufa

14

APM Python

Оновлення: дивіться новий пакет GEKKO, який ми щойно випустили.

APM Python - це безкоштовна панель інструментів оптимізації, яка має інтерфейси для APOPT, BPOPT, IPOPT та інших рішень. Він надає розв'язувачам першу (якобійську) та другу (гессенську) інформацію та надає додатковий веб-інтерфейс для перегляду результатів. Клієнт APM Python встановлюється за допомогою pip:

 pip install APMonitor

Він також може бути встановлений у сценарії Python за допомогою:

try:
    from APMonitor.apm import *
except:
    # Automatically install APMonitor
    import pip
    pip.main(['install','APMonitor'])
    from APMonitor.apm import *

Ми провели пару тестових еталонів і виявили, що комбінація APOPT (метод активного набору) та IPOPT (метод внутрішніх точок) може вирішити великий відсоток проблем з орієнтиром. Існує ряд прикладів проблем, які входять до zip-файлу для завантаження. Та, з якою ви, мабуть, захочете розпочати, - це проблема Hock Schittkowski # 71. Це найпростіший приклад і демонструє, як вирішити обмежені проблеми оптимізації.

Є інтерфейс браузера та API для Python / MATLAB. API для Python - це єдиний скрипт (apm.py), який можна завантажити з домашньої сторінки apmonitor.com. Після завантаження сценарію в код Python він дає можливість вирішувати проблеми:

  • Нелінійні рівняння
  • Змішане цілочисельне нелінійне програмування
  • Диференціальні та алгебраїчні рівняння
  • Найменші квадрати підгонки моделі
  • Оцінка рухомого горизонту
  • Нелінійна модель прогнозування управління
  • тощо.

Для нового користувача програмне забезпечення APM Python має форум груп Google, де користувач може розміщувати питання. Існують вебінари, які демонструють проблеми оптимізації в дослідженні та розробці операцій.

Нижче наводиться приклад проблеми оптимізації (hs71.apm).

Model
  Variables
    x[1] = 1, >=1, <=5
    x[2] = 5, >=1, <=5
    x[3] = 5, >=1, <=5
    x[4] = 1, >=1, <=5
  End Variables

  Equations
    x[1] * x[2] * x[3] * x[4] > 25
    x[1]^2 + x[2]^2 + x[3]^2 + x[4]^2 = 40

    minimize  x[1] * x[4] * (x[1]+x[2]+x[3]) + x[3]
  End Equations
End Model

Проблема оптимізації вирішується за допомогою наступного сценарію Python:

from APMonitor.apm import *
server = 'http://byu.apmonitor.com'

# Application name
app = 'eqn'

# Clear previous application
apm(server,app,'clear all')

# Load model file
apm_load(server,app,'hs71.apm')

# Option to select solver (1=APOPT, 2=BPOPT, 3=IPOPT)
apm_option(server,app,'nlc.solver',3)

# Solve on APM server
solver_output = apm(server,app,'solve')

# Display solver output
print(solver_output)

# Retrieve results
results = apm_sol(server,app)

# Display results
print('--- Results of the Optimization Problem ---')
print(results)

# Display Results in Web Viewer 
url = apm_var(server,app)
print("Opened Web Viewer: " + url)

APM Python - це безкоштовний веб-сервіс для оптимізації. Проблеми оптимізації вирішуються на віддалених серверах, а результати повертаються в локальний скрипт Python. Для завантаження також доступний локальний сервер APMonitor, так що підключення до Інтернету не потрібно ( Завантажити сервер ). Нещодавно ми додали підтримку паралельної обробки як для MATLAB, так і для Python. Модуль Python сумісний з Python 2.7 або Python 3+.


2
Джон, я бачу, що APM Python є у вільному доступі, але я не можу зрозуміти, чи переглядає пакет, чи містить він розв'язувачі, які він використовує локально, або для підрахунків потрібне підключення до веб-сайту AP Monitor. Мені цікаво, до чого.
Арон Ахмадія

3
Aron, сценарії MATLAB або Python потребують підключення до Інтернету до серверів APM для вирішення проблем оптимізації. Це має ряд переваг і недоліків. З позитивного боку, веб-сервіс для оптимізації дозволяє забезпечити сумісність між платформами, вільний доступ до деяких комерційних рішень та оновлення програмного забезпечення, прозорі для користувача. З іншого боку, APM не настільки гнучка, як деякі альтернативи з відкритим кодом, але розроблена для промислових користувачів, які віддають перевагу "під ключ" для оптимізаційних програм.
Джон Хеденгрен

@JohnHedengren У мене є певні попередні обчислення в MATLAB, використовуючи іншу бібліотеку для побудови самої проблеми оптимізації, особливо, обмеження пов'язані з цими зовнішніми викликами. Як ви вважаєте, APM все ще підходить для цієї мети?
gpavanb

Я думаю, що загальним терміном для цього є оптимізація blackbox.
gpavanb

@gpavanb Пакет APMonitor вимагає, щоб рівняння були написані мовою моделювання. Один варіант завантаження зовнішнього коду - це створити об'єкт, який забезпечує залишки та принаймні аналітичні перші похідні. Зазвичай ми кодуємо ці об'єкти у F90 для швидкості, наприклад, перелічених тут: apmonitor.com/wiki/index.php/Main/Objects. Я не думаю, що APMonitor є найкращим варіантом для додатків з оптимізацією blackbox.
Джон Геденгрен

7

Хоча це не зовсім відповідає на ваше запитання, я автор пакету Python для нелінійного програмування під назвою NLPy. Найновішу версію можна отримати з https://github.com/dpo/nlpy

Я мушу наголосити, що NLPy є науково-дослідним, і включені рішення не є настільки надійними, як більш досвідчені коди, такі як IPOPT. Більше того, вони вимагають надання якобіян. При цьому, справа NLPy полягає в наданні інструментів, необхідних дослідникам для збирання користувальницьких рішень, якщо це потрібно. У будь-якому випадку, мені буде цікаво почути ваші коментарі в режимі офлайн, якщо ви все-таки спробуєте. Також вам можуть бути корисні пов'язані пакети https://github.com/dpo/pykrylov та https://github.com/dpo/pyorder . Наразі документації NLPy точно не вистачає. Інші два мають бути розумними.


7

pyomo - це повне GAMS / AMPL-подібне середовище моделювання для оптимізації в python. Він надзвичайно потужний, має інтерфейси до всіх вирішувачів, які підтримуються AMPL, і автоматично генерує якобійці тощо. Однак через те, що він працює у "віртуальному середовищі пітона", пов'язати його з існуючим кодом може не тривіально.


5

GEKKO Python

Нещодавно ми випустили (2018) пакет GEKKO Pythonдля нелінійного програмування з розв'язувачами, такими як IPOPT, APOPT, BPOPT, MINOS та SNOPT з методами активного набору та внутрішньої точки. Одне з питань використання цих розв'язувачів полягає в тому, що вам зазвичай потрібно надати принаймні перші похідні та необов'язково другі похідні. Існує кілька приємних мов моделювання, які можуть зробити це для вас, як згадується з іншими відповідями. GEKKO збирає рівняння до байтового коду, так що це було так, як ви написали модель у Fortran або C ++ з точки зору швидкості. Автоматична диференціація забезпечує 1 та 2 похідні в розрідженій формі для градієнтів на основі градієнтів. Ми розробили GEKKO для оптимальних проблем управління, але він також може вирішити проблеми, схожі на fmincon. Нижче наведено короткий приклад нелінійної проблеми програмування з обмеженнями рівності та нерівності. Спочатку ви'

pip install gekko

Хок Schittkowski проблема # 71 показано нижче в якості прикладу цільової функції, нерівність обмеження, рівність обмежень, і чотири змінних з верхніми і нижніми межами.

from gekko import GEKKO
m = GEKKO() # Initialize gekko
# Initialize variables
x1 = m.Var(value=1,lb=1,ub=5)
x2 = m.Var(value=5,lb=1,ub=5)
x3 = m.Var(value=5,lb=1,ub=5)
x4 = m.Var(value=1,lb=1,ub=5)
# Equations
m.Equation(x1*x2*x3*x4>=25)
m.Equation(x1**2+x2**2+x3**2+x4**2==40)
m.Obj(x1*x4*(x1+x2+x3)+x3) # Objective
m.options.IMODE = 3 # Steady state optimization
m.solve() # Solve
print('Results')
print('x1: ' + str(x1.value))
print('x2: ' + str(x2.value))
print('x3: ' + str(x3.value))
print('x4: ' + str(x4.value))    

GEKKO працює на всіх платформах (Windows, MacOS, Linux, ARM-процесори) та з Python 2.7 та 3+. Повністю локальний варіант доступний без підключення до Інтернету, встановивши опцію "віддалений = Неправда". Локальна опція наразі доступна лише для Windows, і ми працюємо над іншими версіями, такими як Linux, MacOS, ARM-процесори для роботи локально без підключення до Інтернету. Локальна версія включає лише безкоштовні розв'язувачі, які не потребують ліцензії. За замовчуванням проблема надсилається на загальнодоступний сервер, де рішення обчислюється та повертається на Python.

Хоча це питання стосується вирішення нелінійного програмування в Python, я також виділю кілька інших типів проблем, які може вирішити GEKKO, та деякі ресурси для оптимізації навчання. GEKKO також розв'язує змішані цілі та диференціальні алгебраїчні рівняння та має декілька попередньо запрограмованих об'єктів для розширеного управління (подібне до DMC, RMPCT тощо). Режими роботи включають узгодження даних, оптимізацію в режимі реального часу, динамічне моделювання та нелінійний прогнозний контроль.

Я викладаю два курси з оптимізації (оптимізація дизайну та динамічна оптимізація ) та розмістив навчальний матеріал в Інтернеті. Курс динамічної оптимізації пропонується щороку, починаючи з січня, і ми використовуємо пакет GEKKO Python (та MATLAB). GEKKO є розширенням пакету оптимізації APMonitor, але інтегрує моделювання та візуалізацію рішення безпосередньо в Python. Довідки APMonitor та GEKKO дають зразок типів програм, які можна вирішити за допомогою цього пакету. GEKKO розробляється в рамках Національного наукового фонду №1547110 .


Чи можете ви відредагувати свою відповідь, щоб пояснити, як ваше програмне забезпечення відповідає конкретним вимогам, зазначеним у публікації? В іншому випадку це більше схоже на ковдру рекламного повідомлення, а не на відповідь на питання (і, швидше за все, буде закрито).
Крістіан Класон

Крістіан, я відредагував відповідь, щоб бути більш конкретним на питання. Я перемістив додаткову інформацію про GEKKO та онлайн-курси до кінця, але можу видалити її за потреби.
Джон Геденгрен

4

1
Дякую, але це я спробував (через OpenOpt, який надає йому додатковий інтерфейс). Він ніколи не був кращим, ніж fmincon / sqp і провалився у багатьох випадках, коли останні досягли успіху.
Девід Кетчесон

1
Оновлення: я спробував цей безпосередньо від SciPy. Він не вдається навіть у проблемах, коли fmincon здатний послідовно знайти глобальний оптимум за кілька секунд.
Девід Кетчесон

4

PyGMO містить кілька розв'язувачів, надаючи їм однаковий інтерфейс. IPOPT та scipy slsqp включаються в тому випадку, якщо ви складете код та завантажуєте / встановлюєте сторонній код самостійно.

Як бонус, паралельне використання розв'язувача стає дуже просто (багатоступеневим) через клас архіпелагу!


3

Навколо програмного забезпечення для опуклої оптимізації Стівена Бойда є cvxmod , обгортка Python. Це частина пакету Sage .


Але ОП запитує про проблему оптимізації, що не є опуклою.
Алехандро

1
ОП запитує про проблему невипуклої оптимізації, але всі згадані досі вирішувачі гарантовані лише для пошуку епсилон-оптимальних рішень для опуклих задач оптимізації без додаткових метагевристик (багатоступеневих чи інших алгоритмів стохастичної глобальної оптимізації, які вимагають детермінованих, нелінійні, опуклі оптимізатори розв’язання) або алгоритми, пов'язані з розгалуженням і зв'язаними (такі як гілка, пов'язана, гілка і вирізання, і розгалуження і зменшення), що вимагають розслаблення цільової функції та обмежень. Ця відповідь не гірша за будь-яку з інших згаданих станом на 11 грудня.
Джефф Оксберрі

Джефф, як я можу застосувати cvxmod до невипуклої проблеми?
Девід Кетчесон

Я не використовував програмне забезпечення, але теоретично, як і будь-який інший опуклий вирішувач, ви використовуєте його для пошуку локально оптимальних рішень, як і ви зараз використовуєте fmincon (що також є опуклим вирішувачем). Одним із способів його використання був би мультистарт. Створіть список точок, які будуть використані як початкові здогадки для вашого опуклого вирішувача. Для кожної точки, яка використовується як здогадка, запишіть рішення, повернене розв’язувачем. Точка, що відповідає мінімальному значенню цільової функції для всіх повернених рішень, є найкращим наближенням до глобального оптимуму.
Джефф Оксберрі

1
@Geoff: Так, я використовую мультистарт. Що стосується CVXMOD, він приймає лише проблеми, які можна сформулювати в плані дисциплінованого опуклого програмування. Загальні проблеми нелінійного програмування не можуть. Як ви кажете, я міг би шукати послідовні опуклі розслаблення, які наближають мою проблему, але вся мета тут полягає в тому, щоб я менше працював.
Девід Кетчесон

3

fmincon тепер може використовуватися з Python через OpenOpt рамку, необов'язково з щільною / розрідженою автоматичною диференціацією від FuncDesigner http://openopt.org/fmincon


Здається, це більше не існує.
footwet

3






На момент випуску 2014b це тепер підтримується Matlab безпосередньо; дивіться mathworks.de/help/matlab/matlab-engine-for-python.html
Крістіан Классон

@Christian Clason, це, здається, взагалі не робить нут-матлаб? як це робить міст python-matlab-bridge. (Я не користувався цим, хоча.)
Denis

Не безпосередньо (начебто, є власний клас масиву matlab), але існує обов'язковий спосіб перетворення між цим і numpy. Звичайно, виникне деяке накладне покриття через копіювання даних, але це, мабуть, менше проблем щодо розмірів проблем, про які йдеться в ОП. (Я його не використовував; я просто подумав, що я зазначу варіант.)
Крістіан Класон


2

Як щодо CMA-ES? Він має прив'язки Python і добре підходить для неконвексних, нелінійних проблем оптимізації, і я його досить багато використав: https://www.lri.fr/~hansen/cmaesintro.html

Установка через pip:

pip install cma

Ось приклад коду з їх веб-сайту:

import cma
help(cma)  # "this" help message, use cma? in ipython
help(cma.fmin)
help(cma.CMAEvolutionStrategy)
help(cma.CMAOptions)
cma.CMAOptions('tol')  # display 'tolerance' termination options
cma.CMAOptions('verb') # display verbosity options
res = cma.fmin(cma.Fcts.tablet, 15 * [1], 1)
res[0]  # best evaluated solution
res[5]  # mean solution, presumably better with noise

Цей оптимізатор далеко не те, що вимагає ОП. Наприклад, не існує чіткого способу вирішення обмежень рівності чи нерівності за допомогою CMA-ES.
ares

1

Оскільки MATLAB має компілятор JIT, поки CPython ще не робить (принаймні, поки pypy не отримає повну підтримку numpy). Схоже, ви хочете отримати безкоштовний вирішувач, який випереджає комерційну продукцію fmincon. Хіба це не надто багато?

IIRC серед комерційних вирішувачів NLP, тільки snopt до цих пір надав API Python (хоча це досить некрасиво).

Які вирішувачі OpenOpt ви пробували? Скільки змінних та обмежень у вашій невипуклій задачі?

Ви можете спробувати IPOPT через OpenOpt / Funcdesigner API без встановлення на сервері OpenOpt Sage (зверніть увагу на зображення "переключення з мудреця на python").

10300(x0.1)2+10300(y0.2)2(x,y)=(1,1)


2
Якщо ви уважно читаєте, я просто прошу щось із подібною стійкістю до fmincon. Це не повинно бути кращим, а може навіть повільніше.
Девід Кетчесон

1

Для глобальних проблем, які можуть вас зацікавити, http://openopt.org/interalg та інші глобальні рішення для відкритих операцій (http://openopt.org/GLP) для локальної оптимізації openopt також пропонує різноманітні рішення: http://openopt.org / НЛП


Так, я спробував деякі з них, але жоден не мірявся до fmincon.
Девід Кетчесон

1

Тут добре згадати, що вирішувач Google Ceres - це насправді дуже потужний нелінійний оптимізатор, який використовується у багатьох проектах.

Тут також доступна обгортка пітона: https://github.com/rll/cyres


Хіба це не Левенбег-Маркард? який, в той час як добре, далеко від того, що хоче ОП
денис

У той час як ceres - це дійсно хороший вирішувач, він взагалі не підтримує обмежень рівності і підтримує лише обмеження нерівності як верхні / нижні межі параметрів (станом на поточну версію 1.12).
orzechow

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.