30.07.2015 Views

Projet de programmation : Algorithme de Dijkstra

Projet de programmation : Algorithme de Dijkstra

Projet de programmation : Algorithme de Dijkstra

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>Projet</strong> <strong>de</strong> <strong>programmation</strong> : <strong>Algorithme</strong> <strong>de</strong> <strong>Dijkstra</strong>2007-20081. Le problèmeDans un réseau informatique, les routeurs doivent être configurés pour pouvoir atteindre l’ensemble<strong>de</strong>s machines. Dans <strong>de</strong>s réseaux <strong>de</strong> gran<strong>de</strong> taille, il est illusoire <strong>de</strong> réaliser cette configuration « à lamain ». Un certain nombre d’algorithmes sont alors utilisés pour détecter et calculer automatiquementles routes.Parmi les algorithmes utilisés, il y a l’algorithme <strong>de</strong> E. W. <strong>Dijkstra</strong> qui permet <strong>de</strong> calculer un arbre <strong>de</strong>recouvrement minimum au sein d’un réseau interne. Pour cela, il faut disposer <strong>de</strong> la carte complète duréseau. Chaque routeur va calculer le chemin le plus court vers chaque autre routeur. Cela revient àdire qu’il construit un arbre dont la racine est lui-même et les sommets sont les autres routeurs.Voici un exemple :FIG. 1 – Exemple <strong>de</strong> réseauDans la figure 1, nous avons un exemple <strong>de</strong> 4 routeurs interconnectés. Les liens entre les routeursreprésentent les connexions existantes. Les chiffres placés sur chaque lien représentent le coûtd’utilisation <strong>de</strong> la ligne. Ce coût peut être fonction d’un coût réel (monétaire) d’utilisation, <strong>de</strong> la ban<strong>de</strong>passante disponible (afin <strong>de</strong> favoriser <strong>de</strong>s lignes rapi<strong>de</strong>s) ou <strong>de</strong> l’encombrement <strong>de</strong> la ligne (afin <strong>de</strong>favoriser <strong>de</strong>s lignes moins encombrées). Ainsi, le coût entre R1 et R4 est fixé à 3.Chaque routeur va donc <strong>de</strong>voir déterminer le coût pour atteindre chaque autre. Cela revient à dire quechaque routeur va <strong>de</strong>voir construire un arbre dont il est la racine et lui permettant d’atteindre chaqueautre routeur. Les coût doivent être minimum. Si nous prenons le cas <strong>de</strong> R2, nous avons :FIG. 2 – Arbre pour R2Comme le montre la figure 2, les liens en gras font partie <strong>de</strong> l’arbre, dont la racine est R2 et qui le relieaux autres routeurs. Ainsi, le routeur R2 utilisera le lien R2-R1 dont le coût est 5 pour atteindre R1. Ilutilisera le lien R2-R3 dont le coût est 2 pour atteindre R3 et, pour atteindre R4, il utilisera le cheminR2-R1-R4 dont le coût total est 8.L’algorithme à implémenter est celui qui va construire à partir d’un routeur déterminé, l’arbre <strong>de</strong>recouvrement minimum le reliant à tous les autres routeurs. Dit autrement, c’est l’algorithme qui vaL. Swinnen 1


déterminer, pour un routeur donné, les liens qui seront utilisés pour atteindre les autres routeurs avecun coût minimum.2. <strong>Algorithme</strong> <strong>de</strong> <strong>Dijkstra</strong> (à partir du nœud A)Soit :• N, l’ensemble <strong>de</strong>s nœuds faisant partie <strong>de</strong> l’arbre• D(v), coût du chemin à partir <strong>de</strong> la racine jusqu’au nœud v• c(i,j), coût associé à la ligne joignant le nœud i au nœud j. Si aucune ligne ne joint ces nœuds,le coût est fixé à ∞.L’algorithme se déroule en 2 phases :• Phase 1 : la phase d’initialisation.N = {A}Pour tous les nœuds vSi v est adjacent à A,Alors D(v) = c(A, v)Sinon D(v) = ∞• Phase 2 : la répétitionBoucleTrouvez le nœuds w qui n’est pas déjà dans N <strong>de</strong> sorte que D(w) est minimalAjouter le nœud w à l’arbre NPour tous les nœuds v adjacents au nœuds w et ne se trouvant pas dans ND(v) = min( D(v) , D(w) + c(w, v) )Le nouveau coût pour atteindre le nœud v est soit l’ancien coût pour atteindrece nœud, soit un chemin plus court vers w + coût entre les nœuds w et vJusqu’à ce que tous les nœuds se trouvent dans NExemple (supposons pour le calcul à partir <strong>de</strong> R2) :Initialisation :N = { R2 }c(R1) = 5c(R3) = 2c(R4) = INFINIBOUCLE 1 : BOUCLE 2 : BOUCLE 3 :N = { R2, R3 } N= { R1, R2, R3 } N = {R1, R2, R3, R4}c(R1) = 5 c(R4) = 8c(R4) = 103. Métho<strong>de</strong> <strong>de</strong> résolution simplifiéePour résoudre ce problème, nous allons représenter le réseau sous la forme d’une matrice n x n. Si unlien existe entre le routeur i et le routeur j <strong>de</strong> coût c, nous placerons, à l’intersection <strong>de</strong> la ligne i et <strong>de</strong>la colonne j le coût c associé à ce lien. Ce coût c se trouvera également à l’intersection <strong>de</strong> la ligne j et<strong>de</strong> la colonne i.En effet, par souci <strong>de</strong> simplification, nous considérerons que le coût d’une ligne reliant le routeur R Aau routeur R B est i<strong>de</strong>ntique au coût reliant le routeur R B au routeur R A . Dans les réseaux informatiques,ce n’est pas nécessairement le cas.Toutes les autres cases contiendront la valeur –1 représentant l’absence <strong>de</strong> lien entre les <strong>de</strong>ux routeurs.L. Swinnen 2


La 1 ère ligne et la 1 ère colonne (i.e. la ligne 0 et la colonne 0) seront utilisées pour faire <strong>de</strong>s calculs.1) InitialisationR1 R2 R3 R4-1 -1 0 -1 -1R1 -1 -1 5 -1 3R2 0 5 -1 2 -1R3 -1 -1 2 -1 8R4 -1 3 -1 8 -1Durant la phase d’initialisation, on remplit la matrice avec l’élément –1 qui indique l’absence <strong>de</strong>relation.Ensuite, il faut placer les coûts <strong>de</strong>s différents liens reliant les routeurs. Il faut bien se rappeler que lecoût qui relie le routeur R A au routeur R B est i<strong>de</strong>ntique au coût reliant le routeur R B au routeur R A .Enfin, il faut fixer en colonne 0, en regard du routeur choisit comme racine <strong>de</strong> l’arbre (ici le routeurR 2 ), la valeur 0.Pour rappel, la colonne 0 reprendra le coût pour atteindre un routeur une fois que celui-ci est intégrédans l’arbre (ce coût est par conséquent minimal). La ligne 0 nous permettra <strong>de</strong> calculer, pour chaquerouteur le coût minimum pour l’atteindre.2) 1 ère itérationPour tous les routeurs qui n’ont pas déjà été traités (soit les routeurs R 1 , R 3 et R 4 ), il faut déterminer lescoûts pour les atteindre à partir du routeur R 2 .Nous allons donc parcourir les colonnes R 1 , R 3 et R 4 (soit les routeurs à traiter) et déterminer commentles atteindre. Pour le routeur R j :Pour chaque élément matrice[i][j] >= 0 (i.e. il existe une liaison entre le routeur R j et lerouteur R i ), le coût pour l’atteindre est donné par :Cout_rj = min(cout_ri_rj) ∀ R i déjà traité (R 2 dans l’exemple)Cout_ri_rj = matrice[i][0] + matrice[i][j]qui représente le coût pour atteindre le routeur R i auquel on additionne le coût<strong>de</strong> la liaison R i -R j . On gar<strong>de</strong> la plus petite valeur permettant d’atteindre lerouteur R j .uniquement si matrice[i][0] >=0 (uniquement si le routeur R i fait déjà partie <strong>de</strong>l’arbre).Dans notre exemple, pour R 1 , nous avons les valeurs 5 (en regard <strong>de</strong> R 2 ) et 3 (en regard <strong>de</strong> R 4 ).Puisque seul R 2 fait partie <strong>de</strong> la matrice, il est possible d’atteindre R 1 à partir <strong>de</strong> R 2 par un coût <strong>de</strong> 5.Pour R 3 , nous obtenons un coût <strong>de</strong> 2. R 4 n’est pas joignable à ce sta<strong>de</strong>.Cela permet <strong>de</strong> compléter la matrice avec les coûts calculés :R1 R2 R3 R4-1 5 -1 2 -1R1 -1 -1 5 -1 3R2 0 5 -1 2 -1R3 -1 -1 2 -1 8R4 -1 3 -1 8 -1Ensuite il faut sélectionner la plus petite <strong>de</strong> ces valeurs, soit le coût 2 pour atteindre R 3 . Nous ajoutonsR 3 à l’arbre en mentionnant, en colonne 0, le coût minimal pour l’atteindre à partir <strong>de</strong> R 2 . Donc :matrice[3][0] = 2L. Swinnen 3


Puisque nous <strong>de</strong>vons retenir le lien utilisé (à savoir le lien R 2 -R 3 ), nous allons modifier les coûtscorrespondants dans la matrice à la valeur –2. Donc :matrice[2][3] = -2matrice[3][2] = -2Avant la secon<strong>de</strong> itération, la matrice est <strong>de</strong>venue :R1 R2 R3 R4-1 -1 -1 -1 -1R1 -1 -1 5 -1 3R2 0 5 -1 -2 -1R3 2 -1 -2 -1 8R4 -1 3 -1 8 -13) 2 ème itérationPour tous les routeurs qui n’ont pas déjà été traités (soit les routeurs R 1 et R 4 ), il faut déterminer lescoûts pour les atteindre à partir du routeur R2.Nous allons donc parcourir, comme à l’étape précé<strong>de</strong>nte, les colonnes R 1 et R 4 (soit les routeurs àtraiter) et déterminer comment les atteindre.Dans notre exemple, pour R 1 , nous avons les valeurs 5 (en regard <strong>de</strong> R 2 ) et 3 (en regard <strong>de</strong> R 4 ). Seulles routeurs R 2 et R 3 font partie <strong>de</strong> l’arbre, il est possible d’atteindre R 1 à partir <strong>de</strong> R 2 par un coût <strong>de</strong> 5.Pour R 4 , nous obtenons un coût <strong>de</strong> 10 (coût pour R 3 = 2 ; coût R 3 -R 4 = 8 ; coût total pour R 2 -R 3 -R 4 =10).Cela permet <strong>de</strong> compléter la matrice avec les coûts calculés :R1 R2 R3 R4-1 5 -1 -1 10R1 -1 -1 5 -1 3R2 0 5 -1 -2 -1R3 2 -1 -2 -1 8R4 -1 3 -1 8 -1Ensuite il faut sélectionner la plus petite <strong>de</strong> ces valeurs, soit le coût 5 pour atteindre R 1 . Nous ajoutonsR 1 à l’arbre en mentionnant, en colonne 0, le coût minimal pour l’atteindre à partir <strong>de</strong> R 2 . Donc :matrice[1][0] = 5Puisque nous <strong>de</strong>vons retenir le lien utilisé (à savoir le lien R 2 -R 1 ), nous allons modifier les coûtscorrespondants dans la matrice à la valeur –2. Donc :matrice[1][2] = -2matrice[2][1] = -2Avant la troisième itération, la matrice est <strong>de</strong>venue :R1 R2 R3 R4-1 -1 -1 -1 -1R1 5 -1 -2 -1 3R2 0 -2 -1 -2 -1R3 2 -1 -2 -1 8R4 -1 3 -1 8 -1L. Swinnen 4


4) 3 ème itérationPour tous les routeurs qui n’ont pas déjà été traités (soit le routeur R 4 ), il faut déterminer les coûts pourles atteindre à partir du routeur R 2 .Nous allons donc parcourir, comme à l’étape précé<strong>de</strong>nte, la colonne R 4 (soit le <strong>de</strong>rnier routeur àtraiter) et déterminer comment l’atteindre.Dans notre exemple, pour R 4 , nous avons <strong>de</strong>ux possibilités : soit en passant par le lien R 3 -R 4 avec uncoût total <strong>de</strong> 10, soit en passant par le lien R 1 -R 4 avec un coût total <strong>de</strong> 8 (5 pour atteindre R 1 et 3 pourle lien R 1 -R 4 ). C’est cette valeur minimale qui est retenue.Cela permet <strong>de</strong> compléter la matrice avec les coûts calculés :R1 R2 R3 R4-1 -1 -1 -1 8R1 5 -1 -2 -1 3R2 0 -2 -1 -2 -1R3 2 -1 -2 -1 8R4 -1 3 -1 8 -1Ensuite il faut sélectionner la plus petite valeur (comme il n’y en a qu’une, c’est facile), soit le coût 8pour atteindre R 4 . Nous ajoutons R 4 à l’arbre en mentionnant, en colonne 0, le coût minimal pourl’atteindre à partir <strong>de</strong> R 2 . Donc :matrice[4][0] = 8Puisque nous <strong>de</strong>vons retenir le lien utilisé (à savoir le lien R 1 -R 4 ), nous allons modifier les coûtscorrespondants dans la matrice à la valeur –2. Donc :matrice[1][4] = -2matrice[4][1] = -2Au terme <strong>de</strong> la troisième itération, la matrice est <strong>de</strong>venue :R1 R2 R3 R4-1 -1 -1 -1 -1R1 5 -1 -2 -1 -2R2 0 -2 -1 -2 -1R3 2 -1 -2 -1 8R4 8 -2 -1 8 -1Tous les routeurs sont désormais traités, le calcul <strong>de</strong>s route est terminé.4. Représentation <strong>de</strong>s données1) Fichier <strong>de</strong> donnéesNous disposerons d’un fichier CSV décrivant le réseau. Pour ce faire le fichier listera tous les liensexistants. Pour l’exemple, cela donne :SRC;DST;COUT1;2;52;1;51;4;34;1;32;3;23;2;23;4;84;3;8L. Swinnen 5


Le résultat consistera à ajouter à ce fichier CSV les liens qui font parties <strong>de</strong> l’arbre <strong>de</strong> recouvrementcalculé précé<strong>de</strong>mment. Pour l’exemple, cela donne :SRC;DST;COUT;MEMBRE1;2;5;O2;1;5;O1;4;3;O4;1;3;O2;3;2;O3;2;2;O3;4;8;N4;3;8;N2) Le tableauLe fichier CSV sera chargé dans un tableau structuré en mémoire centrale. Ce tableau serasurdimensionné (nous traiterons, au plus, 200 relations).Une fois l’arbre construit, il faudra enrichir le tableau avec les données indiquant si le lien est membre<strong>de</strong> l’arbre ou non.3) la matriceLa matrice sera matérialisée par un tableau d’entiers à 2 dimensions n x n. Le nombre maximum <strong>de</strong>routeurs que nous traiterons sera 20.4) Etapes importantesCe projet peut être découpé en plusieurs étapes beaucoup plus gérables :1. Gestion <strong>de</strong>s fichiers : réalisation <strong>de</strong>s étapes fichier->tableau et tableau->fichier2. Gestion <strong>de</strong> la matrice : réalisation <strong>de</strong>s étapes tableau->matrice et matrice->tableau3. Calcul <strong>de</strong> l’arbre sur base <strong>de</strong> la matriceIl ne faut pas oublier <strong>de</strong> gérer les quelques exceptions qui peuvent survenir :• Fichier <strong>de</strong> données inexistant• Trop <strong>de</strong> relations• Trop <strong>de</strong> routeursL. Swinnen 6

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!