1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
| <?php
class Dijkstra //c'est la classe qui modélise le graphe
{
var $arc= array(); // Matrice d'adjacense qui modélise les arcs entre les noeuds
var $nombre=0; //pour maintenir le nombre des sommets
var $infini = 0;
function Dijkstra ($nombre,&$ourMap, $infini)//initialisation de graphe durant les itérations
{
$this -> arc = &$ourMap;
$this -> nombre = $nombre;
$this -> infini=$infini;
}
function ChercheVoisin($noeud)
{ //construit un tableau des sommets adjacents d'un sommet
$count=0;
$voisins = array();
//trouver les voisins
for ($i = 0; $i<count($this -> arc[$noeud]); $i++)
{
if ($this -> arc[$noeud][$i]>0 )
{
//stocker les voisins dans rep
$voisins[$count++]=$i;
}
}
return $voisins;
}
//application de Dijkstra
//pour faire l'appel il faut désigner le graphe , le départ et l'arrivée
function trouverChemin($depart,$arrivee)
{
//Tableau des distances
$distance = array();
//Tableau des predecesseurs
$predecesseurs = array();
//Tableau des valeurs 0 ou 1 pour marquer si chaque sommet est visité ou non
$marque = array();
for ($i = 0; $i < $this -> nombre; $i++)
{
//initialisation du tableau distance à* l'infinie
$distance[$i]=$this -> infini;
$marque [$i]=false;
}
//initialisation de la distance de la source à 0
$distance[$depart]=0;
for ($i = 0; $i < $this -> nombre; $i++)
{
//extraire le minimum du tableau distance en tenant compte que les sommets à* comparer ne sont pas visités
$min= $this -> ExtraireMin ($distance, $marque);
//changer la valeur* à true pour dire que ce sommet est visité
$marque[$min]=true;
//chercher les voisins du sommet actuel
$SesVoisins= array();
$SesVoisins= $this -> ChercheVoisin($min);
//chercher le voisin le plus proche
for ($j = 0; $j < count($SesVoisins); $j++) {
$voisinActuel = $SesVoisins [$j];
//avoir la nouvelle distance pour le sommet actuel en ajoutant la valeur du nouveau arc à* la distance totale
$distanceActuelle = $distance[$min] + $this -> arc [$min][$voisinActuel];
//si c'est le voisin trouvé est le plus proche changer la distance et le predecesseur
if ($distanceActuelle <$distance[$voisinActuel])
{
$distance[$voisinActuel]=$distanceActuelle;
$predecesseurs[$voisinActuel]=$min;
}
}
}
//pour récupérer le chemin entre le point de départ et l'arrivée
$chemin=array();
$x=$arrivee;
while($x!=$depart)
{
array_unshift($chemin, $x);
$x=$predecesseurs[$x];
}
array_unshift($chemin, $depart);
//retourner le tableau contenant la sécance des sommets
return $chemin;
}
function ExtraireMin($distance, $marque){
//initialiser x à* l'infinie
$x =$this -> infini;
$y=0;
//trouver la valeur minimale du tableau
for ($i = 0; $i < count($distance); $i++)
{
if (!$marque[$i] && $distance[$i]< $x)
{
$y=$i;
$x=$distance[$i];
}
}
//retourner la valeur trouvée
return $y;
}
}
//je test avec $matrice_cout =array(array(0,5),array(5,0)) et count($ourVille)=2
$graphe = new Dijkstra(count($ourVille), $matrice_cout, 100000);
//$depart = 0 et $arrivee = 1
$res=$graphe -> trouverChemin($depart,$arrivee);
?> |
Partager