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
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éstamo | Tasa de interés | Índice de insolvencia |
---|---|---|
Personal | 0,14 | 0,1 |
Carro | 0,13 | 0,07 |
Casa | 0,12 | 0,03 |
Granja | 0,125 | 0,05 |
Comercial | 0,10 | 0,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:
- Definir las variables de decisión
- Anote la función objetivo
- 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.
# 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