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.
Criterios | Julia | Matlab |
Costo | Gratis | Cientos de dólares al año |
Licencia | Fuente abierta | Licencia de usuario de un año |
Fuente | Fundación y comunidad sin fines de lucro | Empresa MathWorks |
Alcance | Principalmente numérico | Solo numérico |
Rendimiento | Excelente | Más rápido que Python pero más lento que Julia |
Editor / IDE | Se recomienda Jupyter | IDE ya incluido |
embalaje | Administrador de paquetes incluido | Cajas de herramientas incluidas |
Uso | Genérico | Industria e investigación en la academia |
Fama | Joven pero empieza a ser conocido | Viejo y conocido |
Apoyo | Comunidad | MathWorks |
Documentación | Creciente | Okey |
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).
Leave a Reply