Um tutorial de GMPL e GLPK
http://code.google.com/p/ms428-unicamp/
14 de julho de 2011
2
i
Licenca
“Um tutorial de GMPL e GLPK” de http://code.google.com/p/ms428-unicamp/foi licenciada com uma Licenca Creative Commons - Atribuicao - Uso NaoComercial 3.0 Nao Adaptada.
Com base na obra disponıvel em http://code.google.com/p/ms428-unicamp/.Podem estar disponıveis permissoes adicionais ao ambito desta licenca em
http://code.google.com/p/ms428-unicamp/.
Licence
“Um tutorial de GMPL e GLPK” by http://code.google.com/p/ms428-unicamp/
is licensed under a Creative Commons Attribution 3.0 Unported License(http://creativecommons.org/licenses/by-nc/3.0/).
Based on a work at http://code.google.com/p/ms428-unicamp/.Permissions beyond the scope of this license may be available at http:
//code.google.com/p/ms428-unicamp/.
ii
Informacoes
Este livro foi concebido com o objetivo de ajudar os alunos do curso 28,Matematica Aplicada e Computacional, da Universidade Estadual de Camp-inas, UNICAMP, no aprendizado da GNU MathProg modeling language (GMPL)e no uso GNU Linear Programming Kit (GLPK).
Optou-se por utilizar o LATEX para a producao deste livro, o sistemade versionamento Mercurial e hospedar os arquivos no Google Code (http://code.google.com/p/ms428-unicamp/).
Para obter a versao mais atual deste livro deve-se adquirir os arquivos doprojeto (maiores informacoes em http://code.google.com/p/ms428-unicamp/
source/checkout e gerar a versao visual.Correcoes e sugestoes podem ser feitas via e-mail ou pelo envio de pa-
cotes ao projeto (para evitar vandalismo, a permissao para modificacoes dosarquivos presentes no repositorio sera concedida apos a primeira correcao ousugestao).
iii
iv
Prefacio
Como disse Flatberg, em [Fla09], a motivacao para utilizar uma linguagemde modelagem, como GMPL, sao que esta:
• apresenta uma sıntaxe que e proxima da formulacao matematica;
• permite uma separacao entre o modelo e a instancia numerica de dados.
Deste modo, nos primeiros capıtulos apresentamos a sıntaxe do linguagemGMPL.
Posteriormente apresentamos como utilizar o GLPK para resolver os mod-elos desenvolvidos na GMPL.
Na Figura 1 e apresentado uma estatıstica comparativa dos principaissolvers existentes. Pode-se observar que o GLPK apresenta o “pior” desem-penho de todos de modo que pode-se perguntar: compensa utiliza-lo? Aresposta para a pergunta depende do objetivo ao modelar e tentar resolverdeterminado problema. Didaticamente e extremamente valido utiliza-lo poissua utilizacao e muito semelhante independente do sistema operacional uti-lizado, sua simplicidade forca o usuario a procurar utilizar formulacoes fortese por ser codigo aberto permite conhecer o funcionamento do solver e tentarimplementar melhorias.
v
vi PREFACIO
Figura 1: MIP solver benchmark: Geometric mean of results taken from thehomepage of Hans Mittelmann, http://plato.asu.edu/ftp/milpf.html
(16/Jan/2011).Unsolved or failed instances are accounted for with the time limit of 2 hours.
Sumario
Informacoes iii
Prefacio v
1 Instalacao 11.1 Aquisicao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.2 Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.3 Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
2 Introducao 32.1 Tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.1.1 Numero . . . . . . . . . . . . . . . . . . . . . . . . . . 42.1.2 Nome . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42.1.3 String . . . . . . . . . . . . . . . . . . . . . . . . . . . 42.1.4 Chave . . . . . . . . . . . . . . . . . . . . . . . . . . . 42.1.5 Delimitador . . . . . . . . . . . . . . . . . . . . . . . . 52.1.6 Comentario . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2 Expressoes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52.2.1 Conjuntos . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.3 Objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52.3.1 Parametros . . . . . . . . . . . . . . . . . . . . . . . . 52.3.2 Parametros em arquivo separado . . . . . . . . . . . . 6
2.4 Variaveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62.4.1 Operacoes . . . . . . . . . . . . . . . . . . . . . . . . . 62.4.2 Funcao Objetivo . . . . . . . . . . . . . . . . . . . . . 62.4.3 Restricoes . . . . . . . . . . . . . . . . . . . . . . . . . 7
A Notacao 9
vii
viii SUMARIO
Capıtulo 1
Instalacao
Neste capıtulo iremos apresentar como adquirir o GLPK e proceder com ainstalacao nos sistemas operacionais Linux e Windows.
1.1 Aquisicao
Para adquirir o GLPK voce deve ir ao site do projeto, http://www.gnu.org/software/glpk/, e procurar pela secao Downloading.
Atualmente a versao 4.45 e a versao mais atual e iremos utiliza-la.
1.2 Linux
Uma vez baixado o arquivo glpk-4.45.tar.gz vamos descompacta-lo como comando:
$ tar zxf glpk-4.45.tar.gz
Sera criado um novo diretorio e vamos acessa-lo pelo comando:
$ cd glpk-4.45
A instalacao se resume aos seguintes comandos:
# ./configure --disable-shared
# make
# make install
Para verificar se a instalacao foi realizada com sucesso pode-se utilizar ocomando:
$ glpsol -v
1
2 CAPITULO 1. INSTALACAO
1.3 Windows
Pode-se proceder de maneira analoga a instalacao para Linux ou baixar oexecutavel disponıvel em http://gnuwin32.sourceforge.net/packages/
glpk.htm (atualmente o executavel disponibilizado correspondende a versao4.34).
Capıtulo 2
Introducao
Neste capıtulo apresentamos a sintaxe basica do GMPL que baseia-se nostipos
1. numero,
2. nome,
3. string,
4. chave,
5. delimitador,
6. comentario,
expressoes e nos objetos
1. parametro,
2. conjunto,
3. variavel,
4. restricao,
5. funcao objetivo.
3
4 CAPITULO 2. INTRODUCAO
2.1 Tipos
2.1.1 Numero
Um numero e uma expressao que reprenta os numeros reais na base 10 dotipo xxEsyy, onde xx e um numero decimal, s e um dos sımbolos + ou -,e yy e outro numero decimal correspondendo a potencia. A seguir algunsexemplos:
123
3.14159
56.E+5
2.1.2 Nome
Um nome e uma sequencia de caracteres alfanumericos onde o primeiro car-acter sempre e alfabetico. A seguir alguns exemplos:
alpha123
This_is_a_name
_P123_abc_321
2.1.3 String
Uma string e uma sequencia de caracteres delimitada por aspas simples ouduplas. Caso na sequencia de caracteres apresente aspas simples ou duplasestas devem ser digitadas duas vezes. A seguir alguns exemplos:
’This is a string’
"This is another string"
’1 + 2 = 3’
’That’’s all’
"She said: ""No"""
2.1.4 Chave
Uma chave e uma sequencia de caracteres que aciona alguma funcionalidade.Iremos descreve-las quando necessario.
2.2. EXPRESSOES 5
2.1.5 Delimitador
Um delimitador e um ou dois caracteres especiais que aciona alguma fun-cionalidade. Todos os delimitadores sao apresentados a seguir:
+ ^ == ! : )
- & >= && ; ]
∗ < > || := |/ <= <> . .. {∗∗ = != , ( }
2.1.6 Comentario
Um comentario e qualquer sequencia de caracteres, iniciada com #, utilizadaspara documentacao. Um comentario tambem pode ser iniciado por /∗ eterminado por ∗/.
2.2 Expressoes
Expressoes sao regras para o calculo de algum valor que e representado comoalgum tipo.
2.2.1 Conjuntos
2.3 Objetos
2.3.1 Parametros
Um parametro e qualquer valor numerico que para uma instancia de determi-nado problema comporta-se como uma constante. A sintaxe a ser utilizadae:
param <nome> <pseudonimo> <dominio> , <atributos> ;
onde nome < e uma o nome do parametro, pseudonimo < e o nome doparametro, Qualquer outra constante pode ser declarada de maneira similarseguinto a sintaxe:
onde <tipo> e um dos seguintes tipos primitivos: int, double.Em muitos problemas e comum existir um ou mais conjuntos. A declaracao
de um conjunto pode ser feita de varias maneiras dependendo dos elementosdo conjunto. A seguir apresentamos alguns exemplos de conjuntos:
1. conjunto de numeros:
6 CAPITULO 2. INTRODUCAO
{int} I = {1, 2, 3};
2. conjunto de numeros em sequencia:
{int} I = {1:3};
3. conjunto de strings:
{string} I = {’um’, ’dois’, ’tres’};
Uma vez definido um conjunto podemos utiliza-lo para definir um vetorutilizando a seguinte sintaxe:
int A[I] = [5, 10, 15];
2.3.2 Parametros em arquivo separado
2.4 Variaveis
Uma parte muito importante de qualquer modelo sao as variavies utilizadas.A declaracao de uma variavel utiliza a seguinte sintaxe:
dvar <tipo> <nome da variavel>;
Tambem e possıvel declarar um vetor de variaveis utilizando a seguinte sin-taxe:
dvar <tipo> <nome da variavel>[<conjunto>];
2.4.1 Operacoes
As operacoes aritmeticas permitidas sao:
2.4.2 Funcao Objetivo
Caso o problema seja de maximizacao declaramos a funcao objetivo seguindoa sintaxe:
maximize <operac~oes aritmeticas>;
2.4. VARIAVEIS 7
Se o problema for de minimizacao trocamos maximize por minimize.
2.4.3 Restricoes
Para as restricoes utilizamos a seguinte sintaxe:
subsect to {
<desigualdade 1>;
<desigualdade 2>;
<...>;
}
8 CAPITULO 2. INTRODUCAO
Apendice A
Notacao
N Conjunto dos naturais, isso e, {1, 2, . . .}Z Conjunto dos inteirosZ≥ Conjunto dos inteiros maiores ou igual a zeroZ> Conjunto dos inteiros estritamente maiores que zeroZ≤ Conjunto dos inteiros menores ou igual a zeroZ< Conjunto dos inteiros estritamente menores que zeroR Conjunto dos reaisR≥ Conjunto dos reais maiores ou igual a zeroR> Conjunto dos reais estritamente maiores que zeroR≤ Conjunto dos reais menores ou igual a zeroR< Conjunto dos reais estritamente menores que zeroAm×n Matriz A com m linhas e n colunasA Matriz Aaij Entrada ij da matriz Abm Vetor b com m posicoesb Vetor bbi Entrada i do vetor bitalico expressao extrangeirafonte sans serif nome de alguma empresa ou softwarefonte teletype codigo ou comando de computador
9
10 APENDICE A. NOTACAO
Referencias Bibliograficas
[Fla09] Truls Flatberg. A short OPL tutorial, 2009. http://folk.uio.no/trulsf/opl/opl_tutorial.pdf.
[Mak08] Andrew Makhorin. Modeling Language GNU MathProg, December2008.
11