Um dos primeiros problemas utilizando Otimização Linear e métodos de pesquisa operacional.
Problema da Ração é um exemplo típico utilizado como exemplo para Otimização Linear.
Imagina que uma fabrica de ração tenha que produzir a ração animal com 3 ingredientes, como o frango, osso e trigo.
Onde abaixo teríamos um custo, apenas como exemplo, dos 3 ingredientes por Kg:
Preço R$/Kg: Frango = 5 , Osso = 4, Trigo = 6
Sendo assim as variáveis decisão serão a quantidade para cada ingrediente:
Quantidade Kg: Frango = x1, Osso = x2, Trigo = x3
- Função Objetivo: Queremos reduzir o custo total de cada ingrediente da ração. Portanto o custo será:
Min 𝑐𝑇𝑥′ =5×1+4×2+6×3
Curiosidade: O resultado da expressão é um escalar obtido pela combinação linear das derivadas das componentes do vetor
, resultando em:

e

2) Restrições:
Quantidade de cada ingrediente não pode ser negativa e que a produção de pelo menos 1Kg de ração.
x1 + x2+ x3 = 1 (Kg)
x1 > =0
x2 > =0
x3 > =0
| Nutriente | Frango (x₁) | Osso (x₂) | Trigo (x₃) | Restrição |
|---|---|---|---|---|
| Proteína | 0.6 | 0.2 | 0.1 | ≥ 0.4 |
| Sódio | 0.1 | 0.05 | 0.02 | ≤ 0.08 |
| Preço Kg | 5 | 4 | 6 | = 1 kg |
ou seja, restrições são:
Quantidade total:
Proteína mínima:
Sódio máximo:
Não negatividade:
Abaixo está a solução em Python com linprog, Otimização para custo mínimo a cada 1Kg de ração.
import numpy as npfrom scipy.optimize import linprog# -------------------------# Variáveis de decisão# x1 = kg Frango, x2 = kg Osso, x3 = kg Trigo# -------------------------# Função objetivo: minimizar custo# min 5x1 + 4x2 + 6x3c = np.array([5, 4, 6], dtype=float)# Restrições do tipo A_ub @ x <= b_ub# 1) Proteína mínima: 0.6x1 + 0.2x2 + 0.1x3 >= 0.4# Convertemos para <= multiplicando por -1:# -0.6x1 -0.2x2 -0.1x3 <= -0.4# 2) Sódio máximo: 0.1x1 + 0.05x2 + 0.02x3 <= 0.08A_ub = np.array([ [-0.6, -0.2, -0.1], # proteína (convertida) [ 0.1, 0.05, 0.02], # sódio], dtype=float)b_ub = np.array([ -0.4, # proteína mínima 0.08, # sódio máximo], dtype=float)# Restrição de igualdade: x1 + x2 + x3 = 1 (mistura total)A_eq = np.array([[1, 1, 1]], dtype=float)b_eq = np.array([1], dtype=float)# Limites (não negatividade): x1, x2, x3 >= 0bounds = [(0, None), (0, None), (0, None)]# Resolverres = linprog( c=c, A_ub=A_ub, b_ub=b_ub, A_eq=A_eq, b_eq=b_eq, bounds=bounds, method="highs")# Resultadosif res.success: x1, x2, x3 = res.x print("✅ Solução ótima encontrada (custo mínimo)") print(f"x1 (Frango) = {x1:.4f} kg") print(f"x2 (Osso) = {x2:.4f} kg") print(f"x3 (Trigo) = {x3:.4f} kg") print(f"Custo mínimo = R$ {res.fun:.4f}") # Checagem das restrições (opcional) proteina = 0.6*x1 + 0.2*x2 + 0.1*x3 sodio = 0.1*x1 + 0.05*x2 + 0.02*x3 print("\n🔎 Checagem:") print(f"Total = {x1 + x2 + x3:.4f} (deve ser 1)") print(f"Proteína = {proteina:.4f} (>= 0.4)") print(f"Sódio = {sodio:.4f} (<= 0.08)")else: print("❌ Não foi possível encontrar solução.") print("Motivo:", res.message)
✅ Solução ótima encontrada (custo mínimo) x1 (Frango) = 0.5000 kg x2 (Osso) = 0.5000 kg x3 (Trigo) = 0.0000 kg Custo mínimo = R$ 4.5000 🔎 Checagem: Total = 1.0000 (deve ser 1) Proteína = 0.4000 (>= 0.4) Sódio = 0.0750 (<= 0.08)