Professional Documents
Culture Documents
Descargar Julia:
https://julialang.org/ (https://julialang.org/)
Descargar Solver:
Descargar lenguaje de modelado específico de dominio para la optimización matemática integrado en Julia:
Julia JuMP: https://jump.dev/JuMP.jl/stable/ (https://jump.dev/JuMP.jl/stable/)
https://introajulia.org/ (https://introajulia.org/)
In [2]: # Matriz
A = [[3 2 1];[0 1 0];[1 1 1]]
In [3]: # Vector
V = [ 1 2 3 4 5 6 7 ]
Modelo Optimización
Modelo simple
In [8]: # Variables
@variable(model, x[1:3] >= 0);
In [9]: # Objetivo
@objective(model, Min, 20*x[1] + 10*x[2] + 15*x[3])
Modelo Intermedio
Ud. Está a cargo de la producción y venta en Chile de una nueva bebida energética a base de berries llamada "Big Energy". Dispone de un único tamaño de venta de 2.5 lts a un
precio de 5.000 pesos. Dispone de 8 ciudades posibles para instalar centros productivos en donde se estima que la demanda será de un 20% de la población de esta. Puede distribuir
los productos entre las ciudades mediante camiones de carga. El costo de arriendo de cada centro productivo es de 50 millones de pesos al año y el costo variable por producto es
600 pesos/unidad para las primeras 80.000 unidades y 200 pesos/unidad para las siguientes. Cada centro productivo puede producir máximo 300.000 unidades al año. Para
transportar el producto entre ciudades, existe un costo fijo de 50.000 pesos y variable de 1 pesos por km recorrido. El transporte de una ciudad a otra es directo (no puede pasar antes
por otras ciudades). Determine qué centros productivos abrirá, la cantidad a producir por cada uno, las cantidades transportadas de una ciudad a otra y el beneficio neto anual.
Parámetros
𝑁: Número de ciudades (𝑁 = 8)
𝑐𝑖 : ciudad i
𝑝𝑖 : poblacion ciudad i
𝑑𝑖 : demanda ciudad i
𝑟𝑖,𝑗 : distancia ciudad i a ciudad j
𝐶𝑎𝑟𝑟𝑖𝑒𝑛𝑑𝑜 : Costo arriendo centro productivo (𝐶𝑎𝑟𝑟𝑖𝑒𝑛𝑑𝑜 = 50.000.000 [pesos/año] )
𝑃 : Precio de Venta (𝑃 : 5.000 [pesos/unidad])
𝐶𝑉𝑎𝑝 : Costo Variable intervalo alta producción ( 𝐶 𝑉𝑎 𝑝 = 200 [pesos/unidad] )
𝐶𝑉𝑏𝑝 : Costo Variable intervalo baja producción ( 𝐶 𝑉𝑏 𝑝 = 600 [pesos/unidad] )
𝐶𝑇𝑣 : Costo de transporte variable ( 𝐶𝑇𝑣 = 1[pesos/(km)])
𝐶𝑇𝑓 : Costo de transporte fijo ( 𝐶𝑇𝑓 = 50.000 [pesos])
𝑃𝑟𝑜𝑑𝑚𝑎𝑥 : Producción máxima de cada centro productivo ( 𝑃𝑟𝑜𝑑𝑚𝑎𝑥 = 300.000 [unidades])
𝐼𝑝 : Límite intervalo producción baja - alta ( 𝐶𝑇𝑓 = 80.000 [unidades])
Variables
𝑥𝑖 : Cantidad bebidas producidos en la ciudad i
𝐴𝑖 : Decisión de arrendar centro en la ciudad i
𝑇𝑖,𝑗 : Decisión de transportar desde ciudad i a ciudad j
𝑦𝑖,𝑗 : Cantidad de productos transportada desde la ciudad i hasta la ciudad j
𝑤𝑖 : Representa el producto entre las variables x y z
𝑤𝑖 = 𝑥𝑖 · 𝑧𝑖
𝑍𝑖 : Nivel de producción en la ciudad i (alto o bajo])
𝑍𝑖 = 1 si ∑𝑖∈𝑁 > 𝐼𝑝
𝑍𝑖 = 0 si ∑𝑖∈𝑁 <= 𝐼𝑝
Función Objetivo
𝐼𝑛𝑔𝑟𝑒𝑠𝑜 = ∑ 𝑥𝑖 ⋅ 𝑃
𝑖∈𝑁
𝐶𝑜𝑠𝑡𝑜𝑉𝑎𝑟𝑖𝑎𝑏𝑙𝑒 = ∑ (𝑥𝑖 ⋅ 𝐶 𝑉𝑎𝑝 ) − (𝐶 𝑉𝑎𝑝 − 𝐶 𝑉𝑏𝑝) ⋅ (𝑤𝑖 − 𝐼𝑝 ∗ 𝑍𝑖 )
𝑖∈𝑁
𝐶𝑜𝑠𝑡𝑜𝐴𝑟𝑟𝑖𝑒𝑛𝑑𝑜 = ∑ 𝐴𝑖 ⋅ 𝐶𝑎𝑟𝑟𝑖𝑒𝑛𝑑𝑜
𝑖∈𝑁
𝐶𝑜𝑠𝑡𝑜𝑉𝑎𝑟𝑖𝑎𝑏𝑙𝑒𝑇𝑟𝑎𝑛𝑠𝑝𝑜𝑟𝑡𝑒 = ∑ ∑ 𝑟𝑖,𝑗 ⋅ 𝐶 𝑇𝑣 ⋅ 𝑦𝑖,𝑗
𝑖∈𝑁 𝑗∈𝐽
𝐶𝑜𝑠𝑡𝑜𝐹𝑖𝑗𝑜𝑇𝑟𝑎𝑛𝑠𝑝𝑜𝑟𝑡𝑒 = ∑ ∑ 𝐶 𝑇𝑓 ⋅ 𝑇𝑖,𝑗
𝑖∈𝑁 𝑗∈𝐽
𝐶𝑜𝑠𝑡𝑜𝑠 = 𝐶𝑜𝑠𝑡𝑜𝑉𝑎𝑟𝑖𝑎𝑏𝑙𝑒 + 𝐶𝑜𝑠𝑡𝑜𝐴𝑟𝑟𝑖𝑒𝑛𝑑𝑜 + 𝐶𝑜𝑠𝑡𝑜𝑉𝑎𝑟𝑖𝑎𝑏𝑙𝑒𝑇𝑟𝑎𝑛𝑠𝑝𝑜𝑟𝑡𝑒 + 𝐶𝑜𝑠𝑡𝑜𝐹𝑖𝑗𝑜𝑇𝑟𝑎𝑛𝑠𝑝𝑜𝑟𝑡𝑒
𝐵𝑒𝑛𝑒𝑓𝑖𝑐𝑖𝑜 = 𝐼𝑛𝑔𝑟𝑒𝑠𝑜 − 𝐶𝑜𝑠𝑡𝑜𝑠
Modelo
𝑚𝑎𝑥 𝐵𝑒𝑛𝑒𝑓𝑖𝑐𝑖𝑜
𝑠.𝑡 ∑ 𝑦𝑖𝑗 + 𝑥𝑖 − ∑ 𝑦𝑖𝑗 ≤ 𝑑𝑖 ∀𝑖
𝑗∈𝐽 𝑗∈𝐽
∑ 𝑦𝑖𝑗 ≤ 𝑥𝑖 ∀𝑖
𝑗∈𝐽
𝑦𝑖𝑗 ≤ 𝑀 ⋅ 𝑇𝑖𝑗 ∀𝑖,𝑗
𝑥𝑖 ≤ 𝑀 ⋅ 𝐴𝑖 ∀𝑖
𝑥𝑖 ≤ 𝑃𝑟𝑜𝑑𝑚𝑎𝑥 ∀𝑖
𝑍𝑖 ⋅ 𝐼𝑝 ≤ 𝑥𝑖 ∀𝑖
𝑤𝑖 ≤ 𝑥𝑖 ∀𝑖
𝑤𝑖 ≤ 𝑀 ⋅ 𝑧𝑖 ∀𝑖
𝑥,𝑦 𝐸𝑛𝑡𝑒𝑟𝑎𝑠
𝐴𝑖 , 𝑇𝑖𝑗 , 𝑍𝑖 ∈ [0,1] ∀𝑖,𝑗
In [13]: function modelo()
#Parámetros
path = "data.xlsx"
r = XLSX.readdata(path, "distancia_ciudades!B2:I9")
poblacion = XLSX.readdata(path, "demanda!B2:B9")
d = XLSX.readdata(path, "demanda!C2:C9")
ciudades = XLSX.readdata(path, "distancia_ciudades!A2:A9");
N = length(ciudades)
P = 5000 #Precio venta por producto
#----------------------------------------------------
#Función Objetivo
Ganancia = sum(x[i] * P for i in 1:N)
Costos_Variables = sum(x[i] * CV_ap - (CV_ap - CV_bp)*(w[i] - I_p*z[i]) for i in 1:N)
Costos_Arriendo = sum(A[i] * C_arriendo for i in 1:N)
Costo_Transporte_var = sum(r[i,j]* CT_v * y[i,j] for i in 1:N for j in 1:N)
Costo_Transporte_fijo = sum(T[i,j] * CT_f for i in 1:N for j in 1:N)
f = Ganancia - (Costos_Variables + Costos_Arriendo + Costo_Transporte_var + Costo_Transporte_fijo)
@objective(m, Max, f)
#----------------------------------------------------------
#Restricciones del Problema
# Límite producción
@constraint(m, max_produccion[i = 1:N], x[i] <= Prod_max)
# Definición de w_1
@constraint(m, def_w1[i = 1:N], w[i] <= x[i])
# Defición de w_2
@constraint(m, def_w2[i = 1:N], w[i] <= z[i] * M)
optimize!(m)
value_opt = objective_value(m)
produccion = JuMP.value.(x)
transporte_entre_cuidades =JuMP.value.(y)
end
path = "data.xlsx"
ciudades = XLSX.readdata(path, "distancia_ciudades!A2:A9");
produccion
DataFrames.rename!(convert(DataFrame, produccion'), [Symbol(ciudades[i]) for i in 1:8])
Out[17]: 1.59440667027e9