Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Tutorial Programação linear em R, Manuais, Projetos, Pesquisas de Programação Linear

Traz como modelar problemas de Programação linear em R

Tipologia: Manuais, Projetos, Pesquisas

2019

Compartilhado em 19/09/2019

thais-campos-43
thais-campos-43 🇧🇷

5

(3)

2 documentos

1 / 5

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
R Projects
Here I will post projects related to more advanced uses of R, such as linear programming
and machine learning. Again, this section is all in Portuguese for now, but it will be soon
translated to English in its entirety.
Linear Programming
Problemas de otimização que podem ser resolvidos por intermédio da programação linear
(PL) também são manipuláveis e solucionáveis através do R. Há um pacote bastante
proeminente que traz funções especialmente voltadas à solução de modelos lineares
conhecido como lpSolve. Fácil de encontrar e de se instalar, este pacote está disponível
no repositório CRAN:
library(lpSolve)
O paradigma de programação funcional pode parecer desafiador num primeiro momento,
especialmente por apresentar problemas matemáticos em uma forma diferente do que
estamos acostumados a lidar cotidianamente. Contudo, no momento em que se
compreende que funções são códigos especializados em lidar com dados de entradas,
transformá-los e retornar uma informação na saída, a maior dificuldade foi ultrapassada.
Não é diferente com PL e a biblioteca lpSolve.
Neste sentido, um problema de PL também não foge à essa realidade. Isto significa dizer
que a representação formal matemática de um problema de PL comum será diferente de
sua representação em R. Os coeficientes que multiplicam as variáveis serão dados como
entrada em funções. Como exemplo disponível na própria documentação do CRAN:
Formatação
Este problema deve ser inserido por etapas nas funções da biblioteca lpSolve. Antes de
mais nada, é importante criar entidades em R que irão conter os elementos do exemplo:
#vetor contendo os coeficientes da função objetivo
f.obj <- c(1,9,1)
#matriz 2x3 contendo as funções de restrição
f.con <- matrix(c(1,2,3,3,2,2),nrow=2,byrow=TRUE)
pf3
pf4
pf5

Pré-visualização parcial do texto

Baixe Tutorial Programação linear em R e outras Manuais, Projetos, Pesquisas em PDF para Programação Linear, somente na Docsity!

R Projects

Here I will post projects related to more advanced uses of R, such as linear programming

and machine learning. Again, this section is all in Portuguese for now, but it will be soon

translated to English in its entirety.

Linear Programming

Problemas de otimização que podem ser resolvidos por intermédio da programação linear

(PL) também são manipuláveis e solucionáveis através do R. Há um pacote bastante

proeminente que traz funções especialmente voltadas à solução de modelos lineares

conhecido como lpSolve. Fácil de encontrar e de se instalar, este pacote está disponível

no repositório CRAN:

library (lpSolve)

O paradigma de programação funcional pode parecer desafiador num primeiro momento,

especialmente por apresentar problemas matemáticos em uma forma diferente do que

estamos acostumados a lidar cotidianamente. Contudo, no momento em que se

compreende que funções são códigos especializados em lidar com dados de entradas,

transformá-los e retornar uma informação na saída, a maior dificuldade foi ultrapassada.

Não é diferente com PL e a biblioteca lpSolve.

Neste sentido, um problema de PL também não foge à essa realidade. Isto significa dizer

que a representação formal matemática de um problema de PL comum será diferente de

sua representação em R. Os coeficientes que multiplicam as variáveis serão dados como

entrada em funções. Como exemplo disponível na própria documentação do CRAN:

Formatação

Este problema deve ser inserido por etapas nas funções da biblioteca lpSolve. Antes de

mais nada, é importante criar entidades em R que irão conter os elementos do exemplo:

#vetor contendo os coeficientes da função objetivo f.obj <- c(1,9,1)

#matriz 2x3 contendo as funções de restrição f.con <- matrix(c(1,2,3,3,2,2),nrow=2,byrow=TRUE)

#vetor contendo o tipo de equação ou inequação das restrições f.dir <- c("<=","<=")

#vetor contendo os lados direitos das restrições f.rhs <- c(9,15)

Esta forma é bem comum, quando se lida com problemas resolvidos em linguagens de

programação funcional. Com o R, não é diferente. Em vez de se inserir todo o problema de

uma vez, armazena-se em entidades (vetores, data frames, matrizes, variáveis etc) partes

componentes do problema de PL. Após essa etapa, é possível utilizar as funções

do lpSolve para resolver o problema:

Solução primal

#função lp() com os parâmetros necessários para a solução do problema. "Solution" resolve lp("max",f.obj,f.con,f.dir,f.rhs)$solution

[1] 0.0 4.5 0.

O que significa dizer que a solução ótima para este problema requer x1=0, x2=4,5 e x3=0.

Outras informações também são observáveis, acessando os componentes do lp(). Para a

análise de sensibilidade, tanto em limites superiores e inferiores:

#limites inferiores dos coeficientes (análise de sensibilidade) lp ("max", f.obj, f.con, f.dir, f.rhs, compute.sens=TRUE)$sens.coef.fr om

[1] -1e+30 2e+00 -1e+

Valores muito pequenos podem ser considerados como tendente a infinito negativo para

efeitos práticos. Igualmente como expoentes e00 iguala-se a 1. Portanto, 2+e00 significa 2.

Ou seja, como resposta, essa função retorna a análise de sensibilidade inferior

consecultivamente: tendendo a infinito negativo, 2 e tendente a infinito negativo.

#limites superiores dos coeficientes (análise de sensibilidade) lp ("max", f.obj, f.con, f.dir, f.rhs, compute.sens=TRUE)$sens.coef.to

[1] 4.50e+00 1.00e+30 1.35e+

Tal como no caso anterior, na prática esses resultados significam 4,5, tendendo a infinito

positivo e 13,5.

Dual

O lp() também disponibiliza informações acerca do dual. Contudo, os resultados tanto

das restrições quanto das variáveis são devolvidos em um único vetor de resposta:

lp ("max", f.obj, f.con, f.dir, f.rhs, compute.sens=TRUE)$duals

#visualizando a montagem do problema de LP print(lprec)

Model name:

C1 C2 C

Maximize 1 9 1

R1 1 2 3 <= 9

R2 3 2 2 <= 15

Kind Std Std Std

Type Real Real Real

Upper Inf Inf Inf

Lower 0 0 0

A etapa de solução desta modalidade de resolução de problemas de PL é tão simples e

direta quanto a modalidade anterior. Contudo, o intuito de demonstrar uma variante de

solução diz respeito justamente à apresentação da função relat.lprec():

#resolvendo o modelo de PL (retorna 0, caso tudo esteja correto) solve(lprec)

[1] 0

#chamando a função de apresentação relat.lprec(lprec)

Valor das variáveis e função objetivo

Z X1 X2 X

Resultado 40.5 0 4.5 0

Análise de otimalidade

Coeficientes originais Custo reduzido Limite inferior Limite sup

erior

X1 1 -3.5 -1e+30 4.

0e+

X2 9 0.0 2e+00 1.

0e+

X3 1 -12.5 -1e+30 1.

5e+

Análise de viabilidade

Valor original Preço Sombra Limite inferior Limite superior

1 9 4.5 -1.776357e-15 1.5e+

2 15 0.0 9.000000e+00 1.0e+

Esta maneira de apresentação é muito mais amigável ao usuário, por apresentar um

relatório completo de fácil visualização. Ainda contém a correção de um erro na função

nativa do lpSolve em um dos cálculos dos valores de preço sombra

Referências

Este tutorial foi criado pelos alunos Dallas Ferraz e Saulo Guilherme do PPGEP-CAA e pode ser

encontrado no seguinte endereço: https://dallasferraz.github.io/docs/index.html. É possível

encontrar tutoriais de outras áreas neste link.