Optimização Combinatória Guia de Utilização do Software José Manuel Vasconcelos Valério de Carvalho Universidade do Minho 2005
Introdução Este documento apresenta diversas informações sobre a utilização dos seguintes packages de programação matemática: Problemas de maximização de fluxo: MAXFLOW Problema do caminho mais curto: LTHRS Problemas de afectação: APC Problema do caixeiro viajante: TSP2 Problema de emparelhamento de custo mínimo em grafos não bipartidos: SAP Todos estes packages se encontram disponíveis: - na Internet: no endereço http://opsresearch.com/, local que fornece inúmeras informações de interesse sobre o domínio da Investigação Operacional, ou - na ORSEP (Operations Research Software Exchange Program), por ftp (usando como login ftp e password um endereço de e-mail válido), no sistema HELIOS.MATHEMATIK.UNI-KL.DE, na directoria pub/math/orsep. Para mais detalhes, ver EJOR 38/1 (1989) e EJOR 48 (1990). Os programas foram desenvolvidos em Fortran (LTHRS, MAXFLOW e APC) e em Pascal (TSP). Utilizadores interessados em converter os programas de Fortran para C poderão fazê-lo com software disponível na Internet no seguinte endereço: - http://www.fortran.com/fortran/free.html Estes packages usam ficheiros de dados como input. Para construir o ficheiro de dados pode ser usado qualquer processor de texto, desde que o ficheiro seja guardado como um ficheiro de texto, apenas com caracteres ASCII. No caso do WORD, deve ser usada a opção GUARDAR COMO ficheiro do tipo TEXT ONLY (*.TXT), podendo o utilizador escolher o nome que pretende dar ao ficheiro. Ficheiros do tipo *.DOC não podem ser utilizados, porque contêm um cabeçalho com caracteres invisíveis para o utilizador que os programas interpretam como dados do problema. Os resultados dos programas são, por defeito, apresentados no écran, podendo, no entanto, ser redireccionados para um ficheiro, através da opção >ficheiro. Os ficheiros relativos a cada programa encontram-se na diskette, respectivamente, nas directorias fluxo, caminho, afecta e caixeiro. Problemas de Maximização de Fluxo: MAXFLOW O package é baseado num artigo de D. Goldfarb, M.D. Grigoriadis, "A computational comparison of the Dinic and network simplex methods for maximum flow, Annals of Operations Research 7, 1988. Este programa determina o fluxo máximo entre um vértice fonte, abaixo designado por isou, e um terminal designado por isnk. Os dados de entrada devem ser números inteiros.
O package aceita dados de input, a partir de um ficheiro de texto, com o seguinte formato: Na primeira linha: nodes narcs isou isnk sendo nodes o número de vértices do grafo e narcs o número de arcos, isou a fonte de fluxo (vértice s) e isnk o terminal (vértice t). Nas restantes narcs linhas, é feita uma listagem dos narcs arcos, no seguinte formato: fromnode tonode arccapacity sendo fromnode o vértice de origem do arco, tonode o vértice de destino, e arccapacity a respectiva capacidade. Se for declarado um valor de capacidade nulo, o programa assume uma capacidade infinita para o arco. O formato de input é 4I10, pelo que devem ser reservadas 10 posições para cada dado, ou então, os dados devem ser separados por vírgulas. O input da rede apresentada na Pág. 66 dos Apontamentos (atribuindo aos vértices v1,v2,v3 e v4, os números 1,2,3 e 4, respectivamente, ao vértice s, o número 5, e ao vértice t, o número 6) é o seguinte: 6,9,5,6 5,1,2 5,2,3 1,3,3 1,4,1 1,2,2 2,4,2 3,6,1 3,4,4 4,6,3 Para executar o programa, fazer - MAXFLOW sendo pedido o nome do ficheiro de input e do ficheiro de output. estruturas de dados utilizadas e o desempenho computacional, podem ser obtidas no artigo acima referido. Problema do Caminho mais curto: LTHRS
O package foi desenvolvido por Gallo e Pallotino, sendo o algoritmo baseado em ideias de Glover, Klingman and Philips. Este programa determina o caminho mais curto entre um vértice de raíz (origem), abaixo designado por nr, e todos os restantes vértices do grafo. São admitidos custos negativos para os arcos, mas o grafo não deve ter nenhum circuito de comprimento negativo. Os valores dos custos devem ser inteiros. O programa LTHRS lê o input numa representação designada por uma estrela de sucessores. O programa usa esta estrutura de dados por ser a mais eficiente para a implementação do algoritmo. No entanto, a introdução de dados neste formato pressupõe o trabalho prévio de organização de dados, e está sujeita a erros. Para ultrapassar este problema, foi desenvolvido o programa LA2ES que converte um ficheiro com uma lista de arcos num ficheiro com o grafo representado como uma estrela de sucessores. Para correr este programa, fazer LA2ES, e fornecer o nome dos ficheiros de input e output. O ficheiro com a lista de arcos deve ter o seguinte formato: Nas três primeiras linhas: n m nr sendo n o número de vértices do grafo e m o número de arcos, e nr o vértice de raíz (origem). Nas restantes m linhas, é feita uma listagem dos m arcos, no seguinte formato: org dst custo sendo org o vértice de origem do arco, dst o vértice de destino, e custo o respectivo custo. No ficheiro PAG36 está definido um problema com 7 vértices e 12 arcos, sendo o vértice de origem o vértice 7. Este corresponde ao grafo apresentado nos Apontamentos na Página 36, e o vértice 7 corresponde ao vértice s, enquanto os restantes vértices têm a numeração apresentada na Figura. O ficheiro PAG44 apresenta outro dos Apontamentos. Para executar o programa, fazer - LTHRS <EXEMPLO.INP >EXEMPLO.OUT em que EXEMPLO.INP deve ser um ficheiro com o formato de lista de adjacências.
estruturas de dados utilizadas e o desempenho computacional, podem ser obtidas no artigo: Giorgio Gallo e Stefano Pallotino, Shortest paths algorithms, Annals of Operations Research 13, 3-79, 1988. A estratégia do algoritmo foi concebida por F.Glover, D. Klingman e N.Phillips, A new polynomially bounded shortest path algorithm, Operations Research, 65-74, 1985. Problema de Afectação: APC O algoritmo de afectação foi desenvolvido por Carpaneto, Martello e Toth e é designado por APC. Baseia-se em ideias apresentadas no artigo Carpaneto, Martello e Toth, Algorithms and codes dor the assignment problem, Annals of Operations Research 13, 193-224, 1988. O módulo A.FOR destina-se a fazer a interface com o utilizador. Este programa determina a afectação de custo mínimo, dada uma matriz de custos de dimensão n x n. O ficheiro com a matriz de custos deve ter o seguinte formato: Na primeira linha: n sendo n a dimensão da matriz quadrada. Em cada uma das restantes n linhas, é feita uma listagem dos n coeficientes de custo relativos a essa linha. O formato de input é 10I8, pelo que devem ser reservadas 8 posições para cada dado, ou então, os dados devem ser separados por vírgulas. Nos ficheiros LOG158.DAT e LOG159.DAT estão definidos os inputs dos problemas apresentados nas páginas 158 e 159 dos Apontamentos, respectivamente. Para executar o programa, fazer
- A sendo pedido o nome do ficheiro de input e do ficheiro de output. estruturas de dados utilizadas e o desempenho computacional, podem ser obtidas no artigo acima referido. Problema do caixeiro viajante: TSP O algoritmo o problema do caixeiro viajante foi desenvolvido por T. Volgenant and W.B. van den Hout do Institute da Universidade de Amsterdão, e está disponível através da ORSEP. Este programa determina a solução óptima do problema de caixeiro viajante simétrico, ou seja, com custos associados aos arcos cij=cji. Ver ficheiro READ.ME Problema de emparelhamento de custo mínimo em grafos não bipartidos: SAP O algoritmo é baseado em ideias de U. Derigs. Este programa determina o emparelhamento perfeito de custo mínimo em grafos não bipartidos com um número par de vértices, significando emparelhamento perfeito que todos os vértices do grafo estão emparelhados. Os valores dos custos associados aos arcos do grafo devem ser inteiros. Este algoritmo pode também ser usado para resolver o problema de emparelhamento apresentado nos Apontamentos da disciplina, em que se pretende determinar o emparelhamento de maior cardinal num grafo não-bipartido. Para o efeito, todos os custos associados aos arcos devem ser iguais a 1. A solução de menor custo é aquela em que todos os vértices (em número que deve ser sempre par) estão emparelhados.
O programa SAP lê o input numa representação própria. O programa usa esta estrutura de dados por ser a mais eficiente para a implementação do algoritmo. No entanto, a introdução de dados neste formato pressupõe o trabalho prévio de organização de dados, e está sujeita a erros. Para ultrapassar este problema, foi desenvolvido o programa LA2NBM que converte um ficheiro com uma lista de arcos num ficheiro com o grafo representado de uma forma adequada. Para correr este programa, fazer LA2NBM, e fornecer o nome dos ficheiros de input e output. Ver exemplo de aplicação em baixo. O ficheiro com a lista de arcos deve ter o seguinte formato: Nas duas primeiras linhas: n m sendo n o número de vértices do grafo e m o número de arcos. Nas restantes m linhas, é feita uma listagem dos m arcos, no seguinte formato: org dst custo sendo org o vértice de origem do arco, dst o vértice de destino, e custo o respectivo custo. No ficheiro APONT65 está definido um problema com 12 vértices e 16 arcos. Este corresponde ao grafo apresentado no dos Apontamentos relativo à solução do problema de emparelhamento em grafos não-bipartidos. Os vértices têm a numeração apresentada na Figura e os custos associados aos arcos são iguais a -1. A aplicação do programa LA2NBM ao ficheiro APONT65 (que tem uma lista de arcos) produz o ficheiro NBM65 (que tem uma representação própria que serve de input ao programa SAP). Para executar o programa, fazer a nível do MS-DOS - SAP <EXEMPLO.INP >EXEMPLO.OUT em que EXEMPLO.INP deve ser um ficheiro com o formato próprio. estruturas de dados utilizadas e o desempenho computacional, podem ser obtidas no artigo: U. Derigs, Solving non-bipartite matching problems via shortest path techniques, Annals of Operations Research 13, 225--261, 1988.