Otimização e Programação Linear

By Salerno | May 7, 2022

Introdução

Se olharmos para os mais variados recursos disponíveis em nossa sociedade, logo perceberemos que vivemos em um mundo com limitação de recursos.

Sabemos que não se pode extrair a quantidade que desejar a qualquer hora nas plataformas de petróleo. A água do nosso planeta…….nosso salário….nosso precioso tempo também é muito escasso!

Bem, acho que já consegui te convencer! Mas se olharmos para disciplinas como a economia, veremos que um dos seus fortes pilares é a gestão da escassez.

Logo, não importa se estamos falando de ambientes individuais ou profissionais, esse tema é de muitas relevância, e garante para aqueles que o estudam o grande diferencial competitivo, afinal de contas, qual a empresa que não gostaria de ter em seu quadro de funcionários um profissional focado em uma alocação ótima de recursos, muitas vezes buscando maximizar receita e/ou redução de custos?

A programção linear é a base utilizada por esses profissionais na busca das melhores alocações possíveis, e isso pode ser usado nos mais variados casos:

  • Determinação do mix de produtos
  • Manufatura
  • Determinação de rotas e logística eficaz
  • Planejamento financeiro e muito mais

Características comuns problemas de otimização

Nessa breve introdução, podemos perceber que essa alocação de recursos, buscando a sua eficácia (“fazer mais com menos em menor tempo”) passa por decisões, restrições e objetivos.

Decisões

Usando uma abordagem um pouco técnica e matemática, associada com a linguagem de negócios, podemos dizer que em um modelo função de x, as variáveis decisórias são aquelas em que você pode altera-las, e seu resultado será visto em uma variável resposta (y).

Um exemplo prático seria um geestor de uma fábrica determinando as quantidades de seu mix de produtos para a sua efetiva produção.

Restrições

Sobre essas variáveis descritas acima, ou seja, quantidade de matéria prima para a produção dos produtos, horas disponíveis para a produção, máquinas e etc, são as restrições nos modelos de progreamação linear.

Vocês verão que os símbolos matemáticos comuns a esse bloco conceitual serão: =, <, > ou !=.

Objetivos

Creio que você entenderá a frase abaixo:

“Dada a quantidade de matéria-prima disponível (x1), horas disponíveis (x2) e máquinas (x3), quero MAX a minha receita (y)”.

A frase acima explica bem os objetivos, muitas vezes expressos na condição de maximizar os resultados de uma função, ou minimizar.

Case

Os exemplos nos ajudam muito a entender os conceitos. Uma vez compreendido a base conceitual fundamental de qualquer tema, é extremamente importante que você passe a aplicar em um case real.

  • Empresa: Blue Ridge Hot Tubs

  • Produtos: Aqua-Spa (x1) e Hydro-Lux (x2). Aqui estamos representando x como as quantidades de cada modelo a produzir dado o objetivoe as restrições.

  • Objetivo: Quantas banherias preciso produzir de cada modelo de tal forma a maximizar a minha margem?

  • Restrições:

  • (1) ambos modelos necessitam de somente 1 bomba em cada banheira totalizando 200 bombas disponíveis (2) 9 horas de produção (x1) e 6 horas para (x2) com 1.566 horas disponíveis (3) 12 unidades de comprimento (x1) e 16 unidades (x2) com 2.880 unidades de comprimento disponíveis


# Import lpSolve package
library(lpSolve)

# Set coefficients of the objective function
f.obj <- c(350, 300)

# Set matrix corresponding to coefficients of constraints by rows
# Do not consider the non-negative constraint; it is automatically assumed
f.con <- matrix(c(1, 1,
                  9, 6,
                  12, 16), nrow = 3, byrow = TRUE)

# Set unequality signs
f.dir <- c("<=",
           "<=",
           "<=")

# Set right hand side coefficients
f.rhs <- c(200,
           1566,
           2880)

# Final value (z)
lp("max", f.obj, f.con, f.dir, f.rhs)
## Success: the objective function is 66100

# Variables final values
lp("max", f.obj, f.con, f.dir, f.rhs)$solution
## [1] 122  78

# Sensitivities
lp("max", f.obj, f.con, f.dir, f.rhs, compute.sens=TRUE)$sens.coef.from
## [1] 300.0000 233.3333
lp("max", f.obj, f.con, f.dir, f.rhs, compute.sens=TRUE)$sens.coef.to
## [1] 450 350

# Dual Values (first dual of the constraints and then dual of the variables)
# Duals of the constraints and variables are mixed
lp("max", f.obj, f.con, f.dir, f.rhs, compute.sens=TRUE)$duals
## [1] 200.00000  16.66667   0.00000   0.00000   0.00000

# Duals lower and upper limits
lp("max", f.obj, f.con, f.dir, f.rhs, compute.sens=TRUE)$duals.from
## [1]  1.74e+02  1.44e+03 -1.00e+30 -1.00e+30 -1.00e+30
lp("max", f.obj, f.con, f.dir, f.rhs, compute.sens=TRUE)$duals.to
## [1] 2.07e+02 1.80e+03 1.00e+30 1.00e+30 1.00e+30

Solução

As quantidades que se maximiza o valor de margem ($66.100) são respectivamente 122 (x1) e 78 (x2).

Próximos passos

Buscar soluções gráficas usando o conceito chamado Curva de Nível.

comments powered by Disqus