Uma formulação matemática simples para otimização de estoques
Motivado por um desafio interno na SLC Agrícola, resolvi pesquisar mais a fundo sobre otimização de estoques, especificamente em estratégias que diminuem desequilíbrios de oferta e demanda de um determinado item em várias localidades/armazéns. Acontece que este é um dos objetos de estudo da pesquisa operacional, que é uma área do conhecimento que busca aplicar soluções matemáticas e estatísticas à tomada de decisão em geral.
Estratégia
Podemos formular esse problema como sendo de programação linear, mais precisamente de fluxo de commodities, se tratarmos as quantidades planejadas e o estoque lógico, respectivamente, como demandas e ofertas de um determinado produto nas diferentes localidades. Como não há restrições de fluxo total de produtos entre as unidades, podemos resolver o problema separadamente para vários produtos que possam existir.
Definindo os seguintes vetores e matrizes:
\(f \in F = \{1,2,\dots,F,\textrm{resto}\}\): localidades
\(c_{f,g}\): custo da transação da localidade \(f\) para \(g\)
\(b_{f}\): oferta líquida do item na localidade \(f\) (pode ser negativa)
\(x_{f,g}\): fluxo do item da localidade \(f\) para \(g\) (as variáveis de decisão)
O objetivo do problema será minimizar o custo total das transferências entre localidades, atendendo os desequilíbrios entre oferta e demanda de itens da melhor maneira possível:
\[\min_{x_{f,g}} \sum_{f,g \in F} c_{f,g} x_{f,g} \\ \textrm{s.a.} \\ \begin{align} \sum_{f \neq g} (x_{f,g}-x_{g,f}) &\leq b_{f}~(1) \\ x_{f,g} &\geq 0~(2) \\ x_{\textrm{resto},f} &= 0~(3) \end{align}\]O significado das restrições:
-
O saldo das transações deve ser menor ou igual ao excesso de oferta do item na localidade \(f\);
-
As transferências devem ser não-negativas;
-
Não deve haver transferências do “resto” de/para outras localidades. O resto (ou sink) é uma localidade teórica que compensa o excesso de demanda/oferta total do sistema.
Representação gráfica
É possível representar as localidades e suas capacidades como grafos direcionados. Assim, o problema acima se torna um problema de fluxo ótimo entre os nós do grafo.
![]()
Se as localidades de interesse são apenas um subconjunto de uma rede com um grande número de localidades, é possível simplificar o problema criando uma sub-rede cujas ligações representam o caminho mais curto (ou custo mínimo) de deslocamento entre essas localidades.
Na prática
Desenvolvi um dashboard em Python que aplica estes conceitos em um cenário urbano, usando dados simulados. O código está no link: