Pouvez vous m'expliquer ce petit code?
R.I.B.A.J
Messages postés
40
Date d'inscription
Statut
Membre
Dernière intervention
-
R.I.B.A.J -
R.I.B.A.J -
Bonjour à tous,
Je me permets de vous demander votre aide car j'essaie de comprendre ce programme mais n'y arrive pas
Le code me donne à la fin le chemin le plus court mais je ne trouve pas la variable qui me donne le temps pris. Dans mon exemple, elle serait égale à 14.
Pour toutes les autres variables il m'est indiqué : "undefined variable"
Je vous remercie d'avance pour votre aide très précieuse.
Je me permets de vous demander votre aide car j'essaie de comprendre ce programme mais n'y arrive pas
<?php
function dijkstra($graph_array, $source, $target) {
$vertices = array();
$neighbours = array();
foreach ($graph_array as $edge) {
array_push($vertices, $edge[0], $edge[1]);
$neighbours[$edge[0]][] = array("end" => $edge[1], "cost" => $edge[2]);
$neighbours[$edge[1]][] = array("end" => $edge[0], "cost" => $edge[2]);
}
$vertices = array_unique($vertices);
foreach ($vertices as $vertex) {
$dist[$vertex] = INF;
$previous[$vertex] = NULL;
}
$dist[$source] = 0;
$Q = $vertices;
while (count($Q) > 0) {
// TODO - Find faster way to get minimum
$min = INF;
foreach ($Q as $vertex){
if ($dist[$vertex] < $min) {
$min = $dist[$vertex];
$u = $vertex;
}
}
$Q = array_diff($Q, array($u));
if ($dist[$u] == INF or $u == $target) {
break;
}
if (isset($neighbours[$u])) {
foreach ($neighbours[$u] as $arr) {
$alt = $dist[$u] + $arr["cost"];
if ($alt < $dist[$arr["end"]]) {
$dist[$arr["end"]] = $alt;
$previous[$arr["end"]] = $u;
}
}
}
}
$path = array();
$u = $target;
while (isset($previous[$u])) {
array_unshift($path, $u);
$u = $previous[$u];
}
array_unshift($path, $u);
return $path;
}
$graph_array = array(
array("a", "b", 7),
array("a", "c", 9),
array("a", "f", 14),
array("b", "c", 10),
array("b", "d", 15),
array("c", "d", 11),
array("c", "f", 20),
array("d", "e", 6),
array("e", "f", 9)
);
$path = dijkstra($graph_array, "f", "a");
echo "path is: ".implode(", ", $path)."\n";
Le code me donne à la fin le chemin le plus court mais je ne trouve pas la variable qui me donne le temps pris. Dans mon exemple, elle serait égale à 14.
Pour toutes les autres variables il m'est indiqué : "undefined variable"
Je vous remercie d'avance pour votre aide très précieuse.
A voir également:
- Pouvez vous m'expliquer ce petit code?
- Code ascii - Guide
- Code puk bloqué - Guide
- Code activation windows 10 - Guide
- Comment déverrouiller un téléphone quand on a oublié le code - Guide
- Code blocks - Télécharger - Langages
1 réponse
Salut !
Je ne connais pas bien le PHP, en attendant que quelqu'un qui sache vraiment te réponde, jpeux te donner ce que j'ai compris :)
Déjà c'est une version PHP de
https://fr.wikipedia.org/wiki/Algorithme_de_Dijkstra
Ensuite, tu as un graphe défini via le tableau $graph_array,
si pour "f","a" tu trouves 14, c'est que pour "a", "b" tu trouves 7 c'est ça ?
Donc tu cherches, la valeur dans la case d'index 2 de chaque tableaux dans le tableau "graph_array".
Après l'algorithme je pense que tu dois avoir une partie pour traduire
- "a" vers "b" = "b" vers "a",
- une partie "a" vers "d" = "a" vers "b" + "b" vers "d"
Si ça peut te mettre sur la voie ^^
Sinon lis la page wikipedia, ça peut aider aussi
Je ne connais pas bien le PHP, en attendant que quelqu'un qui sache vraiment te réponde, jpeux te donner ce que j'ai compris :)
Déjà c'est une version PHP de
https://fr.wikipedia.org/wiki/Algorithme_de_Dijkstra
Ensuite, tu as un graphe défini via le tableau $graph_array,
si pour "f","a" tu trouves 14, c'est que pour "a", "b" tu trouves 7 c'est ça ?
Donc tu cherches, la valeur dans la case d'index 2 de chaque tableaux dans le tableau "graph_array".
Après l'algorithme je pense que tu dois avoir une partie pour traduire
- "a" vers "b" = "b" vers "a",
- une partie "a" vers "d" = "a" vers "b" + "b" vers "d"
Si ça peut te mettre sur la voie ^^
Sinon lis la page wikipedia, ça peut aider aussi
Je te remercie pour ta réponse. Cependant, je viens de remarquer que j'ai donné un cas trivial ou le chemin le plus court entre a et f et (a,f).
Prenons le cas de dijkstra(a,e). Le plus court chemin est a,f,e qui pèse 14 +9 soit 23.
Mon but est d'afficher ce 23. Cependant, je suis quasi sur que le programme la calcule déjà et créer une nouvelle variable serait synonyme de perte de performance.
Je te remercie d'avance pour ton aide.