Apresentação do problema

A companhia PetrusNortel atua no setor petroquímico e possui duas plantas. Uma delas é responsável pela produçãoo de polímeros e está localizada em Recife. A outra está localizada em Manaus, sendo responsável pela produçãoo de resina. A fim de reduzir os custos logísticos, os produtos sofrem uma etapa de transbordo em um dos centros de distribuiçãoo, localizados em São Paulo e no Rio de Janeiro. A partir dos centros de distribuição, os produtos são transportados para os clientes finais, localizados em Belo Horizonte, Joinville e Porto Alegre.

A capacidade de produçãoo das fábricas é de 500 unidades em Manaus e 300 em Recife.

A demanda dos consumidores de Belo Horizonte, Joinville e Porto Alegre é de 200, 250 e 350, respectivamente.

Os custos unitários de transporte, das fábricas para os pontos de transbordo e dos pontos de transbordo para os consumidores finais, estão representados nas tabelas abaixo respectivamente.

library(flextable)

custos_cd = data.frame(Fabrica = c("Manaus", "Recife"),
                       SP = c(8, 7),
                       RJ = c(10, 6))

custos_cons = data.frame(CD = c("Sao Paulo", "Rio de Janeiro"),
                       BH = c(2, 1),
                       JV = c(3, 4),
                       POA = c(4, 5))

flextable(custos_cd)
flextable(custos_cons)

Assim, tem-se que:

\(x13\) = peças transportadas da fábrica de Manaus para o CD de São Paulo.

\(x14\) = peças transportadas da fábrica de Manaus para o CD do Rio de Janeiro.

\(x23\) = peças transportadas da fábrica de Recife para o CD de São Paulo.

\(x24\) = peças transportadas da fábrica de Recife para o CD do Rio de Janeiro.

\(x35\) = peças transportadas do CD de São Paulo para o consumidor de Belo Horizonte.

\(x36\) = peças transportadas do CD de São Paulo para o consumidor de Joinville.

\(x37\) = peças transportadas do CD de São Paulo para o consumidor de Porto Alegre.

\(x45\) = peças transportadas do CD do Rio de Janeiro para o consumidor de Belo Horizonte.

\(x46\) = peças transportadas do CD do Rio de Janeiro para o consumidor de Joinville.

\(x47\) = peças transportadas do CD do Rio de Janeiro para o consumidor de Porto Alegre.

Função objetivo

A função objetivo busca minimizar o custo total de transporte: \(min z = 8x13 + 10x14 + 7x23 + 6x24 + 2x35 + 3x36 + 4x37 + 1x45 + 4x46 + 5x47\)

Restrições

1 - A capacidade de cada fábrica será utilizada para atender a demanda dos consumidores via pontos de transbordo:

R1 \(x13 + x14 = 500\) (Fábrica de Manaus)

R2 \(x23 + x24 = 300\) (Fábrica de Recife)

2 - A demanda de cada consumidor será atendida a partir dos pontos de transbordo:

R3 \(x35 + x45 = 200\) (Consumidor de Belo Horizonte)

R4 \(x36 + x46 = 250\) (Consumidor de Joinville)

R5 \(x37 + x47 = 350\) (Consumidor de Porto Alegre)

3 - Restrições de conservação dos fluxos de entrada e saída de cada ponto de transbordo:

R6 \(x13 + x23 = x35 + x36 + x37\) (CD de São Paulo) -> \(x13 + x23 - x35 - x36 - x37 = 0\)

R7 \(x14 + x24 = x45 + x46 + x47\) (CD do Rio de Janeiro) -> \(x14 + x24 - x45 - x46 - x47 = 0\)

4 - As variáveis de decisão do modelo são não negativas:

\(xij \geq 0, i = 1, 2, 3; j = 1, 2, 3\)

Solução do problema

######## Carregar pacotes lpSolve#################
suppressMessages(require(lpSolve))

######## Dados do problema #######################

# coeficientes na função objetivo 
func.objetivo <- c(8, 10, 7, 6, 2, 3, 4, 1, 4, 5)

# coeficientes nas restrições. 
library(readxl)
restricoes <- read_excel("~/POSCIVIL/TEORIA2/SIMPLEX/restricoes.xlsx")


coeficientes.restricoes <- rbind(restricoes$R1,
                                 restricoes$R2,
                                 restricoes$R3,
                                 restricoes$R4,
                                 restricoes$R5,
                                 restricoes$R6,
                                 restricoes$R7)

# sinal das restrições. Deve obedecer a ordem da matriz de coeficientes
direcao.restricoes <- c("=", "=", "=", "=", "=", "=", "=")

# limite das restrições. Deve obedecer a ordem da matriz de coeficientes
limites.restricoes <- c(500, 300, 200, 250, 350, 0, 0)


######## Solução ###############
solucao.problema <- lpSolve::lp(direction = "min",             
                                objective.in = func.objetivo,  
                                const.mat = coeficientes.restricoes,
                                const.dir = direcao.restricoes,
                                const.rhs = limites.restricoes, 
                                
                                all.int=T)


######### Resultado #############
# valor da função objetivo na solução
solucao.problema$objval
[1] 8250
# Valores para as variáveis de escolha que geram máximo ou mínimo dependendo do problema
solucao.problema$solution
 [1] 500   0   0 300   0 150 350 200 100   0

Após rodar o algoritmo, chega-se a solução ótima do valor total de R$ 8250,00.

Para isso é necessário que:

  • Todas as 500 peças produzidas em Manaus saiam para o CD de São Paulo

  • Todas as 300 peças produzidas em Recife saiam para o CD do Rio de Janeiro

Ao chegar nos Centros de Distribuição, Sao Paulo enviará:

  • 150 peças para Joinville;

  • e 350 peças para Porto Alegre, atendendo assim a sua demanda.

Já o CD do Rio de Janeiro enviará:

  • 200 peças para Belo Horizonte (atendo sua demanda);
  • e 100 peças para Joinville, completando assim a demanda local.

Referência

FÁVERO, Luiz Paulo. Pesquisa Operacional para curso de engenharia / Luiz Paulo Fávero, Patrícia Belfiore. - Rio de Janeiro: Elsevier, 2013.