O algoritmo desenvolvido nesta fase segue uma estratégia um pouco diferente da anterior. Para além de não se efectuar nenhuma troca de fluxos (não se processa o passo 4 da Pesquisa Local Aleatória), logo a ordem destes não é alterada (não se processa os passos 11 a 14 da Pesquisa Local Aleatória) e efectua-se um procedimento extra na determinação dos pares de percursos disjuntos (passo 6 da Pesquisa Local Aleatória).
Para melhor compreensão da estratégia utilizada neste algoritmo, considere-se o seguinte exemplo, em que os pesos têm valores entre 0 e 1:
Figura 7. Rede exemplo antes da modificação dos pesos
Observando a figura 7, facilmente constata-se que o percurso de peso mínimo de A para H é A-F-G-H (peso total = 0.9), pois o caminho A-B-C-D-E-H tem peso total de 1.0. O que se pretende fazer é que o percurso seleccionado seja aquele que tenha as piores cargas mais baixas, ou seja, passar de A-F-G-H (piores cargas – 0.3, 0.3) para A-B-C-D- E-H (piores cargas - 0.2, 0.2).
Para que a selecção do melhor percurso fosse feita, de acordo com as piores cargas mais baixas, o método utilizado foi elevar todos os pesos da rede a um expoente. Como os pesos dos arcos variam de 0 a 1, e como o algoritmo utilizado para determinar os pares de percursos disjuntos (algoritmo de Suurballe) é baseado nos pesos totais dos percursos, então ao elevar os pesos a um expoente, faz com que as diferenças entre os pesos dos arcos seja mais acentuada, reflectindo-se no peso total dos percursos. Por exemplo, o peso de um arco é 0.3 e de outro é 0.9. Este último é três vezes maior que o primeiro. Elevando ambos pesos ao expoente 2, fica-se com 0.09 e 0.81, respectivamente. Ou seja, o arco com peso 0.9 passou de três vezes para nove vezes mais carregado que o arco com peso 0.3. É com base nestas diferenças, que são determinados percursos alternativos, não respeitando os percursos de peso mínimo, mas sim, pelos percursos com as piores caras mais baixas. É importante referir que estas alterações efectuadas nos pesos da rede só são utilizadas na determinação dos pares de percursos disjuntos (algoritmo de Suurballe), logo não afectam directamente as cargas da rede.
23 Voltando ao exemplo da figura 7 e elevando todos os seus pesos ao expoente 2, obtém-se:
Figura 8. Rede exemplo depois da modificação dos pesos
Observando a figura 8, depois de alterar os pesos das ligações, verifica-se que o percurso de peso mínimo de A para H é agora A-B-C-D-E-H (peso total = 0.2), enquanto que o percurso A-F-G-H tem um peso total de 0.27 (> 0.2), conseguindo deste modo fazer com que o percurso inicial com as piores cargas mais baixas (0.2) seja escolhido.
Deste modo, o algoritmo relativo à fase 2 pode ser descrito pelos seguintes passos:
Em termos de implementação, esta alteração reflecte-se nos procedimentos presentes no subcapítulo 3.5.2, antes do passo 11 é necessário modificar os pesos das ligações. Assim, a cada peso da rede é aplicado um expoente de valor variável. Na primeira iteração o expoente apresenta valor 1, sendo que nas restantes iterações é adicionado um parâmetro fixo delta, previamente escolhido pelo utilizador. Depois, continua-se o processo de determinação dos pares de percursos disjuntos, explicado no subcapítulo 3.5.2. Considera-se que uma iteração é uma tentativa de determinação dos pares de percursos disjuntos do conjunto de fluxos, por isso, quando não é gerada uma solução válida ou quando foi determinado o par de percursos disjuntos do último fluxo da ordenação, é incrementado o número de iterações, soma-se delta ao valor do expoente da iteração anterior e repete-se a determinação dos pares de percursos disjuntos do conjunto de fluxos.
1
Algoritmo Construtivo
2
Atribuição da solução inicial como melhor solução
3
while número de iterações não é atingido do:
4
todas as cargas da rede = 0
5
determinação dos pares de percursos disjuntos para a sequência de fluxos
(com alteração de pesos)
6
if solução actual for válida do:
7
comparação com a melhor solução
8
if solução actual melhor que “melhor solução” do:
9
melhor solução = solução actual
24 Se para 1000 iterações, for considerado um delta de 0.1, então a gama dos expoentes testados será [1;100]. Para o mesmo número de iterações, caso seja utilizado um delta de 0.5, então a gama de expoentes é [1;500] e assim sucessivamente.
Assim, ao contrário do que se sucedia na fase 1, a técnica utilizada na fase 2 privilegia os percursos com as piores cargas mais baixas em detrimento dos percursos de peso mínimo total. Contudo, esta técnica depende da diferença entre as piores cargas dos percursos existentes entre o mesmo par origem-destino, pois quanto maior é essa diferença, maior será o valor do expoente necessário para que o percurso com as piores cargas mais baixas seja seleccionado.
Esta técnica procura minimizar as cargas mais elevadas da rede, evitando que certas ligações fiquem mais sobrecarregadas que outras, aumentando assim o número de percursos possíveis a adoptar pelos fluxos.
Em seguida, mostra-se o efeito que o expoente provoca nos pesos originais (figura 9) e pequenos exemplos concretos (figura 10):
25
1
Algoritmo Construtivo
2
Atribuição da solução inicial como melhor solução local
3
Pesquisa por Pesos Modificados
4
Atribuição da melhor solução local como melhor solução global
5
while número limite de iterações não é atingido do:
6
Pesquisa Local Aleatória
7
Pesquisa por Pesos Modificados
8
Comparação da melhor solução local com a melhor solução global
9
Selecção dos percursos de serviço e de protecção
Figura 10. Gráfico ilustrativo da variação do expoente, para os valores representados
Vale a pena referir que estas alterações efectuadas nos valores dos pesos não prejudicam significativamente o desempenho dos algoritmos.