Resumen

Se presenta un modelo de programación lineal entera mixta (MILP) para la optimización del balanceo de inventario en cadenas farmacéuticas. El problema consiste en determinar las transferencias óptimas de productos entre sucursales, maximizando el valor neto de los productos redistribuidos menos los costos de transporte. La formulación incorpora restricciones de capacidad de inventario, niveles mínimos de seguridad y costos de transporte basados en distancias geodésicas. Implementamos el modelo utilizando OR-Tools con el solver SCIP, obteniendo soluciones óptimas en tiempos computacionales aceptables para instancias con cientos de sucursales y miles de productos.

Keywords: programación lineal, optimización de inventario, cadena de suministro, MILP, balanceo de stock.

1Introducción

La gestión eficiente del inventario en cadenas de farmacias representa un desafío logístico significativo. Las fluctuaciones en la demanda, combinadas con la diversidad geográfica de las sucursales, frecuentemente resultan en desbalances de inventario: algunas sucursales acumulan excedentes mientras otras enfrentan faltantes del mismo producto.

El problema de balanceo de inventario entre sucursales puede formularse como un problema de optimización combinatoria. El objetivo es determinar qué productos transferir, desde qué sucursales de origen hacia qué sucursales de destino, y en qué cantidades, de manera que se maximice el beneficio económico neto de las transferencias.

En el contexto específico de cadenas farmacéuticas mexicanas, existe una restricción operativa importante: los días viernes se realiza un surtido obligatorio desde el centro de distribución, donde se deben comprar todos los faltantes de inventario. Por tanto, cada unidad de faltante que no se cubra mediante transferencias internas representa un costo de compra adicional. Esta característica transforma el problema en una maximización del valor ahorrado.

En este trabajo presentamos una formulación de programación lineal entera mixta (MILP) que:

  • Maximiza el valor de los productos transferidos (equivalente a minimizar faltantes).
  • Considera los costos de transporte entre sucursales.
  • Respeta restricciones de capacidad e inventario mínimo de seguridad.
  • Permite la generación de soluciones óptimas o cercanas al óptimo en tiempos computacionales razonables.

2Formulación matemática

2.1 · Conjuntos e índices

  • $\mathcal{S}$: conjunto de sucursales, indexadas por $i, j \in \{1, 2, \ldots, n\}$.
  • $\mathcal{P}$: conjunto de productos, indexados por $p \in \{1, 2, \ldots, m\}$.
  • $\mathcal{E}_{ip}$: pares (sucursal, producto) con excedente.
  • $\mathcal{F}_{jp}$: pares (sucursal, producto) con faltante.

2.2 · Parámetros

Los parámetros del modelo: $e_{ip}$ excedente del producto $p$ en $i$, $f_{jp}$ faltante, $c_p$ precio de costo, $t_{ij}$ costo de transporte $i\to j$, $d_{ij}$ distancia, $\sigma$ inventario mínimo de seguridad, $M$ Big-M, $K$ número máximo de rutas diarias.

El costo de transporte se calcula como:

$$ t_{ij} = \alpha \cdot d_{ij} $$(1)

donde $\alpha$ es el factor de costo por kilómetro. La distancia $d_{ij}$ se calcula mediante la fórmula de Haversine:

$$ d_{ij} = 2R \arcsin\left(\sqrt{\sin^2\left(\frac{\phi_j-\phi_i}{2}\right) + \cos\phi_i \cos\phi_j \sin^2\left(\frac{\lambda_j-\lambda_i}{2}\right)}\right) $$(2)

con $R=6371$ km, $\phi$ latitud y $\lambda$ longitud.

2.3 · Variables de decisión

$$ x_{ijp} \in \mathbb{Z}^+ \cup \{0\}: \text{cantidad de } p \text{ a transferir } i \to j $$(3)
$$ y_{ij} \in \{0,1\}: \begin{cases} 1 & \text{si existe transferencia } i\to j \\ 0 & \text{en otro caso} \end{cases} $$(4)

3Función objetivo

El objetivo es maximizar el valor neto de las transferencias — valor de productos redistribuidos menos costos de transporte:

$$ \max Z = \underbrace{\sum_{i\in\mathcal{S}} \sum_{j\in\mathcal{S}} \sum_{p\in\mathcal{P}} c_p \cdot x_{ijp}}_{\text{valor transferido}} - \underbrace{\sum_{i\in\mathcal{S}}\sum_{j\in\mathcal{S}} t_{ij} \cdot y_{ij}}_{\text{costo de transporte}} $$(5)

Al maximizar $Z$, el modelo automáticamente prioriza productos de mayor valor, prefiere rutas de menor costo y balancea el trade-off entre valor transferido y costo logístico.

4Restricciones

4.1 · Excedente disponible

$$ \sum_{j \neq i} x_{ijp} \leq e_{ip} \quad \forall i, p $$(6)

4.2 · Faltante máximo

$$ \sum_{i \neq j} x_{ijp} \leq f_{jp} \quad \forall j, p $$(7)

4.3 · Inventario mínimo de seguridad

$$ I_{ip} - \sum_{j \neq i} x_{ijp} \geq \sigma \quad \forall i, p $$(8)

4.4 · Activación de ruta (Big-M)

$$ x_{ijp} \leq M \cdot y_{ij} \quad \forall i,j,p $$(9)

Si $y_{ij}=0$ entonces $x_{ijp}=0$; si $y_{ij}=1$ la transferencia puede activarse hasta $M$.

4.5 · Límite de rutas diarias

$$ \sum_i \sum_{j\neq i} y_{ij} \leq K $$(10)

Garantiza que la solución sea ejecutable en la práctica, considerando capacidad de flota y personal disponible. $K=10$ típicamente.

5Modelo completo

$$\begin{aligned} \max\quad & Z = \sum_{i,j,p} c_p\, x_{ijp} - \sum_{i,j} t_{ij}\, y_{ij}\\ \text{s.a.}\quad & \sum_{j\neq i} x_{ijp} \leq e_{ip} \quad \forall i,p\\ & \sum_{i\neq j} x_{ijp} \leq f_{jp} \quad \forall j,p\\ & I_{ip} - \sum_{j\neq i} x_{ijp} \geq \sigma \quad \forall i,p\\ & x_{ijp} \leq M\, y_{ij} \quad \forall i,j,p\\ & \sum_i \sum_{j\neq i} y_{ij} \leq K\\ & x_{ijp} \in \mathbb{Z}^+, \ y_{ij} \in \{0,1\} \end{aligned}$$

5.1 · Complejidad

Para $n$ sucursales y $m$ productos: $O(n^2 m)$ variables enteras, $O(n^2)$ binarias, $O(n^2 m)$ restricciones. El problema es NP-hard, pero los solvers modernos resuelven instancias prácticas a optimalidad en minutos.

6Implementación computacional

Implementamos el modelo con Google OR-Tools + solver SCIP en tres etapas:

  1. Pre-procesamiento — carga de inventario desde SQL Server, generación de matriz de distancias mediante Haversine.
  2. Optimización — construcción del MILP, resolución con límite de tiempo configurable.
  3. Post-procesamiento — agrupación en rutas, ordenamiento por rentabilidad neta, generación de tandas ejecutables.

Parámetros operativos: tiempo límite 120 s · gap de optimalidad 1% · factor $\alpha = $ $15$ MXN/km · $\sigma = 2$ unidades · $K = 10$ rutas/día.

7Resultados

Evaluamos el modelo con una cadena de 19 farmacias en la región de Tula, Hidalgo. La instancia incluye 19 sucursales con coordenadas geográficas conocidas, ~3,000 productos con desbalance, y matriz de distancias $19 \times 19 = 361$ pares.

La rentabilidad neta de cada ruta:

$$ R_{ij} = \sum_p c_p\, x_{ijp} - t_{ij} $$(11)

Solo se ejecutan rutas con $R_{ij} \geq R_{\min}$, donde $R_{\min}$ es el umbral mínimo (típicamente $500$ MXN).

8Extensiones del modelo

8.1 · Priorización por zonas

$$ \max Z' = Z + \beta \sum_{i,j,p} \mathbb{1}_{[z_i = z_j]}\, c_p\, x_{ijp} $$(12)

8.2 · Capacidad de transporte

$$ \sum_p v_p\, x_{ijp} \leq V_{\max}\, y_{ij} \quad \forall i,j $$(13)

9Conclusiones

Presentamos una formulación MILP rigurosa para el balanceo de inventario en cadenas farmacéuticas. El modelo maximiza el valor neto de las transferencias considerando beneficio económico y costos logísticos. La implementación demuestra que instancias de tamaño real pueden resolverse a optimalidad en minutos, lo que permite su uso en operaciones diarias.

Trabajo futuro: extensión multi-período, optimización robusta con incertidumbre en la demanda, e integración con sistemas de ruteo de vehículos.