Tendo como base o NEOS (Network-Enabled Optimization System) Server, ´e poss´ıvel avaliar quais as codifica¸c˜oes mais utilizadas na resolu¸c˜ao de problemas por parte de quem utiliza este servi¸co.
O NEOS Server ´e um servi¸co livre baseado na Internet, que permite, atrav´es de uma abordagem simples, resolver uma grande variedade de problemas de otimiza¸c˜ao, disponibilizando v´arios solvers para isso. De uma forma muito simples o utilizador seleciona o solver que pretende utilizar e, no caso de o solver interpretar mais que uma codifica¸c˜ao, indica qual a codifica¸c˜ao do problema que se pretende resolver. Ap´os o utilizador selecionar o ficheiro onde o problema est´a contido, o resultado ´
e apresentado, sendo apresentados, entre outros dados, a solu¸c˜ao, o n´umero de vari´aveis e o n´umero de restri¸c˜oes.
Tendo em conta as estat´ısticas de utiliza¸c˜ao, no ano de 2012, do NEOS Server, apresentadas no gr´afico da Figura3.1, ´e poss´ıvel visualizar as principais codifica¸c˜oes utilizadas na modela¸c˜ao de problemas de otimiza¸c˜ao quanto ao n´umero de utiliza¸c˜oes para cada codifica¸c˜ao, e no gr´afico da Figura 3.2 em termos percentuais. S˜ao apresentados os dados relativos aos dez interpretadores mais utilizados, no entanto o NEOS permite a resolu¸c˜ao de problemas com vinte e sete codifica¸c˜oes diferentes. De salientar que o NEOS teve no ´ultimo ano 353 091 utilizadores.
S˜ao de seguida apresentadas breves explica¸c˜oes das codifica¸c˜oes mais utilizadas, nos gr´aficos apresentadas, com a exce¸c˜ao da codifica¸c˜ao AMPL que ´e apresentada no cap´ıtulo seguinte.
3.2. PRINCIPAIS CODIFICAC¸ ˜OES 25
Figura 3.1 – N´umero de utiliza¸c˜oes (Fonte: [2])
Figura 3.2 – Utiliza¸c˜ao em percentagem (Fonte: [2])
GAMS
A codifica¸c˜ao GAMS consiste num conjunto de declara¸c˜oes de dados, dados estes que dizem respeito `as vari´aveis do problema, aos seus valores e `a forma como estas constituem a fun¸c˜ao objetivo e as fun¸c˜oes restri¸c˜ao. E apresentado na Figura´
3.3 um exemplo de um problema codificado em GAMS, problema 62 da cole¸c˜ao HockSchittkowski. Todos os dados declarados num ficheiro GAMS pertencem a uma das cinco classes existentes nesta codifica¸c˜ao. Estas classes, apresentadas a seguir, definem os tipos de dados do problema [17].
• SETS - Esta classe representa a declara¸c˜ao dos ´ındices utilizados tanto nos
26 CAP´ITULO 3. CODIFICAC¸ ˜AO DE PROBLEMAS MATEM ´ATICOS
Figura 3.3 – Problema de otimiza¸c˜ao HS62 codificado em GAMS
• PARAMETERS - Apresenta os parˆametros do problema, contendo o nome e
valor destes. Os parˆametros podem ser declarados de duas formas, de forma normal, apresentando o nome e valor correspondente, e sob a forma de tabela, como ´e apresentado na tabela 3.1.
Tabela 3.1 – Declara¸c˜ao de Parˆametros sobe a forma de tabela
Distˆancia entre cidades em Kil´ometros - D(i, j) Vila Real Bragan¸ca Amarante 42,7 158 Porto 99,3 215 Lisboa 385 491
• VARIABLES - S˜ao identificadas por esta classe as vari´aveis, sendo apresentado
o nome e restri¸c˜oes associadas a estas, nomeadamente se s˜ao positivas, negativas, inteiras, etc.
3.2. PRINCIPAIS CODIFICAC¸ ˜OES 27
• EQUATIONS - Como o nome indica s˜ao apresentadas por esta classe as
equa¸c˜oes das fun¸c˜oes restri¸c˜ao e da fun¸c˜ao objetivo, sendo primeiro declarado o nome destas e de seguida as express˜oes das mesmas. Para identificar o tipo de restri¸c˜ao ´e utilizado a letra E no caso de igualdade, L no caso de uma restri¸c˜ao do tipo inferior ou igual e G no caso de uma restri¸c˜ao superior ou igual.
• MODELS - Esta ´ultima classe indica quais das equa¸c˜oes acima declaradas
fazem parte do problema, desta forma ´e poss´ıvel formular modelos diferentes utilzando o mesmo ficheiro de entrada GAMS.
SPARSE SDPA
Utilizado para problemas de otimiza¸c˜ao escritos na seguinte forma padr˜ao (3.1):
min c1× x1 + c2 × x2 + . . . + cm × xm
sujeito a F 1× x1 + F 2 × x2 + . . . + F m × xm − F 0 = X X ≥ 0
(3.1)
Sendo o dual do problema (3.2):
min tr(F 0× Y )
sujeito a tr(F i× Y ) = ci, i = 1, 2, . . . , m Y ≥ 0
(3.2)
Onde todas as matrizes de F0, F1, ..., Fm para al´em de serem consideradas sim´etricas de tamanho n por n, s˜ao matrizes esparsas. As restri¸c˜oes X ≥ 0 e Y ≥ 0 significam que X e Y devem ser positivo.
Existem outras formas normalizadas para esta codifica¸c˜ao utilizadas por v´arios autores, no entanto podem ser traduzidas para o formato padr˜ao SPARSE SDPA com pouco esfor¸co [3]. O ficheiro codificado divide-se em seis partes, s˜ao elas:
28 CAP´ITULO 3. CODIFICAC¸ ˜AO DE PROBLEMAS MATEM ´ATICOS
1. Come¸cando pelos coment´arios, o ficheiro pode conter v´arias linhas de coment´arios, linhas estas que devem come¸car com um destes caracteres ”ou *.
2. Depois dos coment´arios ´e apresentado o n´umero de matrizes restri¸c˜ao, seguida pela letra m, qualquer texto introduzido ap´os esta letra ´e ignorado.
3. A segunda linha ap´os os coment´arios apresenta o n´umero de blocos que dividem a diagonal das matrizes, ou seja, a diagonal da matriz ´e dividida, formando assim submatrizes, exemplificado na Figura 3.4. A declara¸c˜ao do n´umero de blocos ´e seguida da express˜ao nblocks. Da mesma forma que na linha anterior, o texto inserido depois da express˜ao nblocks ´e ignorado.
Figura 3.4 – Divis˜ao da Matriz (Fonte: [3])
4. Ap´os ser indicado o n´umero de blocos criados ´e apresentado um vetor que representa a dimens˜ao de cada bloco. Se este vetor apresentar valores negativos significa que o bloco ´e uma submatriz diagonal, ou seja, apenas os elementos da diagonal s˜ao diferentes de zero.
5. A quarta linha ap´os os coment´arios cont´em o vetor dos coeficientes das vari´aveis que constituem a fun¸c˜ao objetivo.
6. As linhas restantes do ficheiro contˆem os valores das matrizes restri¸c˜ao, apresentando um valor por cada linha. Cada linha ´e constituida pelo ´ındice da matriz, seguido do n´umero do bloco dentro dessa matriz, dos ´ındices i, j que representam o elemento do bloco e por fim o valor da matriz. Como j´a referido as matrizes s˜ao consideradas sim´etricas, logo apenas os valores do triˆangulo superior de cada bloco s˜ao declarados. ´E apresentado na Figura 3.5 um exemplo de um problema e a sua codifica¸c˜ao em SPARSE SDPA respetivamente.
3.2. PRINCIPAIS CODIFICAC¸ ˜OES 29
(a) Problema formulado (b) Codifica¸c˜ao em SPARSE SDPA
Figura 3.5 – Exemplo de um problema de otimiza¸c˜ao e a sua codifica¸c˜ao em SPARSE SDPA (Fonte: [3])
MPS
A codifica¸c˜ao MPS segue um formato orientado `as colunas, sendo os dados do problema apresentados nas colunas 2, 5, 15, 25, 40 e 50, como ´e vis´ıvel na Figura
3.6 [4]. Nesta mesma Figura ´e poss´ıvel ver que os dados s˜ao divididos e agrupados em fun¸c˜ao do mesmo tipo.
Ao longo do ficheiro v˜ao sendo apresentados os tipos de dados que se seguem, utilizando cart˜oes de cabe¸calho. S˜ao eles:
• NAME – Apresentados a partir da coluna 5, os dados identificados por este
cabe¸calho podem conter qualquer informa¸c˜ao sobre o problema, normalmente o nome.
• ROWS – Identifica as linhas seguintes como sendo dados relativos ao nomes
e tipo das fun¸c˜oes, objetivo ou restri¸c˜oes. Estes dados das restri¸c˜oes s˜ao apresentados nas colunas 2 ou 3 para o tipo de restri¸c˜ao e a partir da coluna 5 para o nome da restri¸c˜ao.
30 CAP´ITULO 3. CODIFICAC¸ ˜AO DE PROBLEMAS MATEM ´ATICOS
Figura 3.6 – Estrutura das colunas da codifica¸c˜ao MPS (Fonte: [4])
objetivo e fun¸c˜oes restri¸c˜oes, ou seja, as vari´aveis do problema que definem estas fun¸c˜oes. Cada linha apresenta o nome da vari´avel, que fun¸c˜oes constitui e o seu coeficiente em cada uma delas.
• RHS – Os dados identificados por este cabe¸calho definem o valor das fun¸c˜oes
restri¸c˜ao.
• RANGES (opcional) – Tamb´em referente ao valor das fun¸c˜oes restri¸c˜oes aparece
quando essas fun¸c˜oes possuem um valor superior e inferior.
• BOUNDS (opcional) – Representa os dados referentes `as restri¸c˜oes simples,
ou seja, aos limites inferiores e superiores das vari´aveis.
• ENDATA – O cabe¸calho ENDATA representa o fim de todos os dados do
problema.
´
3.2. PRINCIPAIS CODIFICAC¸ ˜OES 31
Figura 3.7 – Problema de otimiza¸c˜ao codificado em MPS (Fonte: [4])
MOSEL
Tal como as outras linguagens de modela¸c˜ao, o formato MOSEL permite codificar e manipular problemas de otimiza¸c˜ao. A sintaxe utilizada nesta codifica¸c˜ao foi projetada de forma a ser f´acil de utilizar. ´E apresentado na Figura 3.8 um exemplo de um problema codificado em MOSEL, problema Burglar2. A estrutura de um ficheiro MOSEL ´e constituido por cinco partes [18], s˜ao elas:
• Model – Representa o in´ıcio do problema, contendo na mesma linha o nome
do problema.
• Directives – Nesta sec¸c˜ao ´e poss´ıvel incluir bibliotecas do interpretador e
selecionar op¸c˜oes relativamente `a forma como as linhas s˜ao interpretadas, mais propriamente a forma como o interpretador identifica o fim de uma express˜ao, podendo ser pela quebra de linha ou pelo caracter “;“. No caso da identifica¸c˜ao ser feita com a quebra de linha, ´e poss´ıvel que a express˜ao continue na linha seguinte, no entanto ´e necess´ario colocar um operador antes da quebra de linha. No caso do final da express˜ao ser definido com o caracter “;“ o interpretador
32 CAP´ITULO 3. CODIFICAC¸ ˜AO DE PROBLEMAS MATEM ´ATICOS
assume todas as linhas como sendo da mesma express˜ao at´e ser encontrado o caracter.
• Parameters – S˜ao declarados nesta sec¸c˜ao os parˆametros do problema, apresentando
o seu nome e valor.
• Body – Esta sec¸c˜ao do ficheiro apresenta todas as equa¸c˜oes do problema,
nomeadamente da fun¸c˜ao objetivo e fun¸c˜oes restri¸c˜ao.
• End-model – Representa o fim do problema, o ficheiro pode conter linhas de
c´odigo depois desta declara¸c˜ao, no entanto ser˜ao todas interpretadas como coment´arios.
3.2. PRINCIPAIS CODIFICAC¸ ˜OES 33
Esta codifica¸c˜ao permite ainda incluir ficheiros, isto ´e, na parte body acima referido, ´
e poss´ıvel utilizar dados existentes noutros ficheiros, sendo apenas necess´ario indicar o nome do ficheiro que se pretende incluir. Esta inclus˜ao de ficheiro apenas ´e poss´ıvel na parte body do ficheiro, logo apenas pode conter dados relativos `as equa¸c˜oes do problema, nomeadamente da fun¸c˜ao objetivo e fun¸c˜oes restri¸c˜ao;
TSP
A codifica¸c˜ao de problemas utilizando TSP divide o ficheiro, onde estes est˜ao contidos, em duas partes. A primeira parte, denominada parte de especifica¸c˜ao, diz respeito `
a formata¸c˜ao utilizada no ficheiro, a segunda parte cont´em os dados do problema [19]. A parte de especifica¸c˜ao cont´em os seguintes parˆametros:
• Name – Identifica o nome do problema.
• Type – Identifica o tipo de dados do problema, que podem ser:
– TSP – Representa dados de um problema do caixeiro viajante, sendo
estes sim´etricos.
– ATSP – Representa tal com o TSP, dados de um problema do caixeiro
viajante, no entanto com dados assim´etricos.
– SOP – Representa dados de um problema de ordena¸c˜ao sequencial.
– HCP – Representa dados de um problema de caminho hamiltoniano. – CVRP – Representa dados de um problema de roteamento de ve´ıculos
com restri¸c˜oes de capacidade.
– TOUR – Representa dados de um problema de tour. • Comment – Identifica os coment´arios existentes no ficheiros.
• Dimension – Identifica no caso do tipo de dados serem TSP ou ATSP, o n´umero
de n´os do problema. No caso do tipo de dados serem CVRP, identifica o n´umero total de n´os e dep´ositos. Se os dados do problema foram do tipo TOUR, identifica a dimens˜ao do problema correspondente.
34 CAP´ITULO 3. CODIFICAC¸ ˜AO DE PROBLEMAS MATEM ´ATICOS
• Capacity – Identifica a capacidade dos ve´ıculos no caso dos dados serem do
tipo CVRP.
• Edge Weight Type – Especifica como as distˆancias dos caminhos s˜ao dadas. • Edge Weight Format – Especifica o formato das distˆancias dos caminhos. • Edge Data Format – Especifica o formato dos dados dos caminhos.
• Node Coord Type – Especifica o tipo coordenadas associados a cada n´o do
problema utilizadas para apresenta¸c˜ao gr´afica ou no c´alculo das distˆancias.
• Display Data Type – Especifica como ´e feita a apresenta¸c˜ao gr´afica dos n´os. • EOF – Identifica o fim da parte de especifica¸c˜ao.
A declara¸c˜ao destes parˆametros ´e feita utilizando os seus nomes, acima apresentados, seguido do valor.
A segunda parte, referente aos dados do problema ´e dividida em sec¸c˜oes de dados, sendo que cada uma delas come¸ca com a palavra-chave correspondente. As sec¸c˜oes existentes para a parte dos dados s˜ao as seguintes:
• Node Coord Section – O valor das coordenadas de cada n´o s˜ao apresentadas
nesta sec¸c˜ao.
• Depot Section – Esta sec¸c˜ao apresenta a lista de poss´ıveis n´os de dep´osito
alternativos.
• Demand Section – A procura associada a cada n´o, no caso de um problema com
dados do tipo CVRP, ´e dada nesta sec¸c˜ao, contendo para cada n´o o n´umero que identifica o n´o, seguido do valor da procura. Para os n´os de dep´osito o valor da procura ´e 0, no entanto tamb´em s˜ao apresentados nesta sec¸c˜ao.
• Edge Data Section – Esta sec¸c˜ao cont´em os dados dos caminhos do problema.
Contendo em cada linha, referente a cada caminho, os n´umeros que identificam os n´os que este liga.
3.2. PRINCIPAIS CODIFICAC¸ ˜OES 35
• Fixed Edges Section – Nesta sec¸c˜ao s˜ao listados os caminhos que devem aparecer
na solu¸c˜ao, sendo apresentados os n´umeros que identificam os n´os que estes ligam.
• Edge Weight Section – Esta sec¸c˜ao cont´em o valor das distˆancias dos caminhos
do problema.
CPLEX
Desenvolvido no final dos anos oitenta pela CPLEX Optimization Inc., a codififca¸c˜ao CPLEX segue um formato orientado `as linhas, cada linha do ficheiro pode conter at´e 255 caracteres [6]. As linhas em branco s˜ao ignoradas e as linhas que contiverem o caracter \ tamb´em s˜ao ignoradas, visto este caracter identificar a linha como um coment´ario. O ficheiro CPLEX ´e codificado seguindo o seguinte formato:
• Defini¸c˜ao da fun¸c˜ao objetivo. • Defini¸c˜ao das fun¸c˜oes restri¸c˜ao. • Defini¸c˜ao das restri¸c˜oes simples. • Defini¸c˜ao das vari´aveis.
• Indica¸c˜ao de fim do ficheiro.
Todas estas sec¸c˜oes do ficheiro s˜ao identificadas por palavras-chave que identificam o tipo de dados que se segue. Existem v´arias Palavras-chave para o mesmo tipo de dados, apresentadas no Figura 3.9, onde em cada linha ´e poss´ıvel ver as Palavras- chave utiliz´aveis para cada tipo de dados. ´E apresentado na Figura3.10um exemplo de um problema codificado em CPLEX.
36 CAP´ITULO 3. CODIFICAC¸ ˜AO DE PROBLEMAS MATEM ´ATICOS
Figura 3.9 – Palavras-chave utilizadas pela codifica¸c˜ao CPLEX para os tipos de dados (Fonte: [6])
Figura 3.10 – Problema de otimiza¸c˜ao codificado em CPLEX (Fonte: [7])
C, MATLAB BINARY e Fortran
Para problemas codificados em C, MATLAB BINARY e Fortran, a estrutura dos dados depende do interpretador utilizado. No que diz respeito `a codifica¸c˜ao todos os dados s˜ao declarados utilizando a pr´opria linguagem de programa¸c˜ao. Devido `a extens˜ao dos exemplos para estas codifica¸c˜oes, estes foram colocados nos anexos em
4
Codifica¸c˜ao AMPL
4.1
Introdu¸c˜ao
Alguns problemas encontram-se formulados e escritos em AMPL, esta linguagem, de modela¸c˜ao alg´ebrica e com uma sintaxe semelhante `a nota¸c˜ao matem´atica de problemas de otimiza¸c˜ao, permite descrever e solucionar problemas de alta complexidade em larga escala de computa¸c˜ao matem´atica [15]. Projetada e implementada por Robert Fourer, David M. Gay e Brian W. Kernighan em 1985, tem apresentado grandes evolu¸c˜oes desde ent˜ao.
Os problemas est˜ao contidos em ficheiros com extens˜ao .mod e encontram-se separados em 3 partes: inicialmente s˜ao declaradas as vari´aveis e os parˆametros utilizados na formula¸c˜ao do problema; numa segunda parte ´e apresentada a fun¸c˜ao objetivo e fun¸c˜oes restri¸c˜ao, caso existam, e por fim s˜ao apresentados os valores das vari´aveis e dos parˆametros do problema.
Como ´e vis´ıvel na Figura 4.1, problema S353 da colec¸c˜ao Schittkowski, o problema come¸ca com a declara¸c˜ao dos parˆametros, sendo estes dados identificados pela palavra param. A declara¸c˜ao dos parˆametros pode ser feita de duas formas, apresentando o nome e o seu valor na mesma linha, ou apresentando apenas o nome, sendo o valor
38 CAP´ITULO 4. CODIFICAC¸ ˜AO AMPL
Figura 4.1 – Problema S353 codificado em AMPL
declarado numa parte posterior do ficheiro.
De seguida s˜ao declaradas as vari´aveis do problema, identificadas pela palavra var e da mesma forma que os parˆametros existem mais que uma forma destas serem declaradas. A forma mais simples apenas cont´em o nome da vari´avel sendo o valor inicial declarado na ´ultima parte do ficheiro, no entanto ´e poss´ıvel na mesma linha da declara¸c˜ao determinar o seu valor e, se existirem, as restri¸c˜oes simples associadas. A parte final do ficheiro, visto estar associada aos parˆametros e `as vari´aveis, e identificada pela palavra data apresenta os valores iniciais das vari´aveis e o valor dos parˆametros caso n˜ao sejam apresentados no momento de declara¸c˜ao, apresentando o nome da vari´avel ou do parˆametro seguido do seu valor.
Depois das vari´aveis, voltando atr´as na estrutura do ficheiro, identificada pela palavra
4.2. INTERPRETADORES E SOLVERS DE CODIFIFCAC¸ ˜AO AMPL 39
express˜ao. As restri¸c˜oes s˜ao identificadas pela palavra subject to juntamente com o nome da restri¸c˜ao, sendo apresentada na linha seguinte a equa¸c˜ao da restri¸c˜ao.