Existe uma abordagem melhor para encontrar o caminho mais curto dentro de uma rede de tráfego (veicular)?


8

Caros colegas programadores,

Estamos desenvolvendo um software que simula o tráfego de veículos. Parte do processo chamado "atribuição" refere-se à atribuição de veículos às suas rotas e deve usar algum tipo de algoritmo de localização de caminho mais curto.

Tradicionalmente, as pessoas fazem isso com o de Dijkstra, e certas literaturas científicas parecem indicar que A * e outras alternativas não oferecem nenhuma melhoria significativa, talvez devido à natureza do gráfico.

Portanto, também estamos usando o Dijkstra. Surgiu um pequeno problema: se você tratar as ligações de tráfego (vãos de estradas entre cruzamentos) como arestas e cruzamentos como nós, não poderá obter um gráfico unidirecional clássico: ao se aproximar de um cruzamento, o qual você pode mudar frequentemente depende de onde você é, enquanto em um gráfico tradicional você pode obter qualquer vantagem de um nó.

Resolvemos esse problema com bastante facilidade, representando um par de interseção de links (chame de "ripa") como um nó. Como você precisaria atravessar um link para chegar a qualquer "rampa" subsequente, ou ponto de escolha, uma aresta seria então definida como esse percurso, e você obterá um gráfico típico.

Os resultados são armazenados em uma tabela simples, N x N, onde N é o número de "ripas".

Aqui está a (inevitável?) Desvantagem. Se uma rede típica para nossa simulação pode ter, digamos, 2000 cruzamentos, ela terá algo em torno de 6000 links, ou seja, N = 3V. Obviamente, se contados em termos de interseções (V), agora chegamos a O (log (3V) * (3V + E)).

Você pode argumentar que 3 (ou 9) é um fator constante, mas do ponto de vista prático, ele diminui bastante as coisas e aumenta o espaço de armazenamento para 3V x 3V.

Alguém tem alguma idéia de como podemos reestruturar isso para melhorar o desempenho? Não é necessariamente qualquer algoritmo alternativo, talvez reformule as estruturas de dados para ajustar um gráfico de alguma outra maneira?


Não estou claro o que N e V são. V é o número de vértices (interseções) e N é o número de arcos entre os vértices? Além disso, o que é E?
precisa saber é o seguinte

Quais recursos você leu? É comprovado que o IIRC, A * encontra o caminho ideal no menor tempo possível, dada uma heurística pessimista. De fato, A * regressa ao Dijkstra com uma heurística / 0 vazia.
Steven Evers

Além disso, qual representação gráfica você está usando? Gráficos unidirecionais com listas de adjacências permitiriam facilmente estradas como arestas / interseções como nós (na verdade, mesmo uma matriz de adjacência permitiria, mas obviamente teria que ser uma matriz completa em vez de triangular superior / inferior). TBH: Eu sugeriria muita literatura sobre programação de jogos, é um problema altamente trabalhado nesse campo e tem as mesmas restrições de desempenho mais rigorosas que você mencionou.
Steven Evers

1
@SnOrfus: sim, mas você nem sempre pode representar uma única interseção como um único nó; por exemplo, uma interseção permite virar à esquerda ou seguir em frente, mas não à direita, a matriz de adjacência simples não seria capaz de representar isso ( pior se você tiver uma rotatória).
Lie Ryan

@LieRyan: Talvez eu esteja entendendo mal você, mas isso não é diferente de um cruzamento onde não há curva à direita e deve ser representado da mesma maneira.
Steven Evers

Respostas:


6

O Dijkstra's encontra o caminho mais curto entre um determinado nó e todos os outros nós, portanto, espero que seja mais caro que o A *. No entanto, parece que você está tentando pré-calcular o custo e o caminho de um nó para outro? Então o Dijkstra's é o caminho a percorrer.

Quanto a uma representação mais simples, algumas coisas vêm à mente:

Em muitos cruzamentos, você pode entrar e sair da maneira que quiser. É apenas um subconjunto que você tem restrições como "nenhuma curva à esquerda". Então você pode usar os "ripas" apenas para cruzamentos onde você realmente precisa deles. Isso deve reduzir muito o tamanho ali.

Você poderia fazer isso automaticamente procurando "ripas equivalentes" e combinando-as. Dois tornos são equivalentes se todos os links que saem forem iguais. Por exemplo, se "Intersecção X proveniente do oeste" e "Intersecção X proveniente do sul" levam ao mesmo conjunto de outros nós, com o mesmo custo, apenas os mescla em um único nó.

Tem certeza de que precisa / deseja pré-calcular o melhor caminho, em vez de computá-lo online? Os videogames geralmente calculam essas coisas online.

Além disso, como você está representando os caminhos? Na sua matriz, você só precisa representar o primeiro link no caminho. Por exemplo, para ir da casa de Bob para o trabalho de Bob, você só precisa conhecer o primeiro link, pois quando eles chegarem lá, agora você pode procurar em sua matriz como obter o primeiro link para o trabalho de Bob, o que fornecerá a você o segundo link etc.


Combinar "ripas" é realmente uma ideia interessante. Você está certo, estamos encontrando o caminho mais curto entre cada par de nós e, em seguida, gerando caminhos. Em uma simulação de tráfego típica, quase nenhuma estrada é usada (por que haveria uma estrada lá em primeiro lugar, certo?). Quando você diz "online", você quer dizer em tempo real? Tudo o que realmente podemos fazer é calcular os caminhos mais curtos "esperados", já que não sabemos exatamente quais serão as condições em algum link quando o veículo realmente chegar lá. Atualizamos a matriz de caminho mais curto com base nas condições atuais.
Greg Kramida

Sim, com "online", quero dizer em tempo real, ou seja, quando Bob sai de casa e quer ir trabalhar, faça o A * então.
Martin C. Martin

Dependendo de quantas vezes a matriz do caminho mais curto precisa ser atualizada, você pode trabalhar bastante para a atualização e não acabar usando a maioria das células antes de fazer a atualização novamente. Não conheço os detalhes do seu caso de uso, mas do lado de fora, parece que pelo menos vale a pena tentar *. Além disso, enquanto todos os N nós são usados ​​em algum momento, isso não significa que todos os pares N ^ 2 serão usados ​​em algum momento. As pessoas no quarteirão de Bob, quantos destinos únicos eles têm?
Martin C. Martin

Sim, eu concordo, provavelmente vale a pena tentar A *. Para algumas simulações, estamos encaminhando uma fração de veículos em cada origem para quase todos os destinos, mas de longe não em todos os casos. Encontrei alguns artigos sobre pessoas que utilizam várias heurísticas com A * especificamente para redes de tráfego, vou testá-las. Obrigado pela sua ajuda, Martin.
Greg Kramida

1

Você tem um gráfico grande e o tornou ainda maior. Martinc C. Martin aconselhou o uso de tornos somente quando necessário, então não vou entrar nisso.

Uma das coisas que pode ajudá-lo é transformar seu gráfico em gráficos menores.

A primeira simplificação que me ajudou muito (trabalhei com redes rodoviárias dos estados europeus) foi "remover" os nós com o digree 1 e 2 recursivamente. Dessa forma, você não tem ruas sem saída e as interseções em T (originalmente grau 3) tornam-se no grau 2 e isso não é interessante, se você não estiver percorrendo esse nó ou aquele nó naquele saco de lixo removido.

Depois disso, você pode tentar dividir seu gráfico em partes que possuam grande quantidade de nós e arestas internas, mas que tenham uma conexão mínima com outras partes. Para encontrá-los, usei o corte mínimo em que a pia e a fonte estavam tão distantes uma da outra (nas arestas) uma da outra e as arestas próximas a elas tinham uma capacidade enorme e as arestas em algum lugar tinham pequenas.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.