Programação Linear

Q. Você considera inútil alguma disciplina que você cursou?

R. Sim! Programação Linear!

FONTE: `AVALIAÇÃO DO BACHARELADO EM CIÊNCIA DA COMPUTAÇÃO'

Bem-vindo!

Bem-vindo à página de Programação linear para a UFMS. Esta é uma disciplina introdutória em algoritmos de programação linear. Abaixo encontra-se uma descrição de alguns dos ingredientes principais desta disciplina.


  1. Introdução

    O problema básico de programação linear consiste no seguinte: dada uma matriz $ A$ e vetores $ b$ e $ c$, encontrar um vetor $ x$ tal que

        $\displaystyle Ax = b, \ \ x \geq 0 \ $   $\displaystyle$\displaystyle $

    Como outros ramos da matemática, programação linear (e de uma maneira mais geral, programação matemática) teve a sua origem em aplicações.

    Dois mil anos antes de Cristo exemplos especiais de equações lineares já tinham sido estudadas por egípcios e babilônios. Os babilônios também consideraram duas equações lineares em duas variáveis. Babilônios, gregos e chineses conheciam a idéia de eliminação de variáveis para resolver equações lineares (ou quadráticas).

    O que hoje é conhecido como o método de eliminação gaussiana foi descrito explicitamente no `Nove Livros de Aritmética' chinês que foi escrito entre 202 A.C. e 9 D.C. e descreve métodos que provavelmente foram escritos muito antes. Equações lineares e eliminação de variáveis também foram estudadas por Diophantos de Alexandria (aprox. terceiro século D.C.).

    O nome eliminação gaussiana é devido a alguns artigos de Gauss onde eliminação é aplicada. Gauss estudou equações lineares para estimar as órbitas de corpos celestes e observou que, se um sistema $ Ax = b$ de $ n$ equações e $ n$ incógnitas não admite solução ou admite várias soluções, então existe um vetor $ y$ tal que $ yA = 0$ (que é uma espécie de afirmação `dual'). Em um de seus artigos Gauss também descreveu o que é hoje conhecido como processo de ortogonalização de Gram-Schmidt, que decompõe uma matriz $ A$ como $ A = QU$, onde $ Q$ é uma matriz ortogonal (i.e. $ Q^{\top}Q = I)$ e $ U$ é triangular superior. Logo, $ Ax = b$ pode ser trocado por $ Ux = Q^{\top}b$, que é mais fácil de ser resolvido.

    Enquanto resolver vários tipos de equações foi um tópico central em matemática, até recentemente pouca atenção foi dada a encontrar uma solução `ótima'. As aplicações em problemas de transporte na década de 40 (em particular, pelas forças armadas durante a segunda grande guerra mundial) foi um primeiro passo importante na criação da programação linear. Entre os pioneiros que fizeram o desenvolvimento da área estão George Dantzig em Washington e Leonid Kantorovich em Leningrado. Ambos ilustraram muito bem as fontes de aplicações da programação linear; Dantzig trabalhava para o Pentágono (inclusive durante o período da guerra entre 1941 e 1945), enquanto Kantorovich foi motivado pelo plano econômico Soviético. Outros pioneiros são Von Neumann (Game Theory), Wassily Leontief (Input-Output Model of the Economy) e Tjalling Koopmans (Theory of Optimum Allocation of Resources). Kantorovich, Koopmans e Leontief receberam o prêmio Nobel em economia; sobre isto, em Chvátal [2] encontramos o seguinte:

    ``...On October 14, 1975, the Royal Sweden Academy of Sciences awarded the Nobel Prize in economic science to L.V. Kantorovich and T.C. Koopmans ``for their contributions to the theory of optimum allocation of resources.'' (As the reader may know, there is no Nobel Prize in mathematics. Apparently the Academy regarded the work of G.B. Dantzig, who is universally recognized as the father of linear programming, as being too mathematical.)...''

    Em 1946 Dantzig era consultor para a US Air Force Comptroller no Pentágono. Foi no Pentágono que Dantzig recebeu dos seus colegas D. Hitchcock e M. Wood o desafio de tentar mecanizar o processo de planejamento. No verão de 1947 Dantzig propôs o método simplex que tornou possível a solução de problemas de otimização de vários tipos, como transporte, produção, alocação de recursos e problemas de escalonamento (scheduling). O desenvolvimento dos computadores permitiu a aplicação do método simplex a problemas de grande porte, enquanto que, por outro lado, o método revelou alguns dos problemas numéricos que podem ocorrer em cálculos feitos por um computador -- o que motivou a busca de soluções para estes problemas.

    No início da década de 50 começaram a surgir várias áreas as quais chamamos hoje coletivamente de programação matemática. Essas subáreas de programação matemática cresceram rapidamente -- com programação linear desempenhando um papel fundamental nesse desenvolvimento. Entre essas subáreas estão: programação não-linear (começou por volta de 1951 com a famosa condição de Karush-Kuhn-Tucker); aplicações comerciais; fluxos em redes; métodos de grande porte; programação estocástica; e programação inteira.

    Dantzig [4] descreve a origem de certos termos:

    ``Here are some stories about how various linear programming terms arose. The military refer to their various plans or proposed schedules of training, logistical supply and deployment of combat units as a program. When I had first analyzed the Air Force planning problem and saw that it could be formulated as a system of linear inequalities, I called my first paper Programming in a Linear Structure. Note that the term `program' was used for linear programs long before it was used as the set of instructions used by a computer to solve problems. In the early days, these instructions were called codes.

    In the summer of 1948, Koopmans and I visited the Rand Corporation. One day we took a stroll along the Santa Monica beach. Koopmans said: ``Why not shorten `Programming in a Linear Structure' to `Linear Programming'?'' I replied: ``That's it! From now on that will be its name.'' Later that day I gave a talk at Rand, entitled `Linear Programming'; years later Tucker shortened it to Linear Program.

    The term Mathematical Programming is due to Robert Dorfman of Harvard, who felt as early as 1949 that the term Linear Programming was too restrictive.

    The term simplex method arose out of a discussion with T. Motzkin who felt that the approach that I was using, when viewed in the geometry of the columns, was best described as a movement from one simplex to a neighboring one. Mathematical programming is also responsible for many terms which are now standard in mathematical literature, terms like Arg Min, Arg Max, Lexico-Max, Lexico-Min. The term dual is an old mathematical term. But suprisingly the term primal is new and was proposed by my father Tobias Dantzig around 1954 after William Orchard-Hays stated the need for a word to call the original problem whose dual was such and such.''

    Apesar de, em termos teóricos, o algoritmo simplex (algoritmo simplex = método simplex + mecanismo que force a convergência) não ser um algoritmo eficiente, já que o número de operações executadas pelo algoritmo no pior caso é exponencial no número de digitos do problema, na prática o desempenho do algoritmo é muito bom e isto foi decisivo no sucesso da programação linear.

    Em 1979 L.G. Khachiyan mostrou que um método de otimização não-linear devido a N.Z. Shor, D.B. Yudin e A.S. Nemirovskii, que não era amplamente conhecido, podia ser adaptado para resolver problemas de programação linear em tempo polinomial. Este método ficou conhecido como método dos elipsóides.

    Mais recentemente, em 1984, N. Karmarkar desenvolveu um novo algoritmo polinomial para resolver problemas de programação linear. Nasciam assim os chamados métodos de pontos interiores.

    Observação. O que foi brevemente tratado nesta introdução foi extraído de [4], dos prefácios de [5] e de [6], das notas históricas em [13] e de [10].

    Aviso-propaganda. No próximo semestre a professora Cristina Gomes Fernandes oferecerá a disciplina Algoritmos de Aproximação. Os assuntos que estudaremos em Programação Linear, principalmente o conceito dualidade, serão utilizado repetidas vezes na disciplina Algoritmos de Aproximação.



  2. Objetivos

    Esta disciplina apresenta um visão introdutória de programacao linear, uma técnica quantitativa comumente utilizada para ajudar em tomada de decisões e planejamento. Os objetivos principais desta disciplina sao:

    a)
    transformar o estudante em um usuário de técnicas de programação linear;
    b)
    apresentar algoritmos programacao linear, em particular o Simplex, e dar uma visão geral da teoria por detras dos algoritmos comumente utilizados para a solução de problemas de programação linear.

    A ênfase nesta disciplina é em algoritmos e teoria, entretanto, é de particular importância que você entenda como programação linear pode ser aplicada em problemas do `mundo real' e que você esteja ciente de suas limitações.

    Esta é uma primeira disciplina em otimização, disciplinas que podem seguir-se a esta são: Otimização Combinatória; Métodos de Otimização em Finanças; e Programação Não-Linear.

    Divirtam-se!
  3. Critério de avaliação
  4. A nota final (NF) desta disciplina será baseada em dois componentes: listas de exercícios e provas.

    Listas de exercícios
    Teremos alguns exercícios/projetos. Alguns serão do tipo lapis-e-papel, podendo acontecer durante uma aula. Cada exercício valerá um certo número de pontos. Algumas destes exercícios podem exigir algum trabalho de programação ou o uso de pacotes de programação linear (CPLEX, RIOT Interactive Linear Programming, programas feitos pelo professor Paulo Feofiloff, etc.). A nota de exercícios será calculada pela fórmula
    MEX = 10 × X/S,
    onde X é o total de pontos acumulado pelo aluno e S é o total de pontos que um bom aluno obteria.

    Provas
    Teremos três provas nesta disciplina. A média MP das provas será obtida através da média ponderada das três provas, sendo que a nota NP1 da primeira prova terá peso 1 e as notas NP2 e NP3 da segunda e terceira provas, respectivamente, terão peso 2, ou seja,

       MP = (NP1 + 2×NP2 + 2×NP3) / 5.

    Nota final
    A nota final NF será calculada da seguinte maneira. Se a média de provas MP e a média em exercícios MEX forem ambas maiores ou iguais a 5.0 (cinco) então

       NF = (4×MP + MEX) / 5.

    Caso contrário,

       NF = min{MP,MEX}.

    Como é de praxe, os alunos que obtiverem NF >= 5 serão considerados aprovados.

    Observação. A página da disciplina contém as datas mais importantes.

  5. Tópicos que pretendemos cobrir
  6. Os tópicos que pretendemos cobrir nesta disciplina são os seguintes:

    1.
    Vetores e matrizes.
    2.
    Algoritmo de Gauss-Jordan
    3.
    Algoritmo Simplex
    4.
    Problema canônico primal
    5.
    Problema canônico dual e dualidade:
    a)
    Lema da dualidade
    b)
    Folgas complementares
    c)
    Teorema da dualidade
    6.
    Problema geral de programação linear
    7.
    Aplicações em problemas de fluxos em redes:
    a)
    Problema do caminho de custo mínimo
    b)
    Problema do fluxo máximo
    c)
    Problema do fluxo viável de custo mínimo

    Se sobrar algum tempo, dependendo do gosto do professor e do interesse dos alunos, outros tópicos que podem eventualmente ser estudados (rapidamente) são: o método primal-dual; o método dos elipsóides; e o algoritmo de Karmarkar.

  7. Bibliografia
  8. A referência principal desta disciplina será o livro de Feofiloff [6]. Este livro está disponível no URL:

    http://www.ime.usp.br/~pf/prog-lin/ .

    Os tópicos que serão visto sobre fluxos em redes podem ser encontrados no livro de Ahuja, Magnanti e Orlin [1] e no material do URL:

    http://www.ime.usp.br/~coelho/oticomb2000/material/ .

    Outros livros que servirão mais de apoio são Ferreira e Wakabayashi [7] e Humes e de Castro Humes [9].

    O livro de Dantzig [3] é um texto clássico em programação linear (foi o primeiro livro sobre o assunto, acho ...). Outros livros que também podem ser encontrados na biblioteca (?) e que pretendo consultar são: Chvátal [2] (livro bem-conhecido sobre programação linear); Dantzig e Thapa [5] (faz parte de um `trilogia' escrita recentemente por Dantzig e Thapa sobre programação linear); Foulds [8] (de fácil leitura); Nemhauser e Wolsey [11] (trata mais de programação inteira); Padberg [12]; Schrijver [13] (é um livro teórico, como o próprio título já diz); Steiglitz e Papadimitriou [14] (um livro de otimização combinatória); Tah [15] (é um livro sobre pesquisa operacional, ou seja, contém aplicações); Winston [16] (outro livro sobre pesquisa operacional).

  9. Programas
  10. Durante o andamento da disciplina teremos exercícios que poderão exigir algum trabalho de programação ou o uso de pacotes de programação linear como CPLEX, RIOT Interactive Linear Programming, programas feitos pelo professor Paulo Feofiloff e outros. O CPLEX é um pacote comercial que tem sua versão `para estudante' instalada na rede NT do CEC. O RIOT Interactive Linear Programming permite que problemas de programação linear, não muito grandes, possam ser resolvidos através da internet. O professor Paulo Feofiloff escreveu programas em cweb que podem ser vistos no URL

    http://www.ime.usp.br/~coelho/proglin/programas/ .

    Também utilizaremos o modeling system MPL (Mathematical Programming Language). Está disponível para download na página da Maximal Software

    http://www.maximal-usa.com/mpldown.html

    uma versão `for Windows' para estudantes do MPL e do CPLEX -- esta é a mesma versão que está instalada no CEC. A versão para estudantes só admite problemas de tamanho limitado (no máximo 300 variáveis ou restrições), mas fora isto é inteiramente funcional. Um tutorial para o uso do MPL pode ser encontrado em
    http://www.maximal-usa.com/mpltutor/ .


  11. Programação Linear na Internet
  12. No URL

    http://www.ime.usp.br/~coelho/proglin/sitios/

    será mantida uma lista de links para alguns sítios de Programação Linear e assuntos relacionados (por exemplo, análise numérica). Durante o andamento da disciplina esta lista deverá ser atualizada e expandida. Se você encontrar algum sítio de Programação Linear (ou de qualquer outra coisa) que você ache interessante, por favor, não deixe de me avisar.



  13. Lista de discussão
  14. Estaremos mantendo uma lista de discussão que tem como objetivo servir de suporte para a disciplina. Recomenda-se que os alunos mandem para esta lista suas dúvidas, sugestões, críticas ou observações sobre o andamento da disciplina. Assim, se você pretende cursar programação linear, por favor, veja a página

    http://www.ime.usp.br/~coelho/proglin/lista/


    e inscreva-se na lista de discussão. Sinta-se a vontade para me escrever e fazer perguntas ou comentários sobre a disciplina.

    Para mandar sua mensagem para a lista, mande o seu e-mail para



    coelho-proglin@ime.usp.br.

    Os e-mails para a lista serão distribuídos para todos os inscritos e poderão ser acessados no URL

    http://www.ime.usp.br/~coelho/proglin/lista/ .


    Use e abuse desta lista.



  15. Outras informações
  16. O número do telefone do professor Paulo Feofiloff é 0xx11 3818-6198 e o endereço eletrônico é pf@ime.usp.br o número do telefone do professor José Coelho é 0xx11 3818-6295 e o endereço eletrônico é coelho@ime.usp.br.

    Manteremos uma página da disciplina no URL:

    http://www.ime.usp.br/~coelho/proglin/ .

    Nessa página colocaremos todo material da disciplina (como, por exemplo, listas de exercícios, provas, avisos, etc.). Por favor, dê uma olhada nesta página regularmente.

    Aos alunos que estiverem interessados em fazer fazer mestrado ou doutorado, no Departamento de Ciência da Computação da USP, em algum tópico relacionado com otimização sugerimos que batam um papo com:

    Otimização contínua
    os professores Carlos Humes Jr. (humes@ime.usp.br), Ernesto G. Birgin (egbirgin@ime.usp.br), Julio Stern(jstern@ime.usp.br), Leônidas de Oliveira Brandão (leo@ime.usp.br), ou Paulo J. da Silva e Silva (rsilva@ime.usp.br);
    Otimização discreta
    os professores do grupo de combinatória (veja http://www.ime.usp.br/~yoshi/index_combinatorics.html).



Página de programação linear.
Last modified: Tue Jul 10 08:37:24 BRST 2001