Voici un peu moins de pseudo-code mathématique. Je ne sais pas si cela va expliquer ce qui se passe, mais ça peut vous aider à le lire. Ce n'est pas un algorithme fonctionnel (beaucoup de :=
partout), donc je vais utiliser le pseudo-code Python.
# I have no idea where 'i' comes from. It's not defined anywhere
for k in range(2,n):
C[set(i,k), k] = d(1,k)
shortest_path = VERY_LARGE_NUMBER
# I have to assume that n is the number of nodes in the graph G
# other things that are not defined:
# d_i,j -- I will assume it's the distance from i to j in G
for subset_size in range(3,n):
for index_subset in subsets_of_size(subset_size, range(1,n)):
for k in index_subset:
C[S,k] = argmin(lambda m: C[S-k,m] + d(G,m,k), S - k)
shortest_path = argmin(lambda k: C[set(range(1,n)),k] + d(G,1,k), range(2,n))
return shortest_path
# also needed....
def d(G, i, j):
return G[i][j]
def subsets_of_size(n, s): # returns a list of sets
# complicated code goes here
pass
def argmin(f, l):
best = l[0]
bestVal = f(best)
for x in l[1:]:
newVal = f(x)
if newVal < bestVal:
best = x
bestVal = newVal
return best
Quelques notes:
- L'algorithme source n'est pas complète. Au moins, sa mise en forme est bizarre dans la boucle interne, et elle rebondit k dans la deuxième argmin. Donc, tout est probablement faux. Je n'ai pas essayé d'exécuter ce code.
- les arguments à
range
devraient probablement tous être augmentés de 1 puisque Python compte à partir de 0, et non de 1. (et en général compter de 1 est une mauvaise idée).
- Je suppose que G est un dictionnaire de type {from: {to: length}}. En d'autres termes, une représentation de liste d'adjacence.
- J'ai déduit que C est un dictionnaire de type {(set (int), int): int}. Je peux me tromper. J'utilise un
set
comme clés pour C
. En vrai Python, vous devez d'abord convertir en frozen_set
. La conversion est juste occupé, alors je l'ai laissé de côté.
- Je ne me souviens pas des opérateurs set en Python. Je me souviens qu'il utilise
|
et &
au lieu de +
et -
.
- Je n'ai pas écrit
subsets_of_size
. C'est assez compliqué.