Tony Ítalo Abreu Santiago



Documentos relacionados
CAP 254 CAP 254. Otimização Combinatória. Professor: Dr. L.A.N. Lorena. Assunto: Metaheurísticas Antonio Augusto Chaves

Meta-heurísticas. Métodos Heurísticos José António Oliveira meta-heurísticas

CAPÍTULO 2. Grafos e Redes

Algoritmos e Estrutura de Dados III. Árvores

BUSCA LOCAL ITERADA (ILS ITERATED LOCAL SEARCH)

Técnicas para Programação Inteira e Aplicações em Problemas de Roteamento de Veículos 14

CAPÍTULO 3 - TIPOS DE DADOS E IDENTIFICADORES

BCC204 - Teoria dos Grafos

Pesquisa Operacional Programação em Redes

Projeto e Análise de Algoritmos Projeto de Algoritmos Introdução. Prof. Humberto Brandão humberto@dcc.ufmg.br

Dadas a base e a altura de um triangulo, determinar sua área.

Utilização do SOLVER do EXCEL

Projetos. Universidade Federal do Espírito Santo - UFES. Mestrado em Informática 2004/1. O Projeto. 1. Introdução. 2.

Arquitetura de Rede de Computadores

Complexidade de Algoritmos. Edson Prestes

Teoria dos Grafos. Edson Prestes

APLICAÇÕES DA DERIVADA

Faculdade de Engenharia Optimização. Prof. Doutor Engº Jorge Nhambiu

O ESPAÇO NULO DE A: RESOLVENDO AX = 0 3.2

Manual SAGe Versão 1.2 (a partir da versão )

01/05/2016. Danillo Tourinho Sancho da Silva, MSc ROTEIRIZAÇÃO TEORIA DOS GRAFOS MOTIVAÇÃO

Grafos Msc. Daniele Carvalho Oliveira. Doutoranda em Computação UFU Mestre em Computação - UFU Bacharel em Computação - UFJF 1

Algoritmos e Programação (Prática) Profa. Andreza Leite andreza.leite@univasf.edu.br

Entendendo como funciona o NAT

Orientação a Objetos

ISO/IEC 12207: Gerência de Configuração

PONTIFÍCIA UNIVERSIDADE CATÓLICA DE GOIÁS Curso Superior de Tecnologia em Análise e Desenvolvimento de Sistemas

Organização e Arquitetura de Computadores I

A lógica de programação ajuda a facilitar o desenvolvimento dos futuros programas que você desenvolverá.

GASTAR MAIS COM A LOGÍSTICA PODE SIGNIFICAR, TAMBÉM, AUMENTO DE LUCRO

Notas da Aula 17 - Fundamentos de Sistemas Operacionais

PROCESSO DE DESENVOLVIMENTO DE SOFTWARE. Modelos de Processo de Desenvolvimento de Software

a 1 x a n x n = b,

Aula 4 Pseudocódigo Tipos de Dados, Expressões e Variáveis

7 - Análise de redes Pesquisa Operacional CAPÍTULO 7 ANÁLISE DE REDES. 4 c. Figura Exemplo de um grafo linear.

As fases na resolução de um problema real podem, de modo geral, ser colocadas na seguinte ordem:

A Otimização Colônia de Formigas

Sistemas Operacionais

Inteligência Computacional Aplicada a Engenharia de Software

Capacidade = 512 x 300 x x 2 x 5 = ,72 GB

Projeto e Análise de Algoritmos Projeto de Algoritmos Tentativa e Erro. Prof. Humberto Brandão humberto@bcc.unifal-mg.edu.br

Uma Heurística para o Problema de Redução de Padrões de Corte

Módulo 4. Construindo uma solução OLAP

Na medida em que se cria um produto, o sistema de software, que será usado e mantido, nos aproximamos da engenharia.

4 Segmentação Algoritmo proposto

FATEC Cruzeiro José da Silva. Ferramenta CRM como estratégia de negócios

PLANEJAMENTO DA MANUFATURA

AMBIENTE PARA AUXILIAR O DESENVOLVIMENTO DE PROGRAMAS MONOLÍTICOS

Algoritmos Genéticos

1.1. Organização de um Sistema Computacional

Capítulo 4 - Roteamento e Roteadores

Trabalho Computacional

computador-cálculo numérico perfeita. As fases na resolução de um problema real podem, de modo geral, ser colocadas na seguinte ordem:

CT-234. Análise de Algoritmos e Complexidade Estrutural. Carlos Alberto Alonso Sanches

Inteligência de Enxame: ACO

MÓDULO 6 INTRODUÇÃO À PROBABILIDADE

Figura 5.1.Modelo não linear de um neurônio j da camada k+1. Fonte: HAYKIN, 2001

Unidade 8: Padrão MVC e DAO Prof. Daniel Caetano

3 Classificação Resumo do algoritmo proposto

Memória Cache. Prof. Leonardo Barreto Campos 1

Metodologias de Desenvolvimento de Sistemas. Analise de Sistemas I UNIPAC Rodrigo Videschi

MÓDULO 9 METODOLOGIAS DE DESENVOLVIMENTO DE SISTEMAS

4 Avaliação Econômica

3 Método de Monte Carlo

Gerenciamento de projetos.

Análise e Complexidade de Algoritmos

Implantação. Prof. Eduardo H. S. Oliveira

Sistemas Distribuídos

Processos Técnicos - Aulas 4 e 5

28/9/2010. Paralelismo no nível de instruções Processadores superescalares

Árvores de Suporte de Custo Mínimo

PROBLEMA DE TRANSPORTE: MODELO E MÉTODO DE SOLUÇÃO

PÓS GRADUAÇÃO EM CIÊNCIAS DE FLORESTAS TROPICAIS-PG-CFT INSTITUTO NACIONAL DE PESQUISAS DA AMAZÔNIA-INPA. 09/abril de 2014

2 Atualidade de uma base de dados

Desenvolvendo uma Arquitetura de Componentes Orientada a Serviço SCA

5 Mecanismo de seleção de componentes

¹CPTL/UFMS, Três Lagoas, MS,Brasil, ²CPTL/UFMS, Três Lagoas, MS, Brasil.

1 INTRODUÇÃO Internet Engineering Task Force (IETF) Mobile IP

4 Arquitetura básica de um analisador de elementos de redes

ALGORITMOS GENÉTICOS: UMA VISÃO EXPLANATÓRIA

Simulação Computacional de Sistemas, ou simplesmente Simulação

DIFERENÇAS ENTRE HUB, SWITCH E ROOTER

Feature-Driven Development

2 Problema das p-medianas

PARANÁ GOVERNO DO ESTADO

Complemento IV Introdução aos Algoritmos Genéticos

Resolução do Problema de Roteamento de Veículos com Frota Heterogênea via GRASP e Busca Tabu.

A SOLUTION OF N-QUEENS PROBLEM BY GENETIC ALGORITHMS

c. Técnica de Estrutura de Controle Teste do Caminho Básico

Material Teórico - Módulo de Divisibilidade. MDC e MMC - Parte 1. Sexto Ano. Prof. Angelo Papa Neto

MUDANÇAS NA ISO 9001: A VERSÃO 2015

Árvores Binárias de Busca

Governança de TI. ITIL v.2&3. parte 1

Processos de gerenciamento de projetos em um projeto

Guia de utilização da notação BPMN

Cálculo Numérico Aula 1: Computação numérica. Tipos de Erros. Aritmética de ponto flutuante

1. Avaliação de impacto de programas sociais: por que, para que e quando fazer? (Cap. 1 do livro) 2. Estatística e Planilhas Eletrônicas 3.

Roteiro. Arquitetura. Tipos de Arquitetura. Questionário. Centralizado Descentralizado Hibrido

QFD: Quality Function Deployment QFD: CASA DA QUALIDADE - PASSO A PASSO

Transcrição:

FACULDADE LOURENÇO FILHO Curso de Bacharelado em Ciência da Computação Tony Ítalo Abreu Santiago UM ALGORITMO HEURÍSTICO PARA O PROBLEMA DA ÁRVORE GERADORA MÍNIMA DE GRAU RESTRITO BASEADO NA META-HEURÍSTICA GRASP E NO ALGORITMO DE PRIM Fortaleza 2010

1 Tony Ítalo Abreu Santiago UM ALGORITMO HEURÍSTICO PARA O PROBLEMA DA ÁRVORE GERADORA MÍNIMA DE GRAU RESTRITO BASEADO NA META- HEURÍSTICA GRASP E NO ALGORITMO DE PRIM Monografia apresentada à Faculdade Lourenço Filho como exigência parcial para obtenção do título de Bacharel em Ciência da Computação. Orientador: Prof. MSc. André Barros Pereira. Fortaleza 2010

2 Tony Ítalo Abreu Santiago UM ALGORITMO HEURÍSTICO PARA O PROBLEMA DA ÁRVORE GERADORA MÍNIMA DE GRAU RESTRITO BASEADO NA META- HEURÍSTICA GRASP E NO ALGORITMO DE PRIM Monografia apresentada à Faculdade Lourenço Filho como requisito parcial para obtenção título de Bacharel em Ciência da Computação. Monografia aprovada em: / / Orientador: Prof. MSc. André Barros Pereira 1º Examinador: Prof. MSc. Emanuel Ferreira Coutinho 2º Examinador: Prof. MSc. João Frederico Roldan Viana Coordenador do Curso; Prof. MSc. Carlos Manso

3 RESUMO Os problemas de Otimização Combinatória são muito comuns no mundo dos negócios, e fazem parte do cotidiano da maioria das pessoas, principalmente entre profissionais de engenharia de telecomunicações, que em seus projetos buscam resolver as mais diversas situações com o menor gasto de material. Esses problemas buscam a melhor configuração de um conjunto finito de variáveis para atingir um objetivo. Estes geralmente se resumem a aumentar lucros e/ou diminuir custos. Existem na literatura atual, vários métodos propostos para resolução desse tipo de problema, que normalmente buscam um equilíbrio entre qualidade de solução e tempo computacional. Esses métodos ao serem utilizados em instâncias de médio e grande porte, podem se tornar procedimentos muito exaustivos, ou até mesmo inviáveis, pois métodos que produzem soluções exatas ou pelo menos de boa qualidade geralmente são computacionalmente muito custosos e métodos que produzem uma solução rapidamente podem estar muito distantes da solução exata. A monografia apresenta uma proposta para resolver um problema bastante comum entre empresas de telecomunicações, de engenharia, de distribuição de energia, enfim, entre empresas que tenham em seu projeto o intuito de diminuir gastos de ligação. Este é conhecido como o Problema da Árvore Geradora Mínima de Grau Restrito. No decorrer deste trabalho serão descritos todos os conceitos necessários para o entendimento do problema, mostrando algumas técnicas de resolução. Será apresentada uma proposta utilizando uma combinação de dois métodos de resolução: Meta-heurística GRASP e o Algoritmo de Prim, formando assim um procedimento que obteve soluções de qualidade com baixo custo computacional, conforme os resultados computacionais disponíveis neste trabalho. Palavras-Chave: Meta-heurística, GRASP, Otimização Combinatória, Árvore Geradora Mínima de Grau Restrito, Algoritmo de Prim

4 ABSTRACT The combinatorial optimization problems are very common in the business world and are part of everyday life for most people, especially among engineering professionals in telecommunications, which in their projects seek to solve the different situations with the least expenditure of material. These problems seek the best configuration of a finite set of variables to achieve a goal. These usually boil down to increase profits and/or reduce costs. Exist in current literature, several methods for resolution of this problem, they typically look for a balance between solution quality and computational time. These methods to be used in instances of medium and large, can become very extensive procedures, or even that is impractical because methods that produce exact solutions or at least of good quality are often computationally very expensive and methods to produce a solution quickly may be far from the exact solution. This paper presents a proposal to solve a common problem existing on telecom companies, engineering, power distribution, finally, or undertakings which have in your project in order to lower costs of connection. This is known as the Problem of Minimum Spanning Tree Grade Restricted. In this paper will describe the necessary concepts for understanding the problem, showing some resolution techniques. It will be showed a proposal using a combination of two methods of resolution: Meta-heuristic GRASP and Prim's algorithm to form a procedure that obtained good quality solutions with low computational cost, as will be showed through the computational results available in this work. Keywords: Meta-heuristics, GRASP, combinatorial optimization, minimum spanning tree Degree Restricted, Prim's algorithm

5 SUMÁRIO LISTA DE FIGURAS...06 LISTA DE TABELAS...07 LISTA DE QUADROS...08 1. INTRODUÇÃO...09 2. PROBLEMA DA ÁRVORE GERADORA MÍNIMA DE GRAU RESTRITO...11 2.1. Conceitos Básicos sobre Grafos...11 2.2. Árvore Geradora Mínima...14 2.3. Árvore Geradora Mínima com Grau Restrito...15 3. TÉCNICAS DE RESOLUÇÃO...16 3.1. Meta-heurísticas...16 3.2. Meta-heurística GRASP...19 3.2.1.Fase de Construção...19 3.2.2.Fase de Busca Local...20 3.3. Algoritmos para Árvore Geradora Mínima...21 4. O ALGORITMO PROPOSTO...26 4.1. Fase de Construção... 26 4.2. Fase de Busca Local...27 4.3. Codificação... 28 4.4. Exemplo Numérico...28 4.5. Modelo Matemático...34 5. RESULTADOS COMPUTACIONAIS...37 6. CONCLUSÃO E TRABALHOS FUTUROS...43 REFERÊNCIAS...44

6 LISTA DE FIGURAS 1. Exemplo de um grafo...11 2. Exemplo de um grafo completo...12 3. Grafo Valorado...12 4. Exemplo de ciclo em um grafo...13 5. Árvore (G1) e Floresta (G2)...13 6. Exemplo de Rede...14 7. Grafo com as possíveis arestas...23 8. Algoritmo de Prim Passo 1...23 9. Algoritmo de Prim Passo 2...24 10. Algoritmo de Prim Passo 3...24 11. Algoritmo de Prim Passo 4...24 12. Algoritmo de Prim Passo 5...25 13. Algoritmo de Prim Passo 6...25 14. Algoritmo de Prim Solução Obtida...25 15. Representação Gráfica do Grafo G...29 16. Algoritmo Proposto Passo 1...29 17. Algoritmo Proposto Passo 2...29 18. Algoritmo Proposto Passo 3...30 19. Algoritmo Proposto Passo 4...30 20. Algoritmo Proposto Solução da Fase de Construção...31 21. Algoritmo Proposto Início da Fase de Busca Local...31 22. Algoritmo Proposto Final da Iteração de Busca Local...33 23. Algoritmo Proposto Solução Encontrada...34

7 LISTA DE TABELAS 1. Tabela de Custos do grafo G...28 2. Exemplo de Grafo com 5 vértices...37 3. Resultados Obtidos para Exemplo de Grafo com 5 vértices...37 4. Matriz de Custos de um grafo de 10 vértices...39 5. Resultados obtidos pelo Algoritmo para um grafo de 10 vértices...39 6. Matriz de custos de um grafo de 20 vértices...40 7. Resultados obtidos pelo Algoritmo para um grafo de 20 vértices...41

8 LISTA DE QUADROS 1. Passos do Algoritmo de Prim... 22 2. Algoritmo Proposto Passos da Fase de Construção... 26 3. Algoritmo Proposto Passos da Fase de Busca Local... 27 4. Modelagem Método Exato... 35

9 1 INTRODUÇÃO Os problemas de Otimização Combinatória são importantes tanto no meio científico como no mundo dos negócios. Estes problemas consistem na busca da melhor configuração de um conjunto finito de variáveis para atingir algum objetivo. Usualmente estes objetivos se resumem a maximizar lucros e/ou reduzir custos. Para esses problemas existem vários métodos de resolução, que normalmente passam por um dilema entre qualidade da solução e tempo computacional: métodos que produzem soluções ótimas ou pelo menos de boa qualidade podem ser computacionalmente muito custosos ou mesmo inviáveis, enquanto que métodos que fornecem rapidamente uma solução podem estar bem distantes da solução ótima do problema. O grande desafio para os projetistas de algoritmos para resolução de problemas de otimização combinatória é, sem dúvida, encontrar um equilíbrio entre qualidade da solução e tempo computacional. Normalmente, problemas de Otimização Combinatória tais como: sistemas de irrigação, projetos de rodovias, redes de telecomunicações, computadores, telefonia, entre outros, possuem uma série de parâmetros como custo, capacidades de ligação, demandas dos serviços, entre outros. Este fato faz com que a modelagem e resolução desses problemas através de um método exato se tornem um processo exaustivo ou até mesmo inviável, levando em consideração o tempo gasto pelo computador para analisar todas as possibilidades observando as restrições existentes no problema. Durante muitos anos, têm-se estudado métodos para resolver problemas de otimização combinatória. Um tipo particular destes métodos, chamado de heurística, caracteriza-se pela busca de características e informações intrínsecas ao problema a ser explorado, facilitando o encontro de um mínimo global no espaço de soluções viáveis. As heurísticas são limitadas e fornecem sempre a mesma solução quando iniciadas de um mesmo ponto de partida. Somente a partir dos anos 80, começaram a surgir na literatura o que se denomina de meta-heurísticas ou heurísticas inteligentes, tais como: Algoritmos Genéticos, GRASP, Busca Tabu, entre outras diversas. Esta nova técnica heurística veio suprir a deficiência das heurísticas e, tem como objetivo principal explorar um espaço de pesquisa de forma inteligente, ou seja, encontrar soluções de alta qualidade movendo-se para áreas não exploradas quando necessário. Formalmente, Meta-heurística é um processo iterativo ou de refinamento de solução de

10 problemas, que organiza e direciona heurísticas subordinadas, pela combinação de diferentes conceitos, podendo manipular soluções completas, incompletas ou um conjunto de soluções, tentando evitar a parada prematura em um ótimo local, através de mecanismos que permitam escapar deste, podendo assim obter um desempenho superior ao comparar com heurísticas tradicionais. A utilização de meta-heurísticas visando à solução de problemas, tais como o problema da Árvore Geradora de custo Mínimo com Grau Restrito (AGMGR), que será estudado neste trabalho, é justificada pela complexidade do problema em geral, motivo que inviabiliza a utilização de técnicas exatas para resolvê-los, para instâncias de médio e grande porte. A meta-heurística GRASP, atualmente possui um grande destaque na literatura para problemas de otimização. Tal destaque deve-se aos bons resultados obtidos nas aplicações já realizadas, pela facilidade de paralelização e principalmente por sua flexibilidade, sendo tais características o motivo da escolha desta meta-heurística para ser aplicada ao problema da Árvore Geradora Mínima com Grau Restrito. A utilização de uma meta-heurística GRASP neste caso se torna viável devido à complexidade existente nesse tipo de problema, principalmente quando existem vários vértices envolvidos no problema. Neste trabalho, procura-se fazer uma melhoria no desempenho dessa meta-heurística inserindo na fase de construção da solução inicial o Algoritmo de Prim, visando-se obter um resultado de qualidade no inicio da execução do algoritmo, aumentando, desta forma, a possibilidade de encontrar a solução ótima do problema com um número menor de iterações. Esta monografia está organizada da seguinte forma: o Capítulo 2 apresenta uma revisão bibliográfica sobre o problema da Árvore Geradora Mínima de Grau Restrito; o Capítulo 3 apresenta os métodos de resolução dos problemas de Otimização Combinatória mais conhecidos; no Capítulo 4 é apresentada uma proposta de resolução para o problema da Árvore Geradora Mínima de Grau Restrito; no Capítulo 5 os resultados dos testes computacionais são reportados; e por fim, no Capítulo 6 são apresentadas as conclusões e as pesquisas futuras.

11 2 PROBLEMA DA ÁRVORE GERADORA MÍNIMA DE GRAU RESTRITO 2.1 Conceitos Básicos Sobre Grafos O problema da árvore geradora mínima de grau restrito, cuja resolução consiste no foco deste trabalho, pertence à Teoria dos Grafos, que é um ramo da matemática que estuda a relação entre os objetos de um determinado conjunto. Antes de apresentarmos o problema propriamente dito, faz-se necessário resgatar alguns conceitos da Teoria dos Grafos baseados nos trabalhos escritos por Arroyo (2002), Rosseti (2003), Nascimento (2007), Szwarcfiter (1984), Christofides (1975) Wai-Kai (1990), Even (1980), Chartrand (1993), Boaventura (1996), a fim de se obter uma melhor compreensão sobre o problema estudado e suas variações. Grafo é uma estrutura G(V, A) onde V é um conjunto não vazio de objetos denominados vértices e A um conjunto de pares ordenados de V, chamados arcos. O primeiro vértice do par é a ponta inicial do arco e o segundo vértice é a ponta final do arco. Um arco com ponta inicial u e ponta final v é denotado (u, v) ou simplesmente uv. Dizemos que o arco uv vai de u até v. A Figura 1 mostra um exemplo de um grafo G em que V é o conjunto composto pelos vértices {a, b, c, d} e A o conjunto de arestas denotado pelos pares ordenados {(a, b), (b, c), (c, a), (c, b), (c, d), (d, d)}. Dizemos que um arco xy sai de um vértice u, se x=u. Analogamente um arco xy entra no vértice u se y=u. Dados vértices u e v de um grafo, existe no máximo um arco uv e no máximo um arco vu. Em outras palavras, em grafos não existem arcos paralelos. Por outro lado podem existir arcos do tipo uu, onde a ponta final coincide com a inicial. Um arco desse tipo é conhecido

12 como laço. No caso de existir no mesmo par de vértices um arco do tipo uv e um arco do tipo vu, esse par de arcos pode ser denominado simplesmente de aresta, conceitos ilustrados na Figura 1. Um grafo é dito completo, Figura 2, se não possuir laços e para cada vértice deve haver uma aresta ligando este vértice a cada um dos demais vértices. Ou seja, em um grafo com n vértices, cada um dos vértices possui n-1 arestas. Uma aresta conecta dois vértices e esses dois vértices usualmente são denominados incidentes à aresta. O grau, ou valência, de um vértice é o número de arestas incidentes a ele. Nos casos em que o vértice possui um laço, este é contado duas vezes. Percebe-se que em um grafo completo de n vértices todos os vértices possuem o mesmo grau (n-1). O grau de um grafo é definido como o maior grau entre seus vértices. Dependendo do que se deseja modelar através do uso de grafos, arestas podem ou não ter direção. Vértices ou arestas podem ter um peso (numérico) associado. Se as arestas têm uma direção associada (indicada por uma seta na representação gráfica), como ilustrado na Figura 1, o grafo é dito direcionado, orientado ou dígrafo. Se tiver pesos associados às arestas, é chamado de valorado, que é mostrado na Figura 3. Em Teoria dos Grafos, um caminho em um grafo é uma sequência de vértices tal que, de cada dois vértices consecutivos há uma aresta unindo-os no grafo. O primeiro vértice é

13 chamado de vértice inicial e o último de vértice final. Um caminho sem vértices repetidos é chamado de caminho simples. A Figura 4 mostra um caminho cujo vértice inicial coincide com o vértice final. Um caminho com esta característica é denominado ciclo. Observe que a escolha do vértice inicial em um ciclo é arbitrária. Um laço pode ser considerado um ciclo de comprimento igual a um. Se o ciclo envolve todos os vértices do grafo, ele é chamado de ciclo hamiltoniano. Um ciclo simples é um ciclo que tem comprimento maior ou igual a 3 e no qual o vértice inicial só aparece mais uma vez, como vértice final, e os demais vértices aparecem só uma vez. Um grafo é denominado acíclico se não contém ciclos simples. Um grafo é denominado conexo se, para qualquer par de vértices u e v do grafo, existe um caminho de u para v. Na Teoria dos Grafos, uma árvore é um grafo conexo e acíclico. Caso o grafo seja acíclico, mas não conexo, ele é dito uma floresta. Estes conceitos estão ilustrados na Figura 5. Uma floresta também é definida como uma união disjunta de árvores. Uma árvore de um grafo G é um subgrafo de G = (V, A) conexo e acíclico. Uma Árvore Geradora de G é uma árvore que contém todos os nós do grafo. Uma Árvore Geradora Mínima é uma árvore geradora cuja soma dos pesos de suas arestas é mínima em G. A importância dessa estrutura é enorme tanto na prática dos problemas de otimização, como parte da solução de vários outros modelos. Suas maiores aplicações na área de Pesquisa

14 Operacional estão associadas aos problemas de comunicação e conexões. Outra maneira usual de definir o Problema da Árvore Geradora Mínima diz respeito ao conceito de grafo do tipo rede. Esta estrutura é bastante utilizada nos mais diversos problemas de Otimização. Um grafo que possui valores numéricos associado à suas arestas, ou vértices, ou até mesmo em ambos é chamado de Rede, demonstrado pela Figura 6. Uma rede básica, N, é um dígrafo que possui as seguintes características: N tem, exatamente, uma origem e um destino e para cada arco v de N está associado um número positivo c(v) que se designa capacidade do arco v e representa a quantidade máxima de fluxo nesse arco em um determinado período de tempo. A capacidade de cada arco de uma rede geralmente é distinta, de uma maneira geral. A capacidade de transporte dos arcos que saem do vértice inicial e chegam por diferentes caminhos ao vértice final em uma rede é chamada de fluxo de rede. Um fluxo numa rede básica N com origem S e destino T consiste na atribuição de um número não negativo f(v) a cada arco de N. Os fluxos de uma rede devem obedecer a algumas restrições: Em cada arco, o fluxo não pode exceder a capacidade do arco, e os vértices, ou nós, não são pontos de consumo, isto é, a soma que chega ao nó deve ser igual à soma que sai do nó. Exceto os nós de origem e destino. Quando o fluxo de um arco é igual à capacidade do mesmo, esse arco é chamado de arco saturado, e quando o fluxo é menor do que a capacidade é dito arco não saturado. 2.2. Árvore Geradora Mínima Baseado em Goldbarg e Luna (2002), o problema da Árvore Geradora Mínima (AGM) pode ser descrito da seguinte forma: considere uma rede não direcionada, conectada e associada a cada arco um valor (peso, tempo, etc.) não negativo, o objetivo é encontrar o caminho mais curto de tal maneira que os arcos forneçam um caminho entre todos os pares de nós.

15 Esse problema pode ser aplicado em diversas situações como: projetos de redes de telecomunicação (redes de computadores, de fibra óptica, de telefonia, de televisão a cabo), no projeto de rodovias, estradas e ferrovias, projetos de redes de transmissão de energia, e diversas outras aplicações com o intuito de diminuir gastos de ligação ou melhorar desempenho de sistemas. Sobre o problema da Árvore Geradora Mínima alguns conceitos fundamentais estão envolvidos. Uma rede com n nós, requer somente n-1 arcos para produzir uma ligação entre cada par de nós. Os n-1 arcos devem formar uma árvore geradora. O problema é achar a árvore geradora com menor custo total. Parte do princípio que existe apenas os nós de uma rede e arcos potenciais. 2.3 Árvore Geradora Mínima com Grau Restrito O problema abordado nesse trabalho é uma situação específica do problema da Árvore Geradora Mínima, conhecido como Problema da Árvore Geradora Mínima com Grau Restrito. Esse problema específico visa identificar uma Árvore Geradora Mínima cujos vértices possuem um determinado grau máximo k, onde k>=2. O objetivo do algoritmo que resolve esse problema é ligar todos os nós que compõem o grafo em questão com o menor custo possível, obedecendo a capacidade de ligação de cada nó, como por exemplo, cada nó do grafo deve conter no máximo três ligações. O problema da Árvore Geradora Mínima de Grau Restrito é considerado NP - Difícil. Problemas da classe NP são problemas onde o número de computações do melhor algoritmo conhecido cresce exponencialmente em função do tamanho da instância e não existe a garantia da existência de algoritmos melhores. Um problema é NP - Difícil se todos os problemas da classe NP forem redutíveis a ele. Como o número de computações cresce exponencialmente, para instâncias maiores desse problema, a utilização de um algoritmo exato se torna inviável devido ao algoritmo levar um tempo enorme para resolver o problema ou até mesmo levar o computador a situações de instabilidade como o travamento. Então, para resolver esse problema, será utilizado nesse trabalho um método aproximativo chamado de meta-heurística, que não garante a solução ótima, mas para problemas complexos normalmente oferece uma solução muito boa em tempo relativamente pequeno.

16 3 TÉCNICAS DE RESOLUÇÃO 3.1 Meta-heurísticas Até o final dos anos 80, os métodos heurísticos propostos para resolver problemas de otimização combinatória eram, em sua maioria, específicos e dedicados a um dado problema. A partir daí, esse paradigma muda e surge um grande interesse em técnicas que sejam mais gerais e por isso, aplicáveis a diversos problemas. Técnicas assim são conhecidas por Metaheurísticas. Dentre elas destacam-se: Simulated Annealing, Tabu Search, Genetic Algorithm, Scatter Search, GRASP (Greedy Randomized Adaptive Search Procedures), Colônia de Formigas, VNS (Variable Neighbourhood Search), e outras técnicas. Meta-heurísticas são heurísticas genéricas que são utilizadas para obter, em tempo hábil, soluções viáveis e eventualmente ótimas, principalmente para problemas de otimização combinatória de elevada complexidade computacional. A seguir será descrito, de forma breve, um pouco sobre as meta-heurísticas mais conhecidas e mais utilizadas. As Meta-heurísticas vêm tendo um ótimo desempenho nos últimos anos quando se diz respeito a problemas de otimização. Por essa razão, acredita-se ser importante discorrer sobre algumas meta-heurísticas mais conhecidas para a resolução desse tipo de problema, com o objetivo de ter uma visão geral sobre o procedimento utilizado por cada uma delas a fim de se obter resultados satisfatórios em um tempo hábil. Uma grande vantagem das meta-heurísticas em relação a outros métodos de resolução de problemas de otimização é que elas são bastante adaptáveis. Cada uma delas pode ser, com mais ou menos esforço, personalizada para resolver praticamente todo tipo de problema de otimização, independente de suas peculiaridades. Para que uma meta-heurística explore o espaço de busca de forma inteligente, obtenha soluções de ótima qualidade e consiga mover-se para áreas não exploradas quando necessário, os conceitos de intensificação e diversificação devem ser contemplados. A intensificação consiste em concentrar as buscas em regiões promissoras em torno de boas soluções. A diversificação consiste em fazer buscas em regiões ainda não exploradas, visando fugir de ótimos locais. Toda meta-heurística deve possuir componentes de diversificação e intensificação. Esses dois componentes devem ser balanceados e bem utilizados. Baseando-se nos trabalhos realizados por Campello e Maculan (1994), Feo e Resende (1995), Osman e Kelly (1995), Pirlot (1992) e Viana (1998), será descrito os aspectos mais

17 relevantes de algumas Meta-heurísticas que possuem destaque na literatura atual. Sobre a Meta-heurística Simulated Annealing pode-se afirmar que: Considerando a diferença de Energia dada por E E = Ei+1 Ei. É um algoritmo de busca local que explora a analogia entre os problemas de otimização combinatória e os da mecânica estatística. Tal analogia é feita associando-se as soluções viáveis dos problemas de otimização combinatória a estados dos sistemas físicos sendo que seus custos são associados à energia desses estados. Considerando dois estados sucessivos de energia Ei e Ei+1, correspondendo a duas soluções vizinhas e tomemos E E = 0, há situação de estabilidade e, portanto, não há alteração de energia, isto é, a função custo do problema permanece inalterada; se E E<0, há redução de energia e o processo continua, ou seja, há redução na função custo do problema e a nova alocação deve ser aceita; se E E > 0, fica caracterizado um aumento de energia, útil no processo físico para permitir uma futura acomodação das partículas, ou seja, a função custo do problema sofre aumento. Ao invés desta alocação ser eliminada, ela poderá eventualmente ser aproveitada. Para isso, uma função de probabilidade deverá ser acionada para evitar a convergência da função para mínimos locais indesejáveis. Sobre a Meta-heurística Busca Tabu afirma-se que é um algoritmo de busca local introduzido por Glover (1989) para problemas de programação inteira, com o objetivo de encontrar soluções de boa qualidade. Caracteriza-se pela existência de uma lista atualizada das melhores soluções encontradas no decorrer do algoritmo, onde cada solução possui um valor de prioridade ou critério de aspiração. Seus ingredientes básicos são uma lista tabu, para armazenar um histórico da evolução do processo de busca, um mecanismo que permite aceitar ou rejeitar uma nova alocação na vizinhança, baseado nas informações armazenadas na lista tabu e suas respectivas prioridades e um mecanismo que permite alternar entre estratégias de diversificação e intensificação na vizinhança. Algoritmos Genéticos são definidos como técnicas que se apóiam nos mecanismos de seleção e adaptação natural das espécies. Tais algoritmos mantêm uma população formada por um subconjunto de indivíduos, que no caso dos problemas de otimização combinatória são as soluções viáveis, com valores de aptidão associados aos custos de tais soluções. Através dos chamados operadores genéticos e de critérios de seleção, cada algoritmo substitui uma população de indivíduos por outra, com valores de aptidão, em média, melhores. A idéia básica consiste em acreditar que os melhores indivíduos sobrevivem e geram descendentes com suas características hereditárias, de maneira semelhante à teoria biológica das espécies. De forma análoga, os algoritmos genéticos partem de um conjunto de soluções iniciais

18 geradas aleatoriamente, avaliam seus custos, selecionam um subconjunto das melhores soluções e realizam operações genéticas sobre elas, gerando um novo conjunto de soluções ou uma nova população. A Meta-heurística Scatter Search foi introduzida por Glover (1977) em um estudo heurístico de problemas de programação linear inteira. É um método evolutivo que considera combinações lineares de vetores-solução para produzir novos vetores-solução através de gerações sucessivas. Esta metaheurística é composta por uma fase inicial e outra evolutiva. Na primeira, se constitui um conjunto de soluções, das quais as melhores são escolhidas para fazerem parte de um conjunto referência. Na fase evolutiva, novas soluções são geradas utilizando combinações de subconjuntos referência que são selecionados estrategicamente. A partir daí, um conjunto das melhores soluções geradas é incluído no conjunto referência. Os procedimentos da fase evolutiva são repetidos até que o processo satisfaça a um critério de parada qualquer. O GRASP (Greedy Randomized Adaptive Search Procedures) é uma técnica aleatória e iterativa onde, a cada iteração, uma solução aproximada para o problema é obtida. A melhor solução resultante de todas as iterações é a solução final. Em cada iteração, a primeira solução é construída através de uma função gulosa aleatória e as soluções posteriores são obtidas aplicando-se, sobre a solução anterior, um algoritmo de busca local que forneça uma nova solução melhor que a anterior. Ou seja, cada iteração é composta por duas fases, uma de construção e outra de busca local. Ao final de todas as iterações, a solução resultante é a melhor solução gerada. Nada garante que soluções geradas por uma construção GRASP não recaiam em ótimos locais. Assim, é importante aplicar a fase de busca local na tentativa de melhorar tais soluções. Com o uso de estruturas de dados personalizadas e uma implementação cuidadosa, uma fase construtiva eficiente pode produzir boas soluções iniciais, possibilitando uma busca local eficiente. O método Colônia de Formigas trata-se de uma classe de algoritmos distribuídos que tem como principal característica, a definição de propriedades na interação de vários agentes simples. Tem como princípio a forma como as formigas são capazes de encontrar um caminho do formigueiro até uma fonte de alimento e vice-versa. Cada agente simples é chamado de formiga e o conjunto de formigas, cooperando numa atividade comum para resolver um problema, constitui o sistema. A principal característica do método é que a interação desses agentes gera um efeito sinérgico, pois a qualidade da solução obtida aumenta quando tais agentes trabalham juntos, interagindo entre si, para a resolução de um mesmo problema.

19 A Meta-heurística de Busca em Vizinhança Variável, conhecida por VNS (Variable Neighbourhood Search), foi introduzida por Mladenović (1995) e Mladenović & Hansen (1997). É baseada na mudança sistemática das vizinhanças utilizadas na busca e vem sendo aplicada na resolução de grandes exemplares para problemas combinatórios. Não resta dúvida que, embora essas Meta-heurísticas tenham sido criadas a partir de conceitos distintos, todas possuem características em comum que na prática tem produzido resultados confiáveis, e eventualmente soluções ótimas têm sido encontradas. Além disso, como regra geral no campo das Meta-heurísticas, a solução tem sido encontrada em tempo relativamente baixo se comparada com os métodos de solução exatos. 3.2 Meta-heurística GRASP A meta-heurística que será abordada nesse trabalho, GRASP Greedy Randomized Adaptive Search Procedure baseia-se na construção de uma solução inicial e, a partir desta, realizar vários procedimentos de busca local visando uma melhoria na solução inicial. É importante frisar que esta meta-heurística atualmente possui um grande destaque na literatura para problemas de otimização em geral, devido aos bons resultados obtidos e, por esse motivo, foi escolhida para a solução do problema estudado neste trabalho. O GRASP que significa em português Procedimento de Busca Gulosa Adaptativa Aleatória é um processo iterativo em que cada iteração consiste em múltiplas aplicações de busca local, cada uma iniciando de uma solução diferente. O método em geral divide-se em duas fases: uma fase de construção e uma fase de busca local. 3.2.1 Fase de Construção Na fase de construção da meta-heurística GRASP, é utilizado um método para a construção de uma solução viável do problema para ser adotada como solução inicial. Nesta fase são geradas soluções iniciais através de algum tipo de construção randômica gulosa ou algum esquema de perturbação. O método de construção varia de acordo com o problema a ser resolvido. Nessa fase a solução inicial é construída elemento a elemento. Inicialmente o elemento está em uma lista de candidatos (LC) e através de um fator α (alfa), cujo valor se situa entre 0 e 100%, é criada uma lista restrita de candidatos LRC que possui os melhores elementos de LRC. O tamanho da LRC é determinado por: CardinalidadeLRC = α * CardinalidadeLC

20 Após a definição da LRC, seleciona-se um elemento da mesma para compor a solução. A seleção do elemento pode ser realizada aleatoriamente ou através de um critério guloso. Esses dois tipos de seleção provocam duas variações do GRASP conforme a construção da solução: gulosa ou aleatória. Após a adição do elemento na solução, o processo continua com a atualização de ambas as listas LC e LRC. À medida que os elementos vão sendo escolhidos para compor a solução, vão sendo retirados da LC. O processo de construção é finalizado quando a cardinalidade de LC possuir o valor zero, ou seja, não há mais elementos candidatos a constituir a solução, pois uma solução já está disponível. O valor de α influencia na qualidade e diversidade da solução gerada na fase de construção. Valores baixos de α geram soluções gulosas de boa qualidade, mas com pouca diversidade. Um valor alto de α, próximo a 100%, leva a uma grande diversidade, potencializando a obtenção de soluções de qualidade inferior. Isso também influencia o processo de busca local, pois soluções de qualidade inferior tornam o processo de busca local mais lento. O valor de α pode ser constante ao longo do algoritmo, mas pode sofrer também alterações a cada iteração ou por meio de um esquema aleatório ou adaptativo. 3.2.2 Fase de Busca Local A segunda fase da meta-heurística GRASP consiste em refinar a solução encontrada na primeira fase aplicando um método de busca local para fazer pequenas alterações na solução corrente denominada perturbações. Isso corresponde a uma intensificação na solução encontrada, explorando regiões vizinhas através da busca local para encontrar um ótimo local. A busca local pode ser sofisticada, entretanto, não se deve esquecer o diferencial do GRASP, que é explorar o espaço de soluções com gerações rápidas. Quanto melhor for a qualidade da solução gerada na primeira fase, maior será a velocidade para encontrar um ótimo local. Nesta fase o algoritmo utiliza a solução atual, que no inicio é a solução construída na fase anterior, e nela faz uma série de pequenas perturbações, pequenas alterações, que modificarão levemente a solução, visando uma melhoria no custo final. Após cada perturbação é verificada se a solução continua viável. Após um ciclo de perturbações, é avaliada se houve melhoria na solução ou não. Caso em qualquer uma das perturbações tenha sido achada uma solução melhor que a atual, esta solução será adotada como solução atual para o início de uma nova iteração. Caso não tenha sido identificada melhoria em nenhuma

21 das perturbações, a melhor solução encontrada após o término da fase de busca local é adotada como solução do problema sobre análise. No final de um ciclo de iterações, é destacado o melhor resultado encontrado dentre todas elas, que pode não ser a solução ótima, mas espera-se que seja pelo menos uma solução muito boa, com a vantagem de ter sido encontrada em um tempo relativamente pequeno. 3.3 Algoritmos para Árvore Geradora Mínima Existem vários algoritmos que propõem soluções para o problema da Árvore Geradora Mínima e suas variantes, dentre os quais, os mais conhecidos e utilizados serão descritos a seguir. Todos eles são procedimentos que sempre encontram a solução ótima para qualquer instância. Um dos algoritmos para Árvores Geradoras Mínimas mais conhecidos é o de Kruskal. Este algoritmo inicia sua procura da solução fazendo uma busca na tabela de custos das arestas, selecionando as arestas de menor peso e inserindo-a na solução. Logo após, o algoritmo vai analisar a tabela de custos novamente, procurando entre as arestas do grafo, a menor destas que ainda não foi adicionada a solução. Quando a encontra, é verificado dentre as restrições do problema, se a aresta pode ser adicionada à solução sem que a mesma se torne inviável ou nula. Esse passo de buscar a menor aresta e verificar a possibilidade de sua adição na solução é repetido até que todos os vértices façam parte da solução e formem uma Árvore Geradora. Outro algoritmo bastante utilizado para resolver o mesmo tipo de problema é o Algoritmo de Boruvka. Ele funciona da seguinte forma: dado um grafo, representado sob qualquer uma das suas possíveis formas, o Algoritmo consiste em encontrar a mínima distância entre todos os pontos do grafo. Caracteriza-se pela divisão do grafo original em vários subgrafos para os quais é calculado a Árvore Geradora Mínima, ou seja, pode ser considerado uma variação do Algoritmo original de Dijkstra, que é usado para resolver o problema do caminho mais curto em um grafo direcionado ou não direcionado, com arestas de peso não negativo. Trata-se de um algoritmo guloso, ou seja, toma a decisão que parece ótima no momento. O algoritmo de Boruvka é um procedimento com velocidade e convergência bastante rápida, sendo ideal para implementação em computadores paralelos já que a Árvore Geradora Mínima de cada um dos subgrafos pode ser calculada numa máquina diferente. Este algoritmo é recursivo e só termina quando existe apenas um vértice.

22 O Algoritmo escolhido para ser utilizado neste trabalho, se não é o mais conhecido dos algoritmos propostos para este problema, é o mais utilizado e seu processo de busca pela solução é fácil de compreender. O Algoritmo de Prim é um algoritmo em Teoria dos Grafos que busca uma Árvore Geradora Mínima para um grafo conexo, ou seja, que possua ligações entre todos os seus nós, e com pesos mínimos. O Algoritmo de Prim é um exemplo de um algoritmo guloso. Um algoritmo guloso, ou ganancioso, é uma técnica de algoritmos para resolver problemas de Otimização, sempre realizando a escolha que parece ser a melhor no momento, fazendo uma escolha ótima local, na esperança de que essa escolha nos leve a uma solução ótima global. Esse tipo de algoritmo tem a vantagem de ser de fácil implementação e ser considerado simples, e tem como desvantagens o fato de, nem sempre, conduzir a soluções ótimas globais e também podem efetuar cálculos repetitivos. No caso do Algoritmo de Prim ele sempre encontra a solução ótima. O Algoritmo de Prim é uma técnica de resolução que parte do princípio de se fazer uma análise da vizinhança adicionando gradativamente os nós candidatos, buscando ligar todos os nós com o menor custo. O algoritmo é muito eficiente em pequenas situações, porém, por se tratar de uma técnica que analisa todas as possibilidades de ligação, não se torna viável para grandes configurações. Os passos do Algoritmo de Prim são mostrados no Quadro 1: Um dos nós candidatos é escolhido para ser o nó inicial do algoritmo. Esse nó passa a fazer parte da solução atual. Na solução atual é feita uma busca pela sua vizinhança considerando-se o valor das possíveis arestas, dentre as quais será escolhida a melhor delas, que no caso do problema da árvore geradora mínima é a aresta de menor custo. A aresta escolhida e o nó que está ligado à aresta passarão a fazer parte da nova solução atual, que agora vai conter o nó inicial, a aresta e o nó escolhido. Com a nova configuração, é feita uma nova pesquisa dentre as vizinhanças nas possíveis arestas que poderão ligar os nós que fazem parte da solução atual aos nós vizinhos que ainda não fazem parte da solução. Novamente é identificado o nó de menor custo e este nó, juntamente com sua respectiva aresta farão parte da nova configuração. O processo de pesquisa de vizinhança e adição de arestas e nós se repetirá até que todos os nós do grafo façam parte da solução. Quadro 1: Passos do Algoritmo de Prim

23 Com a finalidade de ilustrar o procedimento usado pelo Algoritmo de Prim, será apresentado um pequeno exemplo numérico e serão descritas, passo a passo, todas as operações realizadas por esse algoritmo de resolução. De acordo com a Figura 7, considere que uma grande multinacional do ramo de medicamentos deseja interligar suas filiais utilizando uma rede de dados de fibra óptica privada com o intuito de melhorar o desempenho de seu sistema de transmissão de dados. Cada filial está representada por um nó do grafo e as conexões potenciais entre as filiais são representadas pelas arestas. As distâncias em km entre as filiais são exibidas como pesos nas arestas do grafo. Arbitrariamente, o algoritmo seleciona um nó para se tornar o vértice inicial do problema. Na Figura 8, o algoritmo seleciona o nó O para inicio do procedimento. Qualquer outro nó poderia ter sido escolhido. O nó não conectado mais próximo de O é o nó A, então o algoritmo irá conectar o nó A ao nó O. O nó não conectado mais próximo dos nós O e A é o nó B, que está mais próximo de A. O algoritmo irá conectar o nó B ao nó A. Passo ilustrado através da Figura 9.

24 Na Figura 10, o nó não conectado mais próximo dos nós O, A, B é o nó C, que está mais próximo de B. Então o algoritmo vai conectar o nó C ao nó B. Como se pode observar na Figura 11, o nó não conectado mais próximo dos nós O, A, B, C é o nó E, que está mais próximo do nó B. Logo, o algoritmo irá conectar o nó E ao nó B. O nó não conectado mais próximo dos nós O, A, B, C, E é o nó D, que está mais próximo de E. Então o algoritmo conecta o nó D ao nó E. Passo ilustrado na Figura 12.

25 Como representado na figura 13, o nó não conectado mais próximo dos nós O, A, B, C, E, D é o nó T, que está mais próximo do nó D. O algoritmo irá conectar o nó T ao nó D. Na Figura 14, é apresentada a solução final que possui uma distância total de 14 quilômetros. Através dessa rede, é possível ir de uma filial até qualquer outra filial. A solução final encontrada pelo procedimento do Algoritmo de Prim mostrada na Figura 14 é dita Árvore Geradora Mínima do grafo inicial, com custo total da solução de quatorze quilômetros, que é uma solução ótima do problema. Independente do nó inicial escolhido pelo algoritmo, a solução final terá sempre o mesmo custo.

26 4 O ALGORITMO PROPOSTO Nesse trabalho foi abordado o problema da Árvore Geradora Mínima de Grau Restrito. Como esse problema é classificado como NP Difícil foi utilizada uma meta-heurística (GRASP) para resolvê-lo. A seguir será descrito em detalhes o algoritmo que foi utilizado na resolução do problema da Árvore Geradora Mínima com Grau Restrito. 4.1 Fase de Construção Na fase de construção da solução inicial de uma meta-heurística GRASP comum normalmente é utilizada uma técnica gulosa ou aleatória para a formação de uma solução inicial viável, para o início do procedimento computacional. Somente na fase seguinte, é utilizada sobre essa solução inicial, técnicas de melhoramento visando aprimorar a solução. Optamos por utilizar para a construção da solução inicial, uma adaptação do Algoritmo de Prim. Com isso, espera-se encontrar na fase de construção, uma solução muito boa, eventualmente ótima, e com isso diminuir o número de iterações de busca local. Desta forma, almeja-se melhorar o tempo computacional gasto para resolver o problema, porém tentandose assegurar a qualidade da solução obtida. O Algoritmo de Prim modificado que compõe a fase de construção da Meta-heurística é apresentado no Quadro 2. Entrada: Grafo G (V, A) conexo, grau máximo do grafo k, tamanho percentual da lista restrita de candidatos. Algoritmo: Passo 1: Escolha aleatoriamente um vértice inicial s. Insira-o na solução S. Passo 2: Selecione os vértices que não estão em S e que são adjacentes a vértices que estão em S, verificando se, uma vez conectados, não ultrapassam o grau k em S e não formam ciclos. Passo 3: Ordene-os do mais próximo ao mais distante de algum vértice de S (ou seja, das arestas de menor peso às de maior peso incidentes aos vértices de S). Passo 4: Selecione os % melhores vértices (ou seja, aqueles cujas arestas possuem menor peso) para formar a lista restrita de candidatos (LRC). Se o valor de LRC não for inteiro, selecione a quantidade de elementos correspondentes ao menor inteiro maior que LRC.

27 Passo 5: Escolha aleatoriamente um vértice da LRC para compor a solução. Insira-o, juntamente com sua aresta correspondente à solução S. Passo 6: Repita os passos 2 a 6 até que não se tenha mais vértices fora da solução S. Saída: Solução S contém uma árvore geradora. Quadro 2: Algoritmo Proposto Passos da Fase de Construção 4.2 Fase de Busca Local Na fase de busca local de uma meta-heurística GRASP, utiliza-se uma técnica sobre a solução inicial de forma a explorar a vizinhança desta solução obtida em busca de melhoramento no custo da solução. A técnica é aplicada até que não se consiga mais obter melhoramento da solução. A forma de exploração da vizinhança da solução obtida na fase de construção que propomos é apresentada no Quadro 3: Entrada: Solução inicial S Algoritmo: Passo 1: Para cada par de vértices v de grau 1 (ou seja, folhas da árvore) de S e sua respectiva aresta (v, u) faça: Passo 2: Para cada vértice w de S, tal que w u, crie uma solução S removendo a aresta (v, u) e inserindo a aresta (v, w). Verifique se a solução continua viável (se a aresta formada existe no grafo original e se o grau k está sendo respeitado). Se S for viável, insira-a em uma lista de soluções candidatas LSC. Passo 3: Seja C a melhor solução da LSC (a solução de menor custo). Passo 4: Se o custo de C for menor que o de S, então S=C e retorne ao passo 1. Senão, Fim do Algoritmo. Saída: Solução final S contendo uma árvore geradora. Quadro 3: Algoritmo Proposto Passos da Fase de Busca Local O algoritmo terá ainda como parâmetro o número de iterações GRASP desejado. Cada iteração GRASP consiste na geração de uma solução através da execução da Fase de Construção e a respectiva tentativa de refinamento da mesma através da execução da Fase de Busca Local. A Solução final S do algoritmo será a melhor solução obtida em todas as iterações GRASP.

28 4.3 Codificação A fim de verificar o desempenho computacional do algoritmo proposto, foi realizada uma implementação computacional do algoritmo. Para a implementação foi utilizada a linguagem de programação C e o editor utilizado para a edição e compilação do código foi o Bloodshed Dev C++ Versão 4, que possui um ambiente integrado que aborda as linguagens C e C++. Como guia de referência para codificação do programa na linguagem C foi utilizado Schildt (1997). Nesse primeiro momento, foi implementada uma solução que tem como objetivo resolver problemas de Árvore Geradora Mínima com Grau Restrito em grafos completos. 4.4 Exemplo Numérico Para uma melhor compreensão desse trabalho, aqui será descrito um exemplo numérico da aplicação do algoritmo proposto e para o qual foram realizados testes computacionais. Também será exibido um modelo matemático que foi executado por um resolvedor a fim de se obter a solução ótima. Considere um grafo completo G de vértices V = {1, 2, 3, 4, 5}, deseja-se obter a Árvore Geradora Mínima de G com o grau de vértice k = 3 e matriz de distância entre vértices descrita pela Tabela 1: 1 2 3 4 5 1 0 2 2 3 5 2 2 0 3 4 4 3 2 3 0 7 10 4 3 4 7 0 1 5 5 4 10 1 0 Tabela 1: Tabela de Custos do grafo G Figura 15. Resolvendo através de um método exato solução ótima deste problema é ilustrada na

29 Agora será mostrado passo a passo, todo o processo feito pelo algoritmo proposto em busca da solução final do problema. Na Figura 16, o algoritmo inicia seu procedimento a partir de uma fase de construção de uma solução inicial. Para esta fase, considere que α = 50% e que o grau de cada vértice seja no máximo k = 3. O algoritmo iniciará com o vértice inicial 1 e a partir do mesmo criará uma LRC contendo as 50% melhores arestas da lista de candidatos. Dentre as arestas existentes na LRC o algoritmo faz uma seleção aleatória do vértice e em seguida faz uma ligação entre o vértice escolhido e o vértice inicial. A aresta escolhida por método aleatório foi a aresta (1-2) com custo igual a dois, conforme Figura 17.

30 Agora o grupo solução já possui dois vértices. O grupo que já faz parte da solução possui seis arestas candidatas, a LRC deste grupo conterá as três melhores arestas e, dentre estas, uma será escolhida aleatoriamente para fazer parte do grupo solução. Neste passo o algoritmo selecionou a aresta (1, 3) com o custo dois, como se pode observar na Figura 18. Até este ponto a solução possui três vértices e, como mostrado na figura 18, o grupo solução possui seis arestas candidatas. Logo, a lista restrita de candidatos possui as cinqüenta por cento melhores arestas que participarão da seleção aleatória. Agora a aresta selecionada pelo método aleatório foi (1, 4) com custo de três unidades, conforme Figura 19. Neste passo a solução possui quatro vértices e aqui o grupo solução possui somente três arestas na lista de candidatos, pois devido à restrição do grau do vértice que é k = 3 no vértice 1 que já possui três ligações, todos os vértices candidatos ligados a ele deixarão de fazer parte da lista de candidatos. Então, dentre as três arestas da LC as cinqüenta por cento melhores (ou seja, as duas melhores) arestas da LC farão parte da LRC. Como se pode verificar na Figura 20, o algoritmo escolheu de maneira aleatória a aresta (2, 5) de custo quatro.

31 Aqui o algoritmo chegou ao final da fase de construção da solução inicial. Foi encontrada uma árvore geradora que tem o custo total onze, a qual servirá como parâmetro de entrada para a fase de busca local, ilustrada na Figura 21. A fase que se inicia agora fará uma busca pela vizinhança da solução tendo como objetivo a redução do custo total da solução já existente. O procedimento de perturbação executado por esta fase trata-se de encontrar um nó com grau de vértice igual a um, desconectá-lo da árvore, tentar conectá-lo a outro vértice que possa receber uma ligação e verificar o custo da nova solução. Esse vértice será testado em todos os vértices da solução. Esse procedimento será feito com todos os nós que possuem grau igual a um. Se houver melhora em alguma dessas tentativas, o algoritmo adota essa configuração melhor como solução corrente e inicia uma nova iteração de busca local, até que sejam feitos todos os testes na vizinhança e em nenhum destes tenha havido melhoria de custo. No final de todo esse processo, se dá por encerrada uma iteração GRASP. Como mostra a Figura 21, no início da fase de busca local o algoritmo identifica todos os nós da solução corrente, que possuem grau de vértice igual a um. No exemplo ilustrado, os nós 3, 4, 5, foram identificados com grau 1, o vértice 2 possui grau 2 e o vértice 1 possui grau 3. Os nós 3, 4, 5, passarão pelos processos de perturbações de busca local.

32 Primeiro serão feitas perturbações com o vértice 3, que será desconectado do nó 1 e será conectado ao nó 2. Com isso, a solução passa a ter custo total igual a doze, que é maior que o custo da solução corrente. Logo, essa perturbação será desconsiderada e o algoritmo avança para a próxima perturbação. O próximo passo do algoritmo é desconectar o nó 3 da solução e conectá-lo ao nó 4, com isso, a nova configuração passa a ter custo igual a dezesseis e essa configuração também será descartada pelo algoritmo. Na última ligação possível do nó 3, o mesmo será desconectado do nó 1 e conectado ao nó 5; com essa configuração, a solução passaria a ter custo igual a dezenove e seria descartada pelo algoritmo. Como o nó 3 não pode ser conectado a nenhum outro vértice da solução, o algoritmo passa a analisar o próximo nó de grau igual a um da solução corrente. A próxima tentativa será com o nó 4, que na solução corrente encontra-se ligado ao vértice 1 através de uma aresta com custo de ligação três. Este será desconectado da solução e primeiramente será conectado ao vértice 2, o que eleva o custo total da solução para doze; isto fará com que o algoritmo descarte essa configuração. O próximo passo é conectar o nó 4 ao nó 3, o que resulta que essa configuração possui custo igual a quinze e também será descartada pelo algoritmo. No passo seguinte, o nó 4 será conectado ao vértice 5; essa configuração faz com que o custo da solução, que antes era de onze, passe a ser de nove, e, portanto faz com que o algoritmo guarde esta configuração em memória para que no final da fase de busca, possivelmente substitua a solução corrente. Porém, a iteração não é interrompida e o algoritmo continua testando as possibilidades de configurações identificadas no inicio da fase de busca local. O último vértice de grau um identificado na solução corrente é o vértice 5, que primeiramente será desconectado do nó 2 e será conectado ao nó 3, fazendo com que o custo da solução seja igual a 17 e o algoritmo descarte a configuração. Em seguida, o nó 5 será conectado ao nó 4; essa mudança fará com que o custo, que ainda é de onze, seja reduzido para oito. O algoritmo compara o custo da configuração atual ao da solução que ele tinha encontrado e armazenado na memória. Após essa comparação, ao verificar a redução do valor na nova configuração, o programa substitui a solução armazenada por essa nova configuração encontrada de custo oito. Neste momento, como o nó 5 não pode ser conectado ao nó 1, devido ao grau do vértice 1 já possuir o valor três, e não haver mais nenhuma possibilidade de ligação, o programa resgata da memória a configuração guardada durante a fase de busca local e substitui a