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


Implementação do Algoritmo Simplex para Resolver Problemas de Maximização Linear, Trabalhos de Matemática Computacional

Este documento fornece instruções para implementar o algoritmo simplex para resolver problemas de maximização linear usando o r. O documento inclui um código incompleto e um exemplo para verificar a correção da implementação.

Tipologia: Trabalhos

2022

Compartilhado em 20/12/2022

mariana-leite-garcia
mariana-leite-garcia 🇧🇷

1 documento

1 / 6

Toggle sidebar

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

Não perca as partes importantes!

bg1
28/09/2022 10:12Trabalho-Comp-2.knit
Página 1 de 6file:///Users/mac/Downloads/Trabalho-Comp-2.html
Estatística Computacional II
Nome: Mariana Leite Garcia
RA: 110738
This program implements the simplex algorithm for maximization problems with “less than or equal to”
constraints. So, your exercise is: Create a new R script in the source window and paste in the following
code. Replace all @@@ with correct code.
Implementar, na mão, o método Simplex para resolver sistemas lineares. O código está estruturado, mas
deve ser justificado cada argumento que será considerado no lugar dos “@@@”.
rm(list=ls(all=T)) # limpa a memoria do sistema
simplex3<-function(obj, const, rhs){
#obj: vetor de coefieciente da função objetivo
#const: matriz de coeficientes de equação de restrição, na forma padrão
#rhs: vetor de valores correspondentes do lado direito para restrições
co <- rbind(const, obj)
# co<-rbind(@@@, @@@)
#criamos a variável "co" com "rbind"que faz a sequencia dos vetores (const e obj)
que são os coeficientes negativos da função objetivo sob a matriz de coeficientes d
a equação de restrição.
dims <-dim(co) #vamos pegar a dimensão do vetor co
numRow <- dims[1] #e vamos selecionar apenas a dimensao da linha
#dims<-dim(@@@)
#numRow<-dims[@@@]
M <- cbind(diag(1,numRow))
#M<-@@@
#adicionamos a matriz identidade e o numRow pra sempre ter a dimensao correta da
matriz
tableau <- cbind(co,M,c(rhs,0))
print(tableau)
#tableau<-@@@
#print(@@@)
#para completar nosso quadro, juntamos nosso vetor co, com M (matriz identidade)
e rhs (vetor de valores correspondentes do lado direito para restrições) e mostramo
s nosso quadro com o print
dims<-dim(tableau) #vamos pegar a dimensão do nosso quadro
numCol<-dims[2] #e vamos selecionar apenas a dimensao da coluna
#dims<-dim(@@@)
#numCol<-dims[@@@]
pf3
pf4
pf5

Pré-visualização parcial do texto

Baixe Implementação do Algoritmo Simplex para Resolver Problemas de Maximização Linear e outras Trabalhos em PDF para Matemática Computacional, somente na Docsity!

Estatística Computacional II

Nome: Mariana Leite Garcia

RA: 110738

This program implements the simplex algorithm for maximization problems with “less than or equal to”

constraints. So, your exercise is: Create a new R script in the source window and paste in the following

code. Replace all @@@ with correct code.

Implementar, na mão, o método Simplex para resolver sistemas lineares. O código está estruturado, mas

deve ser justificado cada argumento que será considerado no lugar dos “@@@”.

rm(list=ls(all=T)) # limpa a memoria do sistema simplex3<- function (obj, const, rhs){ #obj: vetor de coefieciente da função objetivo #const: matriz de coeficientes de equação de restrição, na forma padrão #rhs: vetor de valores correspondentes do lado direito para restrições co <- rbind(const, obj) # co<-rbind(@@@, @@@) #criamos a variável "co" com "rbind"que faz a sequencia dos vetores (const e obj) que são os coeficientes negativos da função objetivo sob a matriz de coeficientes d a equação de restrição. dims <-dim(co) #vamos pegar a dimensão do vetor co numRow <- dims[ 1 ] #e vamos selecionar apenas a dimensao da linha #dims<-dim(@@@) #numRow<-dims[@@@] M <- cbind(diag( 1 ,numRow)) #M<-@@@ #adicionamos a matriz identidade e o numRow pra sempre ter a dimensao correta da matriz tableau <- cbind(co,M,c(rhs, 0 )) print(tableau) #tableau<-@@@ #print(@@@) #para completar nosso quadro, juntamos nosso vetor co, com M (matriz identidade) e rhs (vetor de valores correspondentes do lado direito para restrições) e mostramo s nosso quadro com o print dims<-dim(tableau) #vamos pegar a dimensão do nosso quadro numCol<-dims[ 2 ] #e vamos selecionar apenas a dimensao da coluna #dims<-dim(@@@) #numCol<-dims[@@@]

negIndicator <- obj #negIndicator=@@@ #criamos "indicador negativo" para a última linha do quadro, que é o vetor de coe fieciente da função objetivo(obj) if (min(tableau[numRow,])>= 0 ) { print("No negative indicators: algorithm terminates") negIndicator=FALSE } # O if verifique se há entradas negativas na última linha. Se a entrada mínima na última linha for positiva, não haverá indicador negativos. while (min(tableau[numRow,])< 0 ) { _#while(@@@){

Enquato não tiver uma entrada negativa na última linha, vai continuar rodan

do nosso código._ pColIndex<-which.min(tableau[numRow,]) pCol<-tableau[ 1 :(numRow - 1 ),pColIndex] #pCol<-tableau[@@@,@@@] #Aqui selecionamos a coluna pivô, removendo o valor da última linha, que é o ve tor de coefieciente da função objetivo(obj) if (pColIndex <= 0 ){ _# if (@@@){

Se todas as entradas da coluna pivô forem <= 0, o problema é ilimitado._

print("The problem is unbounded, no maximum is possible.") return (tableau) } possibleRows = which(tableau[ 1 :(numRow), pColIndex] > 0 ) #possibleRows = which(@@@ > @@@) #possibleRows é um vetor do índices de linha nas quais a coluna pivô tem entrad as positivas. lst<-tableau[possibleRows,numCol] #lst<-tableau[@@@,@@@] #Selecionamos os valores da última coluna nas linhas selecionadas no possibleRo ws div<-lst/pCol[possibleRows] minPos<-which.min(div) #minPos<-which.min(@@@) #selecionamos o índice da razão mínima calculada pRowIndex<-possibleRows[minPos]

## [,1] [,2] [,3] [,4] [,5] [,6] [,7]

obj -8 -10 -7 0 0 1 0

[,1] [,2] [,3] [,4] [,5] [,6] [,7]

0.4 0 1.4 1 -0.6 0 5.

0.2 1 0.2 0 0.2 0 1.

obj -6.0 0 -5.0 0 2.0 1 16.

[,1] [,2] [,3] [,4] [,5] [,6] [,7]

0 -2 1 1 -1 0 2

1 5 1 0 1 0 8

obj 0 30 1 0 8 1 64

Identificando os valores ótimos, temos que diferenciar as variáveis básicas e váriaveis não básicas.

A variável básica é uma váriavel que tem um único valor 1(um) em sua coluna e o restante é todo 0(zero). A

linha que contém 1(um) corresponderá ao valor de beta e o beta representará a solução ótima para a

variável.

A variavel não básica, não atende aos critérios da básica e significa que a solução ótima dela é 0(zero).

Analisando o print(tableau), temos que:

print(tableau)

[,1] [,2] [,3] [,4] [,5] [,6] [,7]

0 -2 1 1 -1 0 2

1 5 1 0 1 0 8

obj 0 30 1 0 8 1 64

As colunas [,1], [,4] e [,6], isso é: x1, s1 e z são variáveis básicas.

A coluna [,1] que é nosso x1, temos beta no valor de 8.

A coluna [,4] que é nosso s1, temos beta no valor de 2, porém é uma variável de folga e não vamor

incluir na solução ótima.

A coluna [,6] que é nosso z, temos beta no valor de 64.

As colunas [,2], [,3], [,5], isso é: x2, x3 e s2 são variáveis não básicas e a solução ótima dela é zero.

Portanto o valor ótimo para o maximo é 64, que é encontrado no ponto(8,0,0) da função objetivo.

Once you have complete your code. Test it using the following inputs Example 1 (Figure 15) found on

page 340 of the Kemeny, Snell, Thompson book):

obj <- c( 300 , 200 ) const <- rbind(c( 5 , 2 ),c( 3 , 3 )) rhs <- c( 180 , 135 ) tableau <- simplex3(obj,const,rhs)

[,1] [,2] [,3] [,4] [,5] [,6]

5 2 1 0 0 180

3 3 0 1 0 135

obj 300 200 0 0 1 0

[1] "No negative indicators: algorithm terminates"

print(tableau)

[,1] [,2] [,3] [,4] [,5] [,6]

5 2 1 0 0 180

3 3 0 1 0 135

obj 300 200 0 0 1 0

O programa faz referência ao fluxograma na Seção 7.5 (página 345) de “Finite Mathematics” de Kemeny,

Snell, Thompson,

Este programa implementa o algoritmo simplex para problemas de maximização com restrições “menor

ou igual a”, se rodarmos dessa maneira que está acima, a resposta dele é:

“Nenhum indicador negativo: o algoritmo termina”

Sendo assim, no nosso caso, para transformar um problema de PL de minimização em um problema de

PL de maximização, basta multiplicar os vetores de coefieciente da função objetivo por -1, ai teremos:

obj <- c(- 300 ,- 200 ) const <- rbind(c( 5 , 2 ),c( 3 , 3 )) rhs <- c( 180 , 135 ) tableau <- simplex3(obj,const,rhs)

[,1] [,2] [,3] [,4] [,5] [,6]

5 2 1 0 0 180

3 3 0 1 0 135

obj -300 -200 0 0 1 0

[,1] [,2] [,3] [,4] [,5] [,6]

1 0.4 0.2 0 0 36

0 1.8 -0.6 1 0 27

obj 0 -80.0 60.0 0 1 10800

[,1] [,2] [,3] [,4] [,5] [,6]

1 0 0.3333333 -0.2222222 0 30

0 1 -0.3333333 0.5555556 0 15

obj 0 0 33.3333333 44.4444444 1 12000