Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Linguagem de Referncia
para o GLPK Verso 4.57
(RASCUNHO, Fevereiro 2016)
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
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
5.3
5.2.5
Bloco
5.3.1
5.3.2
5.3.3
5.3.4
5.3.5
5.3.6
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
A Usando sufixos
52
52
54
54
54
55
55
56
57
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
63
63
65
65
67
70
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
(1.1)
(1.2)
u1
u2
. .
un
(1.3)
lxu
l=x=u
Varivel fixa
<
L
<
L
L=
aj xj < +
aj xj < +
aj xj U
aj xj U
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
(1.4)
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
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
comentrios.
As unidades lxicas da linguagem so discutidas abaixo.
2.1
Nomes simblicos
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
2.4
Palavras-chave
else
if
in
inter
less
mod
not
or
symdiff
then
union
within
2.5
Delimitadores
Um delimitador tanto um caractere especial nico quanto uma sequncia de dois caracteres
especiais, como segue:
+
*
/
**
^
&
<
<=
=
==
>=
>
<>
!=
!
&&
||
.
,
:
;
:=
..
|
~
(
)
[
]
{
}
<-
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
(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
3.1.2
ndices
3.1.3
Parmetros no-indexados
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)
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 )
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
3.1.10
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
3.2.2
Operadores simblicos
3.2.3
Hierarquia de operaes
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
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
(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
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
3.4.2
Conjuntos no-indexados
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
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
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
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-
exists
quantificador-
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
3.5.6
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
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
:= 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
35
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
36
4.3
Sentena variable
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;
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
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 .
4.5
Sentena objective
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
4.8
Sentena display
41
4.9
Sentena printf
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
43
4.11
Sentena table
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
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
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
data;
bloco de dados;
bloco de dados;
. . .
bloco de dados;
end;
Arquivo de modelo
Arquivo de dados
5.1
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
set
set
set
set
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
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
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
. . . 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
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
. . . 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
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
.val
.dual
Note que os sufixos .status, .val e .dual podem ser usados apenas abaixo da sentena solve.
57
Apndice B
B.1
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
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
%d
O dia do ms como nmero decimal (de 1 at 31). Se permite o zero como primeiro dgito,
embora no seja necessrio.
%h
%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
%%
Um caractere % literal.
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
%A
%b
%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
%D
%e
O dia do ms, como em %d, mas preenchido com espao em branco ao invs de zero.
%F
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
%H
%I
%j
%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
%M
%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
%S
%T
%u
%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
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
%%
Um caractere % literal.
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
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
64
C.2
C.3
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
65
controlador ODBC;
DSN
FILEDSN
PWD
senha de usurio;
SERVER
base de dados;
UID
nome de usurio.
66
C.4
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
nome de usurio;
PWD
senha de usurio;
Port
68
69
Apndice D
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
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
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
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
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