K Shortest Loopless Paths

De Wiki-II

O K Shortest Loopless Paths (KSP) é um algoritmo proposto por Yen [1] capaz de encontrar os K caminhos mais curtos entre dois nodos de um dado grafo.

O KSP foi escrito em Python (versão 2.7.2+) e é disponibilizado no GitHub através do seguinte endereço:

https://github.com/maslab-ufrgs/ksp

A única dependência do script é o pacote py-expression-eval, utilizado na interpretação dos arquivos de grafo.

Tabela de conteúdo

Funcionamento

Para executar o algoritmo KSP, o seguinte comando deve ser executado através do terminal:

python KSP.py [-h] -f FILE -k K [-l OD_LIST]

Onde:

  • -f FILE: é o arquivo de grafo
  • -k K: quantidade de caminhos mais curtos desejados
  • -l OD_LIST: é uma lista de pares OD, separados por ";" (ponto-e-vírgula), e com os nodos separados por "|" (pipe)

Exemplo 1

Obter os 4 caminhos mais curtos para todos os pares OD da rede OW (assumindo que o arquivo da rede está no mesmo diretório do script KSP.py). No terminal, a partir do diretório do KSP, ao digitar:

python KSP.py -f OW.net -k 4

obtém-se:

ksptable = [
	[ # A|L flow
		['A-C', 'C-G', 'G-J', 'J-I', 'I-L'], # cost 28.0
		['A-C', 'C-G', 'G-J', 'J-L'], # cost 29.0
		['A-C', 'C-F', 'F-I', 'I-L'], # cost 31.0
		['A-C', 'C-D', 'D-G', 'G-J', 'J-I', 'I-L'] # cost 33.0
	],
	[ # A|M flow
		['A-C', 'C-D', 'D-H', 'H-K', 'K-M'], # cost 26.0
		['A-C', 'C-G', 'G-J', 'J-K', 'K-M'], # cost 28.0
		['A-C', 'C-G', 'G-H', 'H-K', 'K-M'], # cost 28.0
		['A-D', 'D-H', 'H-K', 'K-M'] # cost 29.0
	],
	[ # B|L flow
		['B-D', 'D-G', 'G-J', 'J-I', 'I-L'], # cost 32.0
		['B-D', 'D-G', 'G-J', 'J-L'], # cost 33.0
		['B-A', 'A-C', 'C-G', 'G-J', 'J-I', 'I-L'], # cost 35.0
		['B-A', 'A-C', 'C-G', 'G-J', 'J-L'] # cost 36.0
	],
	[ # B|M flow
		['B-E', 'E-H', 'H-K', 'K-M'], # cost 23.0
		['B-D', 'D-H', 'H-K', 'K-M'], # cost 25.0
		['B-D', 'D-E', 'E-H', 'H-K', 'K-M'], # cost 30.0
		['B-E', 'E-D', 'D-H', 'H-K', 'K-M'] # cost 32.0
	]
]

Exemplo 2

Obter os 4 caminhos mais curtos apenas para o par AL da rede OW (assumindo que o arquivo da rede está no mesmo diretório do script KSP.py). No terminal, a partir do diretório do KSP, ao digitar:

python KSP.py -f OW.net -l 'A|L' -k 4

obtém-se:

ksptable = [
	[ # A|L flow
		['A-C', 'C-G', 'G-J', 'J-I', 'I-L'], # cost 28.0
		['A-C', 'C-G', 'G-J', 'J-L'], # cost 29.0
		['A-C', 'C-F', 'F-I', 'I-L'], # cost 31.0
		['A-C', 'C-D', 'D-G', 'G-J', 'J-I', 'I-L'] # cost 33.0
	]
]

Instruções para definição do arquivo de grafo

Consulte a especificação de arquivos de rede.

Instruções para chamar o KSP a partir de outros programas

Para chamar o KSP a partir de outros programas escritos em Python, basta importar o KSP e chamá-lo da seguinte forma:

import KSP

routes = KSP.getKRoutesNetFile(graph_file, origin, destination, K)

Onde:

  • graph_file é o caminho do arquivo de rede (string);
  • origin é o nodo de origem (string);
  • destination é o nodo de destino (string);
  • K é a quantidade de caminhos mais curtos desejados (int).

A função acima lê o arquivo de rede e gera as k rotas para o par OD fornecido. Para calcular para mais pares OD, basta chamar a função novamente. No entanto, note que construir a rede a partir do arquivo para cada par OD é ineficiente. Logo, pode-se construir a rede separadamente e então chamar uma variante da função acima que recebe as listas já processadas de nós, arestas e pares OD:

import KSP

V, E, OD = KSP.generateGraph(graph_file)

for od in OD:
    origin, destination = od.split('|')
    routes = KSP.getKRoutes(V, E, origin, destination, K)

O resultado do algoritmo (em ambos os casos) é uma lista dupla, onde cada posição corresponde a uma tupla <caminho, custo>. Considerando os exemplos anteriores (com a rede OW), a saída para o par AL com K=4 seria a seguinte:

[  [['A-C', 'C-G', 'G-J', 'J-I', 'I-L'], 28.0], 
   [['A-C', 'C-G', 'G-J', 'J-L'], 29.0], 
   [['A-C', 'C-F', 'F-I', 'I-L'], 31.0], 
   [['A-C', 'C-D', 'D-G', 'G-J', 'J-I', 'I-L'], 33.0]   ]

Um exemplo detalhado do KSP para esta finalidade está disponível no arquivo de exemplo ksp_calling_example.py, contido no mesmo diretório do algoritmo.

Links externos

Explicação simplificada do algoritmo KSP na Wikipedia (em inglês)

Referências

[1] Yen, J.Y.: Finding the k shortest loopless paths in a network. Management Science 17(11) (1971) 712-716.

Créditos

O script KSP.py foi criado por Gabriel de Oliveira Ramos em 10 de Fevereiro de 2014.

Ferramentas pessoais