leandro pedrosa rodrigues - universidade federal de goiás · 2013. 10. 21. · leandro pedrosa...
TRANSCRIPT
-
UNIVERSIDADE FEDERAL DE GOIÁS – CAMPUS CATALÃO
DEPARTAMENTO DE CIÊNCIAS DA COMPUTAÇÃO
Curso de Bacharelado em Ciências da Computação
FERRAMENTA WEB PARA RESOLUÇÃO DE PROBLEMASDE PROGRAMAÇÃO LINEAR ATRAVÉS DOS MÉTODOS
SIMPLEX E SIMPLEX EM DUAS FASES
Leandro Pedrosa Rodrigues
CATALÃO – GO
2013
-
LEANDRO PEDROSA RODRIGUES
FERRAMENTA WEB PARA RESOLUÇÃO DE PROBLEMAS DEPROGRAMAÇÃO LINEAR ATRAVÉS DOS MÉTODOS SIMPLEX E
SIMPLEX EM DUAS FASES
Monografia apresentada ao Curso de Bacha-relado em Ciências da Computação da Uni-versidade Federal de Goiás – Campus Cata-lão, como requisito parcial para a obtenção doGrau de Bacharel em Ciências da Computa-ção.
Orientador:
Esp. Veríssimo Guimarães Júnior
Área:
Pesquisa Operacional
CATALÃO – GO
2013
-
Rodrigues, Leandro PedrosaFerramenta Web para Resolução de Problemas de Programação Linear através dos
métodos Simplex e Simplex em Duas Fases/ Leandro Pedrosa Rodrigues. – Catalão –GO, 2013.
145 f. ; 30 cm.
Orientador: Esp. Veríssimo Guimarães Júnior.
Monografia (Graduação) – Universidade Federal de Goiás – Campus Catalão,Departamento de Ciências da Computação, Curso de Ciências da Computação, 2013.
1. Pesquisa Operacional. 2. Programação Linear. 3. Simplex. 4. Simplex emDuas Fases. 5. RePPL. 6. Ferramenta Web. I. Guimarães Júnior, Esp. Veríssimo.II. Universidade Federal de Goiás – Campus Catalão. Curso de Bacharelado emCiências da Computação. III. Título.
-
LEANDRO PEDROSA RODRIGUES
FERRAMENTA WEB PARA RESOLUÇÃO DE PROBLEMAS DEPROGRAMAÇÃO LINEAR ATRAVÉS DOS MÉTODOS SIMPLEX E
SIMPLEX EM DUAS FASES
Monografia apresentada ao Curso de Bacha-relado em Ciências da Computação pela Uni-versidade Federal de Goiás – Campus Catalão.
Trabalho aprovado em 20 de março de 2013.
Área: Pesquisa Operacional
Esp. Veríssimo Guimarães JúniorOrientador
Esp. Luiz Fernando Elias MartinezUniversidade Federal de Goiás
Dr. Thiago Alves de QueirozUniversidade Federal de Goiás
Catalão – GO
2013
-
Dedico este trabalho: primeiramente a Deus, minha esposa Kamila Gomes Araújo Pedrosa,
minha mãe Maria Lourdes Pedrosa Rodrigues, meu pai Luiz Rodrigues Sobrinho, meus
irmãos Luciomar Henrique Pedrosa Rodrigues e Luciana Rodrigues Pedrosa. Que sempre me
incentivaram e apoiaram para que os meus objetivos fossem alcançados.
-
AGRADECIMENTOS
Agradeço primeiramente a Deus, por guiar meus passos e me dar a força e determi-
nação necessária para que pudesse concluir mais uma etapa da minha vida, me dando a
certeza de que os desafios estão presentes em nossas vidas para serem superados.
Agradeço minha esposa Kamila Gomes Araújo Pedrosa, aos meus pais Maria Lour-
des Pedrosa Rodrigues e Luiz Rodrigues Sobrinho e aos meus irmãos Luciomar Henrique
Pedrosa Rodrigues e Luciana Rodrigues Sobrinho que sempre me apoiaram.
Agradeço ao meu orientador, Professor Veríssimo Guimarães Júnior, pela orientação,
pelas revisões e por sempre estar ao meu lado durante o desenvolvimento desta monografia.
Você foi de suma importância para o meu crescimento profissional. Obrigado Professor.
Agradeço aos meus amigos da faculdade que compartilharam alegrias e tristezas nes-
tes longos anos de jornada da graduação. Quero agradecer em especial aos meus amigos do
RESEARCH-UFG, Fernando Antônio, Márcia Ribeiro, Hugo Sica, que compartilhamos boas
horas de estudos sobre SPL. Agradeço de coração aos meus amigos Luiz Gustavo (LG), Hugo
Sica e Rafael Ulhoa que me apoiaram, incentivaram para eu nunca desistir, que esteve quase
em todos os momentos comigo na faculdade. Quero agradecer também ao pessoal do CER-
COMP, que esteve comigo.
Agradeço a todos, que me ajudaram durante a minha graduação diretamente e indi-
retamente.
Agradeço a todos que oraram por mim, durante a realização deste trabalho até apre-
sentação.
Agradeço a todos.
Obrigado.
-
O temor do SENHOR é o princípio da sabedoria, e o conhecimento do Santo a prudência.
Provérbios 9:10
-
RESUMO
RODRIGUES, L. P.. Ferramenta Web para Resolução de Problemas de Programa-ção Linear através dos métodos Simplex e Simplex em Duas Fases. 2013. 145 f. Monogra-fia (Graduação) – Departamento de Ciências da Computação, Universidade Federal deGoiás – Campus Catalão, Catalão – GO.
Problemas de Programação Linear exigem um grau de conhecimento para en-contrar a solução ótima. Para amenizar a dificuldade que é imposta pelos Métodos Sim-plex e Simplex em Duas Fases para sua resolução foi criado uma ferramenta no intuitode auxiliar no entendimento e compreensão dos algoritmos, mostrando passo-a-passoa obtenção da solução ótima. No trabalho é abordado sobre a Programação Linear e osdois tipos de Método Simplex que são aplicados na ferramenta. Os resultados encontra-dos para os modelos mostraram a eficiência da ferramenta, que auxilia e complementao aprendizado dos respectivos métodos.
Palavras-chaves: Pesquisa Operacional, Programação Linear, Simplex, Simplex em DuasFases, RePPL, Ferramenta Web.
-
LISTA DE ILUSTRAÇÕES
Figura 1 – Diagrama de Caso de Uso para a RePPL . . . . . . . . . . . . . . . . . . . . . 48
Figura 2 – Diagrama de Classe - Simplex . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
Figura 3 – Diagrama de Classe - Simplex em Duas Fases . . . . . . . . . . . . . . . . . . 50
Figura 4 – Topo da Ferramenta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
Figura 5 – Logo da Ferramenta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
Figura 6 – Exemplo de Página Interna da Ferramenta . . . . . . . . . . . . . . . . . . . 52
Figura 7 – Rodapé da Ferramenta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Figura 8 – Tela Principal da Ferramenta . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Figura 9 – Tela Calcular . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
Figura 10 – Tela Equação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
Figura 11 – Exemplo de uma Tela de Resultado - Parte 1 . . . . . . . . . . . . . . . . . . . 55
Figura 12 – Exemplo de uma Tela de Resultado - Parte 2 . . . . . . . . . . . . . . . . . . . 56
Figura 13 – Exemplo de uma Tela de Resultado - Parte 3 . . . . . . . . . . . . . . . . . . . 57
Figura 14 – Tela de Contato . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
Figura 15 – Tela de Resultado do Exemplo 13 . . . . . . . . . . . . . . . . . . . . . . . . . 60
Figura 16 – Tela de Resultado do Exemplo 14 . . . . . . . . . . . . . . . . . . . . . . . . . 61
-
LISTA DE TABELAS
Tabela 1 – Montagem do Quadro Simplex . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Tabela 2 – Montagem do Quadro Simplex em Duas Fases . . . . . . . . . . . . . . . . . 44
-
LISTA DE ABREVIATURAS E SIGLAS
AIMMS — Advanced Interactive Multidimensional Modeling System
CSS — Cascading Style Sheets
DCC — Departamento de Ciências da Computação
HTML — HyperText Markup Language
IES — Instituição de Ensino Superior
LINDO — Linear, INteractive, and Discrete Optimizer
PHP — Personal Home Page
PL — Programação Linear
PO — Pesquisa Operacional
PPL — Problemas de Programação Linear
PROLIN — Sistema para Programação Linear
RePPL — Resolução de Problemas de Programação Linear
UFG — Universidade Federal de Goiás
UFV — Universidade Federal de Viçosa
-
LISTA DE SÍMBOLOS
V B — Variável Básica
V N B — Variável Não Básica
x — Variável de Decisão
F — Variável de Folga
E — Variável de Excesso
A — Variável Artificial
-
SUMÁRIO
1 Introdução 23
2 Estado da Arte 25
3 Fundamentação Teórica 29
3.1 Álgebra Linear . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.1.1 Matrizes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.1.1.1 Matriz Diagonal . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.1.1.2 Matriz Escalar . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.1.1.3 Matriz Nula . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.1.1.4 Matriz Identidade . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.1.1.5 Matriz Transposta . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.1.1.6 Adição de Matrizes . . . . . . . . . . . . . . . . . . . . . . . . 32
3.1.1.7 Multiplicação por um Escalar . . . . . . . . . . . . . . . . . . 32
3.1.2 Sistemas Lineareas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.1.2.1 Equações Lineares . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.1.2.2 Sistemas de Equações Lineares . . . . . . . . . . . . . . . . . 33
3.1.2.3 Método de Gauss-Jordan . . . . . . . . . . . . . . . . . . . . . 35
3.2 Pesquisa Operacional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.3 Programação Linear . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.4 Método Simplex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.5 Método Simplex em Duas Fases . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
4 Ferramenta 47
4.1 RePPL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
4.2 Linguagens de Programação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
4.3 Implementação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
4.4 Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
4.4.1 Características Gerais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
4.4.2 Topo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
4.4.3 Página Interna . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.4.4 Rodapé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.4.5 Interface da Tela Principal . . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.4.6 Calcular . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
4.4.7 Tela Contato . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
4.5 Utilização . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
-
5 Resultado 59
5.1 Funcionamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
6 Conclusão 63
Referências 65
APÊNDICE A Código Fonte do RePPL 67
A.1 Definições . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
A.2 Método Simplex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
A.3 Método Simplex em Duas Fases . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
-
23
CA
PÍ
TU
LO 1
INTRODUÇÃO
Na Segunda Guerra Mundial, o termo Pesquisa Operacional (PO) foi utilizado pela
primeira vez, quando líderes militares britânicos invocaram um grupo de cientista para au-
xiliar nos problemas de estratégia e de tática associados a defesa do país. O objetivo era
solucionar o problema de alocação dos recursos militares de maneira eficaz (LISBOA, 2002).
Os efeitos alcançados na guerra levaram um grupo de cientista da Força Área dos
Estados Unidos, liderada por George B. Dantzig, em julho de 1947, o desenvolvimento do
modelo de Programação Linear (PL) , e por consequência o desenvolvimento do método
computacional Simplex no final do verão de 1947 (DANTZIG, 1963). Desde o desenvolvi-
mento do algoritmo Simplex, a PL tem sido usado para resolver problemas de otimização
nas indústrias, nos bancos, na educação entre outros (WINSTON, 2003).
A PL é um planejamento de atividades sobre funções lineares, o qual tem como ob-
jetivo obter o resultado ótimo em um determinado problema chamado de Problema de Pro-
gramação Linear (PPL) (SANTOS, 2000). Para alcançar tal objetivo vários métodos podem
ser utilizados, dentre eles, podemos citar, o método gráfico, os métodos simplex e alguns
softwares já existentes como SOLVER (Microsoft EXCEL®), AIMMS® (Paragon Decision Te-
chnology) , LINDO® - Linear, INteractive, and Discrete Optimizer (LINDO Systems Inc.) (FI-
LHO, 2004) e o PROLIN (Universidade Federal de Viçosa - UFV) .
Para facilitar o entendimento e aprendizado sobre os métodos simplex, esse trabalho
propõe a construção de uma ferramenta Web, chamado de RePPL (Resolução de Problemas
de Programação Linear) para resolver os PPLs através dos métodos simplex. Um diferencial
dessa ferramenta, além de sua licença com código aberto, não há custo para aquisição da
ferramenta, é que essa ferramenta irá mostrar passo-a-passo cada fase da resolução partindo
da formulação até a solução do problema.
-
24 Capítulo 1. Introdução
A importância desse material didático-pedagógico será dedicada ao ensino das dis-
ciplinas de Pesquisa Operacional e suas variações dentro dos cursos de graduação e pós-
graduação da UFG (Universidade Federal de Goiás) e qualquer outra IES (Instituição de En-
sino Superior) que tiver interesse no assunto abordado, visto que essa ferramenta também
irá facilitar o aprendizado e o entendimento dos algoritmos simplex com um número maior
de variáveis e restrições do problema. Dependendo desse número de variáveis torna-se in-
viável a explicação e o acompanhamento dentro de uma sala de aula.
A decomposição desse trabalho será detalhado em mais 5 capítulos.
No capítulo 2 é apresentado o estado da arte do trabalho.
No capítulo 3 são apresentados os conceitos utilizadas para a implementação da fer-
ramenta.
No capítulo 4 é abordada a linguagem de programação utilizada, a implementação,
a interface e a utilização do RePPL.
No capítulo 5 é apresentado um cenário da utilização da ferramenta e os resultados
obtidos dos modelos matemáticos.
Por fim, as considerações finais no capítulo 6, do trabalho realizado, levantando os
resultados alcançados e trabalhos futuros.
Em anexo, estão disponibilizados os códigos fontes da ferramenta.
-
25
CA
PÍ
TU
LO 2
ESTADO DA ARTE
A Pesquisa Operacional é uma ciência aplicada voltada para a resolução de proble-
mas reais. Tendo como foco a tomada de decisões, aplica conceitos e métodos de várias
áreas científicas na concepção, planejamento ou operação de sistemas (LOESCH; HEIN,
1997). É utilizada para avaliar linhas de ações alternativas e encontrar as soluções que me-
lhor servem aos objetivos dos indivíduos ou organizações.
Dois eventos motivaram o rápido desenvolvimento da Pesquisa Operacional. O pri-
meiro foi o desenvolvimento de um algoritmo simples para solucionar problemas de progra-
mação linear, denominado algoritmo simplex e proposto por (DANTZIG, 1963). O segundo
foi a proliferação dos microcomputadores e o rápido aumento em sua velocidade de proces-
samento.
Atualmente com os grandes desenvolvimentos técnicos e metodológicos, com o apoio
de meios computacionais de crescente capacidade e disseminação, é possível avaliar enor-
mes volumes de dados sobre as atividades. Além de seu caráter multidisciplinar, a Pesquisa
Operacional é uma disciplina científica que se estende por praticamente todos os domínios
da atividade humana.
A Programação Linear (PL) tem inúmeras aplicações tanto na área teórica como em
situações reais. É uma técnica que utiliza instrumentos matemáticos que permitem a otimi-
zação de operações, e é largamente utilizada na resolução de problemas que tenham seus
modelos representados por expressões lineares. Problemas simples ou extremamente ela-
borados de PL podem ser resolvidos utilizando os métodos simplex e simplex em duas fases
(PRADO, 2007).
O interesse por esta área decorre da capacidade em modelar problemas reais e com-
plexos presentes em diversas outras áreas. Mesmo havendo diversos softwares para a resolu-
-
26 Capítulo 2. Estado da Arte
ção desses problemas, a implementação computacional direta dos métodos existentes nem
sempre são descritos na teoria e muitas das vezes não possuem uma abordagem adequada.
O desenvolvimento de uma ferramenta de otimização que seja capaz de resolver pro-
blemas reais, simples ou até mesmo complexos e de grande porte exige o conhecimento da
teoria de otimização, dos resultados relevantes da computação científica, de princípios de
engenharia de software e de tecnologias.
Através de uma pesquisa foram encontrados as seguintes ferramentas existentes para
a resolução de PPLs através dos métodos Simplex.
O Linear Programming - Simplex Applet é rodado sobre a plataforma java. Resolve
os seguintes problemas: Método Simplex, Simplex Revisado, Primal Dual e Dual Simplex.
Disponível apenas no idioma inglês. A forma de envio é na forma de texto do modelo ma-
temático, o que pode sujeitar a erro caso insira de forma errônea. Ele possui três tipos de
modo de visualização do resultado (SILVA, 1998):
• Alguns feedback: Mostra número de variáveis e números de restrições, indica qual mé-
todo está usando, indica a quantidade de iterações e solução encontra;
• Solução: Apenas mostra a solução encontrada;
• Quadro-a-quadro: Além do feedback, mostra o pivô e o quadro de cada iteração, sendo
que o quadro de maneira desorganizada;
O PHPSimplex calcula pelos métodos Simplex, Duas Fases e Gráfico. Disponível nos
idiomas inglês e espanhol. Ele mostra diretamente ou quadro-a-quadro. A forma de envio
através de um formulário (RUIZ, 2006).
O Simplex Method Tool calcula pelos métodos Simplex e Simplex em Duas Fases. Tem
disponível a versão inglês e espanhol. A forma de envio é na forma de texto do modelo mate-
mático, o que pode sujeitar a erro caso insira de forma errônea. Existem três tipos de modos
a serem exibidos: decimal, fração ou inteiro. Existe arrendondamento de no máximo 13 dí-
gitos para o modo decimal. Mostra apenas o quadro de cada iteração e a solução encontrada
(DINGLE; PURINTON; BALAN, 2010).
O MathsTools existe a versão para a plataforma Android. Além disso na versão Web
tem disponível a versão para os idiomas inglês e espanhol. Ele mostra a versão dual do mo-
delo matemático e mostra a solução quadro-a-quadro, indicando no quadro qual a variável
que sai e qual que entra de cada iteração, além de indicar o pivô e a solução ótima. Existe o
modo de visualização fração ou inteiro. (TOOLS, 2011).
O PROLIN - Sistema para Programação Linear utiliza o Simplex Revisado como al-
goritmo base. A forma de entrada de dados é através de texto do modelo matemático ou
-
27
arquivo .txt. Existe análise de sensibilidade da resolução como opção. Porém ao calcular a
solução do PPL, o próprio exemplo dado no site mostra um erro. (RIBEIRO et al., 1987).
Para o desenvolvimento da ferramenta, objetivo principal deste trabalho, um estudo
da teoria dos métodos Simplex e Simplex em Duas Fases será realizada paralelamente, jun-
tamente com algumas abordagens computacionais adequadas para a implementação efici-
ente da ferramenta. Além disso, como resultado dos estudos e da implementação da fer-
ramenta, esse trabalho poderá proporcionar uma motivação para que outras pesquisas em
desenvolvimentos de softwares para resolução de PPLs sejam iniciadas e continuadas.
-
29
CA
PÍ
TU
LO 3
FUNDAMENTAÇÃO TEÓRICA
Neste capítulo são apresentados os conceitos básicos para a formulação da ferra-
menta, entre eles, Álgebra Linear, Pesquisa Operacional, Programação Linear, Método Sim-
plex e Método Simplex em Duas Fases.
3.1 Álgebra Linear
Vários problemas nas áreas científicas, tecnológica e econômica são modelados por
matrizes e sistemas de equações lineares. No algoritmo simplex não é diferente. Para um
melhor entendimento esta seção revisará os conceitos de Álgebra Linear, tais como matrizes
e sistemas lineares que são abundantemente utilizados.
3.1.1 Matrizes
Nesta subseção serão apresentadas algumas definições e operações de matrizes (KOL-
MAN, 1999), as quais fazem parte do algoritmo simplex. Todas as definições são baseadas
no conjunto dos números reais. Dentre as definições estão:
Definição 1. Uma matriz m x n A é um arranjo retangular de mn elementos em m linhas
horizontais e n colunas verticais:
A =
a11 a12 · · · a1na21 a22 · · · a2n
......
...
am1 am2 · · · amn
A i -ésima linha de A é dada como:
-
30 Capítulo 3. Fundamentação Teórica
[ai 1 ai 2 · · · ai n
](1 ≤ i ≤ n)
A j -ésima coluna de A como:
a1 j
a2 j...
am j
(1 ≤ j ≤ m)
Se m = n dizemos que A é uma matriz quadrada de ordem n e os números a11, a22, · · · , anmformam a diagonal principal.
Exemplo 1. Um exemplo de uma matriz quadrada de ordem 2.
A =[
1 2
5 3
]
Uma matriz 1 x n ou n x 1 também é chamada de matriz linha ou matriz coluna,
respectivamente. Essa matriz pode ser chamada de um vetor de dimensão n e será denotada
por letras minúsculas em negrito.
Exemplo 2. Um exemplo de uma vetor de dimensão 3.
u =[
1 2 5]
ou v =
1
2
5
3.1.1.1 Matriz Diagonal
Definição 2. Uma matriz quadrada A = [ai j ] em que todos os elementos fora da diagonalprincipal são nulos, isto é, ai j = 0 para i 6= j , é denominada matriz diagonal.
Exemplo 3. Um exemplo de uma matriz diagonal.
B =[
2 0
0 1
]
3.1.1.2 Matriz Escalar
Definição 3. Uma matriz diagonal A = [ai j ] em que todos os elementos da diagonal prin-cipal são iguais, isto é, ai j = c para i = j e ai j = 0 para i 6= j , é denominada uma matrizescalar.
-
3.1. Álgebra Linear 31
Exemplo 4. Um exemplo de uma matriz escalar.
C =[
2 0
0 2
]
3.1.1.3 Matriz Nula
Definição 4. Uma matriz de ordem nxm onde todos os elementos são 0 , isto é, ai j = 0 ∀i , j ,é denominada uma matriz nula.
Exemplo 5. Um exemplo de uma matriz nula.
D =[
0 0 0
0 0 0
]
3.1.1.4 Matriz Identidade
Definição 5. Uma matriz diagonal A = [ai j ] em que todos os elementos da diagonal princi-pal são 1, isto é, ai j = 1 para i = j e ai j = 0 para i 6= j , é denominada uma matriz identidade.
Exemplo 6. Um exemplo de uma matriz identidade.
D =[
1 0
0 1
]
3.1.1.5 Matriz Transposta
Definição 6. Se A = [ai j ] é uma matriz mxn, então a matriz nxm, AT = [ aTi j ], onde
aTi j = a j i (1 ≤ i ≤ n,1 ≤ j ≤ m)
é chamada de transposta de A. Portanto, a transposta de A é obtida trocando-se as linhas
de A por suas colunas, ou vice-versa.
Exemplo 7. Sejam
E =[
4 −2 −30 5 −2
]
Então,
E T =
4 0
−2 5−3 −2
-
32 Capítulo 3. Fundamentação Teórica
3.1.1.6 Adição de Matrizes
Definição 7. Se A = [ai j ] e B = [bi j ] são matrizes mxn, a soma de A e B é a matriz C mxn,definida por
ci j = ai j +bi j (1 ≤ i ≤ n,1 ≤ j ≤ m).
Em outras palavras, C é obtida somando-se os elementos correspondentes de A e de
B .
Exemplo 8. Sejam
A =[
1 −2 34 2 0
]e B =
[2 1 0
3 −1 4
]
Então,
A+B =[
1+2 −2+1 3+04+3 2+ (−1) 0+4
]=
[3 −1 37 1 4
]
3.1.1.7 Multiplicação por um Escalar
Definição 8. Se A = [ai j ] é uma matriz mxn, e r é um número real, então múltiplo escalarde A por r , r A, é a matriz mxn, B = [bi j ], onde
bi j = r ai j (1 ≤ i ≤ n,1 ≤ j ≤ m).
Em outras palavras, B é obtida multiplicando-se cada elementos de A por r .
Exemplo 9. Se r = 2
A =[
1 −2 34 2 0
]
Então,
r A = 2[
1 −2 34 2 0
]=
[(2)(1) (2)(−2) (2)(3)(2)(4) (2)(2) (2)(0)
]=
[2 −4 68 4 0
]
3.1.2 Sistemas Lineareas
Para a explicação sobre sistemas lineares é utilizado as definições de Biezuner (2008),
também utilizando o conjunto dos reais.
-
3.1. Álgebra Linear 33
3.1.2.1 Equações Lineares
Definição 9. Uma equação linear em n incógnitas x1, x2, . . . , xn é uma equação da forma
a1x1 +a2x2 + . . .+an xn = b,
onde a1, a2, . . . , an ,b são constantes reais.
Uma solução para a equação linear acima é um conjunto de números reais s1, s2, . . . , sn
tais que quando substituímos
x1 = s1, x2 = s2, . . . , xn = sn
a equação é satisfeita.
Exemplo 10. Um exemplo de uma equação linear é
2x = 5
3.1.2.2 Sistemas de Equações Lineares
Definição 10. Um sistema de m equações lineares com n variáveis (ou incógnitas) é um
conjunto de equações lineares da forma
a11x1 + a12x2 + . . . + a1n xn = b1a21x1 + a22x2 + . . . + a2n xn = b2
......
... = ...am1x1 + am2x2 + . . . + amn xn = bk
(3.1)
onde ai j ,bk , para i = 1, . . . ,m, j = 1, . . . ,nek = 1, . . . ,m, são constantes reais, chama-dos de coeficientes do sistema.
Usando a notação de matrizes, o sistema linear 3.1 pode ser representado pela equa-
ção matricial
AX = B , onde
A =
a11 a12 · · · a1na21 a22 · · · a2n
......
...
am1 am2 · · · amn
-
34 Capítulo 3. Fundamentação Teórica
é a matriz dos coeficientes,
X =
x1
x2...
xn
é a matriz das incógnitas e
B =
b1
b2...
bm
é a matriz dos termos independentes.
Também pode-se representar o sistema AX = B pela sua matriz aumentada, ou seja,é formada pelos coeficientes das incógnitas de A e pelos termos independentes de B . Veja a
matriz aumentada de AX = B :
[A|B ] =
a11 a12 · · · a1n | b1a21 a22 · · · a2n | b2
......
... | ...am1 am2 · · · amn | bm
Definição 11. Uma solução do sistema linear AX = B é uma matriz coluna de números reais
S =
s1
s2...
sm
tal que todas as equações do sistema são satisfeitas quando substituímos
x1 = s1, x2 = s2, . . . , xn = sn
Ou seja, S satisfaz
AS = B .
-
3.1. Álgebra Linear 35
O conjunto de todas as soluções do sistema é chamado de conjunto solução do sis-
tema.
Exemplo 11. O sistema linear
{3x1 + 2x2 = 901x1 + 4x2 = 80
é representado pela equação matricial
[3 2
1 4
] [x1
x2
]=
[90
80
].
Este sistema possui uma única solução
X =[
20
15
]
isto é,
x1 = 20,x2 = 15.
3.1.2.3 Método de Gauss-Jordan
O método de eliminação de Gauss é um dos métodos usados para resolver um sis-
tema linear. Ele consiste da derivação de um sistema específico de equações lineares que
tenha a mesma solução que o sistema original. O procedimento é converter a matriz au-
mentada do sistema em uma matriz identidade, aplicando uma sequência de operações de-
nominados de operações elementares. Tais operações são escolhidos de forma que a solução
do sistema não sejam alterada (LISBOA, 2002).
As operações elementares consistem em três operações básicas:
• Troca de Linhas: A troca de linhas corresponde a troca da posição das equações;
Li ↔ L j é a troca da linha i por linha j .
-
36 Capítulo 3. Fundamentação Teórica
• Multiplicar uma linha por um número não nulo: Equivale a multiplicar um número
não nulo na equação correspondente que também não altera a solução;
Li ← kLi multiplicação da linha i pelo escalar k;
• Somar múltiplo de outra linha: Somar uma linha i a uma multiplicação de um escalar
pela linha j .
Li ← Li +kL j soma da linha j pelo escalar k à linha i ;
Para entender melhor sobre o escalonamento de Gauss-Jordan será mostrado um
exemplo.
Exemplo 12. Considere o sistema linear
4x1 + 8x2 = 1606x1 + 4x2 = 120
Esse sistema linear possui a matriz aumentada[4 8 | 1606 4 | 120
]
e pretendemos transformá-lo na matriz identidade
[1 0 | a0 1 | b
]
onde a,b são números reais que satisfazem a solução do sistema linear.
Para resolver este exemplo, são seguidos os seguintes passos:
1. L1 ← L1/4: Transformação do coeficiente de x1 da linha 1 em 1;Divide-se toda linha 1 por 4.
[1 2 | 406 4 | 120
]
2. L2 ← L2 −6L1: Transformação do coeficiente de x1 da linha 2 em 0;Subtrai-se da linha 2 pela linha 1 multiplicada por 6.
[1 2 | 400 −8 | −120
]
-
3.2. Pesquisa Operacional 37
3. L2 ← L2/8: Transformação do coeficiente de x2 da linha 2 em 1;Divide-se toda linha 2 por (-8).
[1 0 | 400 1 | 15
]
4. L1 ← L1 −2L1: Transformação do coeficiente de x2 da linha 1 em 0;Subtrai-se da linha 1 pela linha 2 multiplicada por 2.
[1 0 | 200 1 | 15
]
Solução encontrada para este sistema é
x1 = 10,x2 = 15.
3.2 Pesquisa Operacional
Segundo (WINSTON, 2003), a Pesquisa Operacional é uma abordagem científica para
a tomada de decisões que envolve um ou mais modelos matemáticos, que visa entender e
operar melhor um sistema (uma organização que trabalha para realizar um determinado
objetivo, como por exemplo, maximizar o lucro), geralmente sob alocação de recursos es-
cassos. Um modelo matemático é uma representação matemática de uma situação real, que
pode ser usado para tomar melhores decisões ou simplesmente para compreender melhor
a situação real.
Existem dois tipos de modelos: simulação e otimização. O modelo de simulação
procura oferecer uma representação do mundo real com o objetivo de permitir a geração e
análise de alternativas, antes da implementação de qualquer uma delas (ANDRADE, 2011).
O modelo de otimização busca encontrar os valores das variáveis de decisão que oti-
mizam (maximizam ou minimizam) uma função objetivo entre o conjunto de todos os valo-
res para as variáveis de decisão que satisfazem as restrições dadas (WINSTON, 2003).
Todos estes modelos são incluídos três conjuntos principais de elementos (LISBOA,
2002)
• Variáveis de decisão e parâmetros: variáveis de decisão são as incógnitas a serem de-
terminadas pela solução do modelo. Parâmetros são valores fixos no problema;
• Restrições: são as limitações físicas imposta no sistema;
-
38 Capítulo 3. Fundamentação Teórica
• Função Objetivo: é uma função matemática que define a qualidade da solução em
função das variáveis de decisão
A formulação do modelo depende diretamente do sistema a ser representado. A fun-
ção objetivo e as funções de restrições podem ser lineares ou não-lineares. As variáveis de
decisão podem ser contínuas ou discretas(inteiras) e os parâmetros podem ser determinís-
tico ou probabilístico. Com tamanha diversidade de representações existem várias técnicas
para resolver cada tipo de modelo, como por exemplo, programação inteira, programação
dinâmica, programação não-linear e programação linear (LISBOA, 2002) sendo a PL que terá
enfoque neste trabalho, detalhada na seção 3.3.
Para desenvolver um estudo de PO, resumidamente, são necessárias seguir 6 fases
(HILLIER; LIEBERMAN, 2000):
1. Definir o problema e reunir os dados relevantes;
2. Formular um modelo matemático para representar o problema;
3. Desenvolver um procedimento para realização de soluções para o problema do mo-
delo;
4. Testar o modelo e refiná-lo, se necessário;
5. Preparar para a aplicação do modelo;
6. Implementá-lo;
Para a resolução na ferramenta é necessário que o usuário desenvolva até o passo 2,
que é a formulação de um modelo matemático e também que seja um modelo de Programa-
ção Linear.
3.3 Programação Linear
Programação Linear é uma das técnicas da Pesquisa Operacional bastante utilizada
em se tratando de problemas de otimização. Os problemas de Programação Linear buscam
a distribuição eficiente de recursos limitados para atender um determinado objetivo, em
geral, maximizar lucros ou minimizar custos. Em se tratando de PL, esse objetivo é expresso
através de uma função linear, denominada por "Função Objetivo".
Geralmente, o modelo de PL é utilizado como auxílio para a resolução de problemas
que envolvam alocação de recursos escassos ou para mesmo alcançar um certo objetivo.
Este problema pode ser resumido em maximização ou minimização de alguma variável de-
pendente, limitada a certas restrições.
-
3.3. Programação Linear 39
De acordo com Garcia, Guerreiro e Corrar (1997), o modelo matemático de um pro-
blema de otimização linear pode ser formulado como seguinte:
Maximizar ou Minimizar
Z = c1x1 + c2x2 + ...+ cn xn (3.2)
sujeito a:
a11x1 +a12x2 + ...+a1n xn ≤ b1(≥ ou =)a21x1 +a22x2 + ...+a2n xn ≤ b2(≥ ou =) (3.3)
...
am1x1 +am2x2 + ...+amn xn ≤ bm(≥ ou =)
Onde xi ≥ 0 e b j ≥ 0, para i = 1,2, ...n e j = 1,2, ...mEquação 3.2 é a função matemática que codifica o objetivo do problema e é denomi-
nada função objetivo;
Equação 3.3 são as funções matemáticas que codificam as principais restrições iden-
tificadas.
Z: função a ser maximizada ou minimizada (geralmente ganho ou custo), respei-
tando o conjunto de restrições;
xi : variáveis de decisão que representam as quantidades ou recursos que se quer
determinar para otimizar o resultado global;
ci : coeficientes de ganho ou custo que cada variável é capaz de gerar;
b j : quantidade disponível de cada recurso;
ai j : quantidade de recursos que cada variável decisória consome;
Os problemas de PL são geralmente expressos algebricamente na forma citada. A
resolução de PPL, na maioria das vezes, é feita através do método Simplex, o qual será expli-
cado na seção 3.4.
A construção e a resolução de um modelo matemático, no caso de PL (GARCIA;
GUERREIRO; CORRAR, 1997), pode-ser facilitada seguindo os quatro passos a seguir:
1. Determinar as variáveis de decisão;
2. Estabelecer o objetivo;
3. Determinar as relações básicas, especialmente as restrições;
4. Calcular a solução ótima;
-
40 Capítulo 3. Fundamentação Teórica
3.4 Método Simplex
O Método Simplex é um algoritmo bastante popular para resolver problemas numé-
ricos de PL. O jornal Computing in Science and Engineering o considerou um dos 10 mais
importantes algoritmos descobertos no século 20 (DONGARRA; SULLIVAN, 2000).
Este método (algoritmo) é iterativo e é utilizado para encontrar algebricamente, a
solução ótima de um problema de PL de forma eficiente.
A solução ótima são os valores das variáveis que atendem todas as restrições do PPL
e que proporciona o lucro máximo ou custo mínimo.
O método Simplex evita a exploração exaustiva de soluções básicas assumindo os
seguintes princípios (LOESCH; HEIN, 1997):
• Apenas pesquisar soluções básicas compatíveis, pois, se há uma solução ótima limi-
tada, existe uma solução básica compatível ? correspondente ao ponto extremo da
solução ótima;
• Melhorar a cada etapa o valor da função objetivo, conduzindo-a a sempre tentar au-
mentar (caso maximização) ou diminuir (caso minimização) o valor da função obje-
tivo;
• Utilizar regras de parada que testem a situação em que: (i) a solução ótima tenha sido
alcançada; (ii) o caso de solução ótima ilimitada; (iii) não existência de uma solução
viável.
Para analisar os algoritmos Simplex e Simplex em Duas Fases é preciso compreender
sobre as variáveis e a solução ótima. Existem dois tipos de variáveis: as básicas (VB) e
não-básicas (VNB) . As básicas são aquelas que se encontram na base do quadro Simplex
e as não básicas são as variáveis restantes que não estão na base. A base é um conjunto
de n variáveis, onde n é a quantidade de restrições do modelo matemático. No início do
sistema, na formação do quadro, é composta pelas variáveis de folga. No entanto, ao calcular
o algoritmo, algumas delas poderão ser trocadas pelas variáveis de decisão sistema.
Além dos dois tipos de variáveis, as variáveis podem ser classificadas ainda:
• Variável de Decisão: são as modelo matemático. No trabalho será chamado de xi ,
onde n é a quantidade de variáveis do sistema e 1 ≤ i ≤ n;
• Variável de Folga: são aquelas adicionadas as restrições do tipo ≤ para se obter umaigualdade. No trabalho será chamada de F j onde j corresponde a linha da restrição,
de m restrições, ou seja, 1 ≤ j ≤ m;
-
3.4. Método Simplex 41
• Variável de Excesso: são aquelas adicionadas as restrições do tipo ≥ para se obter umaigualdade. No trabalho será chamada de Ek onde k corresponde a linha da restrição,
de m restrições, ou seja, 1 ≤ k ≤ m;
• Variável Artificial: são aquelas adicionadas as restrições do tipo≥ ou=para se ter umabase viável. No trabalho será chamada de Al onde l corresponde a linha da restrição
do tipo =, de m restrições , ou seja, 1 ≤ l ≤ m e Ak , onde k corresponde a linha darestrição do tipo ≥, de m restrições, ou seja, 1 ≤ k ≤ m;
Por outro lado, há dois tipos de soluções: a básica e a básica viável. A solução básica
é aquela cujo valores das variáveis não básicas são nulos e a solução básica viável é a solução
básica com todas as variáveis básicas não negativas.
A montagem do quadro do algoritmo Simplex é seguido pelas equações 3.2 e 3.3:
Seja um PPL de maximização na sua forma padrão contendo n variáveis de decisão
e m restrições, onde n,m ≥ 0:
Tabela 1 – Montagem do Quadro Simplex
Base x1 · · · xn F1 · · · Fm 2º MembroF1 a11 · · · a1n 1 · · · 0 b1· · · · · · . . . · · · · · · . . . · · · · · ·Fm am1 · · · amn 0 · · · 1 bmZ −c1 · · · −cn 0 · · · 0 0
Fonte: o autor.
Segundo Andrade (2011), são necessários 3 passos para iniciar o processo do método
simplex: a formulação do problema, montagem do modelo e a solução do modelo.
A formulação do problema consiste em montar o problema de acordo com queira
se produzir, se adequando pelas limitações. A montagem do modelo está na construção
do modelo matemático, determinando a função objetivo com suas respectivas restrições. A
solução do modelo é a resolução do problema para se encontrar o valor ótimo (ANDRADE,
2011).
Para resolver o problema, são necessários realizar os procedimentos descritos abaixo,
em (ANDRADE, 2011), para problemas de maximização.
Passo 1: Introduzir as variáveis de folga; uma para cada desigualdade.
Passo 2: Montar um quadro para os cálculos, colocando os coeficientes de todas as
variáveis com os respectivos sinais e, na última linha, incluir os coeficientes da função obje-
tivo transformada. Veja a tabela 1.
-
42 Capítulo 3. Fundamentação Teórica
Passo 3: Estabelecer uma solução básica inicial, usualmente atribuindo valor zero às
variáveis originais e achando valores positivos para as variáveis de folga.
Passo 4: Como próxima variável a entrar na base, escolher a variável não básica que
oferece, na última linha, a maior contribuição para o aumento da função objetivo (ou seja,
tem o maior valor negativo). Se todas as variáveis que estão fora da base tiverem coeficientes
nulos ou positivos nesta linha, a solução atual é ótima. Se alguma dessas variáveis tiver
coeficiente nulo, isto significa que ela pode ser introduzida na base sem aumentar o valor
da função objetivo. Isso quer dizer que temos uma solução ótima, com o mesmo valor da
função objetivo.
Passo 5: Para escolher a variável que deve deixar a base, deve-se realizar o seguinte
procedimento:
a) Dividir os elementos da última coluna pelos correspondentes elementos positivos da
coluna da variável que vai entrar na base. Caso não haja elemento algum positivo nesta
coluna, o processo deve parar, já que a solução é ilimitada.
b) O menor quociente indica a equação cuja respectiva variável básica deverá ser anu-
lada, tornando-se variável não básica.
Passo 6: Usando operações válidas com as linhas da matriz, transformar o quadro
de cálculos de forma a encontrar a nova solução básica. A coluna da nova variável básica
deverá se tornar um vetor identidade, onde o elemento 1 aparece na linha correspondente à
variável que está sendo anulada.
Passo 7: Retornar ao passo 4 para iniciar outra iteração.
3.5 Método Simplex em Duas Fases
A obtenção da solução básica compatível inicial é fácil quando todas as restrições
do modelo de PL são da forma (≤). Ao passar o problema para a forma padrão, as variáveisde folga entrarão com coeficiente +1 em cada restrição do modelo, constituindo uma base
canônica inicial (LOESCH; HEIN, 1997).
Porém, quando existem restrições da forma (≥), aparecem variáveis de excesso, cujocoeficiente é -1, as quais não constituem uma solução básica compatível. Como obter, então,
uma solução básica compatível inicial? Umas das técnicas empregadas para tal finalidade é
o Método Simplex em Duas Fases.
A montagem do quadro do algoritmo Simplex em Duas Fases é similar ao Simplex,
porém acrescenta as variáveis de excesso e artificial e a função objetivo artificial seguindo as
mesmas equações 3.2 e 3.3.
-
3.5. Método Simplex em Duas Fases 43
A função objetivo artificial é obtida somando os coeficientes das restrições que pos-
suem variáveis artificiais.
Seja um PPL na sua forma padrão contendo n variáveis de decisão e m restrições,
onde n,m ≥ 0. A montagem do quadro é apresentado na tabela 2.Este método é utilizado quando há restrições do tipo (≥) ou (=). Para que a solução
básica inicial não seja negativa, é preciso adicionar variáveis artificiais em cada uma dessas
restrições, as quais não terão significado algum para o problema real, porém são necessárias
para a resolução do PPL. Esta resolução utiliza o mesmo procedimento do método simplex,
mas é dividida em duas fases. A primeira fase consiste em encontrar a solução básica inicial.
Após essa fase, as variáveis artificiais e a função objetivo artificial são eliminadas do quadro
simplex dando início a segunda fase (ANDRADE, 2011).
Os procedimentos do Simplex em Duas Fases são mostradas a seguir (ANDRADE,
2011):
Primeira Fase
Passo 1 - Introduz as variáveis de folga ou de excesso, para as restrições do tipo (≤)ou (≥), respectivamente. Logo após, introduz as variáveis artificiais para todas as restriçõesdo tipo (=) ou (≥);
Passo 2 - Cria-se uma nova função objetivo artificial, formada da seguinte maneira:
a) Para todas as variáveis reais e de folga, o coeficiente da função artificial será a soma
dos coeficientes dessas variáveis, ou seja:
di =−(a1 j +a2 j + ...+am j )∗
b) Zero para as variáveis artificiais;
c) O valor inicial da função objetivo artificial é a soma dos termos independentes das
restrições;
* Obs.: Somente são incluídos os coeficientes das linhas com variáveis artificiais.
-
44 Capítulo 3. Fundamentação Teórica
Tab
ela
2–
Mo
nta
gem
do
Qu
adro
Sim
ple
xem
Du
asFa
ses
≤≥
=B
ase
x 1···
x nF
1···
Fj
E1
···E
kA
1···
Ak
A1
···A
l2º
Mem
bro
F1
a11
···a
1n1
···0
0···
00
···0
0···
0b
1
······
. ..
······
. ..
······
. ..
······
. ..
······
. ..
······
Fj
aj1
···a
jn0
···1
00
00
···0
0···
0b
j
Ak
a11
···a
1n0
···0
-1···
01
···0
0···
0b
1
······
. ..
······
. ..
······
. ..
······
. ..
······
. ..
······
Ak
ak
1···
ak
n0
···0
00
-10
···1
0···
0b
k
Al
a11
···a
1n0
···0
0···
00
···0
1···
0b
1
······
. ..
······
. ..
······
. ..
······
. ..
······
. ..
······
Al
al1
···a
ln0
···0
0···
00
···0
0···
1b
l
Z−c
1···
−cn
0···
00
···0
0···
00
···0
0Z
a−∑ m i
=1a
i1···
−∑ m i=1
ain
0···
01
···1
0···
00
···0
−∑ m i=1
bi
Fon
te:o
auto
r.
-
3.5. Método Simplex em Duas Fases 45
Passo 3 - Monta-se o quadro de solução colocando-se a função objetivo artificial na
última linha. Veja a tabela 2;
Passo 4 - Aplica-se o Método Simplex normalmente, tomando como função objetivo
a última linha. Quando a solução ótima for atingida, dois casos podem ocorrer:
1. Za = 0: neste caso foi obtida uma solução básica do problema original e o processode solução deve continuar, desprezando-se as variáveis artificiais e os elementos da
última linha. É o início da 2 etapa do processo.
2. Za 6= 0: neste caso, o problema original não tem solução viável, o que significa que asrestrições devem ser inconsistentes.
Segunda Fase
Aplica-se o mesmo algoritmo Simplex do problema de maximização, observando
qual o tipo da otimização (maximização ou minimização), que determina como uma va-
riável entra e sai da base.
Caso seja de maximização, é verificado na linha da função objetivo para as variáveis
não básicas, qual o menor coeficiente negativo, e na minimização, é verificado o maior coe-
ficiente positivo para a entrada da nova variável básica.
-
47
CA
PÍ
TU
LO 4
FERRAMENTA
4.1 RePPL
Para encontrar a solução de um PPL foi desenvolvido a ferramenta Web, RePPL (Re-
solução de Problemas Programação Linear), que tem por objetivo encontrar a solução ótima
do PPL através dos Métodos Simplex e Simplex em Duas Fases, podendo o usuário escolher
passo-a-passo ou diretamente. A escolha passo-a-passo mostra desde a entrada do conjunto
de equações e inequações, a introdução das variáveis de folga (restrições ≤) ou de excesso(restrições ≥) e artificiais (para o método Simplex em Duas Fases e restrições ≥ e =), a mon-tagem do quadro simplex inicial, quais são as variáveis que devem entrar e sair da base e as
transformações do quadro simplex de tal forma que as colunas das variáveis que estão na
base se tornem um vetor identidade. Se a escolha for por executar diretamente, os cálculos
serão realizados implicitamente e apenas será mostrado o resultado final.
4.2 Linguagens de Programação
A ferramenta foi criado a partir da linguagem PHP (Personal Home Page) , que é uma
linguagem de script open source de uso geral (GROUP, 2001). Para o pleno funcionamento da
linguagem PHP é preciso que os códigos fontes estejam hospedados em um servidor. E por
isso, a ferramenta atualmente está hospedado no sítio www.leandropedrosa.com.br/reppl e
em funcionamento para utilização.
Além do PHP, foram utilizados HTML (HyperText Markup Language) e CSS (Casca-
ding Style Sheets) . O HTML é uma linguagem de marcação utilizada para produzir páginas
na Web, enquanto, o CSS é uma linguagem para estilos que define o layout de documen-
tos HTML (HTML.NET, ). Ou seja, o HTML destina-se unicamente a estruturar e marcar o
-
48 Capítulo 4. Ferramenta
conteúdo, ficando por conta das CSS toda a responsabilidade pelo visual do documento.
Em termos de armazenamento de dados não foi utilizado nenhum banco de dados
sendo as informações armazenadas no servidor enquanto aplicação está sendo executada.
A escolha da linguagem para a implementação da ferramenta foi devida a sua dispo-
nibilidade na Web e por sua interoperabilidade da plataforma do usuário.
4.3 Implementação
O diagrama de caso de uso mostra as funcionalidades da ferramenta. O usuário po-
derá utilizar o algoritmo simplex usando a ação de Calcular Simplex ou o algoritmo Simplex
Duas em Fases usando a ação de Calcular Simplex Duas em Fases. O diagrama de classe de
uso é mostrado na Figura 1.
Figura 1 – Diagrama de Caso de Uso para a RePPL
Fonte: o autor.
O diagrama de classe do algoritmo simplex, Figura 2, são mostrados todos os atri-
butos e métodos da classe ppl_simplex que são utilizados para o algoritmo simplex. Esta
classe é responsável pelo cálculo, montagem do quadro e as explicações passo-a-passo do
algoritmo simplex.
Aplicação do algoritmo Simplex em Duas Fases foi dividido em duas classes. A pri-
meira classe é justamente que faz o cálculo do algoritmo que se chama ppl_duasfases. E a
segunda faz o processo de visão, ou seja, a impressão do quadro e das explicações para a tela
do usuário. Estas duas classes são mostrada na Figura 3.
-
4.3. Implementação 49
Figura 2 – Diagrama de Classe - Simplex
Fonte: o autor.
-
50 Capítulo 4. Ferramenta
Fig
ura
3–
Dia
gram
ad
eC
lass
e-
Sim
ple
xem
Du
asFa
ses
Fon
te:o
auto
r.
-
4.4. Interface 51
4.4 Interface
Nesta seção são apresentadas as características gerais e algumas telas da ferramenta.
4.4.1 Características Gerais
As características gerais da interface são:
• A interface de usuário deve ser simples, para facilitar o aprendizado da utilização da
ferramenta por parte dos usuários;
• Não será disponibilizada ajuda on-line para o usuário. A próprio ferramenta dispo-
nibiliza explicações detalhadas sobre o funcionamento. Porém, os usuários poderão
entrar em contato através da página de Contato;
• Exibição de erros caso a entrada de dados seja inválida, como o campo que aceita
apenas números, e o usuário entrar com caracteres alfa;
• A interface é dividido em 3 partes para todas as telas, sendo duas estáticas e uma di-
nâmica: topo, rodapé e centro, respectivamente. O topo e o rodapé são estáticas pelo
fato de não necessitar ser carregadas novamente, por terem o mesmo conteúdo em
todas as telas, evitando assim as requisições de imagens, visto que uma vez carregada,
se encontra armazenada no cache do navegador do usuário.
• A ferramenta tem largura mínima de 980 pixels para abrir sem ter a barra de rolagem na
horizontal e a altura tem dimensão automática, calculada através das páginas internas
da ferramenta juntamente com a altura do topo e rodapé.
4.4.2 Topo
A parte do topo é estático, Figura 4. Ela contém a logo da ferramenta, Figura 5, e a
parte do menu contendo os links: Home, Simplex, Simplex em Duas Fases, Calcular, Contato,
Sobre. O topo tem como padrão o fundo azul em várias tonalidades.
Figura 4 – Topo da Ferramenta
Fonte: o autor.
-
52 Capítulo 4. Ferramenta
Figura 5 – Logo da Ferramenta
Fonte: o autor.
4.4.3 Página Interna
O centro é parte dinâmica da ferramenta. Nele é mostrado todos os conteúdos das
páginas, que são as páginas internas. O fundo do centro é na cor cinza. Um exemplo de
página interna é apresentado na Figura 6.
Figura 6 – Exemplo de Página Interna da Ferramenta
Fonte: o autor.
4.4.4 Rodapé
O rodapé, Figura 7, também é estático. Nela é mostrado os e-mails dos criadores, o
apoio da UFG e DCC . O preto é a cor de fundo do rodapé;
4.4.5 Interface da Tela Principal
A tela principal da ferramenta, Figura 8, apresenta na parte interna, uma breve ex-
plicação sobre a Ferramenta, o Simplex, o Simplex em Duas Fases e o Calcular, e apresenta
também os links para as respectivas páginas.
-
4.4. Interface 53
Figura 7 – Rodapé da Ferramenta
Fonte: o autor.
Figura 8 – Tela Principal da Ferramenta
Fonte: o autor.
4.4.6 Calcular
No link Calcular encontra-se as telas que fazem parte do Cálculo. Ela está dividida
em 3 telas. A tela inicial do Calcular, Figura 9, tem um formulário com a escolha do tipo do
método a ser calculado, a escolha se é direto ou passo-a-passo, a quantidade de variáveis e a
quantidade de restrições.
Na tela seguinte, Figura 10, encontra-se um formulário com a finalidade do pro-
-
54 Capítulo 4. Ferramenta
blema, maximização ou minimização, e a entrada dos coeficientes da função objetivo e dos
coeficientes e termo independente das restrições.
A terceira tela está dividida em 3 partes, Figuras 11, 12, 13, é a tela de resultado.
Figura 9 – Tela Calcular
Fonte: o autor.
Figura 10 – Tela Equação
Fonte: o autor.
-
4.5. Utilização 55
Figura 11 – Exemplo de uma Tela de Resultado - Parte 1
Fonte: o autor.
4.4.7 Tela Contato
A tela de Contato, Figura 14, tem um formulário no qual o usuário poderá entrar em
contato enviando mensagens.
4.5 Utilização
Esta ferramenta funcionará da seguinte maneira: o usuário acessará primeiramente
o endereço eletrônico, o qual terá uma interface gráfica onde a comunicação visual com o
usuário será de fácil compreensão. O usuário entrará, no primeiro momento, com tipo de
método a ser calculado, se é passo-a-passo, a quantidade de variáveis e de restrições, Figura
-
56 Capítulo 4. Ferramenta
Figura 12 – Exemplo de uma Tela de Resultado - Parte 2
Fonte: o autor.
9. Feito isso, aparecerá uma segunda tela, Figura 10 para entrada dos coeficientes da função
objetivo e das restrições, que podem ser ≤, ≥ ou =, as quais determinarão os acréscimosdas variáveis de folga ou excesso. Concluído esta etapa, a próxima tela, Figuras 11, 12, 13,
a ser mostrada é a resolução do modelo matemático, respeitando as condições de entrada
imposta pelo usuário. Nesta tela, caso a opção escolhida seja passo-a-passo, a ferramenta
-
4.5. Utilização 57
Figura 13 – Exemplo de uma Tela de Resultado - Parte 3
Fonte: o autor.
irá detalhar todos os passos do algoritmo Simplex até a solução ótima ser obtida.
-
58 Capítulo 4. Ferramenta
Figura 14 – Tela de Contato
Fonte: o autor.
-
59
CA
PÍ
TU
LO 5
RESULTADO
Para verificar o funcionamento da ferramenta RePPL, será utilizado dois modelos
clássicos de PL de Andrade (2011).
5.1 Funcionamento
Para demonstrar o funcionamento da ferramenta na opção Simplex foi utilizado o
um exemplo de alocação de recursos bastante encontrado em todas as atividades empresa-
riais. Geralmente, deseja-se maximizar o lucro de um setor de produção, no qual recursos
disponíveis estão sujeitos a restrições (capacidade produtiva, disponibilidade de mão-de-
obra, estoque, etc) e os produtos estão sujeitos a condições de mercado (demanda máxima,
contratos de suprimentos etc).
Exemplo 13. Um carpinteiro dispõe de 90, 80 e 50 metros de compensado, pinho e cedro,
respectivamente. O produto A requer 2, 1 e 1 metro de compensado, pinho e cedro, respec-
tivamente. O produto B requer 1, 2 e 1 metros, respectivamente. Se A é vendido por $120.00
e B por $100.00, quantos de cada produto ele deve fazer para obter um rendimento bruto
máximo?
Para utilizar a ferramenta RePPL é necessário encontrar o modelo de otimização para
este problema de maximização. As variáveis do problema são x1, x2 que vão indicar qual a
quantidade de produtos "A"e "B"que devem ser produzidas para se obter o lucro máximo.
M ax LUC RO = 120x1 +100x2Sujeito a:
2x1 +x2 ≤ 90
-
60 Capítulo 5. Resultado
x1 +2x2 ≤ 80x1 +x2 ≤ 50x1 ≥ 0, x2 ≥ 0Inserindo os dados do modelo na ferramenta para a opção direta tem-se o resultado
apresentado na Figura 15:
Figura 15 – Tela de Resultado do Exemplo 13
Fonte: o autor.
Para demonstrar o funcionamento da ferramenta na opção Simplex em Duas Fases
foi utilizado o um exemplo de alocação para minimizar os custos em um setor de produção.
Exemplo 14. Uma transportadora possui dois tipos de caminhões: o tipo A com 2 metros
cúbicos de espaço refrigerado e 4 metros cúbicos de espaço não refrigerado e o tipo B com
3 metros cúbicos refrigerados e 3 não refrigerados. Uma fábrica precisou transportar 90 me-
tros cúbicos de produto refrigerado e 120 metros cúbicos de produto não refrigerado. Quan-
tos caminhões de cada tipo ela deve alugar, de modo a minimizar o custo, se o aluguel do
caminhão A custa $0.30 por km e o do B, $0.40 por km.
Novamente para utilizar a ferramenta RePPL é necessário encontrar o modelo de oti-
mização para este problema de minimização.
-
5.1. Funcionamento 61
As variáveis do problema são x1 e x2 que vão indicar quantos caminhões a fábrica
deverá alugar para atender aos pedidos ao menor custo possível.
Mi n CU ST O = 0.30x1 +0.4x2Sujeito a:
2x1 +3x2 ≥ 904x1 +3x2 ≥ 120x1 ≥ 0, x2 ≥ 0Inserindo os dados do modelo na ferramenta para a opção direta tem-se o resultado
apresentado na Figura 16:
Figura 16 – Tela de Resultado do Exemplo 14
Fonte: o autor.
-
63
CA
PÍ
TU
LO 6
CONCLUSÃO
Este trabalho mostrou a criação de uma ferramenta para a resolução direta ou passo-
a-passo de um PPL através dos métodos Simplex ou Simplex em Duas Fases, trazendo uma
alternativa para encontrar a solução ótima de modelos de otimização. Entendendo a di-
ficuldade dos alunos em compreender os métodos e também de encontrar softwares que
mostrassem passo-a-passo a obtenção da solução ótima de um PPL, a ferramenta conse-
guiu encontrar a solução ótima para os modelos apresentados. Vale salientar que essa ferra-
menta não substitui a abordagem e o ensinamento na sua parte escrita, mas auxilia nos seus
esclarecimentos.
Observando as características dos outros métodos citados no Capítulo 2, percebe-se
que esta ferramenta possui uma interface amigável, mostra a resolução dos PPLs do modo
passa-a-passo bem detalhado e informa no quadro simplex qual variável irá entrar na base
e qual deverá sair com suas respectivas justificativas.
Foi possível perceber que o resultado obtido proporciona um aprendizado e conhe-
cimento sobre os métodos Simplex e Simplex em Duas Fases.
Esperando que esse trabalho traga contribuição não apenas para estudantes da UFG,
mas para todos aqueles interessados no assunto abordado, fica como trabalhos futuros a
implementação dos métodos Dual Simplex e Big M na ferramenta.
-
65
REFERÊNCIAS
ANDRADE, E. L. de. Introdução à pesquisa operacional: métodos e modelos para análise dedecisões. 4. ed. Rio de Janeiro: LTC, 2011. 202 p. Citado 4 vezes nas páginas 37, 41, 43 e 59.
BIEZUNER, R. J. Sistemas Lineares. Belo Horizonte, MG - Brasil, 2008. Disponívelem: . Acesso em:28/02/2013. Citado na página 32.
DANTZIG, G. B. Linear Programming and Extensions. Santa Mônica, Califórnia, Agosto1963. 641 p. Disponível em: . Acesso em: 12/02/2013. Citado 2 vezes nas páginas 23 e 25.DINGLE, B.; PURINTON, J.; BALAN, G. Simplex Method Tool. 2010. Disponível em: . Acesso em: 27/03/2013. Citado na pá-gina 26.
DONGARRA, J.; SULLIVAN, F. Guest editors’ introduction: The top 10 algorithms. Computingin Science and Engg., 2000. IEEE Educational Activities Department, Piscataway, NJ, USA,v. 2, n. 1, p. 22–23, jan. 2000. ISSN 1521-9615. Disponível em: . Citado na página 40.FILHO, V. J. M. F. O uso de software de modelagem aimms na solução de problemas de pro-gramação matemática. Pesquisa Operacional, 2004. v. 24, n. 1, p. 197–210, Janeiro a Abril2004. Disponível em: . Citado na página 23.GARCIA, S.; GUERREIRO, R.; CORRAR, L. J. Teoria das restrições e programação linear. VCongresso Internacional de Custos - Costos, Productividad y Rentabilidad, 1997. 1997. Citadona página 39.
GROUP, T. P. O que é PHP? 2001. Disponível em: . Acesso em: 22/02/2013. Citado na página 47.HILLIER, F. S.; LIEBERMAN, G. J. Introduction to Operations Research. 7. ed. [S.l.]: McGrawHill Higher Education, 2000. 1220 p. Citado na página 38.
HTML.NET. CSS. Disponível em: .Acesso em: 22/02/2013. Citado na página 47.
KOLMAN, B. Introdução à Álgebra Linear com Aplicações. 6. ed. Rio de Janeiro: LTC, 1999.290 p. Citado na página 29.
LISBOA, E. F. A. Pesquisa Operacional. Rio de Janeiro, RJ - Brasil, Fevereiro 2002. Disponívelem: . Acesso em: 12/02/2013. Citado 4 vezes nas páginas23, 35, 37 e 38.
http://www.mat.ufmg.br/~rodney/notas_de_aula/sistemas_lineares.pdfhttp://www.rand.org/content/dam/rand/pubs/reports/2007/R366part1.pdfhttp://www.rand.org/content/dam/rand/pubs/reports/2007/R366part1.pdfhttp://www.zweigmedia.com/RealWorld/simplex.htmlhttp://www.zweigmedia.com/RealWorld/simplex.htmlhttp://dx.doi.org/10.1109/MCISE.2000.814652http://dx.doi.org/10.1109/MCISE.2000.814652http://dx.doi.org/10.1007/BF02614318http://php.net/manual/pt_BR/intro-whatis.phphttp://php.net/manual/pt_BR/intro-whatis.phphttp://pt-br.html.net/tutorials/css/lesson1.phphttp://www.ericolisboa.eng.br
-
66 Referências
LOESCH, C.; HEIN, N. Pesquisa Operacional - Fundamentos e Modelos. [S.l.]: FURB, 1997.270 p. Citado 3 vezes nas páginas 25, 40 e 42.
PRADO, D. S. do. Programação Linear. 5. ed. [S.l.]: INDG Tecnologia e Serviços Ltda, 2007.238 p. (Serie Pesquisa Operacional, v. 1). Citado na página 25.
RIBEIRO, C. A. A. S. et al. PROLIN. 1987. Disponível em: .Acesso em: 27/03/2013. Citado na página 27.
RUIZ, J. J. R. PHPSimplex. 2006. Disponível em: . Acesso em: 27/03/2013. Citado na página 26.SANTOS, M. P. dos. Programação Linear. Universidade do Estado de Rio de Janeiro, 2000.Disponível em: . Acesso em:12/02/2013. Citado na página 23.
SILVA, P. M. Linear Programming - Simplex Applet. 1998. Disponível em: . Acesso em: 27/03/2013. Citado na página 26.TOOLS, M. Simplex Algorithm Calculator. 2011. Disponível em: . Acesso em: 27/03/2013. Citado na página 26.WINSTON, W. L. Operations Research: Applications and Algorithms. 4. ed. [S.l.]: DuxburyPress, 2003. 1440 p. Citado 2 vezes nas páginas 23 e 37.
http://www.prolin.ufv.br/http://www.phpsimplex.com/simplex/simplex.htm?l=enhttp://www.phpsimplex.com/simplex/simplex.htm?l=enhttp://www.mpsantos.com.br/plinear/arquivos/plinear.pdfhttp://algos.inesc.pt/lp/http://algos.inesc.pt/lp/http://www.mathstools.com/section/main/simplex_onlinehttp://www.mathstools.com/section/main/simplex_online
-
67
AP
ÊN
DI
CE
ACÓDIGO FONTE DO REPPL
Neste apêndice encontra-se os códigos fontes do método Simplex e do método Sim-
plex em Duas Fases.
A.1 Definições
Listing A.1: Definições
1
A.2 Método Simplex
-
68 APÊNDICE A. Código Fonte do RePPL
Listing A.2: Simplex
1
-
A.2. Método Simplex 69
47 * Armazena a quantidade de restrições que o usuário escolheu48 * @var int49 */50 private $restricao_qtd = 0;51
52 /**53 * Armazena a quantidade de variáveis de folga54 * @var int55 */56 private $folga_qtd = 0;57
58 /**59 * Armazena a quantidade de variáveis que foram para a base.
60 * É a somatória do total de folga com a artificial .61 * @var int62 */63 private $base_qtd = 0;6465 /**66 * Armazena todas as informações do quadro .
67 * Contendo as informações do cabeçalho , variáveis da base , funçãoobjetivo e função objetivo artificial68 * @var Array69 */70 private $linha = array ();71
72 /**73 * Armazena quais são as variáveis que estão na base , ou seja , as
não básicas .74 * @var Array75 */76 private $vnb = array ();77
78 /**79 * Armazena o tipo de finalidade do método .
80 * Maxiximização -> max
81 * Minimização -> min82 * @var String83 */84 private $finalidade = ’’;8586 /**87 * Armazena a quantidade de variável totais (Variaveis , Folga ,
Excesso e Artificial )88 * @var int89 */90 private $variavel_total = 0;
-
70 APÊNDICE A. Código Fonte do RePPL
91
92 /**93 * Armazena a chave que se encontra o maior valor negativo94 * @var Array95 */96 private $maior_valor_negativo_funcao_objetivo_key = array ();97
98 /**99 * Armazena o maior valor negativo que se encontra na função
objetivo100 * @var int101 */102 private $maior_valor_negativo_funcao_objetivo ;103
104 /**105 *106 * @var int107 */108 private $menor_valor_negativo_termo ;109
110 /**111 * Armazena o array com o menor valor negativo no termo112 * @var Array113 */114 private $menor_valor_negativo_termo_key = array ();115
116 /**117 * Array armazenando o coeficente da variável que entra na base118 * @var Array119 */120 private $coeficientes_variavel_entra = array ();121
122 /**123 * Array armazenando o texto que deve sair da base124 * @var Array125 */126 private $texto_sair_base = array ();127
128 /**129 *130 * @var bool131 */132 private $solucao_otima = false;133
134 /**135 *136 * @var Array
-
A.2. Método Simplex 71
137 */138 private $variavel_total_ms = 0;139
140 /**141 * Método construtor da classe .
142 * É necessário enviar o POST do formulário para o funcionamento ;143 * @param Array $post O POST do formulário144 * @since 1.0145 */146 public function __construct ($post) {147 $this ->post = $post;148 $this -> metodo_tipo = isset ($post[’metodo_tipo ’]) ? $post[’metodo_tipo ’] : 0;149 $this -> metodo_passo = isset ($post[’metodo_passo ’]) ? ($post[’
metodo_passo ’] == ’sim ’) ? ’sim ’ : ’nao ’ : ’nao ’;150 $this -> variavel_qtd = isset ($post[’metodo_variaveis_qtd ’]) ?
$post[’metodo_variaveis_qtd ’] : 0;151 $this -> restricao_qtd = isset ($post[’metodo_restricoes_qtd ’]) ?
$post[’metodo_restricoes_qtd ’] : 0;152 $this -> finalidade = isset ($post[’equacao_finalidade ’]) ?
$post[’equacao_finalidade ’] : ’max ’;153
154 // Chama o método verificaMetodo ;155 $this -> verificaMetodo ();156 }157
158 /**159 * Retorna a linha160 * @return int161 */162 public function getLinha () {163 return $this ->linha;164 }165
166
167 /**168 * Método para verificar o tipo de método que está sendo utilizado169 * @since 1.0170 */171 private function verificaMetodo (){172 if($this -> metodo_tipo == 1){ // Método Simplex173 $this -> folga_qtd = $this -> restricao_qtd ;174 }175 $this -> base_qtd = $this -> folga_qtd ;176 $this -> variavel_total = $this -> restricao_qtd + $this -> variavel_qtd
;177 $this -> variavel_total_ms = $this -> variavel_total ;
-
72 APÊNDICE A. Código Fonte do RePPL
178 }179
180 /**181 * Método para montar a linha contendo todas as informações .
182 * Dentro dela são chamados outros métodos ;183 * @since 1.0184 */185 public function montaLinha (){186 $this -> montaLinhaCabecalho ();187 $this -> montaLinhaFolga ();188 $this -> montaLinhaZ ();189 }190191 /**192 * Método para montar a linha cabecalho do quadro193 * @since 1.0194 */195 private function montaLinhaCabecalho (){196 // Linha Cabeçalho197 $this ->linha[ CABECALHO ] = array ();198 $this ->linha[ CABECALHO ][0] = NOME_BASE ;199 // Percorre cada variavel básica insere no cabeçalho200 for($i = 1; $i variavel_qtd ; $i ++){201 $this ->linha[ CABECALHO ][$i] = NOME_V_BASICA .’’.$i.’’;202 }203 $aux_cont = $this -> variavel_qtd ;204
205 // Percorre cada variavel folga insere no cabeçalho206 for($i = 1; $i folga_qtd ; $i ++){207 $j = $i + $aux_cont ;208 $this ->linha[ CABECALHO ][$j] = NOME_V_FOLGA .’’.$i.’’;209 }210 $aux_cont += $this -> folga_qtd ;211 $this ->linha[ CABECALHO ][ TERMO] = NOME_2_MEMBRO ;212 }213
214 /**215 * Método para montar a linha de folga216 * @since 1.0217 */218 private function montaLinhaFolga (){219 // Percorre a linha da variável de folga220 for($k = 1; $k base_qtd ; $k ++){221 // Linha De Restricao222 //if($this -> ordem_sinal [$k] == ’linha[$k] = array ();224 $this ->linha[$k ][0] = NOME_V_FOLGA .’’.$k.’’;
-
A.2. Método Simplex 73
225 $restricao_aux_linha = ’restricao_ ’.$k.’_’;226 // Percorre cada variavel básica insere no cabeçalho227 for($i = 1; $i variavel_qtd ; $i ++){228 $restricao_aux_linha1 = $restricao_aux_linha .$i;229 $this ->linha[$k][$i] = (int)$this ->post[ $restricao_aux_linha1 ];230 }231 $aux_cont = $this -> variavel_qtd ;232
233 // Percorre cada variavel folga insere no cabeçalho234 for($i = 1; $i folga_qtd ; $i ++){235 $j = $i + $aux_cont ;236 $this ->linha[$k][$j] = ($k == $i) ? 1 : 0;237 }238 $aux_cont += $this -> folga_qtd ;239 $restricao_aux_linha_termo = $restricao_aux_linha .’2 membro ’;240 $this ->linha[$k][ TERMO] = (int) $this ->post[
$restricao_aux_linha_termo ];241 //}242 }243 }244
245 /**246 * Método para montar a linha função objetivo247 * @since 1.0248 */249 private function montaLinhaZ (){250 // Linha Função Objetivo251 $this ->linha[ NOME_FO ] = array ();252 $this ->linha[ NOME_FO ][0] = NOME_FO ;253
254 // Percorre cada variavel básica insere no cabeçalho255 for($i = 1; $i variavel_qtd ; $i ++){256 $fo_aux = ’fo_ ’.$i;257 $this ->linha[ NOME_FO ][$i] = (int)-$this ->post[ $fo_aux ];258 }259 $aux_cont = $this -> variavel_qtd ;260
261 // Percorre cada variavel folga insere no cabeçalho262 for($i = 1; $i folga_qtd ; $i ++){263 $j = $i + $aux_cont ;264 $this ->linha[ NOME_FO ][$j] = 0;265 }266 $aux_cont += $this -> folga_qtd ;267 $this ->linha[ NOME_FO ][ TERMO] = 0;268
269 }270
-
74 APÊNDICE A. Código Fonte do RePPL
271
272 public function escreve (){273 if($this -> metodo_passo == ’sim ’){274 $this -> metodoSimplexPasso1 ();275 $this -> metodoSimplexPasso2 ();276 $this -> metodoSimplexPasso3 ();277 $this -> resolveMetodoSimplex ();278 } else {279 echo $this -> montaQuadroInicial ();280 $this -> resolveMetodoSimplex ();281
282 // $this -> apresentaSolucao ();283 }284 }285
286 private function resolveMetodoSimplex (){287
288 $coeficientes_variavel_entra = array ();289 $solucao_otima = false ;290 $texto_sair_base = array ();291 $iteracao = 1;292 $i = 1;293 $funcao_objetivo_aux = array ();294 for($k = 1; $k variavel_total ;$k ++){295 $funcao_objetivo_aux [$k] = $this ->linha[ NOME_FO ][$k];296 }297 $maior_valor_negativo_funcao_objetivo = min( $funcao_objetivo_aux );298 $maior_valor_negativo_funcao_objetivo_key = array_keys (
$funcao_objetivo_aux , $maior_valor_negativo_funcao_objetivo );299 $menor_valor_resulta_termo_array = array ();300 $verifica_limitacao = array ();301 for($i = 1;$i base_qtd ;$i ++){302 if($this ->linha[$i][ $maior_valor_negativo_funcao_objetivo_key [0]]
linha[
$i][’termo ’]/ $this ->linha[$i][$maior_valor_negativo_funcao_objetivo_key [0]] ,2 , ’.’,’’);
310 $texto_sair_base [$i] = $i.’.& ordf; linha: ’.$this ->linha[$i][’termo ’].’ / ’.$this ->linha[$i][$maior_valor_negativo_funcao_objetivo_key [0]]. ’ = ’.
-
A.2. Método Simplex 75
$menor_valor_resulta_termo_array [$i];311 }312 $coeficientes_variavel_entra [$i] = $this ->linha[$i][
$maior_valor_negativo_funcao_objetivo_key [0]];313 }314
315
316 if( in_array (true , $verifica_limitacao )){317 $menor_valor_negativo_termo = min( $menor_valor_resulta_termo_array
);318 $menor_valor_negativo_termo_key = array_keys (
$menor_valor_resulta_termo_array , $menor_valor_negativo_termo );319 $coeficientes_variavel_entra [’funcao_objetivo ’] =
$funcao_objetivo_aux [ $maior_valor_negativo_funcao_objetivo_key[0]];
320 $this -> maior_valor_negativo_funcao_objetivo =$maior_valor_negativo_funcao_objetivo ;
321 $this -> maior_valor_negativo_funcao_objetivo_key =$maior_valor_negativo_funcao_objetivo_key ;
322 $this -> menor_valor_negativo_termo = $menor_valor_negativo_termo ;323 $this -> menor_valor_negativo_termo_key =
$menor_valor_negativo_termo_key ;324 $this -> coeficientes_variavel_entra = $coeficientes_variavel_entra ;325 $this -> texto_sair_base = $texto_sair_base ;326 // echo ’maior_valor_negativo_funcao_objetivo : ’; var_dump (
$maior_valor_negativo_funcao_objetivo );327 // echo ’maior_valor_negativo_funcao_objetivo_key : ’; var_dump (
$maior_valor_negativo_funcao_objetivo_key );328 // echo ’menor_valor_resulta_termo_array : ’; var_dump (
$menor_valor_resulta_termo_array );329 // echo ’coeficientes_variavel_entra : ’; var_dump (
$coeficientes_variavel_entra );330 // echo ’menor_valor_negativo_termo_key : ’; var_dump (
$menor_valor_negativo_termo_key );331 // echo ’maior_valor_negativo_funcao_objetivo_key : ’; var_dump (
$maior_valor_negativo_funcao_objetivo_key );332 // echo ’Linha: ’; var_dump ($this ->linha);333
334
335
336 while (! $solucao_otima ){337
338 $this ->vnb[ $maior_valor_negativo_funcao_objetivo_key [0]] = $this ->linha[ $menor_valor_negativo_termo_key [0]][0];
339 if($this -> metodo_passo == ’sim ’){340 $this -> metodoSimplexPassoIteracao ( $iteracao );341 $this -> metodoSimplexPasso4 ();
-
76 APÊNDICE A. Código Fonte do RePPL
342 $this -> metodoSimplexPasso5 ();343 $this -> metodoSimplexPasso6 ();344 }345 for( $operacao = 1; $operacao metodo_passo == ’sim ’){347 $this -> metodoSimplexPasso6Operacao ( $operacao );348 }349 for($k = 1; $k base_qtd ;$k ++){350 // $mod = $k % 2;351 // $google_class = ($mod == 1) ? ’even ’ : ’odd ’ ;352 $google_select = ’’;353 //A operação na linha da variável que entra354 if( $operacao == 1){355 //Se a linha for igual da variavel que entra356 if($k == $menor_valor_negativo_termo_key [0]){357 $google_select = ’google - visualization -table -tr -sel ’;358 $this ->linha[$k ][0] = $this ->linha[’cabecalho ’][
$maior_valor_negativo_funcao_objetivo_key [0]];359 // $iteracao_meio .= ’’.$base[$i][’ nome ’].’’;
360 for($j = 1;$j variavel_total ;$j ++){361
362 if($j == $maior_valor_negativo_funcao_objetivo_key [0]){363 if($this ->linha[$k][$j] == 0){364 $this ->linha[$k][$j] = 0;365 }else{366 $this ->linha[$k][$j] = $this ->linha[$k][$j
]/ $this ->linha[$k][$j];367 }368
369 }else{370 if($this ->linha[$k][$j] == 0){371 $this ->linha[$k][$j] = 0;372 }else{373 if( $coeficientes_variavel_entra [
$menor_valor_negativo_termo_key [0]] ==0){
374 $this ->linha[$k][$j] =0;375 }else{376 $this ->linha[$k][$j] =
number_format ($this ->linha[$k][$j]/$coeficientes_variavel_entra [$menor_valor_negativo_termo_key
-
A.2. Método Simplex 77
[0]] ,2 , ’.’,’’);377 }378
379 }380 }381
382 }383 if($this ->linha[$k][ TERMO] == 0){384 $this ->linha[$k][ TERMO] = 0;385 }else{386 if( $coeficientes_variavel_entra [
$menor_valor_negativo_termo_key [0]] == 0){387 $this ->linha[$k][ TERMO] = 0;388 }else{389 $this ->linha[$k][ TERMO] = number_format ($this ->
linha[$k][ TERMO ]/ $coeficientes_variavel_entra [$menor_valor_negativo_termo_key [0]] ,2 , ’.’,’’);
390 }391 }392
393 }394 //A operação nas linhas do meio exceto da variável que entra395 }else if( $operacao == 2){// Fim da if( $operacao == 1)396 //Se a linha for igual da variavel que entra397 // echo ’k: ’.$k.’ $menor_valor_negativo_termo_key [0]: ’.
$menor_valor_negativo_termo_key [0].’
’;398 // echo ’Base nome: ’.$base[$k][’ nome ’].’
’;399 if($k != $menor_valor_negativo_termo_key [0]){400 // $base[$k][’ nome ’] = $this -> linha_titulo [$maior_valor_negativo_funcao_objetivo_key [0]];401 $google_select = ’google - visualization -table -tr -sel ’;402 for($j = 1;$j variavel_total ;$j ++){403 // echo $k.’ ’.$j.’: ’.$base[$k][$j].’
’;404 // echo $k.’ ’.$j.’ $base[$maior_valor_negativo_funcao_objetivo_key [0]][ $j]: ’.$base[ $maior_valor_negativo_funcao_objetivo_key [0]][ $j].’
’;405 $this ->linha[$k][$j] = number_format (( $this ->linha[$menor_valor_negativo_termo_key [0]][ $j]* (-$coeficientes_variavel_entra [$k])) + $this ->linha[$k][$j],2,’.’,’’);
406 }407 $this ->linha[$k][ TERMO] = number_format (( $this ->linha[
$menor_valor_negativo_termo_key [0]][ TERMO ]* (-$coeficientes_variavel_entra [$k])) + $this ->linha[$k][ TERMO ],2,’.’,’’);
408 }else{
-
78 APÊNDICE A. Código Fonte do RePPL
409 }410 //A operação na linha da função objetivo411 }else if( $operacao == 3){// Fim da if( $operacao == 2)412
413 }414 }// Fim do for415 if( $operacao == 1 || $operacao == 2){416
417 }else if( $operacao == 3){418 for($i = 1;$i variavel_total ;$i ++){419 // echo $i.’ $base[
$maior_valor_negativo_funcao_objetivo_key [0]][ $i]: ’.$base[ $maior_valor_negativo_funcao_objetivo_key [0]][ $i].’
’;420 // echo ’$coeficientes_variavel_entra [termo ]: ’.$coeficientes_variavel_entra [TERMO ].’
’;421 // echo $i.’ $funcao_objetivo [$i]: ’. $funcao_objetivo [$i].’<br >’;
422 // echo ’Multiplicacao : ’.( $base[$maior_valor_negativo_funcao_objetivo_key [0]][ $i]* (-$coeficientes_variavel_entra [TERMO ])).’
’;423 $this ->linha[ NOME_FO ][$i] = number_format (( $this ->linha[$menor_valor_negativo_termo_key [0]][ $i]* (-$coeficientes_variavel_entra [’funcao_objetivo ’])) +$this ->linha[ NOME_FO ][$i],2,’.’,’’);
424
425 }426 $this ->linha[ NOME_FO ][ TERMO] = number_format (( $this ->linha[
$menor_valor_negativo_termo_key [0]][ TERMO ]* (-$coeficientes_variavel_entra [’funcao_objetivo ’])) + $this ->linha[ NOME_FO ][ TERMO ],2,’.’,’’);
427 }428
429 if($this -> metodo_passo == ’sim ’){430 echo $this -> montaQuadroIteracao ($iteracao , $operacao );431
432 }433 }434
435 for($k = 1; $k variavel_total ;$k ++){436 $funcao_objetivo_aux [$k] = $this ->linha[ NOME_FO ][$k];437 }438 $maior_valor_negativo_funcao_objetivo = min( $funcao_objetivo_aux );439 $maior_valor_negativo_funcao_objetivo_key = array_keys (
$funcao_objetivo_aux , $maior_valor_negativo_funcao_objetivo );440 $menor_valor_resulta_termo_array = array ();441 for($i = 1;$i base_qtd ;$i ++){
-
A.2. Método Simplex 79
442 if($this ->linha[$i][ $maior_valor_negativo_funcao_objetivo_key [0]]linha[
$i][’termo ’]/ $this ->linha[$i][$maior_valor_negativo_funcao_objetivo_key [0]] ,2 , ’.’,’’);
448 $texto_sair_base [$i] = $i.’.& ordf; linha: ’.$this ->linha[$i][’termo ’].’ / ’.$this ->linha[$i][$maior_valor_negativo_funcao_objetivo_key [0]]. ’ = ’.$menor_valor_resulta_termo_array [$i];
449 }450 $coeficientes_variavel_entra [$i] = $this ->linha[$i][
$maior_valor_negativo_funcao_objetivo_key [0]];451 }452 $menor_valor_negativo_termo = min( $menor_valor_resulta_termo_array
);453 $menor_valor_negativo_termo_key = array_keys (
$menor_valor_resulta_termo_array , $menor_valor_negativo_termo );454 $coeficientes_variavel_entra [’funcao_objetivo ’] =
$funcao_objetivo_aux [ $maior_valor_negativo_funcao_objetivo_key[0]];
455
456 $this -> maior_valor_negativo_funcao_objetivo =$maior_valor_negativo_funcao_objetivo ;
457 $this -> maior_valor_negativo_funcao_objetivo_key =$maior_valor_negativo_funcao_objetivo_key ;
458 $this -> menor_valor_negativo_termo = $menor_valor_negativo_termo ;459 $this -> menor_valor_negativo_termo_key =
$menor_valor_negativo_termo_key ;460 $this -> coeficientes_variavel_entra = $coeficientes_variavel_entra ;461 $this -> texto_sair_base = $texto_sair_base ;462
463 $iteracao ++;464
465 if( $maior_valor_negativo_funcao_objetivo >= 0){466 $solucao_otima = true;467 }468
469 if($this -> metodo_passo == ’sim ’){470 $this -> metodoSimplexNovaSolucaoObtida ();471 }472 $this -> solucao_otima = $solucao_otima ;473 };
-
80 APÊNDICE A. Código Fonte do RePPL
474 if($this -> metodo_passo == ’nao ’){475 $this -> montaQuadroFinal ();476 }477 $this -> apresentaSolucao ( $solucao_otima );478 }else{479 echo ’Solu& ccedil ;& atilde ;o
ilimitada
N& atilde ;o h& aacute ; nenhum elementopositivo na coluna da vari& aacute ;vel que vai entrar na base .’;480 exit;481 }482 }483
484 /**485 * Método para montar o Quadro inicial486 * @return string Retorna o quadro pronto para ser imprimido487 */488 public function montaQuadroInicial (){489 $str = ’’;490 $str .= ’’;491 $str .= ’ Quadro Inicial ’;492 $str .= ’’;493 $str .= ’
’;494 $str .= ’’;495 $str .= ’’;496 $str .= ’’;497 for($i = 0; $i < count ($this ->linha[ CABECALHO ]) -1;$i ++){498 $str .= ’’. $this ->linha[ CABECALHO ][$i].’’;
499 }500 $str .= ’’.$this ->linha[ CABECALHO ][ TERMO ].’’;
501 $str .= ’’;502 for($k = 1; $k base_qtd ;$k ++){503 $mod = $k % 2;504 $google_class = ($mod == 1) ? ’even ’ : ’odd ’ ;505 $str .= ’’;506 for($i = 0; $i < count ($this ->linha[$k]) -1;$i ++){507 $str .= ’’.$this ->linha[$k][$i].’’;
508 }
-
A.2. Método Simplex 81
509 $str .= ’’.$this ->linha[$k][ TERMO ].’’;
510 $str .= ’’;511 }512 $str .= ’’;513 for($i = 0; $i < count($this ->linha[ NOME_FO ]) -1;$i ++){514 $str .= ’’.$this ->linha[ NOME_FO ][$i].’’;
515 }516 $str .= ’’.$this ->linha[ NOME_FO][ TERMO ].’’;
517 $str .= ’’;518
519 $str .= ’’;520 $str .= ’’;521
522 return $str;523
524 }525
526 /**527 *528 * @param int $iteracao529 * @param int $operacao530 */531 private function montaQuadroIteracao ($iteracao , $operacao ){532
533 $str = ’’;534 $str .= ’’;
535 $str .= ’’;536 $str .= ’’;537 for($i = 0; $i < count($this ->linha[ CABECALHO ]) -1;$i ++){538 $str .= ’’. $this ->linha[CABECALHO ][$i].’’;
539 }540 $str .= ’’.$this ->linha[CABECALHO ][ TERMO ].’’;
541 $str .= ’’;542 for($k = 1; $k base_qtd ;$k ++){543 $mod = $k % 2;
-
82 APÊNDICE A. Código Fonte do RePPL
544 $google_class = ($mod == 1) ? ’even ’ : ’odd ’ ;545 if( $operacao == 1){546 $google_class_linha = ($this -> menor_valor_negativo_termo_key [0] ==
$k) ? $operacao .’op’ : $google_class ;547 }else if( $operacao == 2){548 $google_class_linha = ($this -> menor_valor_negativo_termo_key [0] !=
$k) ? $operacao .’op’ : $google_class ;549 }else{550 $google_class_linha = $google_class ;551 }552 $str .= ’’;553
554 for($i = 0; $i < count ($this ->linha[$k]) -1;$i ++){555 $str .= ’’.$this ->linha[$k][$i].’’;
556 }557 $str .= ’’.$this ->linha[$k][ TERMO ].’’;
558 $str .= ’’;559 }560 if( $operacao == 3){561 $google_class_linha = ’3op’;562 }else{563 $google_class_linha = ’z’;564 }565 $str .= ’’;566
567 for($i = 0; $i < count ($this ->linha[ NOME_FO ]) -1;$i ++){568 $str .= ’’.$this ->linha[ NOME_FO ][$i].’’;
569 }570 $str .= ’’.$this ->linha[ NOME_FO][ TERMO ].’’;
571 $str .= ’’;572 $str .= ’’;573 $str .= ’’;574 return $str;575 }576
577 private function montaQuadroFinal (){578 $str = ’’;
-
A.2. Método Simplex 83
579 $str .= ’’;580 $str .= ’ Quadro Final ’;581 $str .= ’’;582 $str .= ’
’;583