• Nenhum resultado encontrado

Protecção máxima de redes de telecomunicações

N/A
N/A
Protected

Academic year: 2021

Share "Protecção máxima de redes de telecomunicações"

Copied!
74
0
0

Texto

(1)

Universidade de Aveiro Departamento deElectr´onica, Telecomunica¸c˜oes e Inform´atica, 2010

Jorge Miguel

Saavedra dos Santos

Oliveira

(2)
(3)

Universidade de Aveiro Departamento deElectr´onica, Telecomunica¸c˜oes e Inform´atica, 2010

Jorge Miguel

Saavedra dos Santos

Oliveira

Protec¸c˜

ao M´

axima de Redes de Telecomunica¸c˜

oes

Disserta¸c˜ao apresentada `a Universidade de Aveiro para cumprimento dos requesitos necess´arios `a obten¸c˜ao do grau de Mestre em Engenharia Electr´onica e Telecomunica¸c˜oes, realizada sob a orienta¸c˜ao cient´ıfica de Prof. Dr. Amaro Fernandes de Sousa, Professor Auxiliar do Departamento de Electr´onica, Telecomunica¸c˜oes e Inform´atica da Universidade de Aveiro

Apoio financeiro da FCT e do FSE no ˆambito do III Quadro Comunit´ario de Apoio.

(4)
(5)

o j´uri / the jury

presidente / president Professora Doutora Ana Maria Perfeito Tom´e

Professora Associada do Departamento de Electr´onica, Telecomunica¸c˜oes e In-form´atica da Universidade de Aveiro (por delega¸c˜ao da Reitora da Universidade de Aveiro)

vogais / examiners committee Professor Doutor Pedro Mendes Ferr˜ao Sim˜oes Patr´ıcio

Professor Auxiliar do Departamento de Matem´atica da Universidade da Beira In-terior (arguente principal)

Professor Doutor Amaro Fernandes de Sousa

Professor Auxiliar do Departamento de Electr´onica Telecomunica¸c˜oes e Inform´atica da Universidade de Aveiro (orientador)

(6)
(7)

agradecimentos / acknowledgements

Ao meu orientador, pela paciˆencia, empenho e orienta¸c˜ao cient´ıfica ao longo do desenvolvimento deste trabalho.

`

A Margarida, pela colabora¸c˜ao na fase final do trabalho e por nunca desistir. Aos meus pais e `a minha irm˜a, pelo apoio incondicional.

(8)
(9)

Palavras-Chave PBB-TE, Redes de telecomunica¸c˜ao, Optimiza¸c˜ao, Engenharia de Tr´afego, Protec¸c˜ao de Tr´afego

Resumo Esta disserta¸c˜ao aborda o problema da gest˜ao de recursos de redes de tele-comunica¸c˜oes que permitam melhorar o n´ıvel de protec¸c˜ao a falhas na rede. O objectivo ´e minimizar as cargas das liga¸c˜oes de uma rede com protec¸c˜ao de tr´afego baseada em dois percursos de encaminhamento, um percurso de servi¸co e um percurso de protec¸c˜ao, o mais disjuntos poss´ıvel.

Para atingir este objectivo, foram desenvolvidos algoritmos heur´ısticos que fazem uso do algoritmo de Dijkstra para a obten¸c˜ao de percursos de custo m´ınimo e do algoritmo de Suurballe para a obten¸c˜ao de pares de percursos disjuntos de custo m´ınimo, para mapear t´uneis de tr´afego numa rede de telecomunica¸c˜oes. Os algoritmos foram implementados na linguagem C. Verificou-se que ´e poss´ıvel, recorrendo aos algoritmos de optimiza¸c˜ao imple-mentados, reduzir as taxas de utiliza¸c˜ao m´axima de v´arias liga¸c˜oes da rede, reorganizando os t´uneis de tr´afego existentes, com pouca penaliza¸c˜ao para a taxa m´edia de utiliza¸c˜ao das liga¸c˜oes da rede. Isto permite que no caso de uma falha numa liga¸c˜ao, o seu tr´afego seja mais facilmente acomodado pelo resto da rede sem que os seus utilizadores se apercebam.

O trabalho desenvolvido nesta disserta¸c˜ao permite aos operadores de redes de telecomunica¸c˜oes reduzir os custos na melhoria da sua rede fazendo um reaproveitamento dos recursos existentes e ao mesmo tempo minimizando o impacto para os seus utilizadores no caso de falhas na rede.

(10)
(11)

Keywords PBB-TE, Telecommunication Networks, Optimization, Traffic Engineering, Traffic Protection

Abstract This dissertation addresses the problem of resource management in telecom-munications networks allowing for the improvement of protection against network failures. The goal is to minimize the link loads in a network with traffic protection based on two forwarding paths, one service path and one protection path, as disjoint as possible.

To reach this goal, heuristic algorithms were developed making use of Dijks-tra’s algorithm to obtain lowest cost paths and Suurballe’s algorithm to ob-tain lowest cost pairs of paths, to map traffic tunnels in a telecommunica-tions network. These algorithms where implemented in the C programming language.

The computational results show that, resorting to the implemented opti-mization algorithms, it is possible to reduce the highest loads of several network links, by reorganizing the existing tunnels, with little penalty on the average link load of the network. This allows that, in the case of one link failure, the traffic is more easily accommodated through the remaining links of the network with no impact noticed by its users.

This work enables telecommunication network operators to reduce its network updating costs through a better utilization of the existing resources and, at the same time, minimizing the impact to its users in the event of network failures.

(12)
(13)

Conte´

udo

Conte´udo i

Lista de Figuras iii

Lista de Tabelas v

1 Introdu¸c˜ao 1

1.1 Enquadramento e Motiva¸c˜ao . . . 1

1.2 Objectivos . . . 2

1.3 Conte´udo . . . 3

2 Especifica¸c˜ao da configura¸c˜ao da rede 5 2.1 Introdu¸c˜ao . . . 5

2.2 Especifica¸c˜ao do ficheiro de entrada . . . 5

2.3 Rede utilizada . . . 7

3 Determina¸c˜ao do balanceamento da carga da rede 9 3.1 Introdu¸c˜ao . . . 9

3.2 Algoritmos . . . 9

4 Optimiza¸c˜ao da carga da rede 13 4.1 Introdu¸c˜ao . . . 13

4.2 Algoritmos . . . 14

4.2.1 Pesquisa local . . . 14

4.2.2 Pesquisa local com m´ultiplas situa¸c˜oes iniciais . . . 15

4.2.3 Gera¸c˜ao de sequˆencias aleat´orias de n´umeros distintos . . . 16

4.2.4 Algoritmo de ordena¸c˜ao Quicksort . . . 17

4.2.5 Algoritmo de Dijkstra . . . 18

4.2.6 C´alculo dos custos das liga¸c˜oes . . . 22

4.2.7 Obten¸c˜ao do percurso de custo m´ınimo da lista de predecessores . . . 24

5 Optimiza¸c˜ao de novos t´uneis 27 5.1 Introdu¸c˜ao . . . 27

5.2 Algoritmos . . . 29

5.2.1 Algoritmo de Suurballe para percursos disjuntos nas liga¸c˜oes . . . 29

5.2.2 Transforma¸c˜ao de custos . . . 30 5.2.3 Obten¸c˜ao de caminhos disjuntos a partir de um conjunto de liga¸c˜oes . 30

(14)

5.2.4 Algoritmo de Suurballe para percursos disjuntos nos n´os . . . 33

5.2.5 Algoritmo geral para determinar um par de percursos . . . 35

5.2.6 Algoritmo de optimiza¸c˜ao de novos t´uneis . . . 35

6 Apresenta¸c˜ao e discuss˜ao dos resultados computacionais 39 6.1 Introdu¸c˜ao . . . 39

6.2 Solu¸c˜oes iniciais vs. Optimiza¸c˜ao global . . . 40

6.3 Optimiza¸c˜ao parcial vs. Optimiza¸c˜ao global . . . 41

6.3.1 Cen´ario A . . . 41 6.3.2 Cen´ario B . . . 42 6.3.3 Cen´ario C . . . 42 7 Conclus˜ao 45 Bibliografia 47 Apˆendices A T´uneis configurados A1 B Resultados A3

(15)

Lista de Figuras

2.1 Rede utilizada . . . 7

4.1 Matriz de adjacˆencia da configura¸c˜ao de teste . . . 21

4.2 Vectores de adjacˆencia correspondentes dos n´os 1 e 2 . . . 22

4.3 N´os interm´edios e liga¸c˜oes adjacentes de um percurso de um t´unel . . . 23

5.1 Exemplo 1 contra utiliza¸c˜ao do algoritmo de Dijsktra 2 vezes . . . 28

5.2 Exemplo 2 contra utiliza¸c˜ao do algoritmo de Dijsktra 2 vezes . . . 28

5.3 Exemplo de obten¸c˜ao de um percurso a partir de 2 conjuntos de liga¸c˜oes . . . 30

5.4 Transforma¸c˜ao de custos e duplica¸c˜ao de n´os, primeiro passo . . . 34

(16)
(17)

Lista de Tabelas

6.1 Carga inicial nas 5 piores liga¸c˜oes nos cen´arios A2, B3 e C4 . . . 40

6.2 Carga ap´os optimiza¸c˜ao de t´uneis novos . . . 41

6.3 Valores das 5 piores cargas no cen´ario A com as 2 opera¸c˜oes . . . 41

6.4 Valores das 5 piores cargas no cen´ario B com as 3 opera¸c˜oes . . . 42

6.5 Valores das 5 piores cargas no cen´ario C com as 4 opera¸c˜oes . . . 43 A.1 T´uneis utilizados . . . A1 B.1 Cen´ario A . . . A3 B.2 Cen´ario B . . . A5 B.3 Cen´ario C . . . A7

(18)
(19)

Cap´ıtulo 1

Introdu¸

ao

1.1

Enquadramento e Motiva¸

ao

O crescente aumento dos requisitos de largura de banda faz com que as tradicionais re-des de comuta¸c˜ao de circuitos synchronous digital hierarchy/optical network (SDH/SONET) sejam inadequadas ao elevado volume de tr´afego baseado em pacotes. Assim, existe um inte-resse, por parte dos operadores, em migrar para uma tecnologia que se adapte a este tipo de tr´afego. A Ethernet ´e uma tecnologia baseada em comuta¸c˜ao de pacotes e a sua ubiquidade torna-a mais barata que a tecnologia das tradicionais redes de transporte [1].

Uma rede de operador necessita de tempos de recupera¸c˜ao a falhas muito reduzidos e que, em caso de falha em algum elemento da rede, os restantes elementos consigam assegurar o funcionamento cont´ınuo desta. As redes Ethernet n˜ao respondem de forma adequada a estes requisitos pois s˜ao lentas na recupera¸c˜ao de falhas e n˜ao apresentam um mecanismo de protec¸c˜ao de tr´afego expl´ıcito.

As redes locais baseadas em Ethernet tiram partido das facilidades de auto-configura¸c˜ao desta tecnologia. Numa rede deste tipo s˜ao determinadas, automaticamente pelos switches, ´

arvores de suporte. Estas ´arvores apresentam um caminho ´unico entre qualquer par ori-gem/destino e n˜ao formam ciclos de encaminhamento. As liga¸c˜oes que n˜ao fazem parte da ´

arvore s˜ao utilizadas em caso de falhas na rede, sendo a ´arvore de suporte reconfigurada. A introdu¸c˜ao do protocolo IEEE 802.1w Rapid Spanning Tree Protocol (RSTP) [2] permite a reconfigura¸c˜ao da ´arvore de suporte, em caso de falha na rede, em menos de um segundo[3]. Para assegurar uma melhor utiliza¸c˜ao dos recursos da rede, foi elaborado o protocolo IEEE 802.1s Multiple Spanning Tree Protocol (MSTP) [4] que utiliza v´arias ´arvores de suporte para distribuir melhor o tr´afego por toda a rede[3].

Estes protocolos, que contribu´ıram para a populariza¸c˜ao da Ethernet pela facilidade e eficiˆencia de auto-configura¸c˜ao, n˜ao s˜ao facilmente escal´aveis e eficientes nas grandes redes dos operadores[5], o que constitui um obst´aculo `a adop¸c˜ao desta tecnologia. Al´em disso, os mecanismos de gest˜ao que funcionam em redes de pequena escala n˜ao funcionam necessaria-mente nas redes dos operadores [5].

Assim, para a tecnologia Ethernet ser considerada uma alternativa vi´avel face `as redes SDH/SONET, esta necessita, entre outros, de:

• Permitir a desactiva¸c˜ao dos protocolos de configura¸c˜ao autom´atica e da aprendizagem autom´atica de endere¸cos;

(20)

• Apresentar independˆencia de gest˜ao e transparˆencia entre o espa¸co de endere¸camento do cliente e do operador;

• Implementar gest˜ao centralizada de recursos;

• Implementar protec¸c˜ao de tr´afego com gest˜ao centralizada e tempos reduzidos de recu-pera¸c˜ao a falhas.

A necessidade descrita no primeiro ponto j´a ´e facilitada pela maior parte dos equipamentos de n´ıvel empresarial[5]. Os protocolos IEEE 802.1ad Ethernet Provider Bridging[6] e IEEE 802.1ah Provider Backbone Bridges [7] visam satisfazer a exigˆencia indicada no segundo ponto. O primeiro protocolo adiciona a cada pacote um campo VLAN ID independente do campo VLAN ID do cliente. O segundo realiza o encapsulamento de endere¸co MAC `a entrada da rede do operador para que os switches interiores n˜ao necessitem conhecer os endere¸cos MAC externos.

O protocolo IEEE 802.1Qay Provider Backbone Bridges - Traffic Engineering (PBB-TE)[8] dirige-se `a necessidade exposta nos dois ´ultimos pontos. Este protocolo define a cria¸c˜ao de percursos de encaminhamento entre os v´arios pontos de origem e destino de tr´afego, assim como o suporte de protec¸c˜ao 1:1, para cada um dos percursos de encaminhamento. S˜ao defini-dos percursos de servi¸co, utilizadefini-dos em situa¸c˜ao de opera¸c˜ao normal, e percursos de protec¸c˜ao, utilizados em situa¸c˜ao de falha. A alternˆancia entre estes pares de percursos previamente con-figurados ´e o mecanismo que permite uma recupera¸c˜ao r´apida perante situa¸c˜oes de falha. A optimiza¸c˜ao de todos os percursos de encaminhamento definidos habilita a acomoda¸c˜ao de todo o tr´afego afectado por uma falha num elemento da rede, pela restante rede.

1.2

Objectivos

O objectivo global desta disserta¸c˜ao ´e melhorar a utiliza¸c˜ao dos recursos de uma rede com gest˜ao centralizada baseada no protocolo IEEE 802.1Qay PBB-TE, atrav´es da optimiza¸c˜ao dos seus t´uneis de encaminhamento. Um operador de telecomunica¸c˜oes poder´a utilizar os resultados deste estudo num sistema de apoio `a gest˜ao de uma rede, por forma a minimizar as piores cargas dessa rede, com vista a aumentar a sua robustez. Pode ainda, perante a necessidade de acrescentar novos percursos de encaminhamento, cri´a-los de uma forma optimizada logo `a partida.

Para atingir o objectivo global ´e necess´ario fazer a determina¸c˜ao do balanceamento de carga da rede. Isto n˜ao representa uma optimiza¸c˜ao, mas ´e um processo necess´ario antes de se executarem os algoritmos de optimiza¸c˜ao numa rede com t´uneis j´a existentes. Este ´e o primeiro objectivo desta disserta¸c˜ao.

Para um operador de redes de telecomunica¸c˜oes pode n˜ao ser desej´avel alterar os percursos de servi¸co dos t´uneis da rede pois isto afecta o funcionamento normal da rede. Assim, o objectivo seguinte ´e fazer a optimiza¸c˜ao apenas dos percursos de protec¸c˜ao de todos os t´uneis de uma rede. Para isto ´e necess´ario calcular percursos de custo m´ınimo na rede.

Um operador de rede pode necessitar de configurar novos t´uneis de encaminhamento na rede, com e sem protec¸c˜ao. Deste modo, o ´ultimo objectivo ´e determinar a forma de configurar novos t´uneis na rede de forma optimizada. Assim, ´e preciso determinar a forma de calcular pares de percursos de custo m´ınimo numa rede.

(21)

1.3

Conte´

udo

Esta disserta¸c˜ao est´a organizada em sete cap´ıtulos. O cap´ıtulo 2 especifica os dados de entrada dos diferentes problemas e apresenta a forma de estrutura¸c˜ao dos dados para aplica¸c˜ao dos algoritmos utilizados nesta disserta¸c˜ao. ´E apresentada a rede utilizada nos testes dos algoritmos. O cap´ıtulo 3 apresenta a forma como ´e determinado o balanceamento da carga da rede. O cap´ıtulo 4 apresenta o procedimento de optimiza¸c˜ao dos percursos de protec¸c˜ao da rede atrav´es dos algoritmos de pesquisa local e de obten¸c˜ao de percursos de custo m´ınimo, com vista `a minimiza¸c˜ao das piores cargas. S˜ao ainda descritos os algoritmos de suporte. No cap´ıtulo 5 descreve-se o mecanismo de configura¸c˜ao de novos percursos de encaminhamento na rede, de forma optimizada, utilizando algoritmos de obten¸c˜ao de pares de percursos disjuntos de custo m´ınimo. No cap´ıtulo 6 s˜ao analisados os resultados obtidos em diferentes cen´arios e avaliada a eficiˆencia dos algoritmos nessas situa¸c˜oes. O cap´ıtulo 7 apresenta as conclus˜oes mais relevantes desta disserta¸c˜ao e aborda os poss´ıveis desenvolvimentos futuros.

(22)
(23)

Cap´ıtulo 2

Especifica¸

ao da configura¸

ao da

rede

2.1

Introdu¸

ao

Nesta disserta¸c˜ao, considera-se uma abstrac¸c˜ao das redes Ethernet. As redes s˜ao conside-radas como um conjunto de n´os e de liga¸c˜oes onde s˜ao mapeados t´uneis de encaminhamento. Os n´os s˜ao os pontos de origem e destino de tr´afego e as liga¸c˜oes s˜ao conex˜oes f´ısicas entre dois n´os. Os t´uneis s˜ao conex˜oes virtuais entre dois n´os, podendo atravessar v´arias liga¸c˜oes.

Assim, uma rede ´e definida por um grafo G = (N, L) em que |N | representa o n´umero de n´os da rede e |L| o n´umero de liga¸c˜oes. Cada par n˜ao ordenado {il, jl} representa uma liga¸c˜ao l bidireccional entre o n´o i ∈ N e o n´o j ∈ N . As liga¸c˜oes tamb´em podem ser representadas por dois pares ordenados, um arco (il, jl) no sentido de i para j e um arco (jl, il) no sentido de j para i. Estas defini¸c˜oes s˜ao utilizadas ao longo de toda a disserta¸c˜ao.

Os t´uneis s˜ao liga¸c˜oes l´ogicas, bidireccionais, entre pares de n´os origem/destino com um requisito de largura de banda espec´ıfico. Cada t´unel pode ter apenas um percurso de servi¸co definido, utilizado em situa¸c˜ao de funcionamento normal, ou dois percursos, um de servi¸co e um de protec¸c˜ao usado numa situa¸c˜ao de falha que afecte o percurso de servi¸co. Quando um t´unel ´e definido na rede, reserva-se a largura de banda requisitada pelo t´unel, em cada uma das liga¸c˜oes que este atravessa, em ambos os sentidos. Os requisitos de largura de banda de um t´unel podem ser diferentes em cada um dos seus sentidos. O conjunto T representa o conjunto de t´uneis t existentes na rede. Define-se ainda o conjunto Υ, como o conjuntos dos t´uneis τ que se pretendem mapear na rede.

2.2

Especifica¸

ao do ficheiro de entrada

Conhecidos os elementos constituintes de uma rede, o programa necessita que lhe seja fornecida a configura¸c˜ao da rede em que ir´a operar, atrav´es de um ficheiro de entrada. O ficheiro de entrada deve incluir, pela ordem apresentada, o n´umero de n´os da rede; o n´umero de liga¸c˜oes da rede; o n´umero de t´uneis configurados na rede e n´umero de t´uneis a adicionar `a rede.

De seguida, o ficheiro de entrada deve especificar a configura¸c˜ao f´ısica e a configura¸c˜ao l´ogica da rede.

(24)

Configura¸c˜ao f´ısica

• Lista dos n´os da rede n ∈ N , especificados por: IDn – ID do n´o.

• Lista das liga¸c˜oes da rede l ∈ L, especificadas por: IDl – ID da liga¸c˜ao;

il – ID do primeiro n´o extremo da liga¸c˜ao; jl – ID do segundo n´o extremo da liga¸c˜ao; capl – Capacidade da liga¸c˜ao em Mbps. Configura¸c˜ao l´ogica

• Lista dos t´uneis configurados na rede t ∈ T , especificados por: IDt – ID do t´unel;

it – ID do primeiro n´o extremo do t´unel; jt – ID do segundo n´o extremo do t´unel;

VALORt – vari´avel booleana que indica se o t´unel tem ou n˜ao protec¸c˜ao;

bt – Reserva de recursos do primeiro n´o extremo para o segundo n´o extremo, em Mbps; bt – Reserva de recursos do segundo n´o extremo para o primeiro n´o extremo, em Mbps; nst – N´umero de liga¸c˜oes do percurso de servi¸co;

npt – (Opcional) N´umero de liga¸c˜oes do percurso de protec¸c˜ao;

PSt – Lista de IDs das liga¸c˜oes do percurso de servi¸co, ordenadas do primeiro n´o extremo para o segundo n´o extremo;

PPt – (Opcional) Lista de IDs das liga¸c˜oes do percurso de protec¸c˜ao, ordenadas do primeiro n´o extremo para o segundo n´o extremo.

• Lista dos t´uneis novos τ ∈ Υ, especificados por: IDτ – ID do t´unel;

iτ – ID do primeiro n´o extremo do t´unel; jτ – ID do segundo n´o extremo do t´unel;

VALORτ – vari´avel booleana que indica se o t´unel tem ou n˜ao protec¸c˜ao;

bτ – Reserva de recursos do primeiro n´o extremo para o segundo n´o extremo, em Mbps; bτ – Reserva de recursos do segundo n´o extremo para o primeiro n´o extremo, em Mbps; As listas de IDs dos percursos dos t´uneis devem conter as liga¸c˜oes pela ordem que s˜ao percorridas, desde o primeiro n´o extremo at´e ao segundo n´o extremo. Este requisito permite tornar alguns algoritmos mais eficientes, como ´e mostrado mais `a frente.

No momento da leitura da informa¸c˜ao pelo programa, os IDs dos n´os, das liga¸c˜oes e dos t´uneis s˜ao armazenados. Em todos os c´alculos s˜ao utilizados os ´ındices atribu´ıdos aos elementos da rede, pela ordem de leitura.

(25)

2.3

Rede utilizada

A rede utilizada nos testes do programa foi a rede representada na figura 2.1. Na figura, os n´umeros em cada n´o identificam o ID do n´o e os n´umeros ao lado de cada liga¸c˜ao identificam o ID da liga¸c˜ao. Esta rede ´e constitu´ıda por 18 n´os e 33 liga¸c˜oes e apresenta um grau m´edio de 3,6(6). A configura¸c˜ao da rede escolhida apresenta uma caracter´ıstica comum numa rede de transporte: tem um n´ucleo em que as liga¸c˜oes apresentam elevada capacidade de largura de banda enquanto que nas zonas perif´ericas, a capacidade ´e menor. Nesta rede, ´e sempre poss´ıvel determinar dois percursos disjuntos nos n´os entre qualquer par de n´os origem/destino.

17

18

3

2

1

4

5

13

12

14

16

15

6

7

8

9

10

11

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 1000 Mbps 10000 Mbps

(26)
(27)

Cap´ıtulo 3

Determina¸

ao do balanceamento da

carga da rede

3.1

Introdu¸

ao

A primeira fun¸c˜ao implementada neste trabalho foi a determina¸c˜ao do balanceamento de carga da rede. Esta fun¸c˜ao n˜ao realiza qualquer optimiza¸c˜ao mas ´e necess´aria a sua execu¸c˜ao antes da execu¸c˜ao de todos os outros algoritmos para determinar o balanceamento actual da rede. S˜ao utilizados apenas os t´uneis j´a configurados na rede para determinar o balanceamento da carga. Se o ficheiro de entrada contiver t´uneis novos estes s˜ao ignorados. Esta fun¸c˜ao calcula a percentagem de utiliza¸c˜ao das liga¸c˜oes da rede na configura¸c˜ao de servi¸co e na configura¸c˜ao de carga m´axima. A carga da configura¸c˜ao de servi¸co ´e obtida considerando apenas os percursos de servi¸co dos t´uneis e indica a taxa de utiliza¸c˜ao das liga¸c˜oes na situa¸c˜ao de funcionamento normal da rede. A configura¸c˜ao de carga m´axima ´e obtida quando se incluem os percursos de protec¸c˜ao no c´alculo da carga. Estes valores representam um limite m´aximo de utiliza¸c˜ao de cada liga¸c˜ao, em caso de uma falha numa liga¸c˜ao.

O resultado da tarefa de balanceamento de carga ´e a percentagem de utiliza¸c˜ao, actual e m´axima, das liga¸c˜oes, em ambos os sentidos.

3.2

Algoritmos

O algoritmo 3.2.1 representa o algoritmo que adiciona as reservas de um dos percursos de um t´unel t `a carga das liga¸c˜oes atravessadas por esse t´unel t. a representa o n´o actual, it e jt representam o primeiro e segundo n´os extremo do t´unel t, respectivamente. P atht representa o conjunto de liga¸c˜oes de um dos percursos, de servi¸co ou de protec¸c˜ao, do t´unel t. il e jl representam o primeiro e o segundo n´os extremo da liga¸c˜ao l, respectivamente. Entenda-se por sentido directo o sentido do primeiro para o segundo n´o extremo e o inverso o sentido do segundo para o primeiro n´o extremo. Cl representa a carga da liga¸c˜ao l no sentido directo, de il para jl e Cl representa a carga no sentido inverso, de jl para il. bt e bt representam as reservas de recursos do t´unel t no sentido directo e inverso, respectivamente.

Este algoritmo ´e executado para cada um dos percursos, o de servi¸co e o de protec¸c˜ao, de todos os t´uneis. O algoritmo come¸ca por definir o n´o actual a como sendo o primeiro n´o extremo do t´unel t. De seguida, para a primeira liga¸c˜ao do percurso verifica se o n´o a

(28)

Algoritmo 3.2.1Adicionar reservas de um percurso de um t´unel `a rede

1: a ← it

2: for each l ∈ P atht do 3: if a = il then 4: Cl← Cl+ bt 5: C l← Cl+ bt 6: a ← jl 7: else 8: C l← Cl+ bt 9: Cl← Cl+ b t 10: a ← il 11: end if 12: end for

corresponde ao primeiro n´o extremo il dessa liga¸c˜ao ou ao segundo, n´o jl. Se corresponder ao primeiro, ent˜ao a liga¸c˜ao ´e percorrida no sentido directo, bt ´e adicionada `a liga¸c˜ao nesse sentido e bt ´e adicionada `a liga¸c˜ao no sentido inverso. O outro extremo da liga¸c˜ao actual l passa a ser o n´o actual a, neste caso, o segundo n´o extremo, n´o jl. Se o n´o actual a corresponder ao segundo n´o extremo da liga¸c˜ao, ent˜ao significa que o sentido directo do t´unel t percorre essa liga¸c˜ao no seu sentido inverso. Consequentemente, bt ´e adicionada `a carga da liga¸c˜ao no sentido inverso e bt ´e adicionada `a carga da liga¸c˜ao no sentido directo. O n´o actual a passa a ser o outro extremo da liga¸c˜ao l, neste caso, o primeiro n´o extremo il. Estas opera¸c˜oes sucedem-se por ordem, para cada uma das liga¸c˜oes do conjunto P atht, ou seja, da primeira para a ´ultima liga¸c˜ao l de um percurso do t´unel t.

Este algoritmo s´o funciona quando o conjunto de liga¸c˜oes de um percurso de um t´unel lhe ´e fornecido pela ordem pela qual as liga¸c˜oes desse percurso s˜ao percorridas, do primeiro n´o extremo para o segundo n´o extremo. Ao estarem ordenadas, o algoritmo s´o tem de avan¸car para a liga¸c˜ao seguinte no percurso e determinar o sentido em que s˜ao aplicadas as reservas. Se as liga¸c˜oes n˜ao aparecessem ordenadas, o algoritmo teria primeiro que determinar qual a liga¸c˜ao seguinte, no conjunto das liga¸c˜oes do percurso. Como este algoritmo n˜ao ´e utilizado apenas na determina¸c˜ao do balanceamento da carga da rede, mas tamb´em noutras opera¸c˜oes que s˜ao discutidas mais `a frente, ´e importante que este seja eficiente, pelo que, se considerou razo´avel o requisito de o ficheiro de entrada apresentar o conjunto de liga¸c˜oes de um percurso de forma ordenada.

A carga de servi¸co corresponde `a carga, em cada sentido, de cada liga¸c˜ao da rede na situa¸c˜ao em que os ´unicos percursos activos na rede s˜ao os de servi¸co. A carga m´axima ´e obtida considerando os percursos de servi¸co e de protec¸c˜ao activos. Os valores de carga m´axima representam o limite superior da carga que pode ser atingido numa liga¸c˜ao, quando todos os percursos de servi¸co e de protec¸c˜ao dessa liga¸c˜ao est˜ao activos.

Com o algoritmo de adi¸c˜ao de reservas de um percurso gen´erico P atht `a rede, pode ser constru´ıdo o algoritmo que permite determinar o balanceamento da carga na rede. Este algo-ritmo apresenta-se em 3.2.2. CSle CMlrepresentam as cargas de servi¸co e m´aximas,respectivamente, de uma liga¸c˜ao l ∈ L, no sentido directo. CSl e CMl representam as cargas de servi¸co e m´aximas, respectivamente de uma liga¸c˜ao l ∈ L, no sentido inverso. Os t´uneis com pro-tec¸c˜ao, t com VALORt= 1, constituem o conjunto Tp ⊂ T .

(29)

Algoritmo 3.2.2Determina¸c˜ao do balanceamento de carga 1: for each l ∈ L do 2: CSl← 0 3: CS l← 0 4: end for 5: for each t ∈ T do

6: Adicionar reservas do t´unel t no percurso PSt `a rede 7: end for 8: for each l ∈ L do 9: CMl ← CSl 10: CM l ← CSl 11: end for 12: for each t ∈ Tp do

13: Adicionar reservas do t´unel t no percurso PPt `a rede 14: end for

as reservas de todos os t´uneis t ∈ T nas liga¸c˜oes l ∈ PSt. As cargas m´aximas s˜ao inicializadas com os valores das cargas de servi¸co. S˜ao adicionadas as reservas de todos os t´uneis com protec¸c˜ao t ∈ Tp nas liga¸c˜oes dos percursos de protec¸c˜ao l ∈ PPt.

(30)
(31)

Cap´ıtulo 4

Optimiza¸

ao da carga da rede

4.1

Introdu¸

ao

A fun¸c˜ao de optimiza¸c˜ao da carga da rede tem como objectivo minimizar os valores das piores cargas da rede. Isto tornar´a uma rede mais robusta no que respeita `a susceptibilidade a falhas, uma vez que permite uma melhor acomoda¸c˜ao do tr´afego da rede, em situa¸c˜oes de imprevis´ıvel crescimento de tr´afego. O pior caso acontece quando todos os requisitos de tr´afego crescem simultaneamente. Se a pior carga de uma liga¸c˜ao da rede for a, com 0 < a < 1, ent˜ao todos os requisitos de tr´afico podem crescer simultaneamente at´e (1 − a)/a, antes de haver congestionamento na rede. Se a segunda pior carga da mesma rede for b, com 0 < b < a, todo o tr´afego que n˜ao use a pior liga¸c˜ao pode crescer at´e (1 − b)/b, sem que a rede fique congestionada. Assim, interessa minimizar n˜ao s´o a pior carga, mas tamb´em minimizar todas as cargas subsequentes entre todas as solu¸c˜oes em que as piores cargas anteriores s˜ao m´ınimas. O problema de optimiza¸c˜ao que aqui se considera assume que apenas se podem alterar os percursos de protec¸c˜ao dos t´uneis. Isto ´e importante para um operador, pois os t´uneis de protec¸c˜ao n˜ao s˜ao utilizados quando n˜ao h´a falhas, pelo que n˜ao existe impacto na rede se estes forem alterados. A altera¸c˜ao dos percursos de servi¸co dos t´uneis pode requerer uma reconfigura¸c˜ao com impacto para o funcionamento normal da rede.

´

E necess´ario que, sempre que poss´ıvel, os percursos de protec¸c˜ao se mantenham disjuntos dos percursos de servi¸co, tanto ao n´ıvel dos n´os como das liga¸c˜oes. Sem disjuntividade ´e imposs´ıvel garantir protec¸c˜ao em caso de qualquer falha.

O ficheiro de entrada deve incluir uma lista de t´uneis existentes na rede com as respectivas reservas e percursos. Ap´os a leitura do ficheiro de entrada, e antes de se averiguar uma solu¸c˜ao em que sejam minimizadas as piores cargas da rede, ´e determinado o balanceamento de carga. No final, o resultado desta tarefa permite estabelecer a percentagem de utiliza¸c˜ao, actual e m´axima, das liga¸c˜oes, em ambos os sentidos, assim como a lista de t´uneis da rede com os novos percursos de protec¸c˜ao. Se o ficheiro de entrada incluir t´uneis novos, estes s˜ao ignorados.

Esta tarefa utiliza o algoritmo de pesquisa local com m´ultiplas situa¸c˜oes iniciais para atingir o objectivo. Defina-se solu¸c˜ao vizinha da solu¸c˜ao actual como uma solu¸c˜ao que s´o difere da actual num percurso de um t´unel. Um algoritmo de pesquisa local ´e um algoritmo que analisa todas as solu¸c˜oes vizinhas da solu¸c˜ao actual e, entre estas, escolhe a melhor que ´e tamb´em melhor que a actual. De seguida, o processo repete-se a partir da an´alise de todas as solu¸c˜oes vizinhas. Quando j´a n˜ao existir uma solu¸c˜ao vizinha melhor que a actual, o algoritmo p´ara. Se se partir sempre do mesmo estado inicial, o algoritmo vai terminar sempre na mesma

(32)

solu¸c˜ao. Um algoritmo de pesquisa local com m´ultiplas situa¸c˜oes iniciais encontra v´arias solu¸c˜oes, comparando-as a cada nova solu¸c˜ao encontrada para definir a melhor. Primeiro, utiliza-se como solu¸c˜ao inicial a configura¸c˜ao da rede lida do ficheiro da entrada. Mais `a frente, neste cap´ıtulo, ´e descrito um m´etodo para determinar diferentes solu¸c˜oes iniciais.

4.2

Algoritmos

4.2.1 Pesquisa local

O algoritmo 4.2.1 reflecte a implementa¸c˜ao efectuada. Relembre-se que, como definido no cap´ıtulo 2, T representa o conjunto dos t´uneis t e adicionalmente defina-se um subconjunto Tp ⊂ T dos t´uneis t com VALORt = 1. M representa a melhor solu¸c˜ao at´e ao momento e A a solu¸c˜ao actual. PPt representa o percurso de protec¸c˜ao do t´unel t. PA representa um qualquer percurso de protec¸c˜ao. O s´ımbolo ≺ representa a opera¸c˜ao de “lexicograficamente menor que”.

Inicialmente, a melhor solu¸c˜ao ´e a actual. O passo seguinte consiste em remover, para cada t´unel definido na configura¸c˜ao da rede, as reservas do seu percurso de protec¸c˜ao. De seguida, ´e encontrado um novo percurso de protec¸c˜ao de custo m´ınimo e as reservas deste novo percurso s˜ao adicionadas `a rede. Esta nova configura¸c˜ao ´e vizinha da actual uma vez que apenas um percurso de protec¸c˜ao ´e alterado.

Algoritmo 4.2.1Pesquisa local

1: M ← A 2: Ordenar cargas de M 3: do 4: melhoria ← false 5: for eacht ∈ Tp do 6: PA ← PPt

7: Remover reservas do t´unel t no percurso PPtem A

8: PPt← Percurso de protec¸c˜ao de custo m´ınimo para o t´unel t 9: Adicionar reservas do t´unel t no percurso PPt em A

10: Ordenar cargas de A 11: if A ≺ M then

12: M ← A

13: melhoria ← true 14: end if

15: Remover reservas do t´unel t no percurso PPtem A 16: PPt← PA

17: Adicionar reservas do t´unel t no percurso PPt em A 18: end for

19: if melhoria = true then

20: A ← M

21: end if

22: while melhoria = true

Para determinar se uma nova configura¸c˜ao ´e melhor ou n˜ao que a actual, as cargas de todas as liga¸c˜oes de cada configura¸c˜ao s˜ao ordenadas numa lista, por ordem decrescente, e

(33)

comparadas carga a carga. A melhor configura¸c˜ao ´e aquela com a lista de cargas lexicogra-ficamente menor. Numa compara¸c˜ao, elemento a elemento, dos elementos da lista, a lista lexicograficamente menor ´e aquela que apresentar, para os dois primeiros elementos diferen-tes encontrados, o menor valor entre esses elementos. Se o primeiro elemento das listas for diferente, a lista que tem o menor elemento ´e lexicograficamente menor. Se os primeiros i elementos forem iguais ent˜ao a lista que tiver o menor elemento i + 1 ´e a menor.

Cada solu¸c˜ao vizinha encontrada ´e comparada com a melhor solu¸c˜ao vizinha at´e ao mo-mento e, no caso de ser melhor, substitui a anterior. Ap´os serem testadas todas as solu¸c˜oes vizinhas, considera-se a solu¸c˜ao actual a correspondente `a melhor solu¸c˜ao vizinha encontrada e o algoritmo repete-se at´e que n˜ao seja poss´ıvel encontrar uma solu¸c˜ao melhor. As reservas de largura de banda de um percurso de um t´unel t s˜ao adicionadas `a rede usando o algo-ritmo 3.2.1. A remo¸c˜ao das reservas de um percurso de um t´unel ´e efectuada com o mesmo algoritmo, mas as opera¸c˜oes de adi¸c˜ao s˜ao substitu´ıdas por subtrac¸c˜oes.

´

E necess´ario determinar a forma de c´alculo de percursos de custo m´ınimo para os t´uneis, o que ser´a abordado na sec¸c˜ao 4.2.5.

4.2.2 Pesquisa local com m´ultiplas situa¸c˜oes iniciais

Como anteriormente descrito, uma pesquisa local que comece sempre na mesma situa¸c˜ao inicial termina sempre na mesma solu¸c˜ao. No entanto esta pode n˜ao ser a melhor. Na tenta-tiva de encontrar solu¸c˜oes ainda melhores, foi implementado um algoritmo de pesquisa local com m´ultiplas situa¸c˜oes iniciais. As diferentes situa¸c˜oes iniciais s˜ao geradas removendo os percursos de protec¸c˜ao de todos os t´uneis assim como as suas reservas e, de seguida, calcu-lando, por uma ordem aleat´oria, novos percursos de protec¸c˜ao de custo m´ınimo para todos os t´uneis. Uma vez que se procuram percursos de custo m´ınimo, os percursos j´a calculados influenciam os percursos ainda por calcular, o que conduz a configura¸c˜oes diferentes, se a ordem de c´alculo dos percursos for diferente.

O algoritmo implementado para a pesquisa local com m´ultiplas situa¸c˜oes iniciais ´e o 4.2.2. T representa o conjunto dos t´uneis t e Tp ⊂ T ´e um subconjunto de t´uneis t com VALORt= 1. INC guarda a solu¸c˜ao incumbente, a melhor at´e ao momento. A representa a solu¸c˜ao actual, M guarda a melhor solu¸c˜ao encontrada numa pesquisa local. Este algoritmo ´e repetido durante um tempo m´aximo, MAXTIME, definido pelo utilizador. tempo guarda o tempo decorrido at´e ao momento.

A primeira solu¸c˜ao a ser testada ´e a configura¸c˜ao lida do ficheiro de entrada, que ´e salva como solu¸c˜ao incumbente INC. Inicializa-se o contador de tempo e, de seguida, ´e gerado um vector com |Tp| n´umeros aleat´orios, sem repeti¸c˜ao, com os ´ındices dos t´uneis t ∈ Tp, que determina a ordem de c´alculo dos novos percursos de protec¸c˜ao PPt. De seguida, removem-se todas as reremovem-servas dos percursos de protec¸c˜ao. Neste caso, como o objectivo ´e remover todas as reservas de todos os t´uneis nos percursos de protec¸c˜ao, podemos considerar-se que as cargas m´aximas s˜ao iguais `as da configura¸c˜ao de servi¸co, que foram calculadas anteriormente, durante a opera¸c˜ao de balanceamento de carga, em vez de remover as reservas t´unel a t´unel. Os pr´oximos passos s˜ao, pela ordem determinada anteriormente, calcular |Tp| novos percursos de protec¸c˜ao de custo m´ınimo para os |Tp| t´uneis e executar o algoritmo de pesquisa local 4.2.1. Se a solu¸c˜ao obtida neste algoritmo for melhor, ou seja, lexicograficamente menor que a incumbente, ent˜ao esta ´e a nova solu¸c˜ao incumbente. Se o tempo m´aximo MAXTIME tiver sido atingido, o algoritmo termina. Enquanto n˜ao o tiver sido, volta a repetir-se o procedimento, a partir da gera¸c˜ao de uma nova sequˆencia de n´umeros aleat´orios.

(34)

Algoritmo 4.2.2Pesquisa local com m´ultiplas situa¸c˜oes iniciais

1: INC ← A 2: tempo ← 0 3: do

4: for eacht ∈ Tp do

5: Remover reservas do t´unel t no percurso PPtem A 6: end for

7: Gerar ordem aleat´oria dos ´ındices t ∈ Tp 8: for eacht ∈ Tp pela ordem anterior do

9: PPt← Percurso de protec¸c˜ao de custo m´ınimo para o t´unel t 10: Adicionar reservas do t´unel t no percurso PPt em A

11: end for

12: Executar pesquisa local, algoritmo 4.2.1 13: if M ≺ INC then

14: INC ← M

15: end if

16: Actualizar tempo

17: while tempo < MAXTIME

Nos algoritmos anteriores, 4.2.1 e 4.2.2, falta esclarecer como ´e efectuada a gera¸c˜ao de sequˆencias de n´umeros aleat´orios distintos, a ordena¸c˜ao das cargas por ordem decrescente, assim como o c´alculo de percursos de custo m´ınimo, que se descrevem nas sec¸c˜oes 4.2.3, 4.2.4 e 4.2.5, respectivamente.

4.2.3 Gera¸c˜ao de sequˆencias aleat´orias de n´umeros distintos

Um m´etodo para criar as sequˆencias pretendidas ´e armazenar os n´umeros que v˜ao sendo sorteados se e s´o se ainda n˜ao tiverem sido armazenados, at´e serem armazenados todos os n´umeros. Quando restam poucos n´umeros para armazenar, pode ser muito demorado sortear os n´umeros em falta, especialmente se a sequˆencia a gerar for de grandes dimens˜oes, situa¸c˜ao em que a probabilidade de cada n´umero espec´ıfico ser sorteado ´e reduzida. Tomando em considera¸c˜ao a possibilidade de que nem todos os t´uneis de uma rede tˆem necessariamente protec¸c˜ao e que, por isso, os n´umeros que comp˜oe a sequˆencia n˜ao correspondem necessaria-mente a todos os n´umeros entre 1 e |T |, recorreu-se ao seguinte procedimento.

1. Colocar os n n´umeros a serem sorteados num vector n´umeros;

2. Criar um vector escolhidos, com dimens˜ao n, preenchido com zeros. Este vector vai indicar, em cada posi¸c˜ao, os ´ındices j´a sorteados;

3. Sortear um n´umero i entre 1 e n;

4. Obter o ´ındice do en´esimo zero do vector escolhidos, assinalar esse ´ındice como escolhido e colocar o n´umero sorteado no vector com a ordem aleat´oria ordem;

5. Gerar novo n´umero at´e n menos o n´umero de itera¸c˜oes do algoritmo decorridas at´e ao momento e repetir o procedimento a partir do passo 3 at´e todos os n´umeros estarem no vector ordem.

(35)

Este algoritmo tamb´em ´e utilizado na fun¸c˜ao de optimiza¸c˜ao de novos t´uneis. Assim, o pseudo-c´odigo da implementa¸c˜ao, que gera uma ordena¸c˜ao aleat´oria de n´umeros correspon-dentes aos ´ındices dos t´uneis com protec¸c˜ao, apresenta-se no algoritmo 4.2.3. nprot representa o n´umero de t´uneis da rede que tˆem protec¸c˜ao, count conta o n´umero de t´uneis que ainda n˜ao foram sorteados, numeros ´e um vector constitu´ıdo pelos ´ındices dos t´uneis que tˆem pro-tec¸c˜ao, escolhidos representa os n´umeros j´a sorteados, numero armazena o valor sorteado e o vector ordem cont´em a sequˆencia final de n´umeros. random(1,count) ´e uma fun¸c˜ao que gera n´umeros aleat´orios inteiros entre 1 e count.

Algoritmo 4.2.3Gerar sequˆencia aleat´oria de n´umeros distintos

1: for each t ∈ (Tp∪ Υp) do 2: numeros ← numeros ∪ t 3: end for 4: for n ← 1 to nprot do 5: escolhidosn← 0 6: end for 7: count ← nprot 8: while count > 0 do 9: numero ← random(1,count) 10: i ← 0 11: contador ← 0

12: whilecontador < numero do 13: if escolhidosi = 0 then 14: contador ← contador + 1 15: end if 16: i ← i + 1 17: end while 18: escolhidosi ← 1 19: ordem nprot−count← numerosi 20: count ← count − 1 21: end while

4.2.4 Algoritmo de ordena¸c˜ao Quicksort

O algoritmo de ordena¸c˜ao Quicksort[9] foi o algoritmo de ordena¸c˜ao escolhido por ser conhecido pela sua eficiˆencia computacional. Este algoritmo apresenta, geralmente, um tempo m´edio de execu¸c˜ao inferior aos dos outros algoritmos de ordena¸c˜ao[10]. No pior caso, o tempo de execu¸c˜ao aumenta quadraticamente em fun¸c˜ao do n´umero de elementos a ordenar e, nesta situa¸c˜ao, o algoritmo Quicksort n˜ao ´e o melhor [10]. O pior caso deste algoritmo aparece para sequˆencias quase ordenadas [11]. Como este algoritmo pode ser utilizado para uma qualquer configura¸c˜ao de uma rede, h´a um n´umero elevado de possibilidades para as sequˆencias de cargas. Uma vez que o n´umero de sequˆencias quase ordenadas ´e muito inferior ao das sequˆencias desordenadas, a probabilidade de ocorrer o pior caso ´e muito baixa. Assim, considerando o tempo m´edio de execu¸c˜ao e n˜ao o tempo do pior caso, foi escolhido este algoritmo.

(36)

ordenando cada parti¸c˜ao. Ao algoritmo ´e dado o ´ındice do primeiro e do ´ultimo itens a ordenar. O valor na posi¸c˜ao interm´edia de cada parti¸c˜ao da lista ´e escolhido como pivot para essa parti¸c˜ao. No caso de uma ordena¸c˜ao decrescente, o algoritmo ir´a percorrer a parti¸c˜ao, inicialmente da esquerda para a direita, at´e encontrar um primeiro n´umero menor que o pivot ou atingir o limite direito da parti¸c˜ao. De seguida, percorre a parti¸c˜ao da direita para a esquerda, at´e encontrar um segundo n´umero maior que o pivot ou atingir o limite esquerdo da parti¸c˜ao. Quando encontra dois n´umeros que satisfa¸cam as condi¸c˜oes e, se o ´ındice do primeiro n´umero for inferior ou igual ao ´ındice do segundo, o algoritmo troca os n´umeros de posi¸c˜ao. Quando o ´ındice do primeiro n´umero ´e maior que o ´ındice do segundo, o algoritmo recorre a si pr´oprio para ordenar os dois subintervalos da lista: o subintervalo entre o limite esquerdo da lista e o ´ındice do segundo n´umero e o subintervalo entre o ´ındice do primeiro n´umero e o limite direito da lista.

O implementa¸c˜ao do Quicksort apresenta-se no algoritmo 4.2.4. Quicksort ´e uma fun¸c˜ao que aceita, como parˆametros de entrada, os ´ındices dos limites esquerdo e direito do vector a ordenar.

Algoritmo 4.2.4Quicksort(lef t, right)

1: ind ← j lef t+right 2 k 2: pivot ← vind 3: i ← lef t 4: j ← right 5: do

6: whilevi > pivot and i < right do 7: i ← i + 1

8: end while

9: whilevj < pivot and j > lef t do 10: j ← j − 1 11: end while 12: if i ≤ j then 13: troca(vi, vj) 14: i ← i + 1 15: j ← j − 1 16: end if 17: while i ≤ j 18: if lef t < j then 19: Quicksort(lef t, j) 20: end if 21: if i < right then 22: Quicksort(i, right) 23: end if 4.2.5 Algoritmo de Dijkstra

Para determinar os novos percursos de custo m´ınimo na rede foi utilizado o algoritmo de Dijkstra[12].

(37)

O algoritmo de Dijkstra ´e um algoritmo de pesquisa em grafos, desenhado para encontrar os percursos mais curtos entre um n´o origem de um grafo e todos os outros n´os do mesmo grafo. Se `as liga¸c˜oes entre os v´arios n´os forem atribu´ıdos custos n˜ao negativos, o algoritmo permite encontrar o percurso de custo m´ınimo entre dois n´os. Este algoritmo pode ser adaptado para encontrar o caminho mais curto entre um par de n´os origem/destino de um grafo se se interromper o algoritmo, assim que este encontre o caminho mais curto para o n´o destino.

O funcionamento do algoritmo de Dijkstra para encontrar o percurso de custo m´ınimo de um n´o origem o para um n´o destino d ´e o seguinte:

1. Atribuir custo 0 ao n´o o e +∞ a todos os outros n´os; 2. Marcar todos os n´os como n˜ao seleccionados;

3. Considerar como n´o actual o n´o o; 4. Marcar o n´o actual como seleccionado;

5. Para cada n´o i n˜ao seleccionado, vizinho do n´o actual, calcular a soma do custo da liga¸c˜ao para esse n´o vizinho com o custo do n´o actual;

6. Se o custo calculado for inferior ao registado em cada n´o vizinho, atribuir esse custo como novo custo desse n´o;

7. Se o n´o destino tiver sido marcado como seleccionado, o algoritmo termina. Se n˜ao, repete-se o procedimento, a partir do ponto 4, escolhendo-se para n´o actual o n´o com menor custo para o n´o origem o.

O algoritmo implementado ´e apresentado no algoritmo 4.2.5. Quando o n´o destino ´e seleccionado, ´e percorrido o percurso inverso assinalado com os menores custos, desde o n´o destino d ao n´o origem o, para obter o percurso de custo m´ınimo entre os dois n´os.

Considerando o custo de cada liga¸c˜ao um valor entre 0 e 1, o custo m´aximo seria obtido na situa¸c˜ao em que o percurso passa por todos os n´os e teria um valor igual ao n´umero de n´os menos um, |N | − 1. Assim, o “infinito” foi definido como sendo o n´umero de n´os |N |, que ´e um valor maior que o limite superior para o custo de um percurso de custo m´ınimo.

Na situa¸c˜ao em que o percurso de servi¸co ´e uma liga¸c˜ao directa entre os dois n´os, para garantir que o percurso de protec¸c˜ao ´e disjunto, ´e necess´ario que o algoritmo n˜ao considere o n´o destino d como n´o vizinho na primeira itera¸c˜ao ou o algoritmo poderia terminar nesta itera¸c˜ao com um percurso de protec¸c˜ao igual ao percurso de servi¸co. Ignorando o n´o destino d nesta situa¸c˜ao, o algoritmo prosseguir´a normalmente a partir de um n´o vizinho sem usar a liga¸c˜ao directa entre os n´os origem/destino. O teste realizado na linha 8 do algoritmo 4.2.5 verifica se o percurso de servi¸co ´e uma liga¸c˜ao directa. A primeira itera¸c˜ao do algoritmo ´e efectuada de forma diferente consoante o resultado deste teste e apresenta-se entre as linhas 8 e 24. Se o percurso n˜ao ´e directo, a primeira itera¸c˜ao ´e normal, se n˜ao, verifica-se se o n´o vizinho n˜ao ´e n´o destino (linha 17 do algoritmo).

Considerando estas limita¸c˜oes, a implementa¸c˜ao do algoritmo apresenta-se em 4.2.5. O vector S representa o conjunto dos n´os seleccionados, o vector p indica, em cada posi¸c˜ao correspondente a um n´o, o seu predecessor no percurso com origem no n´o o e o vector c cont´em os custos dos v´arios n´os. |N | indica o n´umero de n´os da rede, a indica o n´o actual, cij o custo da liga¸c˜ao do n´o i para o n´o j e ci indica o custo do n´o origem para o n´o i.

(38)

Algoritmo 4.2.5Dijkstra

1: S ← {} // Nenhum n´o ainda foi seleccionado 2: p ← {} // N˜ao est˜ao ainda definidos predecessores 3: for i = 0 to |N | do

4: ci← ∞ 5: end for

6: co ← 0 // custo para o n´o inicial ´e zero 7: So ← 1 // selecciona o n´o inicial 8: if t´unel de servi¸co n˜ao ´e directo then 9: whilen´o i ´e vizinho do n´o actual a do 10: if ci > ca+ cia then 11: ci ← ca+ cia 12: pi← a 13: end if 14: end while 15: else

16: whilen´o i ´e vizinho do n´o actual a do

17: if Si 6= d // Se o n´o n˜ao ´e o n´o destino then 18: if ci> ca+ cia then 19: ci← ca+ cia 20: pi ← a 21: end if 22: end if 23: end while 24: end if

25: a ← i para qual ci ´e m´ınimo

26: Sa← 1 // Marcar como seleccionado 27: while Sd= 0 do

28: for eachi ∈ vizinhan¸ca de a do

29: if Si = 0 // Se o n´o ainda n˜ao foi seleccionado then 30: if ci> ca+ cia then 31: ci← ca+ cia 32: pi ← a 33: end if 34: end if 35: end for

36: a ← i para qual ci ´e m´ınimo 37: Sa← 1 // Marcar como visitado 38: end while

(39)

O desempenho do algoritmo de Dijkstra ´e afectado pela estrutura de dados em que se armazenam as liga¸c˜oes[13]. A forma tradicional ´e uma matriz de adjacˆencia em que os ´ındices das linhas e das colunas correspondem aos n´os da rede. Na intersec¸c˜ao de cada par de n´os ´e colocado o custo da liga¸c˜ao entre esses n´os. Se n˜ao existir uma liga¸c˜ao entre um determinado par de n´os, o valor do custo ´e infinito. Na intersec¸c˜ao de um n´o com ele pr´oprio ´e colocado o custo zero. Na figura 4.1 apresenta-se a matriz de adjacˆencia da rede utilizada nos testes do programa (figura 2.1). c representa a existˆencia de uma liga¸c˜ao com um custo diferente de zero. Isto cria uma matriz com um elevado n´umero de valores descart´aveis que, apesar disso, s˜ao

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 1 0 c ∞ c ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ c 2 c 0 c c ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ c 3 ∞ c 0 ∞ c ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ c ∞ 4 c c ∞ 0 c ∞ ∞ ∞ ∞ ∞ ∞ ∞ c ∞ ∞ ∞ ∞ ∞ 5 ∞ ∞ c c 0 c c ∞ ∞ ∞ ∞ c ∞ ∞ ∞ ∞ ∞ ∞ 6 ∞ ∞ ∞ ∞ c 0 c ∞ c ∞ c ∞ ∞ ∞ ∞ ∞ ∞ ∞ 7 ∞ ∞ ∞ ∞ c c 0 c c ∞ ∞ c ∞ c ∞ ∞ ∞ ∞ 8 ∞ ∞ ∞ ∞ ∞ ∞ c 0 c c ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ 9 ∞ ∞ ∞ ∞ ∞ c c c 0 c c ∞ ∞ ∞ ∞ ∞ ∞ ∞ 10 ∞ ∞ ∞ ∞ ∞ ∞ ∞ c c 0 c ∞ ∞ ∞ ∞ ∞ ∞ ∞ 11 ∞ ∞ ∞ ∞ ∞ c ∞ ∞ c c 0 ∞ ∞ ∞ ∞ ∞ ∞ ∞ 12 ∞ ∞ ∞ ∞ c ∞ c ∞ ∞ ∞ ∞ 0 c c ∞ ∞ ∞ ∞ 13 ∞ ∞ ∞ c ∞ ∞ ∞ ∞ ∞ ∞ ∞ c 0 c c c ∞ ∞ 14 ∞ ∞ ∞ ∞ ∞ ∞ c ∞ ∞ ∞ ∞ c c 0 c ∞ ∞ ∞ 15 ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ c c 0 c ∞ ∞ 16 ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ c ∞ c 0 ∞ ∞ 17 ∞ ∞ c ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ 0 c 18 c c ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ c 0 Figura 4.1: Matriz de adjacˆencia da configura¸c˜ao de teste

analisados pelo algoritmo enquanto este procura os n´os vizinhos do n´o actual e o respectivo custo. Uma solu¸c˜ao proposta ´e a de condensar a informa¸c˜ao da matriz de adjacˆencia. Se se eliminarem todas as liga¸c˜oes n˜ao existentes, ´e poss´ıvel representar apenas a informa¸c˜ao necess´aria atrav´es de listas ligadas[13] ou de vectores de adjacˆencia[14]. As listas ligadas s˜ao muito dependentes de ponteiros e o espa¸co de mem´oria ocupado n˜ao ´e necessariamente cont´ınuo. Os vectores de adjacˆencia tiram partido das arquitecturas actuais dos computadores que s˜ao eficientes no acesso `a mem´oria em blocos, pelo que foram a solu¸c˜ao escolhida. ´E criado um vector de adjacˆencia para cada n´o da rede, em que cada posi¸c˜ao cont´em uma estrutura de dados com um vizinho desse n´o e o custo da liga¸c˜ao entre os dois n´os. Os vectores de adjacˆencia correspondentes `as duas primeiras linhas da matriz de adjacˆencia da figura 4.1 apresentam-se na figura 4.2.

O algoritmo de Dijkstra cria um vector em que o n´o predecessor de cada n´o i no caminho da origem o ´e armazenado na posi¸c˜ao i do vector, correspondente ao ´ındice do n´o que lhe foi atribu´ıdo durante a leitura do ficheiro de entrada. ´E ent˜ao necess´ario determinar como obter o percurso em termos de liga¸c˜oes, partindo da lista de n´os predecessores, assim como calcular os custos das liga¸c˜oes.

(40)

1 2 c1,2 4 c1,4 18 c1,18 2 1 c2,1 3 c2,3 4 c2,4 18 c2,18

Figura 4.2: Vectores de adjacˆencia correspondentes dos n´os 1 e 2

4.2.6 C´alculo dos custos das liga¸c˜oes

O custo das liga¸c˜oes deve ser, nesta vers˜ao do Dijkstra, n˜ao negativo. Para se normalizar o custo em todas as liga¸c˜oes e atendendo `a possibilidade de poderem apresentar diferentes capacidades, o custo de cada liga¸c˜ao ser´a baseado na sua taxa de utiliza¸c˜ao, considerando que o percurso do t´unel t ir´a passar por essa liga¸c˜ao. O custo de cada liga¸c˜ao ´e uma fun¸c˜ao das cargas nessa liga¸c˜ao, Cl e Cl, das reservas de largura de banda em ambos os sentidos, directo bte inverso bt, da capacidade da liga¸c˜ao capl e de um expoente e:

f (Cl, Cl, bt, bt, capl, e) =  max Cl+ bt capl ,Cl+ bt capl e (4.1) A inclus˜ao do expoente e permite evidenciar a diferen¸ca de custo. Como descrito na literatura, um bom valor para o expoente e ´e 5 [15]. Desta forma, o algoritmo de Dijkstra opta sempre pelas liga¸c˜oes de menor custo, mesmo quando o percurso total inclui muitas liga¸c˜oes. Como as liga¸c˜oes s˜ao bidireccionais e uma falha numa liga¸c˜ao afecta os dois sentidos, o custo de uma liga¸c˜ao ser´a, para cada sentido, o maior dos custos individuais de cada sentido.

L representa o conjunto das liga¸c˜oes da rede, cij e cji representam o custo da liga¸c˜ao no sentido directo e inverso, respectivamente, CMl e CMl representam a carga total da liga¸c˜ao no sentido directo e inverso, respectivamente, bt e bi a reserva de largura de banda de um t´unel no sentido directo e inverso, respectivamente. caplindica a capacidade m´axima de cada liga¸c˜ao l ∈ L. O custo de utilizar a liga¸c˜ao l ´e armazenado em cl

Algoritmo 4.2.6C´alculo dos custos das liga¸c˜oes para um percurso de um t´unel t

1: for each l ∈ L do 2: cij ← CMl+bt capl  3: cji← CMl+ bt capl  4: cl← [max(cij, cji)]5 5: end for

Se os custos totais calculados segundo o algoritmo 4.2.6 forem utilizados no algoritmo de Dijkstra sem qualquer altera¸c˜ao, o percurso calculado ´e efectivamente aquele com custo m´ınimo, mas n˜ao se pode garantir que este seja disjunto do percurso de servi¸co j´a configu-rado. Isto derrota o objectivo de se assegurar protec¸c˜ao em caso de uma falha na rede. Se

(41)

se penalizarem os custos das liga¸c˜oes que fazem parte do percurso de servi¸co, o algoritmo determinar´a preferencialmente percursos de protec¸c˜ao que s˜ao disjuntos nas liga¸c˜oes dos per-cursos de servi¸co. Isto n˜ao evita que os percursos sejam tamb´em disjuntos ao n´ıvel dos n´os, o que ´e necess´ario para precaver eventuais falhas de um n´o. Uma solu¸c˜ao para colmatar esta falha ´e penalizar tamb´em os custos das liga¸c˜oes que entram ou saem dos n´os utilizados pelo percurso de servi¸co, as liga¸c˜oes adjacentes ao percurso. Como um percurso disjunto nos n´os ´e necessariamente disjunto nas liga¸c˜oes, este tipo de percursos deve ser priorit´ario. Se a sua obten¸c˜ao n˜ao for poss´ıvel d´a-se, em seguida, preferˆencia a percursos disjuntos somente nas liga¸c˜oes.

A figura 4.3 representa uma rede com um percurso de servi¸co de um t´unel configurado, do n´o 1 para o n´o 8. Os n´os interm´edios do percurso do t´unel est˜ao assinalados com quadrados, as liga¸c˜oes que fazem parte do percurso s˜ao as liga¸c˜oes mais grossas e as liga¸c˜oes adjacentes aparecem a tracejado.

1

2

3

4

5

6

7

8

Figura 4.3: N´os interm´edios e liga¸c˜oes adjacentes de um percurso de um t´unel Sabendo que, quando os custos das liga¸c˜oes se encontram entre 0 e 1, o custo m´aximo de um percurso ´e igual ao custo do pior caso, que corresponde `a passagem desse percurso por todos os n´os e ´e igual a |N | − 1, foi atribu´ıdo um custo igual a |N | `as liga¸c˜oes que entram ou saem dos n´os interm´edios do percurso de servi¸co (liga¸c˜oes a tracejado na figura 4.3). `As liga¸c˜oes que fazem parte do percurso de servi¸co, o custo atribu´ıdo foi igual a 2 × |N |2

. Este valor ´e maior que o limite superior para um percurso de custo m´ınimo que utilize todas as liga¸c˜oes adjacentes de um percurso de um t´unel que atravessa todos os n´os e ´e igual 2 × (|N | − 2) × |N | + 2. Num percurso de custo m´ınimo, cada n´o s´o pode ser atravessado uma vez e, por isso, podem ser utilizadas, no pior caso, por cada n´o interm´edio do percurso de servi¸co, duas liga¸c˜oes, uma de entrada no n´o e outra de sa´ıda. Neste caso, ser˜ao usadas 2 × (|N | − 2) liga¸c˜oes adjacentes ao percurso de servi¸co e mais duas liga¸c˜oes n˜ao adjacentes para fazer a liga¸c˜ao com estas. Isto obriga a que os n´os do percurso de servi¸co sejam utilizados apenas quando for imposs´ıvel obter um percurso n˜ao disjunto nos n´os, uma vez que o custo de utiliza¸c˜ao das liga¸c˜oes adjacentes ao percurso de servi¸co ou do pr´oprio percurso ´e superior ao custo m´aximo de n˜ao as utilizar.

Usando 2 × (|N | − 2) × |N | + 2 para o custo nas liga¸c˜oes do percurso de servi¸co, garante-se que estas s´o ser˜ao utilizadas em casos extremos, em que s´o ´e poss´ıvel obter um percurso n˜ao disjunto nas liga¸c˜oes.

Assim, o algoritmo resultar´a sempre em percursos o mais disjuntos poss´ıvel, sejam disjun-tos nos n´os, nas liga¸c˜oes ou n˜ao completamente disjuntos.

(42)

A representa¸c˜ao do “infinito” no algoritmo de Dijkstra (4.2.5), considerando os novos custos para as liga¸c˜oes n˜ao limitados entre 0 e 1, n˜ao pode ser agora |N |. O pior caso ´e n˜ao existir disjun¸c˜ao em nenhuma liga¸c˜ao e serem percorridos todos os n´os, pelo que o valor m´aximo ´e (|N | − 1) × (2 × (|N | − 2) × |N | + 2). O “infinito” ´e ent˜ao representado por 2 × |N |3

, que ´e um valor maior que o limite superior para o custo de um percurso de custo m´ınimo.

Considerando as altera¸c˜oes aos custos, o novo algoritmo para c´alculo dos custos das liga¸c˜oes de um percurso de protec¸c˜ao de um t´unel t ´e o apresentado em 4.2.7. Ladj ⊂ L representa o conjunto das liga¸c˜oes adjacentes ao percurso de servi¸co do t´unel t, PSt.

Algoritmo 4.2.7C´alculo actualizado de custos das liga¸c˜oes para um percurso de um t´unel t

1: for each l ∈ L do

2: if l 6∈ (Ladj∪ PSt) then

3: cl← custo segundo o algoritmo 4.2.6 4: else if l ∈ Ladj then

5: cl← |N | 6: else

7: cl← 2 × |N |2 8: end if

9: end for

4.2.7 Obten¸c˜ao do percurso de custo m´ınimo da lista de predecessores

Partindo de uma lista que cont´em os n´os predecessores relativos aos percursos de custo m´ınimo da origem para todos os n´os e conhecendo o n´o destino, obt´em-se o percurso entre o par origem/destino da forma descrita no algoritmo 4.2.8. Considere-se, inicialmente, o n´o actual a como sendo o n´o destino d. Seguindo a cadeia de predecessores, enquanto existir um predecessor do n´o a no caminho para o n´o origem, o algoritmo vai comparar o par n˜ao ordenado de n´os actual e predecessor do n´o actual {a, pa} com o par n˜ao ordenado de n´os extremos de cada uma das liga¸c˜oes l {il, jl}. Quando os pares coincidirem, pode afirmar-se que essa liga¸c˜ao faz parte do percurso origem/destino e o n´o actual passa a ser o seu n´o predecessor. PCM representa o percurso de custo m´ınimo a ser determinado.

(43)

Algoritmo 4.2.8Obten¸c˜ao de um percurso partindo de uma lista de n´os predecessores l ← 1 a ← d PCM ← {} while∃pa do if {a, pa} = {il, jl} then PCM ← PCM ∪l a ← pa end if l ← l + 1 if l > |L| then l ← 1 end if end while

(44)
(45)

Cap´ıtulo 5

Optimiza¸

ao de novos t´

uneis

5.1

Introdu¸

ao

A fun¸c˜ao para configura¸c˜ao de novos t´uneis de forma optimizada baseia-se na fun¸c˜ao de optimiza¸c˜ao dos percursos j´a existentes, apresentada no cap´ıtulo anterior. Esta fun¸c˜ao necessita que lhe sejam fornecidos um conjunto de t´uneis novos Υ e admite a existˆencia de um conjunto de t´uneis j´a configurados T . Se n˜ao forem fornecidos pedidos de t´uneis novos e s´o existirem t´uneis j´a configurados, o programa n˜ao devolve qualquer resultado.

Defina-se, de forma similar ao conjunto Tp, o conjunto Υp ⊂ Υ, no qual os t´uneis τ ∈ Υ tˆem protec¸c˜ao, VALORt = 1. Primeiro, s˜ao calculadas as cargas das liga¸c˜oes, considerando apenas os t´uneis configurados. De seguida, s˜ao calculados, por uma ordem aleat´oria, um percurso de servi¸co para os t´uneis novos τ ∈ Υ \ Υp ou dois percursos, um de servi¸co e um de protec¸c˜ao, para cada um dos novos t´uneis τ ∈ Υp. S˜ao calculadas as cargas nesta configura¸c˜ao, que passa a constituir a solu¸c˜ao incumbente. De seguida, ´e utilizado o algoritmo de pesquisa local em que s˜ao alterados os percursos de cada t´unel. Neste caso, a solu¸c˜ao ´e considerada vizinha da actual se diferir desta apenas num t´unel, seja num ou nos dois percursos, para os t´uneis τ ∈ Υp ou no percurso de servi¸co para os restantes. Durante o tempo definido pelo utilizador, ´e realizada a pesquisa local com m´ultiplas situa¸c˜oes iniciais at´e ser devolvida a melhor solu¸c˜ao encontrada.

O c´alculo de dois novos percursos para um t´unel pode ser efectuado de diferentes formas. Uma primeira vers˜ao ´e baseada na aplica¸c˜ao do algoritmo de Dijkstra, duas vezes consecutivas.

Algoritmo 5.1.1Calcular 2 percursos aplicando o algoritmo de Dijkstra

1: Calcular custos das liga¸c˜oes, algoritmo 4.2.6 2: Dijsktra, algoritmo 4.2.5

3: Calcular custos das liga¸c˜oes incluindo o primeiro percurso, algoritmo 4.2.7 4: Dijkstra, algoritmo 4.2.5

´

E necess´ario recalcular os custos das liga¸c˜oes ap´os a obten¸c˜ao do primeiro percurso, caso contr´ario, na segunda utiliza¸c˜ao do Dijkstra ´e obtido o mesmo percurso. Esta op¸c˜ao devolve dois percursos mas, ainda que seja poss´ıvel obter percursos completamente disjuntos ou dis-juntos apenas nas liga¸c˜oes, n˜ao ´e garantido que os percursos escolhidos sejam disjuntos nem que sejam o par de percursos de custo m´ınimo. Considere-se a figura 5.1 que apresenta uma

(46)

rede em que se pretende determinar dois percursos disjuntos, de custo m´ınimo, do n´o 1 para o n´o 6. Os custos das liga¸c˜oes aparecem assinalados ao lado de cada liga¸c˜ao. O primeiro percurso de custo m´ınimo j´a se encontra assinalado pelas linhas mais grossas.

1

2

3

4

5

6

2 1 1 1 1 1 2

Figura 5.1: Exemplo em que a execu¸c˜ao duas vezes consecutivas do algoritmo de Dijkstra n˜ao resulta num par de percursos disjuntos

Executando duas vezes o algoritmo de Dijkstra n˜ao se obtˆem dois percursos disjuntos, embora a rede os suporte. A primeira execu¸c˜ao calcula o percurso de custo m´ınimo igual a 3 que percorre o conjunto de n´os {1, 3, 4, 6}. Para o segundo percurso ´e imposs´ıvel n˜ao incluir uma liga¸c˜ao do primeiro percurso. Isto n˜ao ´e ´optimo, uma vez que se procura protec¸c˜ao m´axima, o que implica a m´axima disjuntividade poss´ıvel.

Considere-se a figura 5.2 que apresenta uma rede em que se pretende determinar dois percursos disjuntos, de custo m´ınimo, do n´o 1 para o n´o 6. Os custos das liga¸c˜oes aparecem assinalados ao lado de cada liga¸c˜ao. O primeiro percurso de custo m´ınimo j´a se encontra assinalado pelas linhas mais grossas. Para a determina¸c˜ao do segundo percurso, consideram-se as altera¸c˜oes de custos para as liga¸c˜oes que fazem parte do primeiro percurso e para as liga¸c˜oes adjacentes ao percurso, definidas no cap´ıtulo 4. Executando duas vezes o algoritmo

1

2

3

4

5

6

2 1 1 1 1 1 2 5 4

Figura 5.2: Exemplo em que a execu¸c˜ao duas vezes consecutivas do algoritmo de Dijkstra n˜ao resulta num par de percursos de custo m´ınimo

de Dijkstra n˜ao se obt´em um par de percursos de custo m´ınimo. A primeira execu¸c˜ao calcula o percurso de custo m´ınimo igual a 3 que percorre o conjunto de n´os {1, 3, 4, 6}. A segunda execu¸c˜ao calcula o percurso de custo m´ınimo igual a 6 que percorre o conjunto de n´os {1, 2, 6}.

(47)

O custo total ´e de 9. O par de percursos de custo m´ınimo seria constitu´ıdo pelos percursos que percorrem os n´os {1, 2, 4, 6} e os n´os {1, 3, 5, 6}. Ambos tˆem custo 4, sendo o total de 8, que ´e menor que 9. N˜ao se obtendo o par de percursos de custo m´ınimo, o objectivo de minimiza¸c˜ao das piores cargas n˜ao ´e atingido.

Assim, a segunda vers˜ao baseia-se no algoritmo de Suurballe [16, 17] para percursos dis-juntos nas liga¸c˜oes. Esta vers˜ao serviu como ponto de partida para a terceira, que utiliza um algoritmo mais complexo, o de Suurballe para percursos disjuntos nos n´os. Na sec¸c˜ao seguinte apresentam-se as duas vers˜oes do algoritmo de Suurballe.

5.2

Algoritmos

5.2.1 Algoritmo de Suurballe para percursos disjuntos nas liga¸c˜oes

O algoritmo de Suurballe para percursos disjuntos nas liga¸c˜oes baseia-se no algoritmo de Dijkstra para encontrar cada um dos percursos de custo m´ınimo, mas realiza uma trans-forma¸c˜ao de custos entre as duas execu¸c˜oes necess´arias. Considere-se a rede definida no cap´ıtulo 2 pelo grafo G = (N, L) e as defini¸c˜oes de liga¸c˜oes e arcos a´ı referidas. Considere-se ainda ci como o custo de um caminho de um n´o origem o para um n´o destino i e cij como o custo de um arco do n´o i para o n´o j. O algoritmo de Suurballe para percursos disjuntos nas liga¸c˜oes ´e descrito de seguida:

1. Determinar o conjunto M1 dos arcos que pertencem ao primeiro percurso de custo m´ınimo entre o n´o origem o e o n´o destino d;

2. Determinar os percursos de custo m´ınimo do n´o origem o para todos os outros n´os i da rede;

3. Realizar uma transforma¸c˜ao de custos:

cij =    +∞ , se (i, j) ∈ M1 cij + ci− cj , se (i, j) /∈ M1 e (j, i) /∈ M1 0 , se (j, i) ∈ M1

4. Determinar o conjunto M2 dos arcos que pertencem ao segundo percurso de custo m´ınimo de o para d tendo em considera¸c˜ao os novos custos;

5. Do conjunto M = M1∪ M2 retirar todos os arcos que correspondem `a mesma liga¸c˜ao ou seja, os arcos cujos n´os extremos s˜ao os mesmos.

Na transforma¸c˜ao de custos, quando uma liga¸c˜ao ´e utilizada num percurso, o arco no sentido em que foi utilizada passa a ter custo infinito e o arco do sentido inverso recebe o custo zero. Os arcos que n˜ao fazem parte do primeiro percurso sofrem a transforma¸c˜ao indicada. Por fim, o conjunto resultante cont´em os arcos dos quais podem ser obtidos os dois percursos disjuntos de custo m´ınimo.

A implementa¸c˜ao do algoritmo de Suurballe para percursos disjunto nas liga¸c˜oes apresenta-se em 5.2.1. No programa deapresenta-senvolvido, as liga¸c˜oes s˜ao representadas apenas pelo par n˜ao ordenado {il, jl} pelo que, os conjuntos M1 e M2 contˆem as liga¸c˜oes e n˜ao os arcos.

Inicialmente, os custos s˜ao calculados de forma idˆentica aos calculados para o algoritmo de Dijkstra. De seguida, ´e executado o algoritmo de Dijkstra, 4.2.5, mas o crit´erio de paragem da

(48)

Algoritmo 5.2.1Suurballe para percursos disjuntos nas liga¸c˜oes

1: Calcular custos das liga¸c˜oes, algoritmo 4.2.6 2: Dijkstra, algoritmo 4.2.5

3: Calcular conjunto M1

4: Realizar transforma¸c˜ao de custos 5: Dijkstra, algoritmo 4.2.5

6: Calcular conjunto M2

7: Obter 2 percursos de protec¸c˜ao a partir de M = M1∪ M2

linha 27 ´e alterado para que o algoritmo s´o termine quando todos os n´os da rede estiverem no conjunto de n´os j´a seleccionados, conjunto S, em vez de terminar logo que o conjunto S inclua o n´o destino d. Partindo da lista de n´os predecessores resultante do algoritmo de Dijkstra, ´e obtido o conjunto M1. De seguida, realiza-se a transforma¸c˜ao de custos e encontra-se um novo percurso de custo m´ınimo. Ap´os ser determinado o conjunto M2, obtˆem-se os dois percursos disjuntos de custo m´ınimo a partir do conjunto M = M1∪ M2.

O c´alculo dos custos e o algoritmo de Dijkstra j´a s˜ao conhecidos. Os conjuntos M1 e M2 s˜ao obtidos da forma descrita em 4.2.7, a partir da lista de n´os predecessores. ´E ent˜ao necess´ario determinar a forma de fazer a transforma¸c˜ao de custos e de obter os dois percursos de custo m´ınimo a partir dos dois conjuntos.

5.2.2 Transforma¸c˜ao de custos

O algoritmo 5.2.2 descreve a implementa¸c˜ao da transforma¸c˜ao de custos. sizeM 1 indica o n´umero de liga¸c˜oes no percurso M1. status ´e um vector em que, em cada ´ındice, corres-pondente a uma liga¸c˜ao l entre il e jl, ´e registado se essa liga¸c˜ao ´e utilizada pelo primeiro percurso no sentido (il, jl) ou no sentido (jl, il). a e d correspondem ao n´o actual e ao n´o destino, respectivamente.

Para cada liga¸c˜ao entre il e jl do percurso, se a liga¸c˜ao for utilizada no sentido (il, jl) recebe status1 e no sentido oposto recebe status2. De seguida, para todas as liga¸c˜oes, os custos em ambos os sentidos s˜ao calculados segundo a transforma¸c˜ao descrita na sec¸c˜ao 5.2.1.

5.2.3 Obten¸c˜ao de caminhos disjuntos a partir de um conjunto de liga¸c˜oes

Para encontrar os dois percursos disjuntos a partir dos conjuntos M1 e M2 e simultane-amente, eliminar as liga¸c˜oes que aparecem nos dois conjuntos, implementou-se o algoritmo 5.2.3. M1 e M2 foram reunidos numa matriz; a liga¸c˜ao i do percurso M1 ´e dado por M1i e a liga¸c˜ao i do percurso M2 ´e dada por M2i.

Para facilitar a compreens˜ao deste algoritmo apresenta-se a figura 5.3.

M

1

:

M

2

:

1

2

3

4

5

3

2

6

7

8

Referências

Documentos relacionados

forficata recém-colhidas foram tratadas com escarificação mecânica, imersão em ácido sulfúrico concentrado durante 5 e 10 minutos, sementes armazenadas na geladeira (3 ± 1

The main objectives of this data analysis are divided into two classes: i) General Statistics: give an overview of structured information on Wikipedia as a whole, showing raw numbers

No primeiro, destacam-se as percepções que as cuidadoras possuem sobre o hospital psiquiátrico e os cuidados com seus familiares durante o internamento; no segundo, evidencia-se

Especificamente, esperou-se avaliar o contexto de trabalho; o custo humano no trabalho (físico, cognitivo e afetivo); o custo afetivo (definido como

O efetivo pagamento da(s) RECEITA(S) FIXA(S) estará condicionado ao início da operação comercial da(s) USINA(S), devendo os recursos financeiros associados a este

Este estudo tem como objetivos identificar os níveis de trauma manifestados e de estratégias de coping utilizadas pelos TEPH; caracterizar os incidentes mais

The fatigue study presented in this work was a first approach to the mixed-mode crack propagation behaviour using a mixed-mode apparatus that analyses the mode I and

For additional support to design options the structural analysis of the Vila Fria bridge was carried out using a 3D structural numerical model using the finite element method by