Você está na página 1de 76

Linguagem de Modelagem GNU MathProg

Linguagem de Referncia
para o GLPK Verso 4.57
(RASCUNHO, Fevereiro 2016)

O pacote GLPK parte do Projeto GNU distribudo sob a gide do GNU.


c 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2013, 2014,
Copyright
2015, 2016 Andrew Makhorin, Department for Applied Informatics, Moscow Aviation Institute,
Moscow, Russia. Todos os direitos reservados.
Ttulo original: Modeling Language GNU MathProg - Language Reference for GLPK Version 4.57
Traduo: Joo Flvio de Freitas Almeida, Departamento de Engenharia de Produo, Universidade
Federal de Minas Gerais, Minas Gerais, Brasil.
c 2015 Joo Flvio de Freitas Almeida, para esta traduo. Todos os direitos reservados.
Copyright
Free Software Foundation, Inc., Rua Franklin, 51, 5o andar, Boston, MA 02110-1301, USA.
permitido realizar e distribuir cpias textuais deste manual mantendo o aviso de copyright e
preservando este aviso de permisso em todas as cpias.
concedida a permisso para copiar e distribuir verses modificadas deste manual sob as condies
de cpias textuais, desde que o resultado completo derivado do trabalho resultante seja distribudo
sob os termos de uma notificao de permisso idntica a esta.
concedida a permisso para copiar e distribuir tradues deste manual em outra linguagem, sob
as condies acima para as verses modificadas.

Contedo
1 Introduo
1.1 Problema de programao linear . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2 Objetos do modelo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.3 Estrutura da descrio do modelo . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2 Codificao da descrio
2.1 Nomes simblicos . . .
2.2 Literais numricos . .
2.3 Literais de cadeia . . .
2.4 Palavras-chave . . . .
2.5 Delimitadores . . . . .
2.6 Comentrios . . . . . .

do
. .
. .
. .
. .
. .
. .

modelo
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .

3 Expresses
3.1 Expresses numricas . . . . . . .
3.1.1 Literais numricos . . . .
3.1.2 ndices . . . . . . . . . . .
3.1.3 Parmetros no-indexados
3.1.4 Parmetros indexados . .
3.1.5 Funes de referncia . . .
3.1.6 Expresses iteradas . . . .
3.1.7 Expresses condicionais .
3.1.8 Expresses parentizadas .
3.1.9 Operadores aritmticos . .
3.1.10 Hierarquia das operaes .
3.2 Expresses simblicas . . . . . .
3.2.1 Funes de referncia . . .
3.2.2 Operadores simblicos . .
3.2.3 Hierarquia de operaes .
3.3 Expresses de indexao e ndices
3.4 Expresses de conjunto . . . . . .
3.4.1 Conjuntos de literais . . .
3.4.2 Conjuntos no-indexados
3.4.3 Conjuntos indexados . . .
3.4.4 Conjuntos aritmticos .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

6
6
7
8

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

9
10
10
10
11
11
12

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

13
13
14
14
14
14
15
16
16
17
17
17
18
18
19
19
19
23
23
24
24
24

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

24
25
25
25
26
26
27
27
27
28
28
29
29
30
30
30
31
31
31
31
32

4 Sentenas
4.1 Sentena set . . . . . . . . . . . . . . . . . . . . .
4.2 Sentena parameter . . . . . . . . . . . . . . . . .
4.3 Sentena variable . . . . . . . . . . . . . . . . . .
4.4 Sentena constraint . . . . . . . . . . . . . . . . .
4.5 Sentena objective . . . . . . . . . . . . . . . . .
4.6 Sentena solve . . . . . . . . . . . . . . . . . . . .
4.7 Sentena check . . . . . . . . . . . . . . . . . . .
4.8 Sentena display . . . . . . . . . . . . . . . . . .
4.9 Sentena printf . . . . . . . . . . . . . . . . . . .
4.10 Sentena for . . . . . . . . . . . . . . . . . . . . .
4.11 Sentena table . . . . . . . . . . . . . . . . . . .
4.11.1 Estrutura de tabelas . . . . . . . . . . . .
4.11.2 Lendo dados de uma tabela de entrada . .
4.11.3 Escrevendo dados em uma tabela de sada

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

33
33
35
37
38
39
40
41
41
42
43
44
45
45
45

5 Dados do modelo
5.1 Programando a seo de dados . . . .
5.2 Bloco de dados set . . . . . . . . . . .
5.2.1 Registro de atribuio de dados
5.2.2 Registro em fatia de dados . . .
5.2.3 Registro simples . . . . . . . .
5.2.4 Registro de matriz . . . . . . .

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

47
48
49
50
50
51
51

3.5

3.6

3.4.5 Expresses indexantes . .


3.4.6 Expresses iteradas . . . .
3.4.7 Expresses condicionais .
3.4.8 Expresses parentizadas .
3.4.9 Operadores de conjunto .
3.4.10 Hierarquia das operaes .
Expresses lgicas . . . . . . . .
3.5.1 Expresses numricas . .
3.5.2 Operadores relacionais . .
3.5.3 Expresses iteradas . . . .
3.5.4 Expresses parentizadas .
3.5.5 Operadores lgicos . . . .
3.5.6 Hierarquia das operaes .
Expresses lineares . . . . . . . .
3.6.1 Variveis no-indexadas .
3.6.2 Variveis indexadas . . . .
3.6.3 Expresses iteradas . . . .
3.6.4 Expresses condicionais .
3.6.5 Expresses parentizadas .
3.6.6 Operadores aritmticos . .
3.6.7 Hierarquia das operaes .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

5.3

5.2.5
Bloco
5.3.1
5.3.2
5.3.3
5.3.4
5.3.5
5.3.6

Registro de matriz transposta .


de dados de parmetro . . . . .
Registro de atribuio . . . . .
Registro em fatia . . . . . . . .
Registro plano . . . . . . . . .
Registro tabular . . . . . . . .
Registro tabular transposto . .
Formato de dados em tabulao

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

A Usando sufixos

52
52
54
54
54
55
55
56
57

B Funes de data e hora


58
B.1 Obtendo o tempo de calendrio corrente . . . . . . . . . . . . . . . . . . . . . . . . . 58
B.2 Convertendo cadeia de caracteres ao tempo de calendrio . . . . . . . . . . . . . . . 58
B.3 Convertendo tempo de calendrio a uma cadeia de caracteres . . . . . . . . . . . . . 60
C Controladores de tabelas
C.1 Controlador de tabelas CSV . .
C.2 Controlador de tabelas xBASE
C.3 Controlador de tabelas ODBC .
C.4 Controlador de tabelas MySQL

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

D Resolvendo modelos com glpsol

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

63
63
65
65
67
70

E Exemplo de descrio de modelo


72
E.1 Descrio de modelo escrito em MathProg . . . . . . . . . . . . . . . . . . . . . . . . 72
E.2 Instncia gerada do problema de PL . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
E.3 soluo tima do problema de PL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
Agradecimentos

76

Captulo 1

Introduo
GNU MathProg uma linguagem de modelagem projetada para descrever modelos lineares de
programao matemtica. 1
A descrio de um modelo escrito na linguagem GNU MathProg consiste em um conjunto de
sentenas e blocos de dados construdo pelo usurio a partir dos elementos de linguagem descritos
neste documento.
Em um processo denominado traduo, um programa denominado tradutor do modelo analisa
a descrio do modelo e o traduz para uma estrutura de dados interna, que pode ser usado tanto
para gerar instncia de um problema de programao matemtica ou obter diretamente a soluo
numrica do problema por meio de um programa chamado solver.

1.1

Problema de programao linear

Em MathProg o problema de programao linear (PL) expresso da seguinte forma:


minimizar (ou maximizar)
z = c1 x1 + c2 x2 + . . . + cn xn + c0

(1.1)

subjeito s restries lineares


L1 a11 x1 + a12 x2 + . . . + a1n xn U1
L2 a21 x1 + a22 x2 + . . . + a2n xn U2
. . . . . . . . .
Lm am1 x1 + am2 x2 + . . . + amn xn Um
1

(1.2)

A linguagem GNU MathProg um subconjunto da linguagem AMPL. A implementao do GLPK


principalmente baseada no artigo: Robert Fourer, David M. Gay, and Brian W. Kernighan, A Modeling Language
for Mathematical Programming. Management Science 36 (1990), pp. 519-54.

e os limites das variveis


l1 x1
l2 x2
. . .
ln xn

u1
u2
. .
un

(1.3)

onde x1 , x2 , . . . , xn so variveis; z a funo objetivo ; c1 , c2 , . . . , cn so coeficientes da funo


objetivo; c0 o termo constante da funo objetivo; a11 , a12 , . . . , amn so coeficientes das restries;
L1 , L2 , . . . , Lm so limites inferiores das restries; U1 , U2 , . . . , Um so limites superiores das
restries; l1 , l2 , . . . , ln so limites inferiores das variveis; u1 , u2 , . . . , un so limites superiores das
variveis.
Os limites das variveis e das restries podem ser tanto finitos quanto infinitos. Alm disso, os
limites inferiores podem ser igual aos limites superiores correspondentes. Logo, os seguintes tipos
de variveis e restries so permitidos:
< x < +
l x < +
< x u

Varivel livre (ilimitada)


Varivel com limite inferior
Varivel com limite superior

lxu

Varivel duplamente limitada

l=x=u

Varivel fixa

<
L
<
L
L=

aj xj < +

Forma linear livre (ilimitada)

aj xj < +

Restrio de desigualdade maior ou igual a

aj xj U

Restrio de desigualdade menor ou igual a

aj xj U

Restrio de desigualdade duplamente limitada

aj xj = U

Restrio de igualdade

Alm de problemas puramente PL, MathProg tambm permite problemas de programao inteira
mista (PIM), onde algumas ou todas as variveis so restritas a serem inteiras ou binrias.

1.2

Objetos do modelo

Em MathProg o modelo descrito em termos de conjuntos, parmetros, variveis, restries e


objetivos, que se denominam objetos do modelo.
O usurio introduz objetos particulares do modelo usando as sentenas da linguagem. Cada
objeto do modelo possui um nome simblico que o identifica de maneira nica sendo projetado para
propsitos de referenciao.
Objetos do modelo, incluindo conjuntos, podem ser matrizes multidimensionais construdos sobre
conjuntos indexantes. Formalmente, uma matriz n-dimensional A o mapeamento:
A : ,
7

(1.4)

onde S1 . . . Sn um subconjunto do produto Cartesiano de conjuntos indexantes, um


conjunto dos membros da matriz. Em MathProg o conjunto chamado o domnio do subndice.
Seus membros so n-tuplas (i1 , . . . , in ), onde i1 S1 , . . . , in Sn .
Se n = 0, o produto Cartesiano acima possui exatamente um membro (denominado 0-tupla),
portanto, conveniente pensar nos objetos escalares como sendo matrizes 0-dimensionais que
possuem apenas um membro.
O tipo dos membros da matriz determinado pelo tipo de objeto do modelo correspondente,
como segue:
Objeto do modelo
Conjunto
Parmetro
Varivel
Restrio
Objetivo

Membro da matriz
Conjunto plano elementar
Nmero ou smbolo
Varivel elementar
Restrio elementar
Objetivo elementar

Para referir a um membro particular de um objeto, este deve possuir subndices. Por exemplo,
se a um parmetro 2-dimensional definido sobre I J, uma referncia a seus membros particulares
pode ser escrito como a[i, j], onde i I e j J. Entende-se que objetos escalares no necessitam
de subndices por serem 0-dimensionais.

1.3

Estrutura da descrio do modelo

s vezes desejvel escrever um modelo que, por diferentes motivos, tenha que requerer diferentes
dados para resolver cada instncia do problema usando o mesmo modelo. Por esta razo, em
MathProg a descrio do modelo consiste em duas partes: a seo de modelo e a seo de dados.
A seo de modelo a principal parte da descrio do modelo, pois ela contm as declaraes dos
objetos do modelo. Ela tambm comum a todos os problemas baseados no modelo correspondente.
A seo de dados uma parte opcional da descrio do modelo que contm dados especficos
para uma instncia particular do problema.
Dependendo do que seja mais conveniente, as sees de modelo e de dados podem ser dispostas
em um arquivo nico ou em dois arquivos separados. Esta ltima funcionalidade permite que se
tenha um quantidade arbitrria de sees de dados diferentes a serem usadas com a mesma seo
de modelo.

Captulo 2

Codificao da descrio do modelo


A descrio do modelo codificada em um formato de arquivo plano de texto usando o conjunto
de caracteres ASCII. Os caracteres vlidos na descrio do modelo so os seguintes:
Caracteres alfabticos:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
a b c d e f g h i j k l m n o p q r s t u v w x y z _
caracteres numricos:
0 1 2 3 4 5 6 7 8 9
caracteres especiais:
! " # & ( ) * + , - . / : ; < = > [ ] ^ { | } ~
caracteres de espao em branco:
SP HT CR NL VT FF
Dentro de literais de cadeia e comentrios quaisquer caracteres ASCII (exceto caracteres de
controle) so vlidos.
Caracteres de espao-em-branco no so significativos. Eles podem ser usados livremente entre
unidades lxicas para melhorar a legibilidade da descrio do modelo. Eles tambm so usados para
separar unidades lxicas entre si, no caso de no existir outra forma de faz-lo.
Sintaticamente a descrio do modelo uma sequncia de unidades lxicas nas seguintes
categorias:
nomes simblicos;
literais numricos;
literais de cadeia;
palavras-chave;
delimitadores;
9

comentrios.
As unidades lxicas da linguagem so discutidas abaixo.

2.1

Nomes simblicos

Um nome simblico consiste de caracteres alfabticos e numricos, em que o primeiro deste


deve ser alfabtico. Todos os nomes simblicos devem ser distintos (sensibilidade s maisculas:
case-sensitive).
Exemplos
alfa123
Este_eh_um_nome
_P123_abc_321
Nomes simblicos so usados para identificar objetos do modelo (conjuntos, parmetros,
variveis, restries, objetivos) e os ndices.
Todos os nomes simblicos (exceto os nomes dos ndices) devem ser nicos, i.e., a descrio do
modelo no pode ter objetos com nomes idnticos. Nomes simblicos de ndices devem ser nicos
dentro do escopo em que so vlidos.

2.2

Literais numricos

Um literal numrico possui a forma xxEsyy, onde xx um nmero com ponto decimal opcional,
s o sinal + ou -, yy um expoente decimal. A letra E insensvel maisculas (case-insensitive)
e pode ser codificada como e.
Exemplos
123
3.14159
56.E+5
.78
123.456e-7
Literais numricos so usados para representar quantidades numricas. Eles possuem significado
fixo bvio.

2.3

Literais de cadeia

Uma literal de cadeia uma sequncia arbitrria de caracteres cercada por aspas tanto simples
como duplas. Ambas formas so equivalentes.
Se uma aspa simples parte de uma literal de cadeia cercada por aspas simples, ela deve ser
codificada duas vezes. De forma anloga, se uma aspa dupla parte de um literal de cadeia cercada

10

por aspas duplas, ela deve ser codificada duas vezes.


Exemplos
Esta eh uma string
"Esta eh outra string"
Copo dagua
"""Beleza"" disse o capitao."
Literais de cadeia so usadas para representar quantidades simblicas.

2.4

Palavras-chave

Uma palavra-chave uma sequncia de caracteres alfabticos e possivelmente alguns caracteres


especiais.
Todas as palavras-chave caem em algumas das duas categorias: palavras-chave reservadas, que
no podem ser usadas como nomes simblicos, e palavras-chave no-reservadas, que so reconhecidas
pelo contexto, portanto, podem ser usadas como nomes simblicos.
As palavras-chave reservadas so as seguintes:
and
by
cross
diff
div

else
if
in
inter
less

mod
not
or
symdiff
then

union
within

Palavras-chave no-reservadas so descritas nas sees posteriores.


Todas as palavras-chave possuem um significado fixo, a ser explicado nas discusses das
construes sintticas correspondentes, onde as palavras-chave so usadas.

2.5

Delimitadores

Um delimitador tanto um caractere especial nico quanto uma sequncia de dois caracteres
especiais, como segue:
+
*
/

**
^
&
<

<=
=
==
>=

>
<>
!=
!

&&
||
.
,

:
;
:=
..

|
~
(
)

[
]
{
}

<-

Se um delimitador consiste de dois caracteres, no deve haver espaos entre os eles.


Todos os delimitadores possuem um significado fixo, a ser explicado nas discusses das
construes sintticas correspondentes, onde os delimitadores so usados.

11

2.6

Comentrios

Com propsitos de documentao, a descrio do modelo pode conter comentrios, que podem
ter duas formas diferentes. A primeira forma um comentrio de linha-nica, que comea com o
caractere # e se estende at o final da linha. A segunda forma uma sequncia de comentrios, que
uma sequncia de quaisquer caracteres cercados por /* e */.
Exemplos
param n := 10; # Este um comentario
/* Este outro comentrio */
Comentrios e caracteres de espao-em-branco so ignorados pelo tradutor do modelo e podem
aparecer em qualquer local da descrio do modelo.

12

Captulo 3

Expresses
Uma expresso uma regra para calcular um valor. Na descrio de um modelo, expresses so
usadas como constituintes de certas sentenas.
No geral, expresses so constitudas de operandos e operadores.
Dependendo do tipo de valor resultante, todas expresses se enquadram nas seguintes categorias:
expresses numricas;
expresses simblicas;
expresses indexantes;
expresses de conjuntos;
expresses lgicas;
expresses lineares.

3.1

Expresses numricas

Uma expresso numrica uma regra para calcular um valor numrico individual representado
como um nmero de ponto-flutuante.
A expresso numrica primria pode ser um literal numrico, um ndice, um parmetro noindexado, um parmetro indexado, uma funo interna de referncia, uma expresso numrica
iterada, uma expresso numrica condicional ou outra expresso cercada por parnteses.
Exemplos
1.23
j
time
a[May 2003,j+1]
abs(b[i,j])

(literal numrico)
(ndice)
(parmetro no-indexado)
(parmetro indexado)
(funo de referncia)

13

sum{i in S diff T} alpha[i] * b[i,j]


if i in I then 2 * p else q[i+1]
(b[i,j] + .5 * c)

(expresso iterada)
(expresso condicional)
(expresso entre parnteses)

Expresses numricas mais genricas, contendo duas ou mais expresses numricas primrias,
podem ser construdas usando determinados operadores aritmticos.
Exemplos
j+1
2 * a[i-1,j+1] - b[i,j]
sum{j in J} a[i,j] * x[j] + sum{k in K} b[i,k] * x[k]
(if i in I and p >= 1 then 2 * p else q[i+1]) / (a[i,j] + 1.5)

3.1.1

Literais numricos

Se a expresso numrica primria um literal numrico, o valor resultante bvio.

3.1.2

ndices

Se a expresso numrica primria um ndice, o valor resultante o valor corrente atribudo


quele ndice.

3.1.3

Parmetros no-indexados

Se a expresso numrica primria um parmetro no-indexado (que deve ser 0-dimensional),


o valor resultante o valor do parmetro.

3.1.4

Parmetros indexados

A expresso numrica primria, que se refere ao parmetro indexado, possui a seguinte forma
sinttica:
nome[i1 , i2 , . . . , in ]
onde nome o nome simblico do parmetro e i1 , i2 , . . . , in so subndices.
Cada subndice deve ser uma expresso numrica ou simblica. O nmero de subndices na lista
de subndices deve ser o mesmo da dimenso do parmetro com o qual a lista de subndices est
associada.
Os valores reais das expresses de subndice so usadas para identificar um membro particular
do parmetro que determina o valor resultante da expresso primria.

14

3.1.5

Funes de referncia

Em MathProg existem as seguintes funes internas, que podem ser usadas como expresses
numricas:
abs(x)
|x|, valor absoluto de x
atan(x)
arctan x, valor principal do arco tangente de x (em radianos)
atan(y, x)
arctan y/x, valor principal do arco tangente de y/x (em radianos).
Neste caso, os sinais de ambos argumentos y e x so usados para
determinar o quadrante do valor resultante
card(X)
|X|, cardinalidade (o nmero de elementos) do conjunto X
ceil(x)
x, menor inteiro no menor que x (teto de x)
cos(x)
cos x, cosseno de x (em radianos)
exp(x)
ex , exponencial de x na base-e
floor(x)
x, maior inteiro no maior que x (piso de x)
gmtime()
o nmero de segundos decorridos deste 00:00:00 de 01 de Jan de 1970,
Tempo Universal Coordenado (detalhes na Seo B.1, pgina 58)
length(s)
|s|, comprimento da cadeia de caracteres s
log(x)
log x, logaritmo natural de x
log10(x)
log10 x, logaritmo comum (decimal) de x
max(x1 , x2 , . . . , xn )
o maior dos valores x1 , x2 , . . . , xn
min(x1 , x2 , . . . , xn )
o menor dos valores x1 , x2 , . . . , xn
round(x)
arrendondamento de x ao inteiro mais prximo
round(x, n)
arrendondamento de x a n dgitos decimais
sin(x)
sin x, seno de x (em radianos)

x, raiz quadrada no-negativa de x


sqrt(x)
str2time(s, f )
converso de uma cadeia de caracteres s ao tempo calendrio (detalhes
na Seo B.2, pgina 58)
trunc(x)
truncado de x ao inteiro mais prximo
trunc(x, n)
truncado de x a n dgitos decimais
Irand224()
gera inteiro pseudo-aleatrio uniformemente distribudo em [0, 224 )
Uniform01()
gera nmero pseudo-aleatrio uniformemente distribudo em [0, 1)
Uniform(a, b)
gera nmero pseudo-aleatrio uniformemente distribudo em [a, b)
Normal01()
gera varivel Gaussiana pseudo-aleatria com = 0 e = 1
Normal(, )
gera varivel Gaussiana pseudo-aleatria com e dados
Os argumentos de todas as funes internas, exceto card, length, e str2time, devem ser
expresses numricas. O argumento de card deve ser uma expresso de conjunto. O argumento de
length e ambos argumentos de str2time devem ser expresses simblicas.
O valor resultante da expresso numrica, que uma funo de referncia, o resultado da
aplicao da funo ao(s) seu(s) argumento(s).
Note que cada funo geradora de nmeros pseudo-aleatrios possui um argumento latente (i.e.,
algum estado interno), que alterado sempre que funo aplicada. Assim, se a funo aplicada
repetidamente mesmos aos argumentos idnticos, devido ao efeito secundrio, sempre se produziro
valores resultantes diferentes.

15

3.1.6

Expresses iteradas

Uma expresso numrica iterada uma expresso numrica primria, que possui a seguinte forma
sinttica:
operador-iterado expresso-indexada integrando
onde o operador-iterado o nome simblico do operador de iterao a ser executado (veja abaixo),
expresso-indexada uma expresso indexada que introduz ndices e controla a iterao e integrando
uma expresso numrica que participa da operao.
Em MathProg existem quatro operadores iterados, que podem ser usados em expresses numricas:
sum

somatrio

f (i1 , . . . , in )

(i1 ,...,in )

prod

produtrio

f (i1 , . . . , in )

(i1 ,...,in )

min

mnimo

max

mximo

min
(i1 ,...,in )

max
(i1 ,...,in )

f (i1 , . . . , in )
f (i1 , . . . , in )

onde i1 , . . . , in so ndices introduzidos nas expresses indexadas, o domnio, um conjunto de


n-tuplas especificado pela expresso indexada que define valores particulares atribudo aos ndices
ao executar a operao iterada e f (i1 , . . . , in ) o integrando, uma expresso numrica cujo valor
resultante depende dos ndices.
O valor resultante de uma expresso numrica iterada o resultado da aplicao do operador
iterado ao seu integrando por todas as n-tuplas contidas no domnio.

3.1.7

Expresses condicionais

Uma expresso numrica condicional uma expresso numrica primria que possui uma das
seguintes formas sintticas:
if b then x else y
if b then x
onde b uma expresso lgica, enquanto que x e y so expresses numricas.
O valor resultante da expresso condicional depende do valor da expresso lgica que segue a
palavra-chave if. Se ela recebe o valor verdadeiro, o valor da expresso condicional o valor da
expresso que segue a palavra-chave then. Caso contrrio, se a expresso lgica recebe o valor falso,
o valor da expresso condicional o valor da expresso que segue a palavra-chave else. Se ocorre
a segunda forma sinttica da expresso condicional, a reduzida, e a expresso lgica recebe o valor
falso, ento o valor resultante da expresso condicional zero.

16

3.1.8

Expresses parentizadas

Qualquer expresso numrica pode ser cercada por parnteses, o que as torna sintaticamente
uma expresso numrica primria.
Parnteses podem ser usados em expresses numricas, como em lgebra, para especificar a
ordem desejada na qual as operaes devem ser realizadas. Quando se usam parnteses, a expresso
entre parnteses avaliada antes e seu o valor resultante usado.
O valor resultante de uma expresso parentizada o mesmo valor de uma expresso cercada
entre parnteses.

3.1.9

Operadores aritmticos

Em MathProg
numricas:
+x
-x
x+y
x-y
x less y
x*y
x/y
x div y
x mod y
x ** y, x ^ y

exitem os seguintes operadores aritmticos, que podem ser usados em expresses


mais unrio
menos unrio
adio
subtrao
diferena positiva (se x < y ento 0 seno x y)
multiplicao
diviso
quociente da diviso exata
resto da diviso exata
exponenciao (elevao a uma potncia)

onde x e y so expresses numricas.


Se a expresso inclui mais de um operador aritmtico, todos operadores so executados da
esquerda para a direita de acordo com a hierarquia das operaes (veja abaixo) com a nica exceo
de que os operadores de exponenciao so executados da direita para a esquerda.
O valor resultante da expresso, que contm operadores aritmticos, o resultado da aplicao
dos operadores aos seus operandos.

3.1.10

Hierarquia das operaes

A lista seguinte apresenta a hierarquia das operaes em expresses numricas:


Operao
Avaliao das funes (abs, ceil, etc.)
Exponenciao (**, ^)
Mais e menos unrio (+, -)
Multiplicao e diviso (*, /, div, mod)
Operaes iteradas (sum, prod, min, max)
Adio e subtrao (+, -, less)
Avaliao condicional (if . . . then . . . else)

17

Hierarquia
1a
2a
3a
4a
5a
6a
7a

Esta hierarquia usada para determinar qual de duas operaes consecutivas deve ser executada
primeiro. Se o primeiro operador possui hierarquia maior ou igual ao segundo, a primeira operao
executada. Caso contrrio, a segunda operao comparada terceira e assim sucessivamente.
Quando se alcana o fim da expresso, todas as operaes remanescentes so executadas na ordem
inversa.

3.2

Expresses simblicas

Uma expresso simblica uma regra para calcular um valor simblico individual representado
como uma cadeia de caracteres.
A expresso simblica primria pode ser uma cadeia literal, um ndice, um parmetro noindexado, um parmetro indexado, uma funo interna de referncia, uma expresso simblica
condicional ou outra expresso simblica cercada entre parnteses.
Tambm permitido usar uma expresso numrica como a expresso simblica primria, neste
caso o valor resultante da expresso numrica automaticamente convertido em um tipo simblico.
Exemplos
Maio de 2003
j
p
s[abc,j+1]
substr(name[i],k+1,3)
if i in I then s[i,j] & "..." else t[i+1]
((10 * b[i,j]) & .bis)

(literal de cadeia)
(ndice)
(parmetro no-indexado)
(parmetro indexado)
(funo de referncia)
(expresso condicional)
(expresso parentizada)

Expresses simblicas mais genricas contendo duas ou mais expresses simblicas primrias
podem ser construdas usando o operador de concatenao.
Exemplos
abc[ & i & , & j & ]
"de " & cidade[i] " para " & cidade[j]
Os princpios da avaliao de expresses simblicas so completamente anlogos queles dados
para expresses numricas (veja acima).

3.2.1

Funes de referncia

Em MathProg existem as seguintes funes internas que podem ser usadas em expresses
simblicas:
substr(s, x)
substring de s iniciado na posio x
substr(s, x, y)
substring de s iniciado na posio x com tamanho y
time2str(t, f )
converte o tempo de calendrio para uma cadeia de caracteres
(detalhes na Seo B.3, pgina 60)
O primeiro argumento de substr deve ser uma expresso simblica enquanto que o segundo e o

18

terceiro (opcional) argumentos devem ser expresses numricas.


O primeiro argumento de time2str deve ser uma expresso numrica, e seu segundo argumento
deve ser uma expresso simblica.
O valor resultante da expresso simblica, que uma funo de referncia, o resultado de
aplicar a funo aos seus argumentos.

3.2.2

Operadores simblicos

Atualmente, em MathProg exite um nico operador simblico:


s & t
onde s e t so expresses simblicas. Este operador implica na concatenao dos seus dois operandos
simblicos, que so cadeias de caracteres.

3.2.3

Hierarquia de operaes

A lista seguinte mostra a hierarquia das operaes em expresses simblicas:


Operao
Avaliao de operaes numricas
Concatenao (&)
Avaliao condicional (if . . . then . . . else)

Hierarquia
1a -7a
8a
9a

Esta hierarquia possui o mesmo significado como explicado acima para expresses numricas
(ver Subseo 3.1.10, pgina 17).

3.3

Expresses de indexao e ndices

Uma expresso indexante uma construo auxiliar que especifica um conjunto plano de n-tuplas
e introduz ndices. Possui duas formas sintticas:
{ entrada1 , entrada2 , . . . , entradam }
{ entrada1 , entrada2 , . . . , entradam : predicado }
onde entrada1 , entrada2 , . . . , entradam so entradas indexantes, predicado uma expresso lgica
que especifica um predicado opcional (condio lgica).
Cada entrada indexante na expresso indexante possui uma das trs formas seguintes:
i in S
(i1 , i2 , . . . ,in ) in S
S
onde i1 , i2 , . . . , in so ndices e S uma expresso de conjunto (discutido na prxima seo) que
especifica o conjunto bsico.

19

O nmero de ndices na entrada indexante deve coincidir com a dimenso do conjunto bsico S,
i.e., se S consiste de 1-tuplas, deve-se usar a primeira forma. Se S consiste de n-tuplas, onde n > 1,
a segunda forma deve ser usada.
Se a primeira forma da entrada indexante usada, o ndice i pode ser apenas um ndice (veja
mais adiante). Se a segunda forma utilizada, os ndices i1 , i2 , . . . , in podem ser tanto ndices
como alguma expresso numrica ou simblica, em que pelo menos um dos ndices deve ser um
ndice. Na terceira, a forma reduzida da entrada indexante possui o mesmo efeito se houver i (se S
1-dimensional) ou i1 , i2 , . . . , in (se S n-dimensional) onde todos so especificados como ndices.
Um ndice um objeto auxiliar do modelo, que atua como uma varivel individual. Os valores
atribudos aos ndices so componentes das n-tuplas dos conjuntos bsicos, i.e., algumas quantidades
numricas e simblicas.
Com propsitos de referncia, ndices podem ter nomes simblicos. No entanto, diferentemente
de outros objetos de modelo (conjuntos, parmetros, etc.)
ndices no precisam ser
explicitamente declarados. Cada nome simblico no-declarado usado na posio indexante de
uma entrada indexante reconhecida como o nome simblico do ndice correspondente.
Os nomes simblicos dos ndices so vlidos somente dentro do escopo da expresso indexante,
onde o ndice foi inserido. Alm do escopo, os ndices so completamente inacessveis, de modo
que os mesmos nomes simblicos podem ser usados para outros propsitos, em particular, para
representar ndices em outras expresses indexantes.
O escopo da expresso indexante, em que declaraes implcitas de ndices so vlidas, depende
do contexto em que a expresso indexante usada:
Se a expresso indexante usada em um operador-iterado, seu escopo se estende at o final do
integrando.
Se a expresso indexante usada como uma expresso de conjunto primria, seu escopo de
estende at o final desta expresso indexante.
Se a expresso indexante usada para definir o domnio do subndice na declarao de alguns
objetos de modelo, seu escopo se estende at o final da declarao correspondente.
O mecanismo de indexao implementado para indexar expresses melhor explicado por alguns
exemplos discutidos abaixo.
Sejam trs conjuntos:
A = {4, 7, 9},
B = {(1, Jan), (1, F ev), (2, M ar), (2, Abr), (3, M ai), (3, Jun)},
C = {a, b, c},
onde A e C consistem de 1-tuplas (singletos), B consiste de 2-tuplas (dobletes). Considere a seguinte
expresso indexante:
{i in A, (j,k) in B, l in C}
onde i, j, k, e l so ndices.

20

Embora MathProg no seja uma linguagem procedural, para qualquer expresso indexante uma
descrio algortmica equivalente pode ser dada. Em particular, a descrio algortmica da expresso
indexante acima poderia ser vista como segue:
para todo i A faa
para todo (j, k) B faa
para todo l C faa
ao;
onde os ndices i, j, k, l so consecutivamente atribudos aos componentes correspondentes das
n-tuplas dos conjuntos bsicos A, B, C, e ao alguma ao que dependa do contexto no qual a
expresso indexante usada. Por exemplo, se a ao fosse imprimir os valores atuais dos ndices, a
impresso seria vista como segue:
i=4
i=4
i=4
i=4
i=4
i=9
i=9

j
j
j
j
j

=1
=1
=1
=1
=1
. . .
j=3
j=3

k
k
k
k
k
.
k
k

= Jan
= Jan
= Jan
= F ev
= F ev
. . .
= Jun
= Jun

l=a
l=b
l=c
l=a
l=b
l=b
l=c

Seja o exemplo da expresso indexante usado na seguinte operao iterada:


sum{i in A, (j,k) in B, l in C} p[i,j,k,l]
onde p uma parmetro numrico 4-dimensional ou alguma expresso numrica cujo valor resultante
dependa de i, j, k e l. Neste caso, a ao o somatrio, de forma que o valor resultante da expresso
numrica primria :

(pijkl ).
iA,(j,k)B,lC

Agora seja a expresso indexante do exemplo usada como uma expresso de conjunto primria.
Neste caso, a ao reunir todas as 4-tuplas (qudruplas) da forma (i, j, k, l) em um conjunto, de
forma que o valor resultante de tal operao simplesmente o produto Cartesiano dos conjuntos
bsicos:
A B C = {(i, j, k, l) : i A, (j, k) B, l C}.
Note que neste caso, a mesma expresso indexante pode ser escrita na forma reduzida:
{A, B, C}
pois os ndices i, j, k e l no so referenciados, portanto, seus nomes simblicos no precisam ser
especificados.

21

Finalmente, seja a expresso indexante do exemplo usada como o domnio do subndice na


declarao de um objeto de modelo 4-dimensional, por exemplo, um parmetro numrico:
param p{i in A, (j,k) in B, l in C} . . . ;
Neste caso, a ao gerar os membros do parmetro, onde cada membro possui a forma p[i, j, k, l].
Como mencionado anteriormente, alguns ndices da segunda forma das entradas indexantes
podem ser expresses numricas ou simblicas, no apenas ndices. Neste caso, os valores resultantes
destas expresses desempenham o papel de algumas condies lgicas para selecionar apenas aquelas
n-tuplas do produto Cartesiano dos conjuntos bsicos que satisfaam estas condies.
Considere, por exemplo, a seguinte expresso indexante:
{i in A, (i-1,k) in B, l in C}
onde i, k e l so ndices, e i-1 uma expresso numrica. A descrio algortmica desta expresso
indexante a seguinte:
para todo i A faa
para todo (j, k) B e j = i 1 faa
para todo l C faa
ao;
Assim, se esta expresso indexante fosse usada como uma expresso de conjunto primria, o conjunto
resultante seira o seguinte:
{(4, M ai, a), (4, M ai, b), (4, M ai, c), (4, Jun, a), (4, Jun, b), (4, Jun, c)}.
Deve-se notar que neste caso o conjunto resultante consiste em 3-tuplas, e no de 4-tuplas, porque
na expresso indexante no h ndice que corresponda ao primeiro componente das 2-tuplas do
conjunto B.
A regra geral : o nmero de componentes de n-tuplas definido por uma expresso indexante o
mesmo do nmero de ndices naquela expresso, onde a correspondncia entre ndices e componentes
nas n-tuplas no conjunto resultante posicional, i.e., o primeiro ndice corresponde ao primeiro
componente, o segundo ndice corresponde ao segundo componente, etc.
Em alguns casos necessrio selecionar um subconjunto do produto Cartesiano de alguns
conjuntos. Isto pode ser alcanado mediante o emprego de um predicado lgico opcional, que
especificado na expresso indexante.
Considere, por exemplo, a seguinte expresso indexante:
{i in A, (j,k) in B, l in C: i <= 5 and k <> Mar}
onde a expresso lgica aps os dois pontos um predicado. A descrio algortmica desta expresso
indexante a seguinte:
para todo i A faa
para todo (j, k) B faa
para todo l C faa
se i 5 e k = M ar ento
ao;
22

Assim, se a expresso indexante fosse usada como uma expresso de conjunto primria, o conjunto
resultante seria o seguinte:
{(4, 1, Jan, a), (4, 1, F ev, a), (4, 2, Abr, a), . . . , (4, 3, Jun, c)}.
Se o predicado no especificado na expresso indexante assume-se um, que recebe o valor
verdadeiro.

3.4

Expresses de conjunto

Uma expresso de conjunto uma regra para calcular um conjunto elementar, i.e., uma coleo
de n-tuplas, onde os componentes das n-tuplas so quantidades numricas e simblicas.
A expresso de conjunto primria pode ser um conjunto de literais, um conjunto no-indexado,
um conjunto indexado, um conjunto aritmtico, uma expresso indexante, uma expresso de
conjunto iterada, uma expresso de conjunto condicional ou outra expresso cercada por
parnteses.
Exemplos
{(123,aaa), (i+1,bbb), (j-1,ccc)}
I
S[i-1,j+1]
1..t-1 by 2
{t in 1..T, (t+1,j) in S: (t,j) in F}
setof{i in I, j in J}(i+1,j-1)
if i < j then S[i,j] else F diff S[i,j]
(1..10 union 21..30)

(conjunto de literais)
(conjunto no-indexado)
(conjunto indexado)
(conjunto aritmtico)
(expresso indexante)
(expresso de conjunto iterado)
(expresso de conjunto condicional)
(expresso de conjunto parentizado)

Expresses de conjuntos mais genricas contendo duas ou mais expresses de conjunto primrias
podem ser construdas usando operadores especficos de conjunto .
Exemplos
(A union B) inter (I cross J)
1..10 cross (if i < j then {a, b, c} else {d, e, f})

3.4.1

Conjuntos de literais

Um conjunto de literais uma expresso de conjunto primria que possui as duas formas
sintticas seguintes:
{e1 , e2 , . . . , em }
{(e11 , . . . , e1n ), (e21 , . . . , e2n ), . . . , (em1 , . . . , emn )}
onde e1 , . . . , em , e11 , . . . , emn so expresses numricas ou simblicas.
Se a primeira forma adotada, o conjunto resultante consiste de 1-tuplas (singletos) enumerados
entre as chaves. permitido especificar um conjunto vazio como { }, que no possui 1-tuplas.
23

Se a segunda forma adotada, o conjunto resultante consiste de n-tuplas enumeradas entre as


chaves, onde uma n-tupla particular consiste nos componentes correspondentes enumerados entre
parnteses. Todas as n-tuplas devem ter o mesmo nmero de componentes.

3.4.2

Conjuntos no-indexados

Se a expresso de conjunto primria um conjunto no-indexado (que deve ser 0-dimensional),


o conjunto resultante um conjunto elementar associado com o objeto conjunto correspondente.

3.4.3

Conjuntos indexados

A expresso de conjunto primria, que se refere a um conjunto indexado, tem a seguinte forma
sinttica:
nome[i1 , i2 , . . . , in ]
onde nome o nome simblico do objeto conjunto e i1 , i2 , . . . , in so subndices.
Cada subndice deve ser uma expresso numrica ou simblica. O nmero de subndices nas lista
de subndices deve ser o mesmo da dimenso do objeto conjunto com o qual as lista de subndice
est associada.
Os valores correntes das expresses de subndices so usados para identificar um membro
particular do objeto conjunto que determina o conjunto resultante.

3.4.4

Conjuntos aritmticos

A expresso de conjunto primria que constitui um conjunto aritmtico, possui as duas formas
sintticas seguintes:
t0 .. t1 by t
t0 .. t1
onde t0 , t1 , e t so expresses numricas (o valor de t no deve ser zero). A segunda forma
equivalente a primeira forma, onde t = 1.
Se t > 0, o conjunto resultante determinado como segue:
{t : k Z(t = t0 + kt, t0 t t1 )}.
Caso contrrio, se t < 0, o conjunto resultante determinado como segue:
{t : k Z(t = t0 + kt, t1 t t0 )}.

3.4.5

Expresses indexantes

Se a expresso primria uma expresso indexante, o conjunto resultante determinado como


descrito anteriormente, na Seo 3.3, pgina 19.

24

3.4.6

Expresses iteradas

Uma expresso de conjunto iterada uma expresso de conjunto primria, que possui a seguinte
forma sinttica:
setof expresso-indexante integrando
onde expresso-indexante uma expresso indexante, que introduz ndices e controla a iterao,
integrando tanto uma expresso numrica ou simblica individual, como uma lista de expresses
numricas ou simblicas separadas por vrgula e cercadas entre parnteses.
Se o integrando uma expresso numrica ou simblica individual, o conjunto resultante consiste
de 1-tuplas, sendo determinado como segue:
{x : (i1 , . . . , in ) },
onde x um valor do integrando, i1 , . . . , in so ndices introduzidos na expresso indexante,
o domnio, um conjunto de n-tuplas especificado pela expresso indexante que define valores
particulares atribudos aos ndices ao realizar a operao de iterao.
Se o integrando uma lista contendo m expresses numricas e simblicas, o conjunto resultante
consiste de m-tuplas, sendo determinado como segue:
{(x1 , . . . , xm ) : (i1 , . . . , in ) },
onde x1 , . . . , xm so valores das expresses na lista de integrandos, i1 , . . . , in e possuem o mesmo
significado anterior.

3.4.7

Expresses condicionais

Uma expresso de conjunto condicional uma expresso de conjunto primria que possui a
seguinte forma sinttica:
if b then X else Y
onde b uma expresso lgica, X e Y so expresses de conjunto, que devem definir conjuntos da
mesma dimenso.
O valor resultante da expresso condicional depende do valor da expresso lgica que segue a
palavra-chave if. Se ela recebe o valor verdadeiro, o conjunto resultante o valor da expresso que
segue a palavra-chave then. Caso contrrio, se a expresso lgica recebe o valor falso, o conjunto
resultante o valor da expresso que segue a palavra-chave else.

3.4.8

Expresses parentizadas

Qualquer expresso de conjunto pode ser cercada entre parnteses, o que as tornam
sintaticamente uma expresso de conjunto primria. Parnteses podem ser usados em expresses
de conjunto, como em lgebra, para especificar a ordem desejada nas quais as operaes devem
ser executadas. Quando se usam parnteses, a expresso entre parnteses avaliada antes que o
valor resultante seja usado. O valor resultante de uma expresso parentizada idntico ao valor da
expresso cercada entre parnteses.

25

3.4.9

Operadores de conjunto

Em MathProg existem os seguintes operadores de conjunto, que podem ser usados em expresses
de conjunto:
X
X
X
X
X

union Y
diff Y
symdiff Y
inter Y
cross Y

unio X Y
diferena X\Y
diferena simtrica X Y = (X\Y ) (Y \X)
interseo X Y
produto Cartesiano (cruzado) X Y

onde X e Y so expresses de conjunto, que devem definir conjuntos de dimenses idnticas (exceto
o produto Cartesiano).
Se a expresso inclui mais de um operador de conjunto, todos operadores so executados da
esquerda para a direita de acordo com a hierarquia das operaes (veja adiante).
O valor resultante da expresso, que contm operadores de conjunto, o resultado da aplicao
dos operadores aos seus operandos.
A dimenso do conjunto resultante, i.e., a dimenso das n-tuplas, dos quais consistem o conjunto
resultante, a mesma da dimenso dos operandos, exceto o produto Cartesiano, onde a dimenso
do conjunto resultante a soma das dimenses dos seus operandos.

3.4.10

Hierarquia das operaes

A lista seguinte mostra a hierarquia das operaes em expresses de conjunto:


Operao
Avaliao de operaes numricas
Avaliao de operaes simblicas
Avaliao de conjuntos iterados ou aritmticos (setof, ..)
Produto Cartesiano (cross)
Interseo (inter)
Unio e diferena (union, diff, symdiff)
Avaliao condicional (if . . . then . . . else)

Hierarquia
1a -7a
8a -9a
10a
11a
12a
13a
14a

Esta hierarquia possui o mesmo significado como explicado anteriormente para expresses
numricas (ver Subseo 3.1.10, pgina 17).

26

3.5

Expresses lgicas

Uma expresso lgica uma regra para calcular um valor lgico individual, que pode ser verdadeiro ou falso.
A expresso lgica primria pode ser uma expresso numrica, uma expresso relacional, uma
expresso lgica iterada ou outra expresso lgica cercada entre parnteses.
Exemplos
(expresso
(expresso
(expresso
(expresso
(expresso
(expresso
(expresso

i+1
a[i,j] < 1.5
s[i+1,j-1] <> Mar & year
(i+1,Jan) not in I cross J
S union T within A[i] inter B[j]
forall{i in I, j in J} a[i,j] < .5 * b[i]
(a[i,j] < 1.5 or b[i] >= a[i,j])

numrica)
relacional)
relacional)
relacional)
relacional)
lgica iterada)
lgica parentizada)

Expresses lgicas mais genricas, contendo duas ou mais expresses lgicas primrias, podem
ser construdas usando determinados operadores lgicos.
Exemplos
not (a[i,j] < 1.5 or b[i] >= a[i,j]) and (i,j) in S
(i,j) in S or (i,j) not in T diff U

3.5.1

Expresses numricas

O valor resultante da expresso lgica primria, que uma expresso numrica, verdadeiro, se
o valor resultante da expresso numrica diferente de zero. Caso contrrio o valor resultante da
expresso lgica falso.

3.5.2

Operadores relacionais

Em MathProg existem os seguintes operadores relacionais, que podem ser usados em expresses
lgicas:
x<y
x <= y
x = y, x == y
x >= y
x>y
x <> y, x != y
x in Y
(x1 ,. . . ,xn ) in Y
x not in Y , x !in Y
(x1 ,. . . ,xn ) not in Y , (x1 ,. . . ,xn ) !in Y
X within Y
X not within Y , X !within Y

verifica
verifica
verifica
verifica
verifica
verifica
verifica
verifica
verifica
verifica
verifica
verifica

se
se
se
se
se
se
se
se
se
se
se
se

x<y
xy
x=y
xy
x>y
x = y
xY
(x1 , . . . , xn ) Y
x Y
(x1 , . . . , xn ) Y
XY
X Y

onde x, x1 , . . . , xn , y so expresses numricas ou simblicas, X e Y so expresses de conjunto.


27

1. Nas operaes in, not in e !in o nmero de componentes nos primeiros operandos deve ser
igual a dimenso do segundo operando.
2. Nas operaes within, not within e !within ambos operandos devem ter a mesma dimenso.
Todos operadores relacionais listados acima tm seus significados matemticos convencionais.
O valor resultante verdadeiro, se a relao correspondente satisfeita para seus operandos, caso
contrrio falso. (Note que valores simblicos so ordenados de forma lexicogrfica e qualquer valor
numrico precede qualquer valor simblico.)

3.5.3

Expresses iteradas

Uma expresso lgica iterada uma expresso lgica primria com a seguinte forma sinttica:
operador-iterado expresso-indexante integrando
onde operador-iterado o nome simblico do operador iterado a ser executado (veja adiante),
expresso-indexante uma expresso indexante que introduz ndices e controla a iterao,
integrando uma expresso numrica que participa da operao.
Em MathProg existem dois operadores iterados que podem ser usados em expresses lgicas:
forall

quantificador-

(i1 , . . . , in ) [f (i1 , . . . , in )],

exists

quantificador-

(i1 , . . . , in ) [f (i1 , . . . , in )],

onde i1 , . . . , in so ndices introduzidos na expresso indexante, o domnio, um conjunto de


n-tuplas especificado pela expresso indexante que define valores especficos atribudos aos ndices
ao executar a operao iterada, e f (i1 , . . . , in ) o integrando, uma expresso lgica cujo valor
resultante depende dos ndices.
Para o quantificador , o valor resultante da expresso lgica iterada verdadeiro, se o valor do
integrando verdadeiro para todas as n-tuplas contidas no domnio, caso contrrio, falso.
Para o quantificador o valor resultante da expresso lgica iterada falso, se o valor do
integrando falso para todas as n-tuplas contidas no domnio, caso contrrio, verdadeiro.

3.5.4

Expresses parentizadas

Qualquer expresso lgica pode ser cercada entre parnteses, o que a converte sintaticamente
em uma expresso lgica primria.
Parnteses podem ser usados em expresses lgicas, como em lgebra, para especificar a ordem
desejada na qual as operaes devem ser executadas. Quando se usam parnteses, a expresso entre
parnteses avaliada antes que o valor resultante seja usado.
O valor resultante da expresso parentizada idntico ao valor da expresso cercada entre
parnteses.

28

3.5.5

Operadores lgicos

Em MathProg existem os seguintes operadores lgicos, que podem ser usados em expresses
lgicas:
not x, !x
x and y, x && y
x or y, x || y

negao x
conjuno (e lgico) x & y
disjuno (ou lgico) x y

onde x e y so expresses lgicas.


Se a expresso inclui mais de um operador lgico, todos operadores so executados da esquerda
para a direita de acordo com a hierarquia das operaes (veja adiante). O valor resultante da
expresso que contm operadores lgicos o resultado da aplicao dos operadores aos seus
operandos.

3.5.6

Hierarquia das operaes

A lista seguinte mostra a hierarquia das operaes em expresses lgicas:


Operation
Avaliao de operaes numricas
Avaliao de operaes simblicas
Avaliao de operaes de conjunto
Operaes relacionais (<, <=, etc.)
negao (not, !)
Conjuno(and, &&)
Quantificao- e - (forall, exists)
Disjuno (or, ||)

Hierarchy
1a -7a
8a -9a
10a -14a
15a
16a
17a
18a
19a

Esta hierarquia possui o mesmo significado como explicado anteriormente para expresses
numricas (ver Subseo 3.1.10, pgina 17).

29

3.6

Expresses lineares

Uma expresso linear uma regra para calcular a chamada forma linear ou simplesmente frmula,
que uma funo linear (ou afim) de variveis elementares.
A expresso linear primria pode ser uma varivel no-indexada, uma varivel indexada, uma
expresso linear iterada, uma expresso linear condicional ou outra expresso linear cercada entre
parnteses.
Tambm e permitido usar uma expresso numrica como a expresso linear primria, neste caso,
o valor resultante da expresso numrica automaticamente convertido para uma frmula que inclui
o termo constante apenas.
Exemplos
z
x[i,j]
sum{j in J} (a[i,j] * x[i,j] + 3 * y[i-1])
if i in I then x[i,j] else 1.5 * z + 3.25
(a[i,j] * x[i,j] + y[i-1] + .1)

(varivel no-indexada)
(varivel indexada)
(expresso linear iterada)
(expresso linear condicional)
(expresso linear parentizada)

Expresses lineares mais genricas, contendo duas ou mais expresses lineares primrias, podem
ser construdas usando determinados operadores aritmticos.
Exemplos
2 * x[i-1,j+1] + 3.5 * y[k] + .5 * z
(- x[i,j] + 3.5 * y[k]) / sum{t in T} abs(d[i,j,t])

3.6.1

Variveis no-indexadas

Se a expresso linear primria uma varivel no-indexada (que deve se 0-dimensional), a frmula
resultante formula aquela varivel no-indexada.

3.6.2

Variveis indexadas

A expresso linear primria que se refere a uma varivel indexada possui a seguinte forma
sinttica:
nome[i1 , i2 , . . . , in ]
onde nome o nome simblico da varivel do modelo, i1 , i2 , . . . , in so subndices.
Cada subndice deve ser uma expresso numrica ou simblica. O nmero de subndices na lista
de subndices deve ser igual ao da dimenso da varivel do modelo com a qual est associada a lista
de subndices.
Os valores correntes das expresses dos subndices so usados para identificar um membro
particular da varivel do modelo que determina a frmula resultante, que uma varivel elementar
associada com o membro correspondente.

30

3.6.3

Expresses iteradas

Uma expresso linear iterada uma expresso linear primria, que tem a seguinte forma sinttica:
sum expresso-indexante integrando
onde expresso-indexante uma expresso indexante, que introduz ndices e controla iteraes,
integrando uma expresso linear que participa da operao.
A expresso linear iterada avaliada exatamente da mesma forma que a expresso numrica
iterada (ver Subseo 3.1.6, pgina 16), exceto que o integrando participante do somatrio uma
frmula e no um valor numrico.

3.6.4

Expresses condicionais

Uma expresso linear condicional uma expresso linear primria, que possui uma das duas
formas sintticas seguintes:
if b then f else g
if b then f
onde b uma expresso lgica, f e g so expresses lineares.
A expresso linear condicional avaliada exatamente da mesma forma que a expresso
condicional numrica (ver Subseo 3.1.7, pgina 16), exceto que os operandos que participam
da operao so frmulas e no valores numricos.

3.6.5

Expresses parentizadas

Qualquer expresso linear pode ser cercada entre parnteses, o que a converte sintaticamente em
uma expresso linear primria.
Parnteses podem ser usados em expresses lineares, como em lgebra, para especificar a ordem
desejada na qual as operaes devem ser executadas. Quando se usam parnteses, a expresso entre
parnteses avaliada antes que a frmula resultante seja usada.
O valor resultante da expresso parentizada idntico ao valor da expresso cercada entre
parnteses.

3.6.6

Operadores aritmticos

Em MathProg existem os seguintes operadores aritmticos, que podem ser usados em expresses
lineares:
+f
mais unrio
-f
menos unrio
f +g
adio
f -g
subtrao
x * f , f * x multiplicao
f /x
diviso
31

onde f e g so expresses lineares, x uma expresso numrica (mais precisamente, uma expresso
linear contendo apenas o termo constante).
Se a expresso inclui mais de um operador aritmtico, todos operadores so executados da
esquerda para a direita de acordo com a hierarquia das operaes (veja adiante). O valor resultante
da expresso, que contm operadores aritmticos, o resultado de aplicar os operadores aos seus
operandos.

3.6.7

Hierarquia das operaes

A hierarquia de operaes aritmticas usada em expresses lineares a mesma para expresses


numricas (ver Subseo 3.1.10, pgina 17).

32

Captulo 4

Sentenas
Sentenas so unidades bsicas da descrio do modelo. Em MathProg todas as sentenas so
divididas em duas categorias: sentenas de declarao e sentenas funcionais.
Sentenas de declarao (sentena set, sentena parameter, sentena variable, sentena
constraint, sentena objective) so usados para declarar objetos de certo tipo do modelo e definir
certas propriedades de tais objetos.
Sentenas funcionais (sentena solve, sentena check, sentena display, sentena printf, sentena
loop, sentena table) so projetadas para executar aes especficas.
Note que sentenas de declarao podem seguir em qualquer ordem arbitrria, o que no afeta
o resultado da traduo. Entretanto, qualquer objeto de modelo deve ser declarado antes de ser
referenciado por outras sentenas.

4.1

Sentena set

set nome alias domnio , atributo , . . . , atributo ;


nome um nome simblico do conjunto;
alias um literal de cadeia opcional que especifica um pseudnimo para o conjunto;
domnio uma expresso indexante opcional que especifica o domnio do subndice do conjunto;
atributo, . . . , atributo so atributos opcionais do conjunto (as vrgulas que precedem os atributos
podem ser omitidas.)
Atributos opcionais
dimen n
especifica a dimenso de n-tuplas das quais o conjunto consistido;
within expresso
especifica um superconjunto que restringe ao conjunto ou a todos seus membros (conjuntos
elementares) a estarem includos naquele superconjunto;
33

:= expresso
especifica um conjunto elementar atribudo ao conjunto ou aos seus membros;
default expresso
especifica um conjunto elementar atribudo ao conjunto ou aos seus membros sempre que no
h dados apropriados disponveis na seo de dados.
Exemplos
set nos;
set arcos within nos cross nos;
set passo{s in 1..maxiter} dimen 2 := if s = 1 then arcos else passo[s-1]
union setof{k in nos, (i,k) in passo[s-1], (k,j) in passo[s-1]}(i,j);
set A{i in I, j in J}, within B[i+1] cross C[j-1], within D diff E,
default {(abc,123), (321,cba)};
A sentena set declara um conjunto. Se o domnio do subndice no especificado, o conjunto
um conjunto simples, caso contrrio ser uma matriz de conjuntos elementares.
O atributo dimen especifica a dimenso de n-tuplas da qual consistida o conjunto (se o conjunto
simples) ou seus membros (se o conjunto uma matriz de conjuntos elementares), em que n deve
ser um inteiro de 1 a 20. Pode-se especificar no mximo um atributo dimen. Se o atributo dimen
no especificado, a dimenso das n-tuplas implicitamente determinada por outros atributos (por
exemplo, se h uma expresso que segue := ou a palavra-chave default, usa-se a dimenso das
n-tuplas do conjunto elementar correspondente). Se nenhuma informao de dimenso fornecida,
assume-se dimen 1.
O atributo within especifica uma expresso de conjunto cujo valor resultante um superconjunto
usado para restringir o conjunto (se o conjunto simples) ou seus membros (se o conjunto uma
matriz de conjuntos elementares) a estar includo naquele superconjunto. Um nmero arbitrrio de
atributos within podem ser especificados na mesma sentena set.
O atributo de atribuio (:=) especifica uma expresso de conjunto usada para avaliar conjunto(s)
elementar(es) atribudo(s) ao conjunto (se o conjunto simples) ou seus membros (se o conjunto
uma matriz de conjuntos elementares). Se o atributo de atribuio especificado, o conjunto
calculvel, portanto, no h a necessidade de fornecer dados na seo de dados. Se o atributo de
atribuio no especificado, deve-se fornecer os dados na seo de dados. Pode-se especificar no
mximo um atributo de atribuio ou default para o mesmo conjunto.
O atributo default especifica uma expresso de conjunto usado para avaliar conjunto(s)
elementar(es) atribudo(s) ao conjunto (se o conjunto simples) ou seus membros (se o conjunto
uma matriz de conjuntos elementares) sempre que no houver dados apropriados disponveis na
seo de dados. Se no se especifica nem o atributo de atribuio nem o atributo default, a falta
de dados causar um erro.

34

4.2

Sentena parameter

param nome alias domnio , attrib , . . . , attrib ;


nome um nome simblico do parmetro;
alias um literal de cadeia opcional que especifica um pseudnimo para o parmetro;
domnio uma expresso indexante opcional que especifica o domnio do subndice do parmetro;
atributo, . . . , atributo so atributos opcionais do parmetro (as vrgulas que precedem os atributos
podem ser omitidas.)
Atributos opcionais
integer
especifica que o parmetro inteiro;
binary
especifica que o parmetro binrio;
symbolic
especifica que o parmetro simblico;
expresso de relao
(onde relao algum de: <, <=, =, ==, >=, >, <>, !=)
especifica uma condio que restringe o parmetro ou seus membros a satisfazer aquela condio;
in expresso
especifica um superconjunto que restringe o parmetro ou seus membros a estarem inseridos
naquele superconjunto;
:= expresso
especifica um valor atribudo ao parmetro ou a seus membros;
default expresso
especifica um valor atribudo ao parmetro ou aos seus membros sempre que no houverem dados
disponveis na seo de dados.
Exemplos
param
param
param
param
if
param
in
param

unidades{insumo, produto} >= 0;


lucro{produto, 1..T+1};
N := 20 integer >= 0 <= 100;
combinacao n escolhe k {n in 0..N, k in 0..n} :=
k = 0 or k = n then 1 else combinacao[n-1,k-1] + combinacao[n-1,k];
p{i in I, j in J}, integer, >= 0, <= i+j, in A[i] symdiff B[j],
C[i,j], default 0.5 * (i + j);
mes symbolic default Mai in {Mar, Abr, Mai};

35

A sentena parameter declara um parmetro. Se o domnio de subndice no especificado, o


parmetro simples (escalar), caso contrrio, uma matriz n-dimensional.
Os atributos de tipo integer, binary e symbolic qualificam os tipos de valores que podem ser
atribudos ao parmetro, conforme demonstrado:
Tipo de atributo
(no especificado)
integer
binary
symbolic

Valores atribudos
Qualquer valor numrico
Apenas valores numricos inteiros
Tanto 0 quanto 1
Qualquer valor numrico e simblico

O atributo symbolic no pode ser especificado juntamente com outros tipos de atributos. Uma
vez especificado, ele deve preceder todos os outros atributos.
O atributo de condio especifica uma condio opcional que restringe os valores atribudos ao
parmetro para satisfazer aquela condio. Este atributo tem as seguintes formas sintticas:
<v
<= v
= v, == v
>= v
>v
<> v, != v

verifica
verifica
verifica
verifica
verifica
verifica

se
se
se
se
se
se

x<v
xv
x=v
xv
xv
x = v

onde x um valor atribudo ao parmetro, v o valor resultante de uma expresso numrica ou


simblica especificado no atributo de condio. Um nmero arbitrrio de atributos de condio pode
ser especificado para o mesmo parmetro. Se, durante a avaliao do modelo, um valor atribudo ao
parmetro viola pelo menos uma das condies especificadas, ocorrer um erro. (Note que valores
simblicos so ordenados de forma lexicogrfica e qualquer valor numrico precede qualquer valor
simblico.)
O atributo in similar ao atributo de condio e especifica uma expresso de conjunto cujo valor
resultante um superconjunto usado para restringir valores numricos ou simblicos atribudos ao
parmetro a estarem includos naquele superconjunto. Pode-se especificar um nmero arbitrrio
de atributos in para o mesmo parmetro. Se, durante a avaliao do modelo, o valor atribudo ao
parmetro no pertence a pelo menos um dos superconjuntos especificados, ocorrer um erro.
O atributo de atribuio (:=) especifica uma expresso numrica ou simblica usada para
computar um valor atribudo ao parmetro (se um parmetro simples) ou seus membros (se o
parmetro uma matriz). Se o atributo de atribuio especificado, o parmetro calculvel,
portanto, no h a necessidade de fornecer dados na seo de dados. Se o atributo de atribuio
no especificado, deve-se fornecer os dados para o parmetro na seo de dados. Pode-se especificar
no mximo um atributo de atribuio ou default para o mesmo parmetro.
O atributo default especifica uma expresso numrica ou simblica usada para computar um
valor atribudo ao parmetro ou seus membros sempre que no houver dados apropriados disponveis
na seo de dados. Se no se especifica nem o atributo de atribuio nem o atributo default, a
falta de dados causar um erro.

36

4.3

Sentena variable

var nome alias domnio , atrib , . . . , atrib ;


nome um nome simblico da varivel;
alias um literal de cadeia opcional que especifica um pseudnimo para a varivel;
domnio uma expresso indexante opcional que especifica o domnio do subndice da varivel;
atrib, . . . , atrib so atributos opcionais da varivel (as vrgulas que precedem os atributos podem
ser omitidas.)
Atributos opcionais
integer
restringe a varivel a ser inteira;
binary
restringe a varivel a ser binria;
>= expresso
especifica um limite inferior para a varivel;
<= expresso
especifica um limite superior para a varivel;
= expresso
especifica um valor fixo para a varivel;
Exemplos
var
var
var
var
var

x >= 0;
y{I,J};
produzir{p in prod}, integer, >= comprometido[p], <= mercado[p];
armazenar{insumo, 1..T+1} >= 0;
z{i in I, j in J} >= i+j;

A sentena variable declara uma varivel. Se no se especifica o domnio do subndice, a varivel


e uma varivel simples (escalar), caso contrrio uma matriz n-dimensional de variveis elementares.
As variveis elementares associadas com a varivel do modelo (se uma varivel simples) ou
seus membros (se uma matriz) corresponde s variveis na formulao do problema PL/PIM (ver
Seo 1.1, pgina 6). Note que somente variveis elementares realmente referenciadas em algumas
restries e/ou objetivos sero includas na instncia do problema PL/PIM a ser gerado.
Os atributos de tipo integer e binary restringem a varivel a ser inteira ou binria,
respectivamente. Se nenhum atributo de tipo especificado, a varivel contnua. Se todas as
variveis no modelo so contnuas, o problema correspondente da classe PL. Se h pelo menos
uma varivel inteira ou binria, o problema da classe PIM.

37

O atributo de limite inferior (>=) especifica uma expresso numrica para calcular um limite
inferior da varivel. No mximo um limite inferior pode ser especificado. Por padro, todas as
variveis (exceto as binrias) no tem limite inferior, assim, se h a necessidade de uma varivel ser
no-negativa, seu limite inferior zero deve ser explicitamente especificado.
O atributo de limite superior (<=) especifica uma expresso numrica para calcular um limite
superior da varivel. No mximo um limite superior pode ser especificado.
O atributo de valor fixo (=) especifica uma expresso numrica para calcular um valor no qual a
varivel fixada. Este atributo no pode ser especificado junto com os atributos de limite.

4.4

Sentena constraint

s.t. nome alias domnio : expresso , = expresso ;


s.t. nome alias domnio : expresso , <= expresso ;
s.t. nome alias domnio : expresso , >= expresso ;
s.t. nome alias domnio : expresso , <= expresso , <= expresso ;
s.t. nome alias domnio : expresso , >= expresso , >= expresso ;
nome um nome simblico da restrio;
alias um literal de cadeia opcional que especifica um pseudnimo da restrio;
domnio uma expresso indexante opcional, que especifica o domnio do subndice da restrio;
expresso uma expresso linear usada para calcular um componente da restrio (as vrgulas que
precedem os atributos podem ser omitidas).
(A palavra-chave s.t. pode ser escrita como subject to, como subj to ou pode ser omitido por
completo).
Exemplos
s.t. r: x + y + z, >= 0, <= 1;
limite{t in 1..T}: sum{j in produto} produzir[j,t] <= max_prod;
subject to balanco{i in insumo, t in 1..T}:
estoque[i,t+1] = estoque[i,t] - sum{j in produto} unidades[i,j] * produzir[j,t];
subject to rlim limite tempo-regular {t in tempo}:
sum{p in produto} pt[p] * rprod[p,t] <= 1.3 * dpp[t] * equipes[t];
A sentena de restrio declara uma restrio. Se o domnio do subndice no especificado, a
restrio uma restrio simples (escalar), caso contrrio, uma matriz n-dimensional de restries
elementares.
Restries elementares associadas com a restrio do modelo (se uma restrio simples) ou
seus membros (se uma matriz) correspondem a restries lineares na formulao do problema de
PL/PIM (ver Seo 1.1, pgina 6).

38

Se a restrio possui a forma de igualdade ou desigualdade simples, i.e., inclui duas expresses,
uma segue depois dos dois pontos e a outra segue depois do sinal de relao =, <= ou >=,
ambas expresses na sentena podem ser expresses lineares. Se a restrio possui a forma de uma
desigualdade dupla, i.e., inclui trs expresses, a expresso do meio pode ser uma expresso linear,
enquanto a da esquerda e a da direita podem ser apenas expresses numricas.
Gerar o modelo , a grosso modo, gerar suas restries, que so sempre avaliadas para todo
domnio do subndice. Avaliar as restries, por sua vez, leva a avaliao de outros objetos de
modelo tais como conjuntos, parmetros e variveis.
A construo de uma restrio linear includa na instncia do problema, que corresponde a uma
restrio elementar particular, realizada como segue.
Se a restrio possui a forma de igualdade ou desigualdade simples, a avaliao de ambas
expresses lineares resultam em duas formas lineares:
f = a1 x1 + a2 x2 + . . . + an xn + a0 ,
g = b1 x1 + b2 x2 + . . . + bn xn + b0 ,
onde x1 , x2 , . . . , xn so variveis elementares; a1 , a2 , . . . , an , b1 , b2 , . . . , bn so coeficientes
numricos; a0 e b0 so termos constantes. Em seguida, todos os termos lineares de f e g so levados
ao lado esquerdo, enquanto que os termos constantes so levados ao lado direito, resultando na
restrio elementar final na forma padro:

=
(a1 b1 )x1 + (a2 b2 )x2 + . . . + (an bn )xn b0 a0 .

Se a restrio possui a forma de desigualdade dupla, a avaliao da expresso linear do meio


resulta na seguinte forma linear:
f = a1 x 1 + a2 x 2 + . . . + an x n + a0 ,
e a avaliao das expresses numricas da esquerda e da direita do dois valores numricos l e u,
respectivamente. Logo, o termo constante da forma linear levado tanto esquerda como direita
para gerar a restrio elementar final na forma padro:
l a0 a1 x1 + a2 x2 + . . . + an xn u a0 .

4.5

Sentena objective

minimize nome alias domnio : expresso ;


maximize nome alias domnio : expresso ;
nome um nome simblico do objetivo;
alias uma literal de cadeia opcional que especifica um pseudnimo do objetivo;
domnio uma expresso indexante opcional que especifica um domnio do subndice do objetivo;
expresso uma expresso linear usada pra calcular a forma linear do objetivo.

39

Exemplos
minimize obj: x + 1.5 * (y + z);
maximize lucro_total: sum{p in produto} lucro[p] * produzir[p];
A sentena objective declara um objetivo. Se o domnio do subndice no especificado, o
objetivo um objetivo simples (escalar). Caso contrrio, uma matriz n-dimensional de objetivos
elementares.
Objetivos elementares associados com o objetivo do modelo (se um objetivo simples) ou seus
membros (se uma matriz) correspondem a restries lineares genricas na formulao do problema
PL/PIM (ver Seo 1.1, pgina 6). No entanto, diferentemente das restries, estas formas lineares
so livres (ilimitadas).
A construo de uma forma linear includa na instncia do problema, a qual corresponde a
uma restrio elementar particular, realizada como segue. A expresso linear especificada da na
sentena objective avaliada para resultar na seguinte forma linear:
f = a1 x 1 + a2 x 2 + . . . + an x n + a0 ,
onde x1 , x2 , . . . , xn so variveis elementares; a1 , a2 , . . . , an so coeficientes numricos; a0 o
termo constante. Logo, a forma linear usada para construir a restrio final elementar na forma
padro:
< a1 x1 + a2 x2 + . . . + an xn + a0 < +.
Como via de regra, a descrio do modelo contm apenas uma sentena objective que define a
funo objetivo usada na instncia do problema. No entanto, permitido declarar uma quantidade
arbitrria de objetivos. Neste caso, a funo objetivo real ser o primeiro objetivo encontrado na
descrio do modelo. Outros objetivos tambm esto includos na instncia do problema, mas eles
no afetam a funo objetivo.

4.6

Sentena solve

solve ;
A sentena solve opcional e pode ser usada apenas uma vez. Se a sentena solve no usada,
ela assumida ao final da seo de modelo.
A sentena solve provoca que o modelo seja resolvido, o que significa calcular os valores numricos
de todas as variveis do modelo. Isto permite usar variveis em sentenas abaixo da sentena solve
como se fossem parmetros numricos.
Note que a sentena variable, constraint e objective no podem ser usadas abaixo da sentena
solve, i.e., todos os principais componentes do modelo devem ser declarados acima da sentena solve.

40

4.7

Sentena check

check domnio : expresso ;


domnio uma expresso indexante opcional que especifica o domnio do subndice da sentena
check;
expresso uma expresso lgica que especifica a condio lgica a ser verificada (os dois pontos
que precedem a expresso podem ser omitidos).
Exemplos
check: x + y <= 1 and x >= 0 and y >= 0;
check sum{i in ORIG} suprimento[i] = sum{j in DEST} demanda[j];
check{i in I, j in 1..10}: S[i,j] in U[i] union V[j];
A sentena check permite a verificao do valor resultante de uma expresso lgica especificada
na sentena. Se o valor falso, um erro reportado.
Se o domnio do subndice no especificado, a verificao realizada apenas uma vez.
Especificar o domnio do subndice permite a execuo de verificaes mltiplas para cada n-tupla
no conjunto domnio. Neste ltimo caso, a expresso lgica pode incluir ndices introduzidos na
expresso indexante correspondente.

4.8

Sentena display

display domnio : item , . . . , item ;


domnio uma expresso indexante opcional que especifica um domnio do subndice da sentena
display;
item, . . . , item so itens a serem mostrados (os dois pontos que precedem o primeiro item podem
ser omitidos).
Exemplos
display: x =, x, y =, y, z =, z;
display sqrt(x ** 2 + y ** 2 + z ** 2);
display{i in I, j in J}: i, j, a[i,j], b[i,j];
A sentena display avalia todos itens especificados na sentena e escreve seus valores em sada
padro (terminal) em formato de texto plano.
Se um domnio de subndice no especificado, os itens so avaliados e mostrados apenas uma
vez. Ao especificar o domnio do subndice, itens so avaliados e mostrados para cada n-tupla no
conjunto do domnio. No ltimo caso, os itens podem incluir ndices introduzidos na expresso
indexante correspondente.
Um item a ser mostrado pode ser um objeto de modelo (conjunto, parmetro, varivel, restrio,

41

objetivo) ou uma expresso.


Se um item um objeto calculvel (i.e., um conjunto ou parmetro com o atributo de atribuio),
o objeto avaliado por todo domnio e em seguida, seu contedo (i.e., o contedo da matriz de
objetos) mostrado. Caso contrrio, se o item no um objeto calculvel, somente seu seu contedo
corrente (i.e., os membros realmente gerados durante a avaliao do modelo) mostrado.
Se o item uma expresso, a expresso avaliada e seu valor resultante mostrado.

4.9

Sentena printf

printf domnio : formato , expresso , . . . , expresso ;


printf domnio : formato , expresso , . . . , expresso > nome-do-arquivo ;
printf domnio : formato , expresso , . . . , expresso nome-do-arquivo ;
domnio uma expresso indexante opcional que especifica o domnio do subndice da sentena
printf;
formato uma expresso simblica cujo valor especifica uma cadeia de controle de formato (os dois
pontos que precedem a expresso de formato podem ser omitidos).
expresso, . . . , expresso so zero ou mais expresses cujos valores devem ser formatados e impressos.
Cada expresso deve ser de tipo numrico, simblico ou lgico.
nome-do-arquivo uma expresso simblica cujo valor especifica um nome de um arquivo de texto
para onde a sada redirecionada. O sinal > significa criar um novo aquivo vazio, enquanto o sinal
significa acrescentar a sada a um arquivo existente. Se o nome do arquivo no especificado, a
sada escrita na sada padro (terminal).
Exemplos
printf Ola, mundo!\n;
printf: "x = %.3f; y = %.3f; z = %.3f\n", x, y, z > "resultado.txt";
printf{i in I, j in J}: "fluxo de %s para %s eh %d\n", i, j, x[i,j]
>> arquivo_resultado & ".txt";
printf{i in I} fluxo total de %s eh %g\n, i, sum{j in J} x[i,j];
printf{k in K} "x[%s] = " & (if x[k] < 0 then "?" else "%g"),
k, x[k];
A sentena printf similar a sentena display, no entanto, ela permite formatar os dados a serem
escritos.
Se um domnio do subndice no especificado, a sentena printf executada apenas uma vez.
Especificar um domnio do subndice gera a execuo da sentena printf para cada n-tupla no
conjunto do domnio. No ltimo caso, o formato e a expresso podem incluir ndices introduzidos
nas expresses indexantes correspondentes.
A cadeia de controle de formato valor da expresso simblica formato especificada na sentena

42

printf. Ela composta de zero ou mais diretivas, como segue: tanto caracteres ordinrios (exceto %),
que so copiados sem modificao ao fluxo de sada, quanto especificaes de converso, provocam
a avaliao da expresso correspondente especificada na sentena printf, do seu formato e da escrita
do valor resultante no fluxo de sada.
As especificaes de converso que podem ser usadas na cadeia de controle de formato so as
seguintes: d, i, f, F, e, E, g, G e s. Estas especificaes possuem a mesma sintaxe e semntica que
na linguagem de programao C.

4.10

Sentena for

for domnio : sentena ;


for domnio : { sentena . . . sentena } ;
domnio uma expresso indexante que especifica um domnio do subndice da sentena for. (Os
dois pontos que seguem a expresso indexante podem ser omitidos).
sentena uma sentena que deve ser executada sob o controle da sentena for;
sentena, . . . , sentena uma sequncia de sentenas (cercada entre chaves) que deve ser executada
sob o controle da sentena for.
Apenas as sentenas seguintes podem ser usadas dentro da sentena for: check, display, printf e
outro for.
Exemplos
for {(i,j) in E: i != j}
{ printf "fluxo de %s para %s eh %g\n", i, j, x[i,j];
check x[i,j] >= 0;
}
for {i in 1..n}
{ for {j in 1..n} printf " %s", if x[i,j] then "Q" else ".";
printf("\n");
}
for {1..72} printf("*");
A sentena for faz com que a sentena, ou uma sequncia de sentenas especificadas como parte
da sentena for, seja executada para cada n-tupla no conjunto do domnio. Assim, sentenas dentro
da sentena for podem incluir ndices introduzidos na expresso indexante correspondente.

43

4.11

Sentena table

table nome alias IN controlador arg . . . arg :


conjunto <- [ cmp , . . . , cmp ] , par ~ cmp , . . . , par ~ cmp ;
table nome alias domnio OUT controlador arg . . . arg :
expr ~ cmp , . . . , expr ~ cmp ;
nome um nome simblico da tabela;
alias um literal de cadeia opcional que especifica um pseudnimo da tabela;
domnio uma expresso indexante que especifica o domnio do subndice da tabela (de sada);
IN significa ler dados de uma tabela de entrada;
OUT significa escrever dados em uma tabela de sada;
controlador uma expresso simblica que especifica o controlador usado para acessar a tabela (para
mais detalhes, ver Apndice C, pgina 63);
arg uma expresso simblica opcional, que um argumento passado ao controlador da tabela.
Esta expresso simblica no deveria incluir ndices especificados no domnio;
conjunto o nome de um conjunto simples opcional chamado conjunto de controle. Pode ser omitido
junto com o delimitador <-;
cmp um nome de campo. Entre colchetes, pelo menos um campo deve ser especificado. O nome
do campo, que segue o nome do parmetro ou de uma expresso, opcional e pode ser omitido
juntamente com o delimitador ~. Neste caso o nome do objeto de modelo correspondente usado
como nome de campo;
par um nome simblico de um parmetro do modelo;
expr uma expresso numrica ou simblica.
Exemplos
table dados IN "CSV" "dados.csv": S <- [DE,PARA], d~DISTANCIA,
c~CUSTO;
table resultado{(d,p) in S} OUT "CSV" "resultado.csv": d~DE, p~PARA,
x[d,p]~FLUXO;
A sentena table permite a leitura de dados de uma tabela para objetos de modelo como conjuntos
e parmetros (no-escalares) assim como escrever dados do modelo para uma tabela.

44

4.11.1

Estrutura de tabelas

Uma tabela de dados um conjunto (desordenado) de registros, onde cada registro consiste do
mesmo nmero de campos e cada campo possui um nico nome simblico denominado o nome do
campo. Por exemplo:
Primeiro
campo

Cabealho da tabela
Primeiro registro
Segundo registro
. . .
ltimo registro

4.11.2

DE
Seattle
Seattle
Seattle
San-Diego
San-Diego
San-Diego

Segundo
campo

PARA
New-York
Chicago
Topeka
New-York
Chicago
Topeka

. . .
DISTANCIA
2.5
1.7
1.8
2.5
1.8
1.4

ltimo
campo

CUSTO
0.12
0.08
0.09
0.15
0.10
0.07

Lendo dados de uma tabela de entrada

A sentena tabela de entrada faz a leitura de dados da tabela especificada, registro por registro.
Uma vez que o registro subsequente foi lido, valores numricos ou simblicos dos campos, cujos
nomes so cercados entre colchetes na sentena table, so reunidos em um n-tuplo. Se o conjunto
de controle especificado na sentena table, este n-tuplo adicionado a ele. Alm disso, um valor
numrico ou simblico de cada campo associado com um parmetro do modelo atribudo ao
membro do parmetro identificado por subndices, que so componentes da n-tupla que acabou de
ser lida.
Por exemplo, a seguinte sentena de tabela de entrada:
table dados IN "...": S <- [DE,PARA], d~DISTANCIA, c~CUSTO;
faz a leitura de valores de quatro campos chamados DE, PARA, DISTANCIA e CUSTO de cada registro
da tabela especificada. Os valores dos campos DE e PARA do um par (f, t), que adicionado ao
conjunto de controle S. O valor do campo DISTANCIA atribudo ao membro do parmetro d[f, t]
enquanto que o valor do campo CUSTO atribudo ao membro do parmetro c[f, t].
Note que a tabela de entrada pode conter campos adicionais cujos nomes no sejam especificados
na sentena tabela, neste caso, os valores destes campos sero ignorados na leitura da tabela.

4.11.3

Escrevendo dados em uma tabela de sada

A sentena tabela de sada gera a escrita de dados na tabela especificada. Note que alguns
controladores (chamados CSV e xBASE) destroem a tabela de sada antes de escrever os dados, i.e.,
deletam todos os registros existentes.
Cada n-tupla no domnio do conjunto especificado gera um registro escrito na tabela de sada. Os
valores dos campos so valores numricos ou simblicos das expresses correspondentes especificadas
45

na sentena table. Estas expresses so avaliadas para cada n-tupla no conjunto do domnio,
portanto, podem incluir ndices introduzidos na expresso indexante correspondente.
Por exemplo, a seguinte sentena da tabela de sada:
table resultado{(f,t) in S} OUT "...": f~DE, t~PARA, x[f,t]~FLUXO;
gera a escrita de registros; um registro para cada par (f, t) no conjunto S para a tabela de sada,
onde cada registro consiste de trs campos chamados DE, PARA e FLUXO. Os valores escritos nos
campos DE e PARA so os valores correntes dos ndices f e t. O valor escrito no campo FLUXO um
valor do membro x[f, t] do correspondente parmetro ou varivel indexada.

46

Captulo 5

Dados do modelo
Os dados do modelo includem conjuntos elementares, que so valores dos conjuntos do modelo,
e valores numricos e simblicos dos parmetros do modelo.
Em MathProg existem duas formas diferentes de fornecer valores aos conjuntos e parmetros do
modelo. Uma forma simplesmente prover os dados necessrios usando o atributo de atribuio. No
entanto, em muitos casos mais prtico separar o modelo prprio dos dados particulares necessrios
para o modelo. Para o ltimo caso, em MathProg h uma outra forma, em que a descrio do modelo
dividida em duas partes: a seo de modelo e a seo de dados.
A seo de modelo a principal parte da descrio do modelo. Ela contm todas as declaraes
de todos objetos do modelo, sendo comum a todos problemas baseados naquele modelo.
A seo de dados uma parte opcional da descrio do modelo que contm dados especficos
para um problema particular.
Em MathProg sees de modelo e de dados podem ser localizadas tanto em um arquivo de texto
ou em dois arquivos de texto separados.
1. Se ambas sees de modelo e de dados esto localizados em um arquivo, o arquivo composto
como segue:
sentena;
sentena;
. . .
sentena;
data;
bloco de dados;
bloco de dados;
. . .
bloco de dados;
end;

47

2. Se a seo de modelo e dados so posicionados em dois arquivos separados, os arquivos so


compostos como segue:
sentena;
sentena;
. . .
sentena;
end;

data;
bloco de dados;
bloco de dados;
. . .
bloco de dados;
end;

Arquivo de modelo

Arquivo de dados

Nota: Se a seo de dados posicionada em um arquivo separado, a palavra-chave data


opcional e pode ser omitida juntamente como o ponto e vrgula que a segue.

5.1

Programando a seo de dados

A seo de dados uma sequncia de blocos de dados em vrios formatos e so discutidos nas
sees seguintes. A ordem na qual os blocos de dados seguem na seo de dados pode ser arbitrria,
portanto, no precisa ser necessariamente a mesma ordem que seguem os elementos correspondentes
da seo de modelo.
As regras para programar a seo de dados so comumente as mesmas que as regras de
programar a descrio do modelo (ver Seo 2, pgina 9), i.e., blocos de dados so compostos com
unidades lxicas bsicas, como nomes simblicos, literais numricos e de cadeia, palavras-chave,
delimitadores e comentrios. No entanto, por convenincia e para melhorar legibilidade, h um
desvio da regra comum: se um literal de cadeia consiste unicamente de caracteres alfanumricos
(incluindo o caractere sublinhado), os sinais + e - e/ou o ponto decimal, ele pode ser programado
sem aspas limitadoras (simples ou duplas).
Todo material numrico e simblico provido na seo de dados programado na forma de
nmeros e smbolos, i.e., diferentemente da seo de modelo, no so permitidas expresses na
seo de dados. Apesar disso, os sinais + e - podem preceder literais numricos para permitir a
programao de quantidades numricas com sinais. Neste caso no deve haver caractere de espao
em branco entre o sinal e o literal numrico seguinte (se houver pelo menos uma espao em branco,
o sinal e o literal numrico seguinte so reconhecidos como duas unidades lxicas diferentes).

48

5.2

Bloco de dados set

set nome , registro , . . . , registro ;


set nome [ smbolo , . . . , smbolo ] , registro , . . . , registro ;
nome um nome simblico do conjunto;
smbolo, . . . , smbolo so subndices que especificam um membro particular do conjunto
(se o conjunto uma matriz, i.e., um conjunto de conjuntos);
registro, . . . , registro so registros.
As vrgulas que precedem os registros podem ser omitidas.
Registros
:=
um elemento de atribuio de registro no-significativo que pode ser usado livremente para
melhorar a legibilidade;
( fatia )
especifica uma fatia;
dados-simples
especifica os dados do conjunto em formato simples;
: dados matriciais
especifica os dados do conjunto em formato de matriz;
(tr) : dados matriciais
especifica os dados do conjunto em formato de matriz transposta. (Neste caso, os dois pontos
que seguem a palavra-chave (tr) podem ser omitidos).
Exemplos
set
set
set
set
set

set
set
set
set

mes := Jan Fev Mar Abr Mai Jun;


mes "Jan", "Fev", "Mar", "Abr", "Mai", "Jun";
A[3,Mar] := (1,2) (2,3) (4,2) (3,1) (2,2) (4,4) (3,4);
A[3,Mar] := 1 2 2 3 4 2 3 1 2 2 4 4 3 4;
A[3,Mar] : 1 2 3 4 :=
1 - + - 2 - + + 3 + - - +
4 - + - + ;
B := (1,2,3) (1,3,2) (2,3,1) (2,1,3) (1,2,2) (1,1,1) (2,1,1);
B := (*,*,*) 1 2 3, 1 3 2, 2 3 1, 2 1 3, 1 2 2, 1 1 1, 2 1 1;
B := (1,*,2) 3 2 (2,*,1) 3 1 (1,2,3) (2,1,3) (1,1,1);
B := (1,*,*) : 1 2 3 :=
1 + - 2 - + +
49

3
(2,*,*) :
1
2
3

1
+
+

+
2
-

3 :=
+
- ;

(Nestes exemplos mes um conjunto simples de singletos, A uma matriz 2-dimensional de duplas
e B um conjunto simples de triplas. Os blocos de dados para o mesmo conjunto so equivalentes
no sentido que especificam os mesmos dados em formatos distintos.)
O bloco de dados do conjunto usado para especificar um conjunto elementar completo que
atribudo a um conjunto (se um conjunto simples) ou a um de seus membros (se o conjunto uma
matriz de conjuntos).1
Blocos de dados podem ser especificados somente para conjuntos no-calculveis, i.e., para
conjuntos que possuem o atributo de atribuio (:=) na sentena set correspondente.
Se o conjunto um conjunto simples, somente seus nomes simblicos devem ser especificados
no cabealho do bloco de dados. Caso contrrio, se o conjunto uma matriz n-dimensional, seus
nomes simblicos devem ser fornecidos com uma lista completa de subndices separados por vrgulas
e cercados em colchetes para especificar um membro particular da matriz de conjuntos. O nmero
de subndices deve ser igual ao da dimenso da matriz de conjuntos, onde cada subndice deve ser
um nmero ou um smbolo.
Um conjunto elementar definido no bloco de dados programado como uma sequncia de
registros descritos abaixo.2

5.2.1

Registro de atribuio de dados

O registro de atribuio de dados (:=) um elemento no-significante. Ele pode ser usado para
melhorar a legibilidade de blocos de dados.

5.2.2

Registro em fatia de dados

O registro em fatia de dados um registro de controle que especifica uma fatia do conjunto
elementar definido no bloco de dados. Ele possui a seguinte forma sinttica:
( s1 , s2 , . . . , sn )
onde s1 , s2 , . . . , sn so componentes da fatia.
Cada componente da fatia pode ser um nmero, smbolo ou asterisco (*). O nmero de
componentes na fatia deve ser o mesmo da dimenso n-tuplas do conjunto elementar a ser definido.
Por exemplo, se o conjunto elementar contm 4-tuplas (qudruplas), a fatia deve ter quatro
componentes. O nmero de asteriscos na fatia denomina a dimenso da fatia.
1

H uma outra forma de especificar dados para um conjunto simples com dados para os parmetros. Esta questo
discutida na prxima seo.
2
Registro simplesmente um termo tcnico. No significa que os mesmos possuem qualquer formato especial.

50

O efeito de usar fatias o seguinte: se uma fatia m-dimensional (i.e., uma fatia contendo m
asteriscos) especificada no bloco de dados, todos registros subsequentes devem especificar tuplas
de dimenso m. Sempre que uma m-tupla encontrada, cada asterisco da fatia substitudo pelos
componentes correspondentes da m-tupla, o que resulta na n-tupla, que includa no conjunto
elementar a ser definido. Por exemplo, se a fatia (a, , 1, 2, ) est vigente e a dupla (3, b)
encontrada no registro subsequente, a 5-tupla resultante a ser includa no conjunto elementar
(a, 3, 1, 2, b).
Se a fatia no possui asteriscos, ela prpria define uma n-tupla completa que includa no
conjunto elementar.
Uma vez especificada uma fatia, a mesma est vigente at que aparea uma nova fatia ou at
que se encontre o fim do bloco de dados. Note que se uma fatia no especificada no bloco de
dados, assume-se uma cujos componentes so asteriscos em todas as posies.

5.2.3

Registro simples

O registro simples define uma n-tupla em um formato simples e possui a seguinte forma sinttica:
t1 , t2 , . . . , tn
onde t1 , t2 , . . . , tn so componentes da n-tupla. Cada componente pode ser um nmero ou um
smbolo. As vrgulas entre os componentes so opcionais e podem ser omitidas.

5.2.4

Registro de matriz

O registro de matriz define diversas 2-tuplas (duplas) em um formato matricial e possui a seguinte
forma sinttica:
:
c1
c2 . . . cn :=
r1 a11 a12 . . . a1n
r2 a21 a22 . . . a2n
. . . . . . . . .
rm am1 am2 . . . amn
onde r1 , r2 , . . . , rm so nmeros e/ou smbolos que correspondem a linhas da matriz; c1 , c2 , . . . , cn
so nmeros e/ou smbolos que correspondem a colunas da matriz, a11 , a12 , . . . , amn so elementos
da matriz, que podem ser tanto + como -. (Neste registro, o delimitador : que precede a lista de
colunas e o delimitador := que segue aps a lista de colunas, no podem ser omitidos.)
Cada elemento aij do bloco de dados matricial (onde 1 i m, 1 j n) correspondem a
2-tuplas (ri , cj ). Se aij o sinal mais (+), a 2-tupla correspondente (ou uma n-tupla maior, se uma
fatia usada) includa no conjunto elementar. Caso contrrio, se aij o sinal menos (-), aquela
2-tupla no includa no conjunto elementar.
Uma vez que o registro de matriz define 2-tuplas, tanto o conjunto elementar quanto a fatia
vigente devem ser 2-dimensional.

51

5.2.5

Registro de matriz transposta

O registro de matriz transposta possui a seguinte forma sinttica:


(tr) : c1
c2
r1
a11 a12
r2
a21 a22
. . . . . . .
rm
am1 am2

. . . cn :=
. . . a1n
. . . a2n
. .
. . . amn

(Neste caso, o delimitador : que segue a palavra-chave (tr) opcional e pode ser omitido.)
Este registro completamente anlogo ao registro de matriz (ver anteriormente) com a nica
exceo de que neste caso, cada elemento aij da matriz passa a corresponder a 2-tupla (cj , ri ) ao
invs de (ri , cj ).
Uma vez especificado, o indicador (tr) tem alcance em todos registros subsequentes at que se
encontre outra fatia ou o fim do bloco de dados.

5.3

Bloco de dados de parmetro

param nome , registro , . . . , registro ;


param nome default valor , registro , . . . , registro ;
param : dados-tabulao ;
param default valor : dados-tabulao ;
nome um nome simblico do parmetro;
valor um valor opcional padro do parmetro;
registro, . . . , registro so registros;
dados-tabulao especifica os dados do parmetro em formato tabulao.
As vrgulas que precedem os registros podem ser omitidas.
Registros
:=
um elemento de atribuio de registro no-significativo que pode ser usado livremente para
melhorar a legibilidade;
[ fatia ]
especifica uma fatia;
dados-planos
especifica os dados do parmetro em formato simples;

52

: dados-tabulares
especifica dados do parmetro em formato tabular;
(tr) : dados-tabulares
especifica dados do parmetro no formato tabular transposto. (Neste caso, os dois pontos que
seguem a palavra-chave (tr) podem ser omitidos).
Exemplos
param
param
param
param
param
param
param
param

T := 4;
mes := 1 Jan 2 Fev 3 Mar 4 Abr 5 Mai;
mes := [1] Jan, [2] Fev, [3] Mar, [4] Abr, [5] Mai;
estoque_inicial := ferro 7.32 niquel 35.8;
estoque_inicial [*] ferro 7.32, niquel 35.8;
custo [ferro] .025 [niquel] .03;
valor := ferro -.1, niquel .02;
: estoque_inicial custo valor :=
ferro
7.32
.025
-.1
niquel
35.8
.03
.02 ;
param : insumo : estoque_inicial custo valor :=
ferro
7.32
.025
-.1
niquel 35.8
.03
.02 ;
param demanda default 0 (tr)
: FRA DET LAN WIN STL FRE LAF :=
chapa 300
.
100
75
.
225 250
bobina 500 750 400 250
.
850 500
placa 100
.
.
50 200
.
250 ;
param custo_transporte :=
[*,*,chapa]: FRA DET LAN WIN STL FRE LAF :=
GARY
30
10
8
10
11
71
6
CLEV
22
7
10
7
21
82
13
PITT
19
11
12
10
25
83
15
[*,*,bobina]: FRA DET LAN WIN STL FRE LAF :=
GARY
39
14
11
14
16
82
8
CLEV
27
9
12
9
26
95
17
PITT
24
14
17
13
28
99
20
[*,*,placa]: FRA DET LAN WIN STL FRE LAF :=
GARY
41
15
12
16
17
86
8
CLEV
29
9
13
9
28
99
18
PITT
26
14
17
13
31 104
20 ;
O bloco de dados do parmetro usado para especificar dados completos para um parmetro (ou
parmetros, se os dados so especificados no formato tabulao).
Os blocos de dados podem ser especificados apenas para parmetros no-calculveis, i.e., para
parmetros que no possuem o atributo de atribuio (:=) nas sentenas parameter correspondentes.
Os dados definidos no bloco de dados do parmetro so programados como uma sequncia de
registros descritos em seguida. Adicionalmente, o bloco de dados pode vir com o atributo opcional
53

default, que especifica um valor numrico ou simblico padro do parmetro (ou parmetros).
Este valor padro atribudo ao parmetro ou a seus membros quando no se definem valores
apropriados no bloco de dados do parmetro. O atributo default no pode ser usado se ele j tiver
sido especificado na sentena parameter correspondente.

5.3.1

Registro de atribuio

O registro de atribuio (:=) um elemento no-significativo. Ele pode ser usado para melhorar
a legibilidade dos blocos de dados;

5.3.2

Registro em fatia

O registro em fatia um registro de controle que especifica uma fatia da matriz do parmetro.
Ele tem a seguinte forma sinttica:
[ s1 , s2 , . . . , sn ]
onde s1 , s2 , . . . , sn so componentes da fatia.
Cada componente da fatia pode ser um nmero, smbolo ou asterisco (*). O nmero de
componentes na fatia deve ser o mesmo da dimenso n-tuplas do parmetro. Por exemplo, se
o parmetro uma matriz 4-dimensional, a fatia deve ter quatro componentes. O nmero de
asteriscos na fatia denomina a dimenso da fatia.
O efeito de usar fatias o seguinte: se uma fatia m-dimensional (i.e., uma fatia contendo
m asteriscos) especificada no bloco de dados, todos registros subsequentes devem especificar os
subndices do membros do parmetro, como se o parmetro fosse m-dimensional, no n-dimensional.
Sempre que m subndices so encontrados, cada asterisco da fatia substitudo pelos
componentes correspondentes que do n subndices, que definem o membro corrente do parmetro.
Por exemplo, se a fatia (a, , 1, 2, ) est vigente e os subndices 3 e b so encontradas no
registro subsequente, a lista completa de subndices usada para escolher o membro do parmetro
(a, 3, 1, 2, b).
permitido especificar uma fatia que no tenha asteriscos. Tal fatia, em si prpria, define uma
lista completa de subndice, em cujo caso o prximo registro deve definir apenas um nico valor do
membro correspondentes do parmetro.
Uma vez especificada uma fatia, a mesma est vigente at que aparea uma nova fatia ou at
que se encontre o fim do bloco de dados. Note que se uma fatia no especificada no bloco de
dados, assume-se uma cujos componentes so asteriscos em todas as posies.

5.3.3

Registro plano

O registro plano define uma lista de subndice e um valor individual no formato plano. Este
registro possui a seguinte forma sinttica:
t1 , t2 , . . . , tn , v
54

onde t1 , t2 , . . . , tn so subndices e v um valor. Cada subndice, assim como o valor, pode ser um
nmero ou um smbolo. As vrgulas que seguem os subndices so opcionais e podem ser omitidas.
No caso de um parmetro ou fatia 0-dimensional, o registro plano no possui subndice e consiste
de um valor individual apenas.

5.3.4

Registro tabular

O registro tabular define diversos valores onde cada valor provido de dois subndices. Este
registro possui a seguinte forma sinttica:
:
r1
r2
rm

c1
c2
a11 a12
a21 a22
. . . . . .
am1 am2

...
...
...
. .
...

cn
a1n
a2n

:=

.
amn

onde r1 , r2 , . . . , rm so nmeros e/ou smbolos que correspondem a linhas da tabela; enquanto que
c1 , c2 , . . . , cn so so nmeros e/ou smbolos que correspondem a colunas da tabela, a11 , a12 , . . . ,
amn so elementos da tabela. Cada elemento pode ser um nmero, smbolo ou o ponto decimal (.)
individual. (neste registro, o delimitador : que precede a lista de colunas e o delimitador := que
segue aps a lista de colunas, no podem ser omitidos).
Cada elemento aij do bloco de dados tabulares (1 i m, 1 j n) define dois subndices,
onde o primeiro subndice ri e o segundo cj . Estes subndices so usados juntamente com a
fatia vigente para formar a lista completa de subndices que identifica um membro particular da
matriz de parmetros. Se aij um nmero ou um smbolo, este valor atribudo ao membro do
parmetro. No entanto, se aij um ponto decimal individual, o membro atribudo ao valor padro
especificado ou no bloco de dados do parmetro ou na sentena parameter, ou ainda, se nenhum
valor padro especificado, o membro permanece indefinido.
Uma vez que o registro tabular fornece dois subndices para cada valor, tanto o parmetro quanto
a fatia vigente em uso devem ser 2-dimensional.

5.3.5

Registro tabular transposto

O registro tabular transposto possui a seguinte forma sinttica:


(tr) : c1
c2
r1
a11 a12
r2
a21 a22
. . . . . . .
rm
am1 am2

. . . cn :=
. . . a1n
. . . a2n
. .
. . . amn

(Neste caso, o delimitador : que segue a palavra-chave (tr) opcional e pode ser omitida.)
Este registro completamente anlogo ao registro tabular (ver anteriormente) com a nica
exceo que o primeiro subndice definido pelo elemento aij cj enquanto que o segundo ri .
55

Uma vez especificado, o indicador (tr) afeta todos registros subsequentes at que se encontre
outra fatia ou o fim do bloco de dados.

5.3.6

Formato de dados em tabulao

O bloco de dados do parmetro no formato tabulao possui a seguinte forma sinttica:


param
r11 ,
r21 ,
...
rm1 ,

default valor
r12 , . . . ,
r22 , . . . ,
...
...
rm2 , . . . ,

:s:
r1n ,
r2n ,
...
rmn ,

p1 ,
a11 ,
a21 ,
...
am1 ,

p2 ,
a12 ,
a22 ,
...
am2 ,

...
...
...
...
...

, pr :=
, a1r ,
, a2r ,
...
, amr ;

1. A palavra-chave default pode ser omitida juntamente com o valor que a segue.
2. O nome simblico s pode ser omitido juntamente com os dois pontos que o segue.
3. Todas as vrgulas so opcionais e podem ser omitidas.
O bloco de dados no formato tabulao mostrado acima exatamente equivalente aos seguintes
blocos de dados:
set s := (r11 ,r12 , . . . ,r1n ) (r21 ,r22 , . . . ,r2n ) . . . (rm1 ,rm2 , . . . ,rmn );
param p1 default valor :=
[r11 ,r12 , . . . ,r1n ] a11 [r21 ,r22 , . . . ,r2n ] a21 . . . [rm1 ,rm2 , . . . ,rmn ] am1 ;
param p2 default valor :=
[r11 ,r12 , . . . ,r1n ] a12 [r21 ,r22 , . . . ,r2n ] a22 . . . [rm1 ,rm2 , . . . ,rmn ] am2 ;
. . . . . . . . .
param pr default valor :=
[r11 ,r12 , . . . ,r1n ] a1r [r21 ,r22 , . . . ,r2n ] a2r . . . [rm1 ,rm2 , . . . ,rmn ] amr ;

56

Apndice A

Usando sufixos
Sufixos podem ser usados para recuperar valores adicionais associados com as variveis, restries
e objetivos do modelo.
Um sufixo consiste de um ponto (.) seguido por uma palavra-chave no-reservada. Por exemplo,
se x uma varivel bi-dimensional, x[i,j].lb um valor numrico igual ao limite inferior da varivel
elementar x[i,j], que (cujo valor) pode ser usado em expresses como um parmetro numrico.
Para as variveis do modelo, os sufixos possuem o seguinte significado:
.lb
.ub
.status

.val
.dual

limite inferior (lower bound)


limite superior (upper bound)
status na soluo:
0 indefinida
1 bsica
2 no-bsica no limite inferior
3 no-bsica no limite superior
4 varivel no-bsica livre (ilimitada)
5 varivel no-bsica fixa
valor primal na soluo
valor dual (custo reduzido) na soluo

Para as restries e objetivos do modelo, os sufixos tm os seguintes significados:


.lb
.ub
.status

.val
.dual

limite inferior (lower bound) da forma linear


limite superior (upper bound) da forma linear
status na soluo:
0 indefinida
1 no-limitante
2 limitante no limite inferior
3 limitante no limite superior
4 linha limitante livre (ilimitada)
5 restrio de igualdade limitante
valor primal da forma linear na soluo
valor dual (custo reduzido) da forma linear na soluo

Note que os sufixos .status, .val e .dual podem ser usados apenas abaixo da sentena solve.
57

Apndice B

Funes de data e hora


por Andrew Makhorin <mao@gnu.org>
e Heinrich Schuchardt <heinrich.schuchardt@gmx.de>

B.1

Obtendo o tempo de calendrio corrente

Para obter o tempo de calendrio corrente em MathProg existe a funo gmtime. Ela no possui
argumentos e retorna o nmero de segundos transcorridos desde 00:00:00 de 1o de Janeiro de 1970,
pelo Tempo Universal Coordenado (UTC). Por exemplo:
param utc := gmtime();
MathProg no possui uma funo para converter o tempo UTC retornado pela funo gmtime
para os tempos de calendrio local. Assim, para determinar o tempo de calendrio local corrente,
preciso que adicione ao tempo UTC retornado a diferena de horas, com respeito a UTC, expressa
em segundos. Por exemplo, a hora em Berlim durante o inverno uma hora frente do UTC, que
corresponde a uma diferena horria de +1 hora = +3600 segundos, assim, o tempo de calendrio
corrente no inverno em Berlim pode ser determinado como segue:
param now := gmtime() + 3600;
De forma anloga, o horrio de vero em Chicago (Zona Horria Central-CDT) cinco horas atrs
da UTC, de modo que o horrio corrente do calendrio local pode ser determinado como segue:
param now := gmtime() - 5 * 3600;
Note que o valor retornado por gmtime voltil, i.e., ao ser chamada diversas vezes, esta funo
pode retornar diferentes valores.

B.2

Convertendo cadeia de caracteres ao tempo de calendrio

A funo str2time(s, f) converte uma cadeia de caractere (impresso da data e hora)


especificada pelo seu primeiro argumento s, que deve ser uma expresso simblica, para o tempo de

58

calendrio apropriado para clculos aritmticos. A converso controlada pela cadeia de formato
especificado f (o segundo argumento), que tambm deve ser uma expresso simblica.
A converso resultante retornada por str2time possui o mesmo significado dos valores retornados
pela funo gmtime (ver Subseo B.1, pgina 58). Note que str2time no corrige o tempo de
calendrio retornado para zona horria local, i.e., ao se aplicar a 00:00:00 de 1o de Janeiro de 1970,
ela sempre retorna 0.
Por exemplo, as sentenas de modelo:
param s, symbolic, := "07/14/98 13:47";
param t := str2time(s, "%m/%d/%y %H:%M");
display t;
produz a seguinte sada:
t = 900424020
onde o tempo de calendrio impresso corresponde a 13:47:00 em 14 de Julho de 1998.
A cadeia de formato passada funo str2time consiste de especificadores de converso e
caracteres ordinrios. Cada especificador de converso inicia com um caractere de porcentagem (%)
seguido de uma letra.
Os seguintes especificadores de converso podem ser usados na cadeia de formato:
%b

O nome do ms abreviado (insensvel a maisculas). Pelo menos as trs primeiras letras


do ms devem aparecer na cadeia de entrada.

%d

O dia do ms como nmero decimal (de 1 at 31). Se permite o zero como primeiro dgito,
embora no seja necessrio.

%h

O mesmo que %b.

%H

A hora como um nmero decimal, usando um relgio de 24-horas (de 0 a 23). Se permite
o zero como primeiro dgito, embora no seja necessrio.

%m

O ms como um nmero decimal (de 1 a 12). Se permite o zero como primeiro dgito,
embora no seja necessrio.

%M

O minuto como um nmero decimal (de 0 a 59). Se permite o zero como primeiro dgito,
embora no seja necessrio.

%S

O segundo como um nmero decimal (de 0 to 60). Se permite o zero como primeiro dgito,
embora no seja necessrio.

%y

O ano sem o sculo, como um nmero decimal (de 0 to 99). Se permite o zero como
primeiro dgito, embora no seja necessrio. Valores de entrada de 0 a 68 so considerados
dos anos 2000 a 2068 enquanto que os valores 69 at 99 como dos anos 1969 to 1999.

%z

A diferena horria do GMT no formato ISO 8601.

%%

Um caractere % literal.

Todos os outros caracteres (ordinrios) na cadeia de formato devem ter um caractere


correspondente com a cadeia de entrada a ser convertida. Excees so espaos na cadeia de

59

entrada, a qual pode coincidir com zero ou mais caracteres de espao na cadeia de formato.
Se algum componente de data e/ou hora esto ausentes no formato e, portanto, na cadeia de
entrada, a funo str2time usa seus valores padro correspondendo a 00:00:00 de 1o de Janeiro de
1970, ou seja, o valor padro para o ano 1970, o valor padro para o ms Janeiro, etc.
A funo str2time aplicvel a todos horrios calendrio desde 00:00:00 de 1o de Janeiro de
0001 at 23:59:59 de 31 de Dezembro de 4000 do calendrio Gregoriano.

B.3

Convertendo tempo de calendrio a uma cadeia de caracteres

A funo time2str(t, f) converte o tempo de calendrio especificado pelo seu primeiro


argumento t, que deve ser uma expresso numrica, para uma cadeia de caracteres (valor
simblico). A converso controlada pela cadeia de formato f (o segundo argumento), que deve ser
uma expresso numrica.
O tempo de calendrio passado para time2str possui o mesmo significado dos valores retornados
pela funo gmtime (ver Subseo B.1, pgina 58). Note que time2str no corrige o tempo de
calendrio especificado para zona horria local, i.e., o tempo de calendrio 0 sempre corresponde a
00:00:00 de 1o de Janeiro de 1970.
Por exemplo, as sentenas de modelo:
param s, symbolic, := time2str(gmtime(), "%FT%TZ");
display s;
pode produzir a seguinte impresso:
s = 2008-12-04T00:23:45Z
que a impresso da data e hora no formato ISO.
A cadeia de formato passada para a funo time2str consiste de especificadores de converso e
caracteres ordinrios. Cada especificador de converso comea com um caractere de porcentagem
(%) seguido de uma letra.
Os seguintes especificadores de converso podem ser usados na cadeia de formato:
%a

O nome do dia da semana abreviado(2 caracteres).

%A

O nome do dia da semana completo.

%b

O nome do dia do ms abreviado (3 caracteres).

%B

O nome do ms completo.

%C

O sculo do ano, ou seja, o maior inteiro no maior que o ano dividido por 100.

%d

O dia do ms como um nmero decimal (de 01 at 31).

%D

A data usando o formato %m/%d/%y.

%e

O dia do ms, como em %d, mas preenchido com espao em branco ao invs de zero.

%F

A data usando o formato %Y-%m-%d.

60

%g

O ano correspondente ao nmero de semana ISO, mas sem o sculo (de 00 at 99). Este
possui o mesmo formato e valor que %y, exceto que se o nmero de semana ISO (ver %V)
pertence ao ano anterior ou seguinte, se usa aquele ano em seu lugar.

%G

O ano correspondente ao nmero de semana ISO. Este possui o mesmo formato e valor
que %Y, exceto que se o nmero de semana ISO (ver %V) pertence ao ano anterior ou
seguinte, se usa aquele ano em seu lugar.

%h

O mesmo que %b.

%H

A hora como um nmero decimal usando um relgio 24 horas (de 00 at 23).

%I

A hora como um nmero decimal usando um relgio 12 horas (de 01 at 12).

%j

O dia do ano como um nmero decimal (de 001 at 366).

%k

A hora como um nmero decimal usando um relgio 24 horas, como %H, mas preenchido
com espao em branco ao invs de zero.

%l

A hora como um nmero decimal usando um relgio 12 horas, como %I, mas preenchido
com espao em branco ao invs de zero.

%m

O ms como um nmero decimal (de 01 at 12).

%M

O minuto como um nmero decimal (de 00 at 59).

%p

Tanto AM como PM, de acordo com o valor da hora fornecido. Meia-noite tratada como
AM e meio-dia, como PM.

%P

Tanto am como pm, de acordo com o valor da hora fornecido. Meia-noite tratada como
am e meio-dia, como pm.

%R

A hora e minuto em nmeros decimais usando o formato %H:%M.

%S

O segundo como um nmero decimal (de 00 at 59).

%T

A hora do dia em nmeros decimais usando o formato %H:%M:%S.

%u

O dia da semana como nmero decimal (de 1 at 7) em que Segunda 1.

%U

O nmero da semana do ano corrente como um nmero decimal (de 00 at 53) iniciando
com o primeiro Domingo como o primeiro dia da primeira semana. Os dias que precedem
o primeiro Domingo do ano so considerados parte da semana 00.

%V

O nmero da semana ISO como um nmero decimal (de 01 at 53). Semanas ISO iniciam
com Segunda e finalizam com Domingo. A semana 01 de um ano a primeira semana
que possui a maioria de seus dias naquele ano. Isto equivalente semana contendo 4 de
Janeiro. A semana 01 de um ano pode conter dias do ano anterior. A semana anterior
semana 01 de um ano a ltima semana (52 ou 53) do ano anterior, mesmo se ela contm
dias do novo ano. Em outras palavras, se 1o de Janeiro Segunda, Tera, Quarta ou
Quinta, ele est na semana 01; Se 1o de Janeiro Sexta, Sbado ou Domingo, ele est na
semana 52 ou 53 do ano anterior.

%w

O dia da semana como um nmero decimal (de 0 at 6) em que Domingo 0.

61

%W

O nmero da semana do ano corrente como um nmero decimal (de 00 at 53), iniciando
com a primeira Segunda como o primeiro dia da primeira semana. Dias que precedem a
primeira Segunda do ano so considerados parte da semana 00.

%y

O ano sem o sculo como um nmero decimal (de 00 at 99), ou seja, o ano mod 100.

%Y

O ano como um nmero decimal, usando o calendrio Gregoriano.

%%

Um caractere % literal.

Todos os outros caracteres (ordinrios) na cadeia de formato so simplesmente copiados cadeia


resultante.
O primeiro argumento (tempo do calendrio) passado para a funo time2str deve estar entre
62135596800 at +64092211199, o que corresponde ao perodo de 00:00:00 de 1o de Janeiro de
0001 at 23:59:59 de 31 de Dezembro de 4000 do calendrio Gregoriano.

62

Apndice C

Controladores de tabelas
por Andrew Makhorin <mao@gnu.org>
e Heinrich Schuchardt <heinrich.schuchardt@gmx.de>
O controlador de tabelas um mdulo do programa que permite transmitir dados entre objetos
de um modelo MathProg e tabela de dados.
Atualmente, o pacote GLPK possui quatro controladores de tabelas:
controlador interno de tabelas CSV;
controlador interno de tabelas xBASE;
controlador de tabelas ODBC;
controlador de tabelas MySQL.

C.1

Controlador de tabelas CSV

O controlador de tabelas CSV assume que a tabela de dados est representada na forma de
arquivo de texto plano, em formato de arquivo CSV (valores serparados por vgula:
comma-separated values) como descrito abaixo.
Para escolher o controlador de tabelas CSV, seu nome na sentena table deve ser especificado
como "CSV" e o nico argumento deve especificar o nome do arquivo de texto plano contendo a
tabela. Por exemplo:
table dados IN "CSV" "dados.csv": ... ;
O sufixo do nome do arquivo pode ser arbitrrio, no entanto, recomendado usar o sufixo .csv.
Ao ler tabelas de entrada o controlador de tabelas CSV fornece um campo implcito chamado
RECNO, que contm o nmero do registro corrente. Este campo pode ser especificado na sentena
de entrada table, como se realmente houvesse um campo chamado RECNO no arquivo CSV. Por
exemplo:
table lista IN "CSV" "lista.csv": num <- [RECNO], ... ;

63

Formato CSV1
O formato CSV (comma-separated values) um formato de arquivo de texto plano definido como
segue.
1. Cada registro localizado em uma linha separada, delimitada por uma quebra de linha. Por
exemplo:
aaa,bbb,ccc\n
xxx,yyy,zzz\n
onde \n significa o caractere de controle LF (0x0A).
2. O ltimo registro no arquivo pode ou no ter a quebra de linha. Por exemplo:
aaa,bbb,ccc\n
xxx,yyy,zzz
3. Deve haver uma linha de cabealho na primeira linha do arquivo no mesmo formato das linhas
de registros normais. Este cabealho deve conter nomes correspondendo aos campos no arquivo. O
nmero de nomes de campos na linha de cabealho deve ser o mesmo do nmero de campos dos
registros do arquivo. Por exemplo:
nome1,nome2,nome3\n
aaa,bbb,ccc\n
xxx,yyy,zzz\n
4. Dentro do cabealho e de cada registro, podem haver um ou mais campos separados por
vrgulas. Cada linha deve conter o mesmo nmero de campos por todos arquivo. Espaos so
considerados parte de um campo, portanto, no so ignorados. O ltimo campo do registro no
deve ser seguido de vrgula. Por exemplo:
aaa,bbb,ccc\n
5. Campos podem ou no estar cercados em aspas duplas. Por exemplo:
"aaa","bbb","ccc"\n
zzz,yyy,xxx\n
6. Se um campo cercado de aspas duplas, cada aspa dupla que faa parte do campo deve ser
codificado duas vezes. Por exemplo:
"aaa","b""bb","ccc"\n
Exemplo
DE,PARA,DISTANCIA,CUSTO
Seattle,New-York,2.5,0.12
Seattle,Chicago,1.7,0.08
Seattle,Topeka,1.8,0.09
San-Diego,New-York,2.5,0.15
San-Diego,Chicago,1.8,0.10
San-Diego,Topeka,1.4,0.07
1

Este material baseado no documento RFC 4180.

64

C.2

Controlador de tabelas xBASE

O controlador de tabelas xBASE assume que a tabela de dados armazenada no formato de


arquivo .dbf.
Para escolher o controlador de tabela xBASE, seu nome na sentena table deve ser especificado
como "xBASE" e o primeiro argumento deve especificar o nome de um arquivo .dbf contendo a tabela.
Para a tabela de sada deve haver um segundo argumento definindo o formato da tabela na forma
"FF...F", onde F tanto C(n), que especifica um campo de caractere de tamanho n, ou N(n[,p]),
que especifica um campo numrico de tamanho n e preciso p (por padro p 0).
Adiante est um simples exemplo que ilustra a criao e leitura de um arquivo .dbf:
table tab1{i in 1..10} OUT "xBASE" "foo.dbf"
"N(5)N(10,4)C(1)C(10)": 2*i+1 ~ B, Uniform(-20,+20) ~ A,
"?" ~ FOO, "[" & i & "]" ~ C;
set S, dimen 4;
table tab2 IN "xBASE" "foo.dbf": S <- [B, C, RECNO, A];
display S;
end;

C.3

Controlador de tabelas ODBC

O controlador de tabelas ODBC permite conexes com bancos de dados SQL usando uma
implementao da interface ODBC baseada na Call Level Interface (CLI).2
Debian GNU/Linux. No Debian GNU/Linux o controlador de tabelas ODBC usa o pacote
iODBC, 3 que deve ser instalado antes de montar o pacote GLPK. A instalao pode ser efetuada
com o seguinte comando:
sudo apt-get install libiodbc2-dev
Note que, ao configurar o pacote GLPK, para habilitar o uso da biblioteca do iODBC a opo
--enable-odbc deve ser passada para o script de configurao.
Para seu uso em todo sistema, as bases de dados individuais devem ser inseridas em /etc/odbc.ini
e /etc/odbcinst.ini. As conexes das bases de dados a serem usadas por um nico usurio so
especificadas por arquivos do diretrio home (.odbc.ini e .odbcinst.ini).
Microsoft Windows. No Microsoft Windows o controlador de tabelas ODBC usa a biblioteca
Microsoft ODBC. Para habilitar esta funcionalidade, o smbolo:
#define ODBC_DLNAME "odbc32.dll"
deve ser definido no arquivo de configurao do GLPK config.h.
Fontes de dados podem ser criados via Ferramentas Administrativas do Painel de Controle.
Para escolher do controlador de tabelas ODBC, seu nome na sentena table deve ser especificado
2
3

A norma software correspondente definida na ISO/IEC 9075-3:2003.


Ver <http://www.iodbc.org/>.

65

como ODBC ou iODBC.


A lista de argumentos especificada como segue.
O primeiro argumento a cadeia de conexo passada para a biblioteca ODBC, por exemplo:
DSN=glpk;UID=user;PWD=password, ou
DRIVER=MySQL;DATABASE=glpkdb;UID=user;PWD=password.
Diferentes partes da cadeia so separadas por ponto e vrgula. Cada parte consiste de um par
nome-do-campo e valor separados pelo sinar de igualdade. Os nomes de campo permitidos dependem
da biblioteca ODBC. Tipicamente os seguintes nomes-de-campo so permitidos:
DATABASE base de dados;
DRIVER

controlador ODBC;

DSN

nome de uma fonte de dados;

FILEDSN

nome de um arquivo de fonte de dados;

PWD

senha de usurio;

SERVER

base de dados;

UID

nome de usurio.

O segundo argumento e todos os seguintes so considerados como sentenas SQL.


As sentenas SQL podem ser estendidas sobre mltiplos argumentos. Se o ltimo caractere de
um argumento um ponto e vrgula, este indica o fim de uma sentena SQL.
Os argumentos de uma sentena SQL so concatenados separados por espao. O eventual ponto
e vrgula final ser removido.
Todas as sentenas SQL, exceto a ltima, sero executadas diretamente.
Para tabela-IN, a ltima sentena SQL pode ser um comando SELECT que se inicia com
SELECT em letras maisculas. Se a cadeia no se inicia com SELECT , se considera que
um nome de uma tabela e uma sentena SELECT automaticamente gerada.
Para tabela-OUT, a ltima sentena SQL pode conter um ou mltiplos pontos de interrogao.
Se contm um ponto de interrogao, considerado um gabarito para a rotina de escrita. Caso
contrrio, a cadeia considerada um nome de tabela e um gabarito INSERT automaticamente
gerado.
A rotina de escrita usa um gabarito com o pontos de interrogao e o substitui o primeiro ponto
de interrogao pelo primeiro parmetro de sada, o segundo ponto de interrogao, pelo segundo
parmetro e assim por diante. Em seguida, o comando SQL emitido.
O que segue um exemplo da sentena table de sada:
table ta { l in LOCAIS } OUT
ODBC
DSN=glpkdb;UID=glpkuser;PWD=glpkpassword
DROP TABLE IF EXISTS resultado;
CREATE TABLE resultado ( ID INT, LOC VARCHAR(255), QUAN DOUBLE );

66

INSERT INTO resultado VALUES ( 4, ?, ? ) :


l ~ LOC, quantidade[l] ~ QUAN;
Alternativamente pode se escrever como segue:
table ta { l in LOCAIS } OUT
ODBC
DSN=glpkdb;UID=glpkuser;PWD=glpkpassword
DROP TABLE IF EXISTS resultado;
CREATE TABLE resultado ( ID INT, LOC VARCHAR(255), QUAN DOUBLE );
resultado :
l ~ LOC, quantidade[l] ~ QUAN, 4 ~ ID;
O uso de gabaritos com ? no s permite INSERT, como tambm o UPDATE, DELETE, etc.
Por exemplo:
table ta { l in LOCAIS } OUT
ODBC
DSN=glpkdb;UID=glpkuser;PWD=glpkpassword
UPDATE resultado SET DATA = & data & WHERE ID = 4;
UPDATE resultado SET QUAN = ? WHERE LOC = ? AND ID = 4 :
quantidade[l], l;

C.4

Controlador de tabelas MySQL

O controlador de tabelas MySQL permite a conexo a base de dados MySQL.


Debian GNU/Linux. No Debian GNU/Linux o controlador de tabelas MySQL usa o pacote
MySQL, 4 que deve ser instalado antes da criao do pacote GLPK. A instalao pode ser efetuada
com o seguinte comando:
sudo apt-get install libmysqlclient15-dev
Note que ao configurar o pacote GLPK para habilitar o uso da biblioteca MySQL a opo
--enable-mysql deve ser passada ao script de configurao.
Microsoft Windows. No Microsoft Windows o controlador de tabelas MySQL tambm usa a
biblioteca MySQL. Para habilitar esta funcionalidade o smbolo:
#define MYSQL_DLNAME "libmysql.dll"
deve ser definido no arquivo de configurao do GLPK config.h.
Para escolher o controlador de tabelas MySQL, seu nome na sentena table deve ser especificada
como MySQL.
A lista de argumentos especificada como segue.
O primeiro argumento especifica como conectar a base de dados no estilo DSN, por exemplo:
Database=glpk;UID=glpk;PWD=gnu.
4

Para fazer o download de arquivos de desenvolvimento, ver <http://dev.mysql.com/downloads/mysql/>.

67

Diferentes partes da cadeia so separadas por ponto e vrgula. Cada parte consiste de um
par nome-do-campo e valor separado pelo sinal de igualdade. Os seguintes nomes de campo so
permitidos:
Server

servidor rodando a base de dados (localhost por padro);

Database nome da base de dados;


UID

nome de usurio;

PWD

senha de usurio;

Port

porta usada pelo servidor (3306 por padro).

O segundo argumento e todos os seguintes so considerados sentenas SQL.


Sentenas SQL podem se estender sobre mltiplos argumentos. Se o ltimo caractere de um
argumento um ponto e vrgula, isto indica o fim de uma sentena SQL.
Os argumentos de uma sentena SQL so concatenados e separados por espao. O eventual
ponto e vrgula final ser removido.
Todas sentenas SQL, menos a ltima, sero executadas diretamente.
Para tabela-IN, a ltima sentena SQL pode ser um comando SELECT iniciado com letras
maisculas SELECT . Se a cadeia no inicia com SELECT considerado um nome de tabela e a
sentena SELECT automaticamente gerada.
Para tabela-OUT, a ltima sentena SQL pode conter um ou mltiplos pontos de interrogao.
Se contm um ponto de interrogao, considerado um gabarito para a rotina de escrita. Caso
contrrio, a cadeia considerada um nome de tabela e um gabarito INSERT automaticamente
gerado.
A rotina de escrita usa um gabarito com o pontos de interrogao e o substitui o primeiro ponto
de interrogao pelo primeiro parmetro de sada, o segundo ponto de interrogao, pelo segundo
parmetro e assim por diante. Em seguida, o comando SQL emitido.
O que segue um exemplo da sentena table de sada:
table ta { l in LOCAIS } OUT
MySQL
Database=glpkdb;UID=glpkuser;PWD=glpkpassword
DROP TABLE IF EXISTS resultado;
CREATE TABLE resultado ( ID INT, LOC VARCHAR(255), QUAN DOUBLE );
INSERT INTO resultado VALUES ( 4, ?, ? ) :
l ~ LOC, quantidade[l] ~ QUAN;
Alternativamente poderia ser escrito como segue:
table ta { l in LOCAIS } OUT
MySQL
Database=glpkdb;UID=glpkuser;PWD=glpkpassword
DROP TABLE IF EXISTS resultado;
CREATE TABLE resultado ( ID INT, LOC VARCHAR(255), QUAN DOUBLE );
resultado :

68

l ~ LOC, quantidade[l] ~ QUAN, 4 ~ ID;


O uso de gabaritos com ? no s permite INSERT, como tambm o UPDATE, DELETE, etc.
Por exemplo:
table ta { l in LOCAIS } OUT
MySQL
Database=glpkdb;UID=glpkuser;PWD=glpkpassword
UPDATE resultado SET DATE = & date & WHERE ID = 4;
UPDATE resultado SET QUAN = ? WHERE LOC = ? AND ID = 4 :
quantidade[l], l;

69

Apndice D

Resolvendo modelos com glpsol


O pacote GLPK 1 inclui o programa glpsol, um solver de PL/PIM autnomo. Este programa pode ser chamado por uma linha de comando ou pelo shell para resolver modelos escritos na
linguagem de modelagem GNU MathProg.
Para comunicar ao solver que o arquivo de entrada contm uma descrio do modelo, necessrio
especificar a opo --model na linha de comando. Por exemplo:
glpsol --model foo.mod
s vezes necessrio usar a seo de dados posicionado em um arquivo separado. Neste caso,
deve-se usar o seguinte comando:
glpsol --model foo.mod --data foo.dat
Note que ser o arquivo de modelo tambm contm a seo de dados, aquela seo ignorada.
Tambm permitido especificar mais de um arquivo contendo a seo de dados, por exemplo:
glpsol --model foo.mod --data foo1.dat --data foo2.dat
Se a descrio do modelo contm alguma sentena display e/ou printf, o resultado enviado
para o terminal por padro. Se h a necessidade de redirecionar a sada para um arquivo, deve-se
usar o seguinte comando:
glpsol --model foo.mod --display foo.out
Se h a necessidade de ver o problema que est sendo gerado pelo tradutor de modelo, deve-ser
usar a opo --wlp como segue:
glpsol --model foo.mod --wlp foo.lp
Neste caso, os dados do problema so escritos no arquivo foo.lp no formato CPLEX LP vivel
para anlise visual.
s vezes, necessrio checar a descrio do modelo sem ter que resolver a instncia do problema
gerado. Neste caso, deve-se especificar a opo --check, por exemplo:
glpsol --check --model foo.mod --wlp foo.lp
1

http://www.gnu.org/software/glpk/

70

Se h a necessidade de escrever uma soluo numrica obtida pelo solver para um arquivo,
deve-se usar o seguinte comando:
glpsol --model foo.mod --output foo.sol
neste caso, a soluo escrita no arquivo foo.sol em formato de texto plano, vivel para anlise
visual.
A lista completa de opes do glpsol pode ser encontrada no manual de referncia do GLPK
includa na distribuio do GLPK.

71

Apndice E

Exemplo de descrio de modelo


E.1

Descrio de modelo escrito em MathProg

Este um exemplo completo de descrio de modelo escrito na linguagem de modelagem GNU


MathProg.
# UM PROBLEMA DE TRANSPORTE
#
# Este problema encontra a logstica de custo mnimo que atende das demandas
# de mercado e as ofertas das fbricas.
#
# Referncia:
#
Dantzig G B, "Linear Programming and Extensions."
#
Princeton University Press, Princeton, New Jersey, 1963,
#
Chapter 3-3.
set I;
/* fbricas de enlatados*/
set J;
/* mercados */
param a{i in I};
/* capacidade da fbrica i, em caixas */
param b{j in J};
/* demanda no mercado j, em caixas */
param d{i in I, j in J};
/* distncia, em milhares de milhas */

72

param f;
/* frete, em dlares por caixa a cada mil milhas */
param c{i in I, j in J} := f * d[i,j] / 1000;
/* custo de transporte, em milhares de dlares por caixa */
var x{i in I, j in J} >= 0;
/* quantidade enviada, em caixas */
minimize custo: sum{i in I, j in J} c[i,j] * x[i,j];
/* custo total de transporte, em milhares de dlares */
s.t. suprimento{i in I}: sum{j in J} x[i,j] <= a[i];
/* observa o limite de suprimento na fbrica i */
s.t. demanda{j in J}: sum{i in I} x[i,j] >= b[j];
/* satisfaz a demanda do mercado j */
data;
set I := Seattle San-Diego;
set J := New-York Chicago Topeka;
param a := Seattle
San-Diego

350
600;

param b := New-York
Chicago
Topeka

325
300
275;

param d :

New-York
2.5
2.5

Seattle
San-Diego

Chicago
1.7
1.8

param f := 90;
end;

73

Topeka :=
1.8
1.4 ;

E.2

Instncia gerada do problema de PL

Este o resultado da traduo do modelo de exemplo produzido pelo solver glpsol e escrito no
formato CPLEX LP com a opo --wlp.
\* Problem: transporte *\
Minimize
custo: + 0.225 x(Seattle,New~York) + 0.153 x(Seattle,Chicago)
+ 0.162 x(Seattle,Topeka) + 0.225 x(San~Diego,New~York)
+ 0.162 x(San~Diego,Chicago) + 0.126 x(San~Diego,Topeka)
Subject To
suprimento(Seattle): + x(Seattle,New~York) + x(Seattle,Chicago)
+ x(Seattle,Topeka) <= 350
suprimento(San~Diego): + x(San~Diego,New~York) + x(San~Diego,Chicago)
+ x(San~Diego,Topeka) <= 600
demanda(New~York): + x(Seattle,New~York) + x(San~Diego,New~York) >= 325
demanda(Chicago): + x(Seattle,Chicago) + x(San~Diego,Chicago) >= 300
demanda(Topeka): + x(Seattle,Topeka) + x(San~Diego,Topeka) >= 275
End

E.3

soluo tima do problema de PL

Esta a soluo tima da instncia gerada do problema de PL encontrada pelo solver glpsol e
escrita em formato de texto plano com a opo--output.
Problem:
Rows:
Columns:
Non-zeros:
Status:
Objective:

transporte
6
6
18
OPTIMAL
custo = 153.675 (MINimum)

No.
Row name
St
Activity
Lower bound
Upper bound
Marginal
------ ------------ -- ------------- ------------- ------------- ------------1 cust
B
153.675
2 suprimento[Seattle]
NU
350
350
< eps
3 suprimento[San-Diego]
B
550
600
4 demanda[New-York]
NL
325
325
0.225
5 demanda[Chicago]
NL
300
300
0.153
6 demanda[Topeka]
NL
275
275
0.126

74

No. Column name St


Activity
Lower bound
Upper bound
Marginal
------ ------------ -- ------------- ------------- ------------- ------------1 x[Seattle,New-York]
B
50
0
2 x[Seattle,Chicago]
B
300
0
3 x[Seattle,Topeka]
NL
0
0
0.036
4 x[San-Diego,New-York]
B
275
0
5 x[San-Diego,Chicago]
NL
0
0
0.009
6 x[San-Diego,Topeka]
B
275
0
End of output

75

Agradecimentos
Os autores gostariam de agradecer as seguintes pessoas que gentilmente leram, comentaram e
corrigiram o rascunho deste documento:
Juan Carlos Borras <borras@cs.helsinki.fi>
Harley Mackenzie <hjm@bigpond.com>
Robbie Morrison <robbie@actrix.co.nz>

76