Antarmuka C ++ yang modern, ringan, berbasis eigen untuk pemecah pemrograman nonlinier, seperti IPOPT dan Snopt.
Contoh masalah optimasi nonlinier untuk dipecahkan didefinisikan sebagai:
Fitur • Instal • Contoh • Kontribusi • Publikasi • Penulis
Menggabungkan keunggulan IPOPT / Snopt dan Eigen:
| IPOPT / Snopt | Eigen |
|---|---|
| ✔️ Pemecah berkualitas tinggi untuk optimasi nonlinier | ✔️ Formulasi vektor dan matriks modern dan intuitif |
| C ++ API Inconvenient dan Rawan Kesalahan (Pointer Raw, Manajemen Indeks, Konstruksi Jacobian) | ✔️ Implementasi yang sangat efisien |
| menghubungkan dan mengekspor sulit |
find_package(ifopt) atau catkin/ros (opsional) Masalah optimasi terdiri dari beberapa variabel dan kendala independen . Setiap set mewakili konsep umum, misalnya satu set variabel mungkin mewakili koefisien spline, posisi langkah kaki lain. Demikian pula, kelompok kendala yang dikelompokkan dengan kendala serupa bersama-sama. ifopt memungkinkan pengguna untuk mendefinisikan masing -masing set ini secara mandiri di kelas yang terpisah dan kemudian membangun masalah keseluruhan dari set ini. (Tidak ada lagi indeks adaptasi yang mengkhawatirkan saat menambahkan atau menghapus set).
find x0, x1 (variable-sets 0 & 1)
s.t
x0_lower <= x0 <= x0_upper (bounds on variable-set x0 in R^2)
{x0,x1} = arg min c0(x0,x1)+c1(x0,x1) (cost-terms 0 and 1)
g0_lower < g0(x0,x1) < g0_upper (constraint-set 0 in R^2)
g1_lower < g1(x0,x1) < g0_upper (constraint-set 1 in R^1)
Menyediakan informasi turunan sangat meningkatkan kecepatan solusi. ifopt memungkinkan untuk mendefinisikan turunan dari masing-masing biaya-jangka/kendala sehubungan dengan masing-masing variabel-set secara independen . Ini memastikan bahwa ketika urutan variabel-set berubah dalam vektor keseluruhan, informasi turunan ini masih valid. "Blok Jacobian" ini harus disuplai melalui ConstraintSet::FillJacobianBlock() dan kemudian digunakan untuk membangun Jacobian lengkap untuk biaya dan kendala.
Tinjauan grafis sebagai UML dapat dilihat di sini.
Cara termudah untuk menginstal adalah melalui Binari ROS dan Anda siap!
sudo apt-get install ros-<distro>-ifopt
Jika Anda tidak menggunakan ROS atau binari tidak ada untuk distro Anda, Anda dapat dengan mudah membangun paket -paket ini dari sumber. Untuk ini, instal dependensi yang diperlukan cmake, eigen dan ipopt menggunakan
sudo apt-get install cmake libeigen3-dev coinor-libipopt-dev
Jika Anda ingin menautkan ke instalasi lokal IPOPT atau Snopt, lihat di sini.
Memasang
git clone https://github.com/ethz-adrl/ifopt.git && cd ifopt
mkdir build && cd build
cmake ..
make
sudo make install # copies files in this folder to /usr/local/*
# sudo xargs rm < install_manifest.txt # in case you want to uninstall the aboveGunakan: untuk digunakan dalam proyek cmake Anda, lihat cmakelists minimal ini.txt:
find_package (ifopt)
# Formulate (ifopt:ifopt_core) and solve (ifopt::ifopt_ipopt) the problem
add_executable (main main.cpp)
# Pull in include directories, libraries, ...
target_link_libraries (main PUBLIC ifopt::ifopt_ipopt) Instal: Unduh Alat Baris Perintah Catkin atau Catkin, lalu:
cd catkin_ws/src
git clone https://github.com/ethz-adrl/ifopt.git
cd ..
catkin_make_isolated # `catkin build` if you are using catkin command-line tools
source ./devel/setup.bashGunakan: Sertakan dalam proyek Catkin Anda dengan menambahkan ke cmakelists Anda
add_compile_options (-std=c++11)
find_package (catkin COMPONENTS ifopt)
include_directories ( ${catkin_INCLUDE_DIRS} )
target_link_libraries (foo ${catkin_LIBRARIES} )Tambahkan yang berikut ke paket Anda.xml:
< package >
< depend >ifopt</ depend >
</ package > Arahkan ke folder build Anda di mana Makefile berada, yang tergantung pada bagaimana Anda membangun kode:
cd ifopt/build # plain cmake
cd catkin_ws/build_isolated/ifopt/devel # catkin_make_isolated
cd catkin_ws/build/ifopt # catkin build Pastikan semua yang diinstal dengan benar dengan menjalankan target test
make test Anda harus melihat ifopt_ipopt-example....Passed (atau Snopt jika diinstal) serta ifopt_core-test jika gtest diinstal.
Jika Anda memiliki IPOPT yang diinstal dan ditautkan dengan benar, Anda juga dapat menjalankan contoh biner secara langsung (sekali lagi, pertama -tama navigasikan ke folder build dengan Makefile )
make test ARGS= ' -R ifopt_ipopt-example -V 'Keluaran:
1.0 0.0Masalah yang lebih terlibat, diambil dari TOWR, dengan beberapa set variabel dan kendala untuk menghasilkan gerakan untuk robot berkaki menghasilkan yang berikut:
Kami menyukai permintaan tarik, apakah antarmuka untuk pemecah tambahan, perbaikan bug, tes unit atau memperbarui dokumentasi. Silakan lihat kontribusi.md untuk informasi lebih lanjut. Lihat di sini daftar kontributor yang berpartisipasi dalam proyek ini.
Jika Anda menggunakan pekerjaan ini, harap pertimbangkan mengutip sebagai berikut:
@misc{ifopt,
author = {Alexander W Winkler},
title = {{Ifopt - A modern, light-weight, Eigen-based C++ interface to
Nonlinear Programming solvers Ipopt and Snopt.}},
year = 2018,
doi = {10.5281/zenodo.1135046},
url = {https://doi.org/10.5281/zenodo.1135046}
}
Proyek penelitian di mana kode ini dikembangkan:
Alexander W. Winkler - Pekerjaan Awal/Pemelihara
Ini telah dilakukan di lembaga -lembaga berikut:
Jika Anda membangun dari sumber dan ingin menggunakan versi IPOPT yang diinstal secara lokal, tambahkan jalur ke folder Build IPOPT Anda ke ~/.bashrc Anda
export IPOPT_DIR=/home/your_name/Code/Ipopt-3.12.8/buildJika OS Anda tidak menyediakan binari yang dikompilasi atau versi yang diperlukan, Anda juga dapat dengan mudah menginstal IPOPT dari sumber seperti yang dijelaskan di sini. Ringkasan ini mungkin berhasil untuk Anda:
wget https://www.coin-or.org/download/source/Ipopt/Ipopt-3.11.10.zip
unzip Ipopt-3.11.10.zip
cd Ipopt-3.11.10/ThirdParty/Mumps
./get.Mumps # HSL routines are faster (http://www.hsl.rl.ac.uk/ipopt/)
cd ../../
mkdir build && cd build
../configure --prefix=/usr/local
make
make test
make install
export IPOPT_DIR= ` pwd ` Jika Anda membutuhkan antarmuka untuk Snopt, arahkan cmake ke folder build di ~/.bashrc Anda melalui misalnya
export SNOPT_DIR=/home/your_name/Code/Snoptdan jalankan cmake sebagai
cmake -DBUILD_SNOPT=ON ..