Saya memiliki beberapa masalah optimisasi global non-cembung yang menantang untuk dipecahkan. Saat ini saya menggunakan MATLAB's Optimization Toolbox (khusus, fmincon()
dengan algoritma = 'sqp'
), yang cukup efektif . Namun, sebagian besar kode saya menggunakan Python, dan saya ingin melakukan optimasi dengan Python juga. Apakah ada pemecah NLP dengan binding Python yang dapat bersaing dengan fmincon()
? Itu harus
- dapat menangani kendala kesetaraan dan ketidaksetaraan nonlinier
- tidak mengharuskan pengguna untuk menyediakan Jacobian.
Tidak apa-apa jika tidak menjamin global optimal ( fmincon()
tidak). Saya mencari sesuatu yang konvergen kuat ke optimal lokal bahkan untuk masalah yang menantang, dan bahkan jika itu sedikit lebih lambat daripada fmincon()
.
Saya telah mencoba beberapa solver yang tersedia melalui OpenOpt dan menemukan mereka lebih rendah daripada MATLAB fmincon/sqp
.
Hanya untuk penekanan saya sudah memiliki formulasi yang mudah disalurkan dan pemecah yang baik. Tujuan saya hanyalah mengubah bahasa agar memiliki alur kerja yang lebih ramping.
Geoff menunjukkan bahwa beberapa karakteristik masalah mungkin relevan. Mereka:
- 10-400 variabel keputusan
- 4-100 batasan kesetaraan polinomial (derajat polinom berkisar dari 1 hingga sekitar 8)
- Sejumlah kendala ketimpangan rasional sama dengan sekitar dua kali lipat jumlah variabel keputusan
- Fungsi obyektif adalah salah satu variabel keputusan
Jacobian dari batasan kesetaraan adalah padat, seperti Jacobian dari batasan ketidaksetaraan.
sumber
Jawaban:
fmincon()
, seperti yang Anda sebutkan, menggunakan beberapa strategi yang terkenal dalam optimasi nonlinier yang berupaya untuk menemukan minimum lokal tanpa banyak memperhatikan apakah optimum global telah ditemukan. Jika Anda setuju dengan ini, maka saya pikir Anda telah mengutarakan pertanyaan dengan benar (optimasi nonlinear).Paket terbaik yang saya ketahui untuk optimasi nonlinear umum adalah IPOPT [1]. Rupanya Matthew Xu memelihara satu set binding Python ke IPOPT , jadi ini mungkin tempat untuk memulai.
[1]: Andreas Wachter adalah teman pribadi, jadi saya mungkin sedikit bias.
sumber
Saya bekerja di lab yang melakukan optimasi global masalah bilangan bulat dan non-cembung. Pengalaman saya dengan pemecah pengoptimalan sumber terbuka adalah bahwa yang lebih baik biasanya ditulis dalam bahasa yang dikompilasi, dan harganya lebih murah dibandingkan dengan paket pengoptimalan komersial.
Jika Anda dapat merumuskan masalah Anda sebagai sistem persamaan eksplisit dan membutuhkan pemecah gratis, taruhan terbaik Anda mungkin IPOPT, seperti kata Aron. Pemecah gratis lainnya dapat ditemukan di situs web COIN-OR . Setahu saya, pemecah nonlinier tidak memiliki binding Python yang disediakan oleh pengembang; setiap binding yang Anda temukan akan menjadi pihak ketiga. Untuk mendapatkan solusi yang baik, Anda juga harus membungkus pemecah cembung nonlinier yang Anda temukan dalam heuristik optimisasi global stokastik yang sesuai, atau dalam algoritma optimisasi global deterministik seperti cabang-dan-terikat. Sebagai alternatif, Anda dapat menggunakan Bonmin atau Couenne, yang keduanya merupakan pemecah optimisasi non-cembung deterministik yang berkinerja baik dengan baik dibandingkan dengan pemecah canggih, BARON .
Jika Anda dapat membeli pemecah optimasi komersial, Anda dapat mempertimbangkan melihat bahasa pemodelan GAMS , yang mencakup beberapa pemecah optimasi nonlinier. Disebutkan secara khusus adalah antarmuka untuk pemecah CONOPT, SNOPT, dan BARON. (CONOPT dan SNOPT adalah pemecah cembung.) Solusi kludgey yang saya gunakan di masa lalu adalah dengan menggunakan ikatan bahasa Fortran (atau Matlab) ke GAMS untuk menulis file GAMS dan memanggil GAMS dari Fortran (atau Matlab) untuk menghitung solusi masalah optimisasi. GAMS memiliki ikatan bahasa Python, dan staf dukungan yang sangat responsif bersedia membantu jika ada masalah. (Penafian: Saya tidak berafiliasi dengan GAMS, tetapi lab saya memiliki lisensi GAMS.) Pemecah masalah komersial tidak boleh lebih buruk dari
fmincon
; sebenarnya, saya akan terkejut jika mereka tidak jauh lebih baik. Jika masalah Anda cukup kecil, maka Anda mungkin tidak perlu membeli lisensi GAMS dan lisensi untuk solver, karena salinan evaluasi GAMS dapat diunduh dari situs web mereka. Jika tidak, Anda mungkin ingin memutuskan solver mana yang akan dibeli bersamaan dengan lisensi GAMS. Perlu dicatat bahwa BARON membutuhkan pemecah pemrograman linear bilangan bulat, dan lisensi untuk dua pemecah program linear bilangan bulat bilangan bulat terbaik CPLEX dan GUROBI gratis untuk akademisi, jadi Anda mungkin bisa pergi hanya dengan membeli antarmuka GAMS sebagai gantinya daripada antarmuka dan lisensi pemecah, yang dapat menghemat banyak uang.Poin ini diulangi: untuk setiap pemecah optimasi non-cembung deterministik yang telah saya sebutkan di atas, Anda harus dapat merumuskan model sebagai set persamaan eksplisit. Jika tidak, algoritma optimasi non-cembung tidak akan berfungsi, karena semuanya bergantung pada analisis simbolik untuk membangun relaksasi cembung untuk algoritma branch-and-bound-like.
UPDATE: Satu pemikiran yang tidak terpikir oleh saya pada awalnya adalah bahwa Anda juga dapat memanggil Toolkit untuk Pengoptimalan Tingkat Lanjut ( TAO ) dan PETSc menggunakan tao4py dan petsc4py , yang akan memiliki potensi manfaat tambahan dari paralelisasi yang lebih mudah, dan meningkatkan keakraban dengan PETSc dan alat ACTS .
PEMBARUAN # 2: Berdasarkan informasi tambahan yang Anda sebutkan, metode pemrograman kuadratik sekuensial (SQP) akan menjadi taruhan terbaik Anda. Metode SQP secara umum dianggap lebih kuat daripada metode titik interior, tetapi memiliki kelemahan karena membutuhkan pelarut linier padat. Karena Anda lebih peduli tentang ketahanan daripada kecepatan, SQP akan menjadi taruhan terbaik Anda. Saya tidak dapat menemukan pemecah SQP yang baik di luar sana yang ditulis dengan Python (dan tampaknya, tidak juga Sven Leyffer di Argonne dalam laporan teknis ini ). Saya menduga bahwa algoritma yang diimplementasikan dalam paket seperti SciPy dan OpenOpt memiliki kerangka dasar dari beberapa algoritma SQP yang diimplementasikan, tetapi tanpa heuristik khusus yang digunakan oleh kode yang lebih maju untuk mengatasi masalah konvergensi. Anda dapat mencoba NLopt, ditulis oleh Steven Johnson di MIT. Saya tidak memiliki harapan yang tinggi untuk itu karena tidak memiliki reputasi yang saya ketahui, tetapi Steven Johnson adalah orang yang cerdas yang menulis perangkat lunak yang baik (setelah semua, ia menulis bersama FFTW). Itu mengimplementasikan versi SQP; jika ini perangkat lunak yang bagus, beri tahu saya.
Saya berharap bahwa TAO akan memiliki sesuatu di jalan pemecah optimasi dibatasi, tetapi tidak. Anda tentu dapat menggunakan apa yang mereka miliki untuk membangunnya; mereka punya banyak komponen di sana. Seperti yang Anda tunjukkan, akan jauh lebih sulit bagi Anda untuk melakukan itu, dan jika Anda akan mengalami masalah seperti itu, Anda mungkin juga seorang pengembang TAO.
Dengan informasi tambahan itu, Anda lebih mungkin mendapatkan hasil yang lebih baik dengan memanggil GAMS dari Python (jika itu pilihan), atau mencoba menambal antarmuka IPOPT Python. Karena IPOPT menggunakan metode titik interior, itu tidak akan sekuat, tetapi mungkin implementasi Andreas dari metode titik interior jauh lebih baik daripada penerapan Matlab tentang SQP, dalam hal ini, Anda mungkin tidak mengorbankan ketahanan sama sekali. Anda harus menjalankan beberapa studi kasus untuk mengetahui dengan pasti.
Anda sudah mengetahui trik untuk merumuskan kembali batasan ketimpangan rasional sebagai kendala ketidaksetaraan polinomial (ada di buku Anda); alasan ini akan membantu BARON dan beberapa pemecah nonconvex lainnya adalah bahwa ia dapat menggunakan istilah analisis untuk menghasilkan ketidaksetaraan valid tambahan yang dapat digunakan sebagai potongan untuk meningkatkan dan mempercepat konvergensi pemecah.
Tidak termasuk pengikatan GAMS Python dan antarmuka Python ke IPOPT, jawabannya tidak, belum ada pemecah pemrograman nonlinier berkualitas tinggi untuk Python. Mungkin @Dominique akan mengubahnya dengan NLPy.
UPDATE # 3: Lebih banyak tikaman liar menemukan solver berbasis Python menghasilkan PyGMO , yang merupakan seperangkat ikatan Python ke PaGMO, sebuah solver optimisasi global multiobjective optimizer berbasis C ++. Meskipun ini dibuat untuk optimisasi multiobjek, ia juga dapat digunakan untuk pemrograman nonlinier objektif tunggal, dan memiliki antarmuka Python ke IPOPT dan SNOPT, di antara pemecah lainnya. Itu dikembangkan dalam Badan Antariksa Eropa , jadi mudah-mudahan ada komunitas di belakangnya. Itu juga dirilis relatif baru (24 November 2011).
sumber
Pembaruan: lihat paket GEKKO baru yang baru saja kami rilis.
APM Python adalah kotak alat optimasi gratis yang memiliki antarmuka untuk APOPT, BPOPT, IPOPT, dan pemecah lainnya. Ini memberikan informasi pertama (Jacobian) dan kedua (Hessian) ke pemecah dan menyediakan antarmuka web opsional untuk melihat hasil. Klien APM Python diinstal dengan pip:
Itu juga dapat diinstal dalam skrip Python dengan:
Kami telah melakukan beberapa tes benchmark dan menemukan bahwa kombinasi APOPT (metode set aktif) dan IPOPT (metode titik interior) dapat menyelesaikan sebagian besar masalah benchmark. Ada sejumlah contoh masalah yang disertakan dengan file zip unduhan. Salah satu yang mungkin ingin Anda mulai adalah masalah Hock Schittkowski # 71. Ini adalah contoh paling sederhana dan menunjukkan cara mengatasi masalah optimisasi terbatas.
Ada antarmuka browser dan API ke Python / MATLAB. API ke Python adalah skrip tunggal (apm.py) yang tersedia untuk diunduh dari beranda apmonitor.com. Setelah skrip dimuat ke dalam kode Python, skrip memberikan kemampuan untuk memecahkan masalah:
Untuk pengguna baru, perangkat lunak APM Python memiliki forum Google Groups di mana pengguna dapat memposting pertanyaan. Ada webinar yang menampilkan masalah optimisasi dalam riset dan rekayasa operasi.
Di bawah ini adalah contoh masalah optimasi (hs71.apm).
Masalah optimisasi diselesaikan dengan skrip Python berikut:
APM Python adalah layanan web gratis untuk pengoptimalan. Masalah optimisasi diselesaikan pada server jarak jauh dan hasilnya dikembalikan ke skrip Python lokal. Server lokal APMonitor juga tersedia untuk diunduh sehingga koneksi Internet tidak diperlukan ( Unduh server ). Kami baru-baru ini menambahkan dukungan pemrosesan paralel untuk MATLAB dan Python. Modul Python kompatibel dengan Python 2.7 atau Python 3+.
sumber
Meskipun ini tidak sepenuhnya menjawab pertanyaan Anda, saya menulis paket Python untuk pemrograman nonlinier bernama NLPy. Versi terbaru dapat diambil dari https://github.com/dpo/nlpy
Saya harus menekankan bahwa NLPy adalah riset-grade dan solver yang disertakan tidak sekuat kode yang lebih berpengalaman seperti IPOPT. Selain itu, mereka saat ini mensyaratkan agar orang-orang Jacobian disediakan. Yang sedang berkata, titik NLPy adalah untuk menyediakan alat yang dibutuhkan bagi para peneliti untuk mengumpulkan pemecah kustom jika mereka perlu. Bagaimanapun, saya akan tertarik untuk mendengar komentar Anda secara offline jika Anda mencobanya. Anda juga dapat menemukan paket terkait https://github.com/dpo/pykrylov dan https://github.com/dpo/pyorder berguna. Saat ini, dokumentasi NLPy jelas kurang. Dua lainnya harus masuk akal.
sumber
pyomo adalah lingkungan pemodelan penuh seperti GAMS / AMPL untuk optimisasi dalam python. Ini sangat kuat, memiliki antarmuka untuk semua pemecah yang didukung oleh AMPL, dan menghasilkan Jacobian dll secara otomatis. Namun, karena itu berjalan di 'lingkungan python virtual', mungkin tidak sepele untuk menautkannya ke kode yang ada.
sumber
Kami baru-baru ini merilis (2018) paket GEKKO Pythonuntuk pemrograman nonlinear dengan solver seperti IPOPT, APOPT, BPOPT, MINOS, dan SNOPT dengan set aktif dan metode titik interior. Salah satu masalah dengan menggunakan pemecah ini adalah bahwa Anda biasanya perlu menyediakan setidaknya turunan pertama dan opsional turunan kedua. Ada beberapa bahasa pemodelan bagus yang dapat melakukan ini untuk Anda, sebagaimana disebutkan dengan jawaban lain. GEKKO mengkompilasi persamaan ke kode byte sehingga seperti Anda menulis model dalam Fortran atau C ++ dalam hal kecepatan. Diferensiasi otomatis memberikan turunan 1 dan 2 dalam bentuk jarang ke pemecah berbasis gradien. Kami merancang GEKKO untuk masalah kontrol yang optimal tetapi juga dapat memecahkan masalah yang mirip dengan fmincon. Di bawah ini adalah contoh cepat dari masalah pemrograman nonlinear dengan kendala kesetaraan dan ketidaksetaraan. Pertama kamu'
Masalah Hock Schittkowski # 71 ditunjukkan di bawah ini sebagai contoh fungsi objektif, kendala ketimpangan, kendala kesetaraan, dan empat variabel dengan batas atas dan bawah.
GEKKO berfungsi pada semua platform (Windows, MacOS, Linux, prosesor ARM) dan dengan Python 2.7 dan 3+. Opsi sepenuhnya lokal tersedia tanpa koneksi Internet dengan mengatur opsi "remote = False". Opsi lokal saat ini hanya tersedia untuk Windows dan kami sedang mengerjakan versi lain seperti Linux, MacOS, prosesor ARM untuk dijalankan secara lokal tanpa koneksi internet. Versi lokal hanya mencakup pemecah gratis yang tidak memerlukan lisensi. Secara default, masalahnya dikirim ke server publik tempat solusinya dihitung dan dikembalikan ke Python.
Meskipun pertanyaan ini secara khusus tentang menyelesaikan pemrograman nonlinear dengan Python, saya juga akan menyoroti beberapa jenis masalah lain yang dapat dipecahkan oleh GEKKO dan beberapa sumber daya untuk mempelajari pengoptimalan. GEKKO juga memecahkan persamaan aljabar campuran-bilangan bulat dan diferensial dan memiliki beberapa objek yang diprogram untuk kontrol tingkat lanjut (mirip dengan DMC, RMPCT, dll). Mode operasi termasuk rekonsiliasi data, optimasi waktu nyata, simulasi dinamis, dan kontrol prediktif nonlinier.
Saya mengajar dua kursus tentang optimasi (optimasi desain dan optimasi dinamis ) dan telah memposting materi kursus online. Kursus optimisasi dinamis ditawarkan setiap tahun mulai bulan Januari dan kami menggunakan paket GEKKO Python (dan MATLAB) untuk kursus tersebut. GEKKO adalah perpanjangan dari APMonitor Optimization Suite tetapi telah mengintegrasikan pemodelan dan visualisasi solusi langsung dalam Python. Referensi APMonitor dan GEKKO memberikan contoh jenis aplikasi yang dapat diselesaikan dengan paket ini. GEKKO dikembangkan di bawah Hibah Penelitian Yayasan Sains Nasional # 1547110 .
sumber
Bagaimana dengan scipy.fmin_slsqp?
http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.fmin_slsqp.html
sumber
PyGMO berisi beberapa pemecah, menyediakan antarmuka yang sama dengannya. IPOPT dan slsqp licik disertakan jika Anda mengkompilasi kode dan mengunduh / menginstal kode pihak ketiga secara independen.
Sebagai bonus, penggunaan paralel solver dibuat sangat mudah (multistart) via kelas nusantara!
sumber
Ada cvxmod , pembungkus Python di sekitar perangkat lunak optimasi cembung Stephen Boyd. Itu bagian dari paket Sage .
sumber
fmincon sekarang dapat digunakan dari Python melalui kerangka OpenOpt, opsional dengan diferensiasi otomatis yang padat / jarang oleh FuncDesigner http://openopt.org/fmincon
sumber
sumber
Apakah cekungan melompat melalui Scipy cukup untuk kebutuhan Anda? Jika mengembalikan min lokal dan bukan min global, Anda dapat mengubah jumlah iterasi dan / atau menerapkan batas.
sumber
Bagaimana dengan CMA-ES? Ini memiliki binding Python dan sangat cocok untuk nonconvex, masalah optimasi nonlinear dan saya telah menggunakannya sedikit: https://www.lri.fr/~hansen/cmaesintro.html
Instalasi melalui pip:
Berikut beberapa contoh kode dari situs web mereka:
sumber
Karena MATLAB memiliki kompiler JIT sementara CPython belum (setidaknya, sampai Pypy mendapat dukungan penuh numpy). Sepertinya Anda menginginkan pemecah gratis yang mengungguli yang diproduksi secara komersial
fmincon
. Bukankah terlalu banyak?IIRC di antara pemecah NLP komersial, hanya snopt yang menyediakan API Python sampai sekarang (meskipun agak jelek).
Pemecah OpenOpt mana yang sudah Anda coba? Berapa banyak variabel dan kendala yang Anda miliki dalam tugas nonkonversi Anda?
Anda dapat mencoba IPOPT melalui OpenOpt / Funcdesigner API tanpa instalasi pada server OpenOpt Sage (perhatikan gambar "switch from sage to python").
sumber
untuk masalah global Anda dapat tertarik pada http://openopt.org/interalg dan pemecah global openopt lainnya (http://openopt.org/GLP) untuk optimalisasi lokal, openopt juga menyediakan beragam pemecah: http://openopt.org / NLP
sumber
Baik untuk disebutkan di sini bahwa pemecah Google Ceres sebenarnya adalah pengoptimal non-linear yang sangat kuat, yang digunakan dalam banyak proyek.
Ada juga pembungkus python yang tersedia di sini: https://github.com/rll/cyres
sumber
KNITRO memiliki antarmuka Python dan MATLAB, antara lain. Anggap saja sebagai pengganti FMINCON, tetapi kinerjanya jauh lebih baik, dan lebih mahal. https://www.artelys.com/en/optimization-tools/knitro#doc-tab .
Saya adalah pengguna KNITRO, tetapi tidak berafiliasi dengan produk ini.
sumber