J'ai travaillé sur un petit programme qui calcule les chemins les plus courts pour chaque sommet dans un graphique donné en utilisant OpenMP pour séparer les calculs entre plusieurs threads au lieu de faire un seul sommet à la fois. Bien que mon implémentation actuelle fonctionne, je veux que je puisse lire les données du graphique à partir d'un fichier au format "vertex1 vertex2 weight" afin que les graphiques ne soient pas codés en dur dans le programme.Problèmes de portée possibles avec ma mise en œuvre de l'algorithme de plus court chemin de Dijkstra dans OpenMP?
Les sources sont ici: http://pastebin.com/bkR7QysB
Compilé comme suit:
g++ -fopenmp GraphTest.cpp WeightedGraph.cpp -o dijkstra
En utilisant les données suivantes en entrée:
foo derp 50
narf balls 30
foo balls 20
balls derp 60
derp narf 40
derp cox 30
foo narf 50
narf pie 99
cox pie 15
cox narf 10
ma sortie est:
Enter filename: lol.out
Printing all edges currently in graph:
(foo, derp) : cost 50
(narf, balls) : cost 30
(foo, balls) : cost 20
(balls, derp) : cost 60
(derp, narf) : cost 40
(derp, cox) : cost 30
(foo, narf) : cost 50
(narf, pie) : cost 99
(cox, pie) : cost 15
(cox, narf) : cost 10
[thread:0] Showing single-source shortest path run for source vertex balls. Format is (start, end) : cost.
(balls, balls : cost 0)
(balls, derp : cost 60)
[thread:0] Showing single-source shortest path run for source vertex cox. Format is (start, end) : cost.
(cox, cox : cost 0)
(cox, narf : cost 10)
[thread:1] Showing single-source shortest path run for source vertex derp. Format is (start, end) : cost.
(derp, derp : cost 0)
(derp, cox : cost 30)
[thread:1] Showing single-source shortest path run for source vertex foo. Format is (start, end) : cost.
(foo, foo : cost 0)
(foo, narf : cost 50)
[thread:2] Showing single-source shortest path run for source vertex narf. Format is (start, end) : cost.
(narf, narf : cost 0)
(narf, cox : cost 10)
[thread:2] Showing single-source shortest path run for source vertex pie. Format is (start, end) : cost.
(pie, pie : cost 0)
(pie, cox : cost 15)
Ceci est évidemment incorrect - il est supposé imprimer le plus court chemin d'un sommet à tous les autres sommets du graphique, mais ici il imprime seulement le plus court chemin vers lui-même (qui est toujours 0) et le chemin vers un seul directement voisins adjacents. Il ne traverse pas du tout le graphique. Le plus étrange partie, cependant, est que décommentant ce bloc énorme à la fin de GraphTest.cpp et commenter le code de fichier de traitement de sorte que les données de graphique est codé en dur dans le programme, tout fonctionne bien:
Printing all edges currently in graph:
(foo, derp) : cost 50
(narf, balls) : cost 30
(foo, balls) : cost 20
(balls, derp) : cost 60
(derp, narf) : cost 40
(derp, cox) : cost 30
(foo, narf) : cost 50
(narf, pie) : cost 99
(cox, pie) : cost 15
(cox, narf) : cost 10
[thread:0] Showing single-source shortest path run for source vertex balls. Format is (start, end) : cost.
(balls, balls : cost 0)
(balls, foo : cost 20)
(balls, narf : cost 30)
(balls, cox : cost 40)
(balls, pie : cost 55)
(balls, derp : cost 60)
[thread:0] Showing single-source shortest path run for source vertex cox. Format is (start, end) : cost.
(cox, cox : cost 0)
(cox, narf : cost 10)
(cox, pie : cost 15)
(cox, derp : cost 30)
(cox, balls : cost 40)
(cox, foo : cost 60)
[thread:1] Showing single-source shortest path run for source vertex derp. Format is (start, end) : cost.
(derp, derp : cost 0)
(derp, cox : cost 30)
(derp, narf : cost 40)
(derp, pie : cost 45)
(derp, foo : cost 50)
(derp, balls : cost 60)
[thread:1] Showing single-source shortest path run for source vertex foo. Format is (start, end) : cost.
(foo, foo : cost 0)
(foo, balls : cost 20)
(foo, derp : cost 50)
(foo, narf : cost 50)
(foo, cox : cost 60)
(foo, pie : cost 75)
[thread:2] Showing single-source shortest path run for source vertex narf. Format is (start, end) : cost.
(narf, narf : cost 0)
(narf, cox : cost 10)
(narf, pie : cost 25)
(narf, balls : cost 30)
(narf, derp : cost 40)
(narf, foo : cost 50)
[thread:2] Showing single-source shortest path run for source vertex pie. Format is (start, end) : cost.
(pie, pie : cost 0)
(pie, cox : cost 15)
(pie, narf : cost 25)
(pie, derp : cost 45)
(pie, balls : cost 55)
(pie, foo : cost 75)
Honnêtement, je n'ai aucune idée de ce qui se passe ici. La seule chose à laquelle je puisse penser, c'est que quelque chose sort de sa portée trop tôt et fait que mon objet graphique se comporte bizarrement, mais si c'était vrai alors les deux sorties auraient dû être fausses ... J'espère que quelqu'un plus intelligent que moi peut courir ceci et m'aider à comprendre ce qui s'est mal passé.
En fait, la direction n'a pas vraiment dans ce cas - méthode GetDistance (Vertex *, Vertex *) vérifie les deux façons, donc il rapportera la même distance pour les deux (v1, v2) et (v2, v1) si seulement un de ceux-ci est défini. J'ai utilisé new au lieu de simplement faire des instances parce que celles-ci étaient vraiment hors de portée trop rapidement, et mon code segfaulted partout jusqu'à ce que je les remplace par des pointeurs. – Cirvante
Edit: @ dusktreader Merci pour le conseil sur les insertions répétées en écrasant l'élément précédent. J'ai ajouté une rapide vérification .find() == .end() pour voir si le vertex à insérer était déjà dans la map, et cela semblait résoudre le problème. :) – Cirvante