leandro pedrosa rodrigues - universidade federal de goiás · 2013. 10. 21. · leandro pedrosa...

147
UNIVERSIDADE FEDERAL DE GOIÁS – CAMPUS CATALÃO DEPARTAMENTO DE CIÊNCIAS DA COMPUTAÇÃO Curso de Bacharelado em Ciências da Computação F ERRAMENTA W EB PARA R ESOLUÇÃO DE P ROBLEMAS DE P ROGRAMAÇÃO L INEAR ATRAVÉS DOS MÉTODOS S IMPLEX E S IMPLEX EM D UAS FASES Leandro Pedrosa Rodrigues CATALÃO – GO 2013

Upload: others

Post on 04-Feb-2021

0 views

Category:

Documents


0 download

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

    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

    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

    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

    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

    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

    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;64

    65 /**66 * Armazena todas as informações do quadro .
    67 * Contendo as informações do cabeçalho , variáveis da base , função

    objetivo 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 = ’’;85

    86 /**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 }190

    191 /**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