Modelo de Transporte de Dinero y Documentos de Valores
Modelo matemático
pip install pulp
Resolución con python
from pulp import *
# Datos del problema
bodegas = ['Bóveda 1', 'Bóveda 2', 'Bóveda 3']
sucursales = ['Providencia', 'San Miguel', 'Las Condes']
proveedores = ['Proveedor 1', 'Proveedor 2', 'Proveedor 3']
capacidad_bodegas = {'Bóveda 1': 1000, 'Bóveda 2': 5000, 'Bóveda 3': 3000}
demanda_sucursales = {'Providencia': 1800, 'San Miguel': 3000, 'Las Condes': 2000}
capacidad_proveedores = {'Proveedor 1': 4000, 'Proveedor 2': 3000, 'Proveedor 3': 5000}
distancias = {
('Bóveda 1', 'Providencia'): 7,
('Bóveda 1', 'San Miguel'): 4,
('Bóveda 1', 'Las Condes'): 9,
('Bóveda 2', 'Providencia'): 5,
('Bóveda 2', 'San Miguel'): 6,
('Bóveda 2', 'Las Condes'): 3,
('Bóveda 3', 'Providencia'): 3,
('Bóveda 3', 'San Miguel'): 7,
('Bóveda 3', 'Las Condes'): 2
}
tarifas = {'Proveedor 1': 3, 'Proveedor 2': 2.5, 'Proveedor 3': 3.5}
# Definir el problema
prob = LpProblem("Minimizar_Costos_de_Distribucion", LpMinimize)
# Variables de decisión
x = LpVariable.dicts("x", (bodegas, sucursales, proveedores), lowBound=0, cat='Continuous')
y = LpVariable.dicts("y", (bodegas, sucursales, proveedores), cat='Binary')
# Función objetivo
prob += lpSum([distancias[(i,j)] * tarifas[k] * y[i][j][k] for i in bodegas for j in sucursales for k in proveedores])
# Restricciones
for i in bodegas:
prob += lpSum([x[i][j][k] for j in sucursales for k in proveedores]) <= capacidad_bodegas[i]
for j in sucursales:
prob += lpSum([x[i][j][k] for i in bodegas for k in proveedores]) == demanda_sucursales[j]
for k in proveedores:
prob += lpSum([x[i][j][k] for i in bodegas for j in sucursales]) <= capacidad_proveedores[k]
for i in bodegas:
for j in sucursales:
for k in proveedores:
prob += x[i][j][k] - sum(capacidad_bodegas.values())*y[i][j][k] <= 0
# Resolver el problema
prob.solve()
# Imprimir el estado del problema y la solución óptima
print("Estado:", LpStatus[prob.status])
for v in prob.variables():
print(v.name, "=", v.varValue)
print("Costo total de distribución =", value(prob.objective))