Je suis étudiant en M1 maths appliquées et je rencontre une difficulté dans la rédaction de mon mémoire. Je dois coder (en python) un algorithme de plus court chemin, ayant étudié en cours la partie théorique de la programmation dynamique ( principe de Bellman) je me suis lancé sur un algo de Bellman-Ford. Cela me paraît pertinent pour faire écho à mes cours même si le graphe que je considère n'a pas de pondération négative...
Mon code semble fonctionner (même s'il n'est pas très beau) mais je ne parviens pas à récupérer la liste totale des sommets composant les dits plus courts chemins calculés : Je n'ai que le début et la plus petite distance ! Comment récupérer la totalité de ces listes ?
(désolé pour la longueur du post
Voici mon code test sur un graphe simple (je souhaite étudier le métro parisien à terme), soyez indulgents
- Code: Tout sélectionner
import numpy as np
import math
mat = np.array( [[0,1,0,0,0,0,0,1],
[1,0,1,0,0,0,0,1],
[0,1,0,1,0,0,0,0],
[0,0,1,0,1,1,0,1],
[0,0,0,1,0,1,0,0],
[0,0,0,1,1,0,1,0],
[0,0,0,0,0,1,0,1],
[1,0,0,1,0,0,1,0]])
src = 0
L = [math.inf] * len(mat)
P = [math.inf] * len(mat)
L[src] = 0
P[src] = src
go = True
list_path = np.ones((len(mat),len(mat)))
list_path = math.inf * list_path
edgelist = []
for i in range(0,len(mat)):
for j in range(0,len(mat)):
if mat[i][j] == 1:
edge = (i,j)
edgelist.append(edge)
i = 0
while go == True:
go = False
for (x,y) in edgelist:
list_path[y][0] = y
if L[y] > L[x] + mat[x][y]:
L[y] = L[x] + mat[x][y]
P[y] = x
go = True
list_path[y][i] = P[y]
i = + 1
print('P=',P)
print('L=',L)
print('list_path=',list_path )
et la sortie :
- Code: Tout sélectionner
P= [0, 0, 1, 7, 3, 3, 7, 0]
L= [0, 1, 2, 2, 3, 3, 2, 1]
list_path= [[ 0. 0. inf inf inf inf inf inf]
[ 1. 0. inf inf inf inf inf inf]
[ 2. 1. inf inf inf inf inf inf]
[ 3. 7. inf inf inf inf inf inf]
[ 4. 3. inf inf inf inf inf inf]
[ 5. 3. inf inf inf inf inf inf]
[ 6. 7. inf inf inf inf inf inf]
[ 7. 0. inf inf inf inf inf inf]]

