• Nenhum resultado encontrado

3.4 Algoritmo Cálculo de Rotas

3.4.1 RAPTOR Execução do algoritmo

Para se entender melhor o algoritmo implementado, este será exemplificado numa rede de transportes virtual e mais simples (Figura3.8). Esta rede é composta apenas por paragens e uma ligação a pé. Neste exemplo o objetivo é calcular o caminho mais rápido entre os pontos 1 e 6 com partida às 14:00h. É possível observar que esta rede é constituída por 4 linhas e por uma ligação a pé entre os pontos 1 e 2. Como foi explicado anteriormente o algoritmo RAPTOR funciona por rondas, onde K rondas correspondem a K - 1 transbordos. Inicialmente o tempo de chegada é colocado a infinito em todos os pontos da rede, exceto no ponto de partida, que é colocado no valor indicado pelo utente no campo hora de partida (14:00h neste caso). Assim é garantido que só são pesquisadas viagens que partam depois da hora indicada. O algoritmo é iniciado com K = 0. Durante a execução deve ser mantida uma lista MarkedPlaces que guarda os pontos da rede a serem analisados pelo algoritmo na próxima ronda, uma lista BestArrivalTime que guarda o melhor tempo de chegada na ronda K para cada um dos pontos da rede e uma lista BestKnownValue que regista o melhor tempo de chegada global em cada ponto.

Quando K = 0, o único ponto marcado é o ponto de partida. Como o ponto 1 não é uma paragem, então devem ser calculados os tempos de chegada a outros pontos da rede partindo do ponto 1. No exemplo, partindo de 1 só é possível alcançar o ponto 2. Deve ser calculado o tempo a caminhar entre 1 e 2. Assumindo que se demora 2 minutos a caminhar entre 1 e 2 então pode ser afirmado que é possível alcançar 2 às 14:02. Se o melhor tempo na ronda atual em 2 (infinito) for superior ao tempo calculado (14:02h) então esse valor deve ser atualizado para o valor calculado (14:02h). Caso este valor também seja inferior ao melhor valor global nesse ponto então o melhor valor global também tem de ser atualizado. Como o ponto 2 foi analisado e

Modelação do Problema

Tabela 3.3: Execução da ronda K = 0 do algoritmo RAPTOR.

Ronda 1 2 3 4 5 6

K = 0 Tempo de chegada 14:00 14:02 INF INF INF INF

ainda não está marcado então deve ser adicionado à lista de pontos marcados MarkedPlaces para serem analisados na próxima ronda. Finalmente é registado que o melhor valor partindo de 2 foi alcançado a partir de 1. Esta estrutura de dados é útil para no final se conseguir reconstruir o melhor caminho. Os resultados estão ilustrados na tabela3.3.

Na próxima ronda, K = 1, os tempos de BestArrivalTime da ronda K - 1 são copiados para a ronda K para se definir um limite superior para os tempos de chegada. Com este limite definido é assumido que nas próximas rondas só podem ser pesquisadas viagens que melhorem o tempo em cada ponto da rede. Agora será repetido um ciclo de instruções até se encontrar um caminho que leve à paragem de destino. O ciclo é executado entre K = 1 e K = MaxK. O valor de MaxK pode ser personalizável e corresponde ao número máximo de rondas que o algoritmo pode executar. Em K = 1é sabido que o único ponto que faz parte da lista MarkedPlaces é o ponto 2. O primeiro passo do algoritmo nesta fase é verificar quais são as linhas que passam pelos pontos na lista MarkedPlacese registar esses dados numa lista Q. A lista Q associa a cada linha um ponto. Se na lista MarkedPlaces estiverem marcados 2 pontos que são servidos pela mesma linha L, aquele que será associado à linha L será aquele que contém o menor valor do campo ordem, ou seja, o que aparece primeiro na linha. Depois de executado este passo a lista MarkedPlaces poderá ser limpa. No exemplo apresentado as linhas 204 e 505 estão associadas ao ponto 2.

O próximo passo do algoritmo é iterar por cada par (r, p) ∈ Q, onde r representa uma linha e p representa um ponto da rede associado a essa linha, e verificar se o tempo em cada uma das paragens da linha pode ser melhorado. Para isso primeiro é necessário encontrar uma viagem que faça parte de cada linha. A viagem selecionada é a primeira que tenha como hora de partida um tempo superior ao que está marcado em p. No caso do ponto 2, terão de ser encontradas viagens que partam depois das 14:02h. Os resultados das operações estão apresentados na tabela

3.4 e na figura 3.9. Como é possível verificar, o tempo de chegada nas paragens 3 e 4 foram melhorados, logo são marcadas para serem analisadas nas próximas rondas e são adicionadas à lista MarkedPlaces. Também é registado que o melhor tempo para se chegar às paragens 3 e 4 foi alcançado a partir da paragem 2. Estas paragens correspondem aos locais onde é possível fazer um transbordo.

A próxima ronda é a ronda K = 2 e aqui os procedimentos serão semelhantes aos anteriores. Nesta ronda a linha 204 e a linha 700 estarão associadas à paragem 3 e as linhas 204 e 205 estarão

Tabela 3.4: Resultados após a ronda K = 1.

Ronda 1 2 3 4 5 6

K = 0 Tempo de chegada 14:00 14:02 INF INF INF INF K = 1 14:00 14:02 14:05 14:12 INF INF

Modelação do Problema

Figura 3.8: Rede de exemplo para o algoritmo RAPTOR.

Modelação do Problema

associadas à paragem 4. A partir da figura3.9 é possível verificar que a partir da paragem 3 as paragens da linha 204 nunca irão ser melhoradas. Uma vez que na paragem 3 o melhor tempo é às 14:05h, o que o algoritmo faria para tentar melhorar os tempos nas paragens seguintes seria encontrar a próxima viagem da linha que partisse depois das 14:05h. Ora, assumindo que ao percorrer a mesma linha os veículos nunca se ultrapassam então o tempo 14:10h marcado na paragem após a 3 na linha 204 nunca iria ser melhorado. Assim, na paragem 3 basta analisar a linha 700 e na paragem 4 a linha 205. Ao analisar a linha 205 os tempos nas paragens 5 e 6 serão melhorados desde que uma viagem seja encontrada. Deve ser registado que as paragens 5 e 6 foram alcançadas partindo da paragem 4. Os resultados estão apresentados na figura3.10.

Nesta altura é possível observar que a paragem de destino já foi alcançada, no entanto não é garantido que o valor 14:23h seja o melhor nesta ronda uma vez que a linha 700 a partir da paragem 3 ainda não foi analisada. Os resultados após a análise da linha 700 partindo da paragem 3 estão apresentados na figura 3.11. Como é possível observar, um utente pode embarcar num transporte na paragem 3 às 14:07h e alcançar a paragem 5 às 14:10h. Este tempo é melhor do que 14:20h, que estava marcado anteriormente nessa paragem. Como o tempo melhorou então é necessário indicar que agora o melhor caminho em 5 foi encontrado partindo de 3 e não de 4 como estava anteriormente indicado. A paragem 5 deve ser novamente marcada para análise na próxima ronda. Os melhores tempos estão agora indicados conforme os valores apresentados na tabela3.5. Atualmente o melhor percurso corresponde à seguinte sequência: 1 -> 2 -> 4 -> 6.

Se não for permitido expandir mais a pesquisa então o melhor percurso com 1 transbordo já foi encontrado, mas caso seja permitido passar para a próxima ronda então já foi demonstrado que muito provavelmente será possível encontrar uma solução melhor. Assumindo que é permitido passar para a próxima ronda, K = 3, partindo agora da paragem 5 e tendo como referência o tempo 14:10h, o objetivo agora é encontrar a próxima viagem da linha 205 que tenha como tempo de partida na paragem 5 um valor superior a 14:10h. Como é possível observar na figura3.12, é possível partir na paragem 5 às 14:12h e alcançar a paragem 6 às 14:15h. O tempo na paragem 6 é melhor do que aquele que estava indicado anteriormente, logo também deve ser atualizado. O melhor caminho anterior que ligava até à paragem 6 era a paragem 4, no entanto agora esse valor deve ser atualizado para a paragem 5. O melhor percurso na ronda K = 3 passa agora a ser 1 -> 2 -> 3 -> 5 -> 6. Como a ronda atual é a 3 então o melhor percurso foi obtido com 2 transbordos. De facto, os transbordos feitos para encontrar a melhor viagem deram-se na paragem 3 entre as linhas 204 e 700 e na paragem 5 entre as linhas 700 e 205. Os melhores tempos para esta ronda estão apresentados na tabela3.6. Uma vez que o tempo da paragem 6 foi melhorado nesta ronda então teria de ser marcada para ser analisada na próxima ronda, no entanto como a paragem 6 apenas é servida pela linha 205 então é desnecessário passar para a ronda K = 4.

Como é possível observar, o algoritmo RAPTOR calculou o melhor tempo até todas as esta- ções, partindo do ponto 1. Se for necessário calcular o melhor percurso até à paragem 4 na mesma hora do dia não é necessário executar o algoritmo novamente já que é possível verificar qual foi a paragem que se antecede à paragem 4. Assim, o resultado para a paragem 4 seria 1 -> 2 -> 4 e para a paragem 5 seria 1 -> 2 -> 3 -> 5.

Modelação do Problema

Figura 3.10: Rede de transportes após a análise da linha 205 a partir da paragem 4.

Durante a execução do algoritmo é possível correr de forma paralela as iterações pelos pon- tos que estão na lista MarkedPlaces, tornando assim a pesquisa mais rápida. Como foi referido no capítulo anterior, uma das abordagens mais corretas para se paralelizar o algoritmo passava por calcular as linhas independentes, ou seja, linhas que não partilham qualquer paragem entre si. A abordagem seguida durante o desenvolvimento do trabalho foi diferente. Para se paralelizar o algoritmo utilizaram-se estruturas de dados preparadas para lidar com programas em paralelo, evitando assim criar novos métodos para calcular linhas independentes. Dessa forma foi possí- vel paralelizar o código apenas alterando o tipo da estrutura de dados para uma semelhante que suportasse paralelismo.

Documentos relacionados