Pouvez vous m'expliquer ce petit code?

Fermé
R.I.B.A.J Messages postés 40 Date d'inscription dimanche 8 mars 2015 Statut Membre Dernière intervention 31 mars 2016 - 21 nov. 2015 à 01:00
 R.I.B.A.J - 21 nov. 2015 à 11:12
Bonjour à tous,

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:

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
0
Salut Bastien,

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.
0