Una interfaz C ++ moderna, liviana, basada en Eigen para solucionadores de programación no lineal, como IPOPT y SNOPT.
Un ejemplo de problema de optimización no lineal para resolver se define como:
Características • Instalar • Ejemplos • Contribuir • Publicaciones • Autores
Combina las ventajas de IPOPT / SNOPT y Eigen:
| Ipopt / snopt | Rango |
|---|---|
| Solvers de alta calidad para la optimización no lineal | ✔️ Formulaciones modernas e intuitivas de vectores y matrices |
| C ++ API Inconveniente y propensa a errores (punteros sin procesar, gestión de índices, construcción jacobiana) | ✔️ Implementaciones altamente eficientes |
| Vinculación y exportación difícil |
find_package(ifopt) o catkin/rosa (opcional) Un problema de optimización consiste en múltiples conjuntos de variables y restricciones independientes . Cada conjunto representa un concepto común, por ejemplo, un conjunto de variables podría representar coeficientes de spline, otras posiciones de pasos. Del mismo modo, un conjunto de restricciones agrupa restricciones similares juntas. ifopt permite a los usuarios definir cada uno de estos conjuntos de forma independiente en clases separadas y luego desarrolla el problema general de estos conjuntos. (No más índices de adaptación preocupantes al agregar o eliminar conjuntos).
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)
El suministro de información derivada aumenta enormemente la velocidad de la solución. ifopt permite definir la derivada de cada costo/conjunto de restricciones con respecto a cada conjunto de variable de forma independiente . Esto asegura que cuando el orden de los conjuntos variables cambie en el vector general, esta información derivada sigue siendo válida. Estos "bloques jacobianos" deben suministrarse a través de ConstraintSet::FillJacobianBlock() y luego se usan para construir el jacobiano completo para el costo y las limitaciones.
Una descripción gráfica como UML se puede ver aquí.
¡La forma más fácil de instalar es a través de los binarios de ROS y estás listo!
sudo apt-get install ros-<distro>-ifopt
En caso de que no use ROS o los binarios no existen para su distribución, puede construir fácilmente estos paquetes a partir de la fuente. Para esto, instale las dependencias requeridas CMake, Eigen e IPOPT utilizando
sudo apt-get install cmake libeigen3-dev coinor-libipopt-dev
Si desea vincular a una instalación local de IPOPT o a SNOPT, consulte aquí.
Instalar
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 aboveUso: Para usar en su proyecto CMake, consulte esta mínima cmakelists.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) Instalar: descargue las herramientas de línea de comandos Catkin o Catkin, luego:
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.bashUse: incluya en su proyecto Catkin agregando a su cmakelists.txt
add_compile_options (-std=c++11)
find_package (catkin COMPONENTS ifopt)
include_directories ( ${catkin_INCLUDE_DIRS} )
target_link_libraries (foo ${catkin_LIBRARIES} )Agregue lo siguiente a su paquete.xml :
< package >
< depend >ifopt</ depend >
</ package > Navegue a su carpeta de compilación en la que reside Makefile , que depende de cómo construyó el código:
cd ifopt/build # plain cmake
cd catkin_ws/build_isolated/ifopt/devel # catkin_make_isolated
cd catkin_ws/build/ifopt # catkin build Asegúrese de que todo esté instalado correctamente ejecutando el objetivo test
make test Debería ver ifopt_ipopt-example....Passed (o SNOPT si está instalado), así como ifopt_core-test si GTEST está instalado.
Si tiene IPOPT instalado y vinculado correctamente, también puede ejecutar el ejemplo binario directamente (nuevamente, primero navegue a la carpeta de compilación con Makefile )
make test ARGS= ' -R ifopt_ipopt-example -V 'Producción:
1.0 0.0Un problema más involucrado, tomado de TOWR, con múltiples conjuntos de variables y restricciones para generar movimientos para robots de patas produce lo siguiente:
Nos encanta la solicitud de extracción, ya sean interfaces para solucionadores adicionales, correcciones de errores, pruebas unitarias o actualizando la documentación. Eche un vistazo a contribuir. MD para obtener más información. Vea aquí la lista de contribuyentes que participaron en este proyecto.
Si usa este trabajo, considere citar lo siguiente:
@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}
}
El proyecto de investigación dentro del cual se desarrolló este código:
Alexander W. Winkler - Trabajo inicial/mantenedor
Esto se ha llevado a cabo en las siguientes instituciones:
Si está construyendo desde la fuente y desea utilizar una versión instalada localmente de IPOPT, agregue la ruta a su carpeta de compilación de IPOPT a su ~/.bashrc , por ejemplo,
export IPOPT_DIR=/home/your_name/Code/Ipopt-3.12.8/buildEn caso de que su sistema operativo no proporcione los binarios precompilados o la versión requerida, también puede instalar fácilmente IPOPT desde la fuente como se describe aquí. Este resumen podría funcionar para usted:
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 ` Si necesita una interfaz para SNOPT, apunte a CMake a esa carpeta de compilación en su ~/.bashrc a través de EG
export SNOPT_DIR=/home/your_name/Code/Snopty ejecutar cmake como
cmake -DBUILD_SNOPT=ON ..