Optimización con JuMP en Julia

Como resultado de la aparición y el progreso de los lenguajes de código abierto, los analistas de SCM y OR tienen acceso a un número creciente de herramientas y solucionadores en constante mejora. Julia, por ejemplo, es un lenguaje de programación de código abierto dinámico flexible que es apropiado para la computación científica y numérica. El código fuente de Julia está disponible en GitHub y el lenguaje de programación es compatible con un número creciente de marcos y aplicaciones para optimización y programación.

Ya presenté a Julia en una de mis publicaciones anteriores, cubriendo un ejemplo de programación lineal. En este artículo daré una introducción más completa a Julia, comparándola con otros lenguajes de programación y centrándome específicamente en la optimización.

JuMP: un paquete para programación matemática en Julia

JuMP (Julia para programación matemática) es un paquete disponible en Julia. Este marco de modelado permite a los usuarios formular un problema de optimización (lineal, entero mixto, cuadrático, cuadrático cónico, semidefinito y no lineal) con código fácil de leer. El problema puede resolverse mediante optimizadores (solucionadores) escritos en lenguajes de bajo nivel. El solucionador seleccionado para esta demostración es GLPK, que es un solucionador de código abierto de última generación para problemas de programación lineal (LP) y programación de enteros mixtos (MIP) . Incorpora algoritmos como el método simplex y el método de punto interior.

Comparación de Julia con Matlab para problemas de optimización

Al principio, es necesaria una comparación rápida entre Julia y Matlab para apreciar el poder de los lenguajes de programación de código abierto.

CriteriosJulia Matlab 
CostoGratisCientos de dólares al año
LicenciaFuente abiertaLicencia de usuario de un año
FuenteFundación y comunidad sin fines de lucroEmpresa MathWorks
AlcancePrincipalmente numéricoSolo numérico
RendimientoExcelenteMás rápido que Python pero más lento que Julia
Editor / IDESe recomienda JupyterIDE ya incluido
embalajeAdministrador de paquetes incluidoCajas de herramientas incluidas
UsoGenéricoIndustria e investigación en la academia
FamaJoven pero empieza a ser conocidoViejo y conocido
ApoyoComunidadMathWorks
DocumentaciónCrecienteOkey

Paquetes JuMP y GLPK para optimización con Julia

Salto:

  • Lenguaje de modelado y colección de paquetes de soporte para optimización matemática en  Julia
  • Solucionadores admitidos : GLPK, CLP, CBC, CPLEX, ECOS, GUROBI, HiGHS, MOSEK, XPRESS, OSQP, PATH, ProxSDP SCIP, SCS, SDPA.

El primer paso es agregar los paquetes necesarios: JuMP y GLPK. Esto se hace usando Pkg, que es un administrador de paquetes integrado en Julia. Puedo agregar los paquetes requeridos o deseados usando los siguientes comandos en Julia REPL. Si Julia está instalada, escribir Julia en la línea de comando es suficiente para abrir REPL (comando de ejecución de Julia).

# utilizando Pkg
Pkg.add("JuMP")
Pkg.add("GLPK")

Ahora, debería importar los paquetes necesarios en el IDE que es un cuaderno Jupyter en nuestro caso.

# Importar paquetes: JuMP y GLPK
using JuMP # Paquete Julia - lenguaje de programación de alto nivel
using GLPK # solucionador de código abierto - lenguaje de bajo nivel

Un problema de prueba

Consideremos el siguiente modelo de optimización:

La región factible (ya que xey son variables de decisión continuas) se muestra a continuación:

Según el gradiente del objetivo (la flecha roja) y la dirección de la optimización (maximización), el punto verde es la solución óptima, en la que x = 3,75, y = 1,25, y el valor óptimo de la función objetivo es 23,75. Resolveré este simple modelo de programación lineal continua con el paquete JuMP en Julia y comentaré su sintaxis.

Resolviendo el problema

El siguiente código comentado tiene como objetivo resolver el modelo de programación lineal propuesto con JuMP (el nombre del paquete) en Julia:

# Definir el modelo
m = Model(); # m significa modelo

# Configurar el optimizador
set_optimizer(m,GLPK.Optimizer); # llamando al solucionador GLPK

# Definir las variables
@variable(m, x>=0);
@variable(m, y>=0);

# Definir las restricciones
@constraint(m, x+y<=5);
@constraint(m, 10x+6y<=45);

# Definir la función objetivo
@objective(m, Max, 5x+4y);

# Ejecuta el solucionador
optimize!(m);

# Producción
println(objective_value(m)) # optimal value z
println("x = ", value.(x), "\n","y = ",value.(y)) # solución óptima x & y

En un trabajo futuro, exploraré el poder de Julia para resolver problemas de gestión de la cadena de suministro, específicamente la programación de enteros mixtos (MIP).

You May Also Like

Leave a Reply

Leave a Reply

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.