Otimizacao_linear_Pesquisa_operacional
Métodos de Agregação de Síntese – AHP Gaussiano
O AHP Gaussiano (Analytic Hierarchy Process Gaussiano):
O método AHP Gaussiano é a evolução do método AHP (Analytic Hierarchy Process), ele utiliza uma abordagem estatística baseada na variabilidade dos dados (desvio padrão e coeficiente de variação).
Fórmula:
Exemplo: Critérios de decisão, em algum momento você ganha e inicio a perda.
Sim. Um exemplo bastante didático para o blog seria a seleção de fornecedores, pois permite demonstrar critérios de maximização e minimização.
Limitações do AHP-Gaussiano
O artigo sobre aplicação do método em sensores inteligentes destaca duas limitações principais. researchgate.net
O AHP tradicional é geralmente recomendado para hierarquias com aproximadamente sete elementos, admitindo-se uma variação de dois elementos, devido ao esforço cognitivo exigido pelas comparações par a par. O AHP-Gaussiano reduz essa limitação, pois calcula os pesos a partir da dispersão dos dados quantitativos. Entretanto, exige critérios independentes, dados positivos e representativos e uma quantidade suficiente de alternativas para que as medidas de dispersão sejam confiáveis.
1. Não admite diretamente valores negativos
A formulação trabalha com razões, médias e coeficientes de variação. Por isso, critérios com valores negativos podem produzir resultados inadequados ou incompatíveis com os pressupostos do método.
Isso pode acontecer, por exemplo, com:
- lucros e prejuízos;
- variações percentuais negativas;
- temperaturas abaixo de zero;
- escalas centradas em zero.
Nesses casos, é necessário transformar justificadamente a escala ou escolher outro método multicritério.
2. É essencialmente quantitativo
O AHP-Gaussiano calcula os pesos a partir dos valores existentes na matriz de decisão. Assim, critérios qualitativos, como conforto, design ou facilidade de manutenção, não entram diretamente.
Eles podem ser transformados em escalas numéricas, mas essa conversão exige cuidado. Uma codificação inadequada pode introduzir subjetividade e favorecer artificialmente uma alternativa. researchgate.net
Outras limitações e cuidados importantes
- Critérios independentes: o método pressupõe que os critérios não estejam medindo praticamente a mesma coisa. Utilizar “consumo”, “economia de combustível” e “custo mensal de combustível”, por exemplo, pode contar a mesma informação várias vezes. A proposta original chegou a incorporar a correlação de Pearson para verificar relações entre critérios. journals.sagepub.com
- Método compensatório: um desempenho muito bom pode compensar um desempenho muito ruim. Um carro barato e econômico poderia subir no ranking mesmo apresentando um resultado considerado inaceitável em segurança. Se houver limites obrigatórios, eles devem ser aplicados antes do AHP-Gaussiano.
- Peso determinado pela dispersão: o método não pergunta ao decisor qual critério é mais importante. Um critério recebe maior peso quando diferencia mais as alternativas. Assim, grande variação não significa automaticamente grande importância estratégica.
- Sensibilidade a valores extremos: um carro com valor muito diferente dos demais pode aumentar o desvio-padrão e, consequentemente, o peso do critério. Estudos recentes também apontam sensibilidade à distribuição, a valores discrepantes e a vieses na coleta dos dados. nature.com
- Dependência da qualidade dos dados: erros, dados ausentes, períodos de medição diferentes ou fontes pouco confiáveis afetam diretamente os pesos e o ranking.
- Instabilidade com poucas alternativas: matematicamente é possível calcular o método com duas alternativas, mas o desvio-padrão ficará determinado apenas pela diferença entre elas. Com tão poucos valores, a ideia de uma dispersão associada a uma distribuição gaussiana se torna estatisticamente frágil.
- Mudança do conjunto de alternativas: ao adicionar ou remover um carro, mudam a normalização, a média, o desvio-padrão, os pesos e possivelmente o ranking.
Exemplo: escolha de fornecedor com AHP-Gaussiano
Uma empresa precisa selecionar um fornecedor de componentes. Quatro empresas apresentaram propostas, mas nenhuma é claramente superior em todos os critérios.
Alternativas
- Fornecedor A
- Fornecedor B
- Fornecedor C
- Fornecedor D
Matriz de decisão
| Fornecedor | Custo unitário (R$) ↓ | Prazo de entrega (dias) ↓ | Taxa de defeitos (%) ↓ | Capacidade mensal ↑ | Entregas no prazo (%) ↑ |
|---|---|---|---|---|---|
| A | 52 | 5 | 1,8 | 9.000 | 96 |
| B | 47 | 8 | 3,2 | 12.000 | 90 |
| C | 55 | 4 | 1,2 | 7.500 | 98 |
| D | 49 | 6 | 2,0 | 10.500 | 94 |
- ↓ quanto menor, melhor: custo, prazo e defeitos;
- ↑ quanto maior, melhor: capacidade e entregas no prazo.
Neste exemplo:
- (m=4) alternativas;
- (n=5) critérios.
Por que não escolher antecipadamente?
O fornecedor B possui o menor custo e a maior capacidade, mas apresenta o maior prazo e a maior taxa de defeitos.
O fornecedor C tem a menor taxa de defeitos, o menor prazo e o melhor percentual de entregas no prazo, porém possui o maior custo e a menor capacidade.
Portanto, não podemos dizer antecipadamente qual é o melhor. É necessário agregar todos os critérios.
Etapas
- Construir a matriz de decisão.
- Identificar critérios de maximização e minimização.
- Converter os critérios para a mesma direção de preferência.
- Normalizar a matriz.
- Calcular a média de cada critério.
- Calcular o desvio-padrão.
- Calcular o fator gaussiano.
- Normalizar os fatores gaussianos.
- Multiplicar a matriz normalizada pelo vetor de pesos.
- Obter o índice de preferência global e o ranking.
A matriz de decisão é:

De forma geral:
A direção dos critérios é:
- custo unitário: quanto menor, melhor;
- prazo de entrega: quanto menor, melhor;
- taxa de defeitos: quanto menor, melhor;
- capacidade mensal: quanto maior, melhor;
- entregas no prazo: quanto maior, melhor.
2. Tratamento da direção dos critérios
Antes da normalização, todos os critérios precisam estar orientados na mesma direção. Neste exemplo, valores maiores deverão sempre representar desempenhos mais favoráveis.
Para os critérios de benefício, o valor original será mantido. Para os critérios de custo, será utilizada a transformação recíproca:
Assim, para um critério de custo:
Por exemplo, para o custo unitário do fornecedor A:
Para o fornecedor B:
Como o fornecedor B possui o menor custo, ele passa a apresentar o maior valor transformado nesse critério.
Após a transformação dos critérios de minimização, obtém-se:
| Fornecedor | Custo | Prazo | Defeitos | Capacidade | Entregas no prazo |
|---|---|---|---|---|---|
| A | 0,019231 | 0,200000 | 0,555556 | 9.000 | 96 |
| B | 0,021277 | 0,125000 | 0,312500 | 12.000 | 90 |
| C | 0,018182 | 0,250000 | 0,833333 | 7.500 | 98 |
| D | 0,020408 | 0,166667 | 0,500000 | 10.500 | 94 |
3. Normalização da matriz de decisão
A normalização converte os critérios para uma escala comparável. Cada valor tratado é dividido pela soma de sua coluna:
Para um critério de benefício, a expressão pode ser escrita como:
Para um critério de custo tratado pela transformação recíproca:
Exemplo para a capacidade do fornecedor A
A soma das capacidades é:
Logo, a capacidade normalizada do fornecedor A é:
A matriz normalizada resultante é:
| Fornecedor | Custo | Prazo | Defeitos | Capacidade | Entregas no prazo |
|---|---|---|---|---|---|
| A | 0,2431 | 0,2697 | 0,2524 | 0,2308 | 0,2540 |
| B | 0,2690 | 0,1685 | 0,1420 | 0,3077 | 0,2381 |
| C | 0,2299 | 0,3371 | 0,3785 | 0,1923 | 0,2593 |
| D | 0,2580 | 0,2247 | 0,2271 | 0,2692 | 0,2487 |
| Soma | 1,0000 | 1,0000 | 1,0000 | 1,0000 | 1,0000 |
Depois da normalização, a soma das alternativas em cada critério é igual a 1:
4. Transposição da matriz normalizada
Na matriz transposta, cada linha passa a representar um critério e cada coluna passa a representar uma alternativa:
No exemplo:
| Critério | Fornecedor A | Fornecedor B | Fornecedor C | Fornecedor D |
|---|---|---|---|---|
| Custo | 0,2431 | 0,2690 | 0,2299 | 0,2580 |
| Prazo | 0,2697 | 0,1685 | 0,3371 | 0,2247 |
| Defeitos | 0,2524 | 0,1420 | 0,3785 | 0,2271 |
| Capacidade | 0,2308 | 0,3077 | 0,1923 | 0,2692 |
| Entregas no prazo | 0,2540 | 0,2381 | 0,2593 | 0,2487 |
A transposição não altera os valores. Ela apenas facilita a realização dos cálculos estatísticos por critério.
5. Cálculo da média
A média das alternativas em cada critério é calculada por:
Como a soma de cada critério normalizado é igual a 1:
Neste exemplo, existem quatro fornecedores:
onsequentemente, todos os critérios apresentam a mesma média após a normalização:
| Critério | Média |
|---|---|
| Custo | 0,2500 |
| Prazo | 0,2500 |
| Defeitos | 0,2500 |
| Capacidade | 0,2500 |
| Entregas no prazo | 0,2500 |
6. Cálculo do desvio-padrão
O desvio-padrão mostra o quanto os fornecedores se diferenciam em cada critério. Neste exemplo, será utilizado o desvio-padrão amostral:
Para o critério custo:
Os resultados para todos os critérios são:
| Critério | Média | Desvio-padrão |
|---|---|---|
| Custo | 0,2500 | 0,0171 |
| Prazo | 0,2500 | 0,0713 |
| Defeitos | 0,2500 | 0,0979 |
| Capacidade | 0,2500 | 0,0497 |
| Entregas no prazo | 0,2500 | 0,0090 |
A taxa de defeitos apresentou o maior desvio-padrão, indicando maior diferença entre os fornecedores. O percentual de entregas no prazo apresentou o menor desvio, pois os valores das alternativas são relativamente próximos.
7. Cálculo do fator gaussiano
O fator gaussiano corresponde ao coeficiente de variação do critério:
Para o custo:
Os fatores gaussianos obtidos são:
| Critério | Média | Desvio-padrão | Fator gaussiano |
|---|---|---|---|
| Custo | 0,2500 | 0,0171 | 0,0684 |
| Prazo | 0,2500 | 0,0713 | 0,2851 |
| Defeitos | 0,2500 | 0,0979 | 0,3914 |
| Capacidade | 0,2500 | 0,0497 | 0,1986 |
| Entregas no prazo | 0,2500 | 0,0090 | 0,0361 |
Quanto maior o fator gaussiano, maior é a dispersão relativa dos desempenhos das alternativas naquele critério. Consequentemente, maior será sua capacidade de diferenciar os fornecedores.
Isso não significa necessariamente que o critério seja mais importante do ponto de vista estratégico. Significa que ele apresentou maior variabilidade nos dados utilizados.
A soma dos fatores gaussianos é:
No exemplo:
Os fatores gaussianos ainda não correspondem aos pesos finais, pois precisam ser normalizados.
8. Normalização dos fatores gaussianos
O peso normalizado de cada critério é calculado por:
Para o critério custo:
Convertendo para porcentagem:
Os pesos normalizados são:
| Critério | Fator G_j | Peso w_j | Peso percentual |
|---|---|---|---|
| Custo | 0,0684 | 0,0698 | 6,98% |
| Prazo | 0,2851 | 0,2910 | 29,10% |
| Defeitos | 0,3914 | 0,3995 | 39,95% |
| Capacidade | 0,1986 | 0,2027 | 20,27% |
| Entregas no prazo | 0,0361 | 0,0369 | 3,69% |
| Total | 0,9797 | 1,0000 | 100% |
Depois da normalização:
Ou, em porcentagem:
A taxa de defeitos recebeu o maior peso, com 39,95%, seguida pelo prazo, com 29,10%. Esses critérios apresentaram as maiores dispersões relativas entre os fornecedores.
O vetor de pesos é:
9. Cálculo do índice de preferência global
A etapa final consiste em agregar o desempenho das alternativas em todos os critérios. A pontuação da alternativa i é calculada por:
Na forma matricial:
De maneira expandida:
Fornecedor A
Fornecedor B
Fornecedor C
Fornecedor D
O vetor resultante é:
A soma dos índices de preferência é igual a 1:
10. Ranking final
| Alternativa | Índice de preferência | Percentual | Ranking |
|---|---|---|---|
| Fornecedor C | 0,3139 | 31,39% | 1º |
| Fornecedor A | 0,2524 | 25,24% | 2º |
| Fornecedor D | 0,2379 | 23,79% | 3º |
| Fornecedor B | 0,1957 | 19,57% | 4º |
| Total | 1,0000 | 100% |
A melhor alternativa é aquela que maximiza o índice de preferência:
Neste exemplo:
E a ordenação final é:
Portanto:
Resultados
O fornecedor C foi a alternativa recomendada pelo AHP-Gaussiano. Embora tenha apresentado o maior custo e a menor capacidade mensal, obteve os melhores desempenhos no prazo de entrega e na taxa de defeitos, justamente os critérios que receberam os maiores pesos.
O fornecedor B, mesmo possuindo o menor custo e a maior capacidade, ficou na última posição porque apresentou o maior prazo e a maior taxa de defeitos.
O resultado mostra que a escolha não depende de uma única variável. O AHP-Gaussiano agregou todos os critérios, considerando tanto o desempenho normalizado dos fornecedores quanto a capacidade de cada critério de diferenciá-los.
Conclusão
Considerando exclusivamente os fornecedores, critérios e dados utilizados neste exemplo, o fornecedor C apresentou o maior índice de preferência global e foi a alternativa recomendada pelo AHP-Gaussiano.
Essa conclusão não significa que o fornecedor C seja universalmente o melhor. O resultado é condicionado à matriz de decisão analisada. Alterações nos fornecedores, nos critérios ou nos dados podem modificar os pesos e o ranking final.
Também é importante observar que o método atribui maior peso aos critérios com maior dispersão relativa. Portanto, um critério recebe maior influência por diferenciar mais as alternativas, e não necessariamente porque tenha sido considerado estrategicamente mais importante pela empresa.
Antes da aplicação em uma decisão real, recomenda-se verificar a qualidade dos dados, possíveis correlações entre os critérios, valores extremos e a estabilidade do ranking por meio de uma análise de sensibilidade.
Otimização Linear – Problema da Mistura
Em busca da mistura com menos custo, ou seja, minimizar o preço.
Notação matemática:
- objetivo é achar as proporções dos ingredientes que respeitem os limites e chegue ao menor custo.
Modelo:
Exemplos de aplicações:
Exemplo 1)
Modelo: Alocação de Entregas com Capacidade
Contexto
Uma organização precisa distribuir entregas para centros regionais.
Cada centro deve ser atendido por exatamente um veículo.
Cada veículo tem um limite máximo de atendimentos.
O objetivo é minimizar a distância total percorrida.
from pulp import LpProblem, LpMinimize, LpVariable, lpSum, LpStatus, value, PULP_CBC_CMD# Criar problemamodelo = LpProblem("Delivery_Allocation_Model", LpMinimize)veiculos = ['V1', 'V2', 'V3']locais = ['Norte', 'Sul', 'Leste', 'Oeste', 'Centro']# Variável binária: y[v,l] = 1 se veículo v atende local ly = LpVariable.dicts( "assign", [(v, l) for v in veiculos for l in locais], cat="Binary")# Matriz de custos (distâncias)custo = { ('V1', 'Norte'): 15, ('V1', 'Sul'): 20, ('V1', 'Leste'): 10, ('V1', 'Oeste'): 25, ('V1', 'Centro'): 5, ('V2', 'Norte'): 18, ('V2', 'Sul'): 15, ('V2', 'Leste'): 12, ('V2', 'Oeste'): 22, ('V2', 'Centro'): 8, ('V3', 'Norte'): 20, ('V3', 'Sul'): 25, ('V3', 'Leste'): 15, ('V3', 'Oeste'): 18, ('V3', 'Centro'): 10,}# -------------------------# Função Objetivo# -------------------------modelo += lpSum(custo[(v, l)] * y[(v, l)] for v in veiculos for l in locais)# -------------------------# Restrição 1:# Cada local deve ser atendido exatamente uma vez# -------------------------for l in locais: modelo += lpSum(y[(v, l)] for v in veiculos) == 1# -------------------------# Restrição 2:# Capacidade máxima de atendimentos por veículo# -------------------------limite_atendimentos = {'V1': 3, 'V2': 2, 'V3': 3}for v in veiculos: modelo += lpSum(y[(v, l)] for l in locais) <= limite_atendimentos[v]# Resolvermodelo.solve(PULP_CBC_CMD(msg=False))# Resultadosprint("Status:", LpStatus[modelo.status])print("Distância total mínima:", value(modelo.objective))for v in veiculos: atendimentos = [l for l in locais if value(y[(v, l)]) > 0.5] print(f"{v} atende: {', '.join(atendimentos) if atendimentos else 'Nenhum'}")
Status: OptimalDistância total mínima: 63.0V1 atende: Norte, Leste, CentroV2 atende: SulV3 atende: Oeste
Exemplo 2)
custo mínimo para 1Kg de ração com as restrições abaixo de quantidade mínima de proteína e sódio.
Modelo com valores respectivos para Frango/Osso/Trigo, com:
- mistura total = 1 kg
- proteína mínima
- sódio máximo
- x1,x2,x3≥0
Atenção: os coeficientes como exemplo na tabela (proteína: 0.6/0.2/0.1 e sódio: 0.1/0.05/0.02; limites proteína ≥ 0.4 e sódio ≤ 0.08).
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 kgx2 (Osso) = 0.5000 kgx3 (Trigo) = 0.0000 kgCusto mínimo = R$ 4.5000🔎 Checagem:Total = 1.0000 (deve ser 1)Proteína = 0.4000 (>= 0.4)Sódio = 0.0750 (<= 0.08)
Otimização Linear – Problema da Ração
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)
Otimização Linear
Otimização Linear:
A Programação Linear é um dos pilares da Pesquisa Operacional.
Otimização Linear, ou Programação Linear (PL), é um método matemático para tomar a melhor decisão em um problema, maximizando ou minimizando um objetivo (como lucro ou custo) sujeito a um conjunto de restrições representadas por equações lineares. Ela é aplicada na pesquisa operacional para resolver situações complexas do mundo real, como planejamento de produção, definindo as quantidades ideais de produtos a fabricar para otimizar o lucro, ou criando misturas com o menor custo possível, respeitando a disponibilidade de componentes.
Função Objetivo é linear: min ou max da função linear abaixo.

Restrições tambem linear: Limitações de recursos (materiais, tempo, mão de obra), expressas como inequações (<= ou >=) ou equações (=) lineares.
s.a.: Ax >= b x>=0
Objetivo: Maximizar o lucro ou minimizar custos, expresso como uma função linear .

Elementos Principais:
- Função Objetivo:Uma função matemática (linear) que expressa o objetivo do problema, como maximizar o lucro ou minimizar o custo.
- Variáveis de Decisão:As variáveis que precisam ser determinadas para atingir o objetivo (ex: quantidade de cada produto a ser produzida).
- Restrições:Condições que limitam as variáveis de decisão, expressas como igualdades ou desigualdades lineares (ex: disponibilidade de ingredientes, demanda máxima ou mínima de um produto).
Objetivos exemplos:
- Ter unico otimizador global.
- Ter infinitos otimizadores globais
- Ser infactivel.
- Ser factivel, mas sem otimizador.
- em python podemos utilizar as bibliotecas linprog, mip, pub
1) Unica solução:

Obs: por padrao no linprog bounds = ( 0, None ), que são as restrições da “Unica solução”

2) Infinitas soluções:

Obs.: Aqui as restrições acima estão em A_eq e b_eq

3) Infactivel


4) Ilimitado


Alguns Exemplo de otimizador em python:
Exemplo:
Problema: Maximizar
Z=3x+4y
s.a. x+2y≤10, 2x+y≤12, x≥0, y≥0
# prog linear interpretação geometricaimport numpy as npimport matplotlib.pyplot as plt# grade para xx = np.linspace(0, 8, 400)# restrições (em forma y = ...)y1 = (10 - x) / 2 # x + 2y = 10 -> y = (10 - x)/2y2 = 12 - 2*x # 2x + y = 12 -> y = 12 - 2xplt.figure(figsize=(10, 8))# linhas das restriçõesplt.plot(x, y1, label=r'$x + 2y \leq 10$', linewidth=2)plt.plot(x, y2, label=r'$2x + y \leq 12$', linewidth=2)# não-negatividade (eixos)plt.axvline(0, linewidth=2) # x = 0plt.axhline(0, linewidth=2) # y = 0# região viável: abaixo das duas retas e acima de y=0y_feasible = np.minimum(y1, y2)y_feasible = np.maximum(y_feasible, 0)plt.fill_between(x, 0, y_feasible, alpha=0.25, label='Região viável')# vértices (calculados/confirmados)# Interseção das retas:# x + 2y = 10# 2x + y = 12 -> solução: x=14/3, y=8/3vertices = [ (0, 0), (0, 5), # quando x=0 na 1ª restrição: 2y=10 -> y=5 (e satisfaz a 2ª) (14/3, 8/3), # interseção (6, 0) # quando y=0 na 2ª restrição: 2x=12 -> x=6 (e satisfaz a 1ª)]# função objetivo (max)def Z(x, y): return 3*x + 4*y# plotar vértices e anotar valor da função objetivofor (vx, vy) in vertices: plt.plot(vx, vy, 'ko', markersize=8) plt.annotate( f'({vx:.2f}, {vy:.2f})\nZ={Z(vx, vy):.2f}', xy=(vx, vy), xytext=(vx + 0.25, vy + 0.25) )# destacar o ótimobest = max(vertices, key=lambda p: Z(p[0], p[1]))plt.plot(best[0], best[1], 'k*', markersize=14, label='Ótimo')plt.xlim(-0.5, 8)plt.ylim(-0.5, 8)plt.xlabel('x')plt.ylabel('y')plt.grid(alpha=0.3)plt.legend()plt.title(f'Visão Geométrica: ótimo no vértice ({best[0]:.2f}, {best[1]:.2f})')plt.show()print("Vértice ótimo:", best, "com Z =", Z(best[0], best[1]))
