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?