Programación lineal en Julia con GLPK y JuMP

En publicaciones anteriores hemos cubierto varios ejemplos de programación lineal tanto en Python como en R. Por ejemplo, hemos introducido lpSolve en R, PuLP en Python, Gekko en Python, MIP en Python, ortools en Python, así como muchos otros paquetes y módulos para programación lineal. . En esta publicación, demostraré cómo se puede implementar la programación lineal en Julia.

Julia es un lenguaje dinámico flexible que es apropiado para la computación científica y numérica. Además, Julia es un proyecto de código abierto. Su código fuente está disponible en GitHub. El uso de Julia proporciona acceso a muchos paquetes ya desarrollados para este lenguaje. Para el ejemplo de programación lineal presentado en esta publicación, usaré los paquetes Julia GLPK y JuMP.

Ejemplo de ingeniería financiera utilizando JuMP y GLPK en Julia

Logotipo del lenguaje de programación Julia

El ejemplo demostrado es sobre una política de préstamos bancarios. Este sencillo ejemplo nos ayudará a comprender el poder de la programación lineal para resolver la mayoría de los problemas que enfrentamos en la gestión de la cadena de suministro y los campos financieros. De hecho, se incorporará a Julia para solucionar el problema de optimización. El ejemplo está adaptado del libro de Hamdy Taha disponible en Amazon.

Tipo de préstamoTasa de interésÍndice de insolvencia
Personal0,140,1
Carro0,130,07
Casa0,120,03
Granja0,1250,05
Comercial0,100,02

Un banco está en proceso de diseñar una política de préstamos que involucra un  máximo de $ 12 millones . La tabla, que se muestra arriba, proporciona los datos sobre los préstamos disponibles. Es importante señalar que  las deudas incobrables son irrecuperables y no generan ingresos por intereses . La competencia con otras instituciones financieras dicta la  asignación de al menos el 40% de los fondos a préstamos agrícolas y comerciales . Para ayudar a la industria de la vivienda en la región,  los préstamos hipotecarios deben equivaler al menos al 50% de los préstamos personales, para automóviles y para la vivienda . El banco  limita el índice general de deudas incobrables de todos los préstamos a un máximo del 4% .

Desarrollar un enunciado de un problema matemático

La parte más difícil de cualquier problema de optimización es construir el modelo matemático. Los pasos para superar esta dificultad son los siguientes:

  1. Definir las variables de decisión
  2. Anote la función objetivo
  3. Formular todas las restricciones

Variables de decisión

De acuerdo con lo dado en el problema, necesitamos determinar el monto del préstamo en millones de dólares. La tabla muestra cinco categorías o tipos de préstamos. Por tanto, necesitamos cinco variables de decisión correspondientes a cada categoría.

  • x1 = préstamos personales
  • x2 = préstamos para automóviles
  • x3 = préstamos hipotecarios
  • x4 = préstamos agrícolas
  • x5 = préstamos comerciales

Función objetiva

La función objetivo es maximizar las ganancias (rendimiento neto). La rentabilidad neta es la diferencia entre los ingresos generados por la tasa de interés y las pérdidas debidas al índice de insolvencia.

Entonces, la función objetivo es la siguiente:

Restricciones

Los préstamos totales deben ser menores o iguales a 12 millones de dólares

Los préstamos agrícolas y comerciales equivalen al menos al 40% de todos los préstamos

Los préstamos hipotecarios deben equivaler al menos al 50% de los préstamos personales, para automóviles y para la vivienda

Las deudas incobrables no deben exceder el 4% de todos los préstamos.

No negatividad

Aplicación de la programación lineal en Julia

El primer paso es agregar los paquetes necesarios para resolver el programa lineal. Esto se hace usando el <Pkg> que es el administrador de paquetes integrado en Julia. Podemos agregar los paquetes necesarios usando los siguientes comandos en Julia REPL. Si Julia está instalada, escribir Julia en la línea de comando, en el símbolo del sistema de la computadora, es suficiente para abrir REPL.

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

El trabajo que se presenta a continuación se realiza en un cuaderno Jupyter con un kernel de Julia. JuMP es un lenguaje de modelado para optimización matemática en Julia, mientras que GLPK es el solucionador que usaremos. Después de importar los paquetes en Jupyter, definimos el problema de optimización creando una variable BM que significa Bank Model. El siguiente paso es configurar el optimizador declarando el solucionador (GLPK) y el modelo (BM). Continuando, especificamos las variables de decisión, las restricciones y la función objetivo.

En [1]:

## Importando los paquetes necesarios ## 
usando JuMP
 usando GLPK

En [2]:

## Definición del modelo ## 
BM = Modelo () # BM significa Bank Model

## Configuración del optimizador ##
set_optimizer (BM, GLPK.Optimizer)

## Definir las variables ##
@variable (BM, x1> = 0)
@variable (BM, x2> = 0)
@variable (BM, x3> = 0)
@variable (BM, x4> = 0)
@variable (BM, x5> = 0)

## Definir las restricciones ##
@constraint (BM, x1 + x2 + x3 + x4 + x5 <= 12)
@constraint (BM, 0.4x1 + 0.4x2 + 0.4x3-0.6x4-0.6x5 <= 0)
@constraint (BM, 0.5x1 + 0.5x2-0.5x3 <= 0)
@constraint (BM, 0.06x1 + 0.03x2-0.01x3 + 0.01x4-0.02x5 <= 0)

## Definir la función objetivo ##
@objetivo (BM, Max, 0.026x1 + 0.0509x2 + 0.0864x3 + 0.06875x4 + 0.078x5)

## Ejecuta la optimización ##
optimizar! (BM)

Declarar la función objetivo y las restricciones en Julia es más fácil porque la ecuación algebraica se puede ingresar como está (es decir, no es necesario mostrar el operador de multiplicación entre la variable y la constante). Después de ejecutar el modelo de optimización, podemos ver el resultado del modelo de la siguiente manera:

En [3]:

BM

Fuera [3]:

Un modelo JuMP
Problema de maximización con:
Variables: 5
Tipo de función objetivo: AffExpr
`AffExpr`-in-`MathOptInterface.LessThan {Float64}`: 4 restricciones
`VariableRef`-in-`MathOptInterface.GreaterThan {Float64}`: 5 restricciones
Modo de modelo: AUTOMÁTICO
Estado de CachingOptimizer: ATTACHED_OPTIMIZER
Nombre del solucionador: GLPK
Nombres registrados en el modelo: x1, x2, x3, x4, x5

En [4]:

valor_objetivo (BM)

Fuera [4]:

0.99648

En [5]:

sentido_objetivo (BM)

Fuera [5]:

MAX_SENSE :: OptimizationSense = 1

En [6]:

println ("x1 =", valor. (x1), " \ n ", "x2 =", valor. (x2), " \ n ", "x3 =", valor. (x3), " \ n ", "x4 =", valor. (x4), " \ n ", "x5 =", valor. (x5))
x1 = 0.0
x2 = 0.0
x3 = 7,199999999999999
x4 = 0.0
x5 = 4,8

Analizando la salida del modelo, podemos ver que el banco debería gastar 7,2 millones de dólares en préstamos hipotecarios y 4,8 millones de dólares en préstamos comerciales. Esta distribución ayudará al banco a maximizar sus rendimientos netos (es decir, beneficios) a 0,99648 millones de dólares.

Observaciones finales

En esta publicación, exploramos el poder de la programación lineal en el sector bancario y utilizamos a Julia para resolver el problema de optimización de LP. Es bueno ver que los lenguajes de código abierto pueden resolver este tipo de problemas de una manera fácil sin muchas horas de codificación. En el futuro, tendremos una idea de los problemas no lineales en la gestión de la cadena de suministro.

Leave a Reply

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

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

Close

Meta