Chemins optimaux dans graphes algorithme de DANTZIG + programmation java - Recherche Operationnelle
I. Introduction
1) Graphe valué.
2) Chemin de longueur optimal.
3) Condition d’existence :
Exemple: circuit de longueur négatif
La longueur du circuit suivant est -2. C’est donc un circuit absorbant.
1) Exemples :
- Sommets correspondre aux localités
- Arcs correspondre aux routes (A chaque route on fait correspondre 2 arcs de sens opposés)
II. Algorithmes de résolution
Le problème du plus court chemin a été résolu par de nombreux algorithmes. Parmi ces algorithmes on peut trouver l’algorithme de
Ford, algorithme de DANTZIG(ou de MOORE-DIJKSTRA), algorithme de
BELLMAN, etc. Différents problèmes peuvent être posés autour de la
recherche de plus court chemin.
i. Un premier problème consiste à rechercher le plus court chemin
entre deux points donnés. C’est-à-dire déterminer le chemin de plus
petite longueur qui relie ces points.
ii. Un deuxième problème consiste à déterminer, à partir d’un point donné le plus court chemin pour aller à tous les autres
sommets.
iii. Enfin, un troisième problème consiste à trouver, pour n’importe quelle paire de sommets, le chemin le plus court entre eux.
1) Algorithme de Ford.
On suppose que le graphe G ne contient pas de circuit négatif G = (X,U) |X| = n.
1. Numéroter les sommets dans un ordre quelconque à
l’exception de l’origine et l’extrémité du chemin qui doivent être numérotés respectivement x1 et xn
2. Affecter provisoirement, à tout sommet xi un poids λi
0
|
si
|
i = 1
|
|
t.q λi =
|
si
|
i>1
|
|
+ ∞
|
|
3. Calculer de proche les différences λj – λi pour tout arc
(xi,xj) , et remplacer λj par λi + l(i,j) si λj – λi >l(i,j)
4. Arrêter la procédure lorsqu’aucun λi ne peut plus être
modifié.
Soit λn* la valeur final de λn. Donc la valeur du chemin minimal est λn*.
2) Algorithme de DANTZIG
Soit x1 l’origine et xn l’extrémité entre lesquels on désire connaitre le chemin de longueur minimale [ l(u) ≥ 0, u U G = (X,U)]
(a) λ1 = 0 E {x1}
(b) xi on associe xi* Ē = X – E t. q
Puis on revient à (b) jusqu’on atteint xn (si l’on veut seulement déterminer le chemin de v0 minimale entre x1 et xn). Ou bien quand E = X (dans le cas où on désire connaitre les chemins de valeurs minimale entre x1 et xi
xi X – { x1 }.
III. Implémentation de l’algorithme de DANTZIG.
Cet algorithme détermine la plus courte distance entre tous les couples de sommets d’un graphe valué G = (X,U). On suppose que le graphe ne contient pas de circuit absorbant. On commence par numéroter les sommets d’une manière quelconque. Ensuite, une matrice nommée MatMin de taille n x n
(n= nombre de sommets) est construite indiquant pour chaque sommet la
plus courte distance qui le sépare d’un autre sommet. L’idée est de
considérer un sous-graphe pour lequel on détermine les plus courtes
distances entre ses sommets. Ensuite, itérativement, on rajoute un
sommet dans ce sous-graphe, on met les plus courtes distances à jour et
on recommence jusqu’à ce que le sous-graphe soit le graphe lui même.
Rappelant que dans ce TP on s’intéressera aux problèmes de type (iii).
A l’itération k, le sous-graphe a k sommets et ce sont ceux numérotés de 1 à k. A l’itération k + 1, on ajoute le sommet k + 1
dans le sous-graphe. Les distances sont mises à jour de la manière
suivante. Tout d’abord on détermine la plus courte distance entre le
sommet k + 1 et n’importe quel autre sommet. Cela s’exprime par:
MatMin(k + 1, i) = min{d(xk + 1,xj) + MatMin(j,i)} pour i allant de
1 jusqu’à k. Cela veut dire que l’on considère que pour aller de k + 1 à i, on passe par un des sommets de 1 à k. On conserve la longueur du plus court chemin. De la même manière, on détermine
MatMin(i,k + 1) = min{d(xj,xk + 1) + MatMin(i,j)} pour i = 1...k.
Enfin, on met à jour la plus courte distance de chaque sommet de 1 à k vers chaque sommet de 1 à k car peut être que le plus court chemin entre deux de ces sommets passe par k + 1.
MatMin(i,j) = min{MatMin(i,j) , MatMin(i,k + 1) + MatMin(k + 1,j)} pour i, j = 1...k.
Algorithme
Entrées: G = (X,U) un graphe.
Sorties: MatMin une matrice contenant les plus courtes distances.
Début
pour i ← 1 à n faire pour j ← 1 à n faire
si i = j alors MatMin(i,i) ← 0; sinon MAtMin(i,j) ← +∞;
fin pour; fin pour;
pour k ← 1 à n faire
pour i ← 1 à k - 1 faire
MatMin(k,i) ← min{d(xk,xj)+MatMin(j,i)|(xk,xj) U};
fin pour;
pour i ← 1 à k - 1 faire
MatMin(i,k) ←min{d(xj,xk)+MatMin(i,j)|(xj,xk) U};
fin pour;
pour i ← 1 à k - 1 faire pour j ← 1 à k - 1 faire
MatMin(i,j) ←min{MatMin(i,j),MatMin(i,k)+ MatMin(k,j)};
fin pour; fin pour;
fin pour;
Fin
Le corps de la classe AlgoDantzig
/**
* classe gérant les graphes
* @version 1.0
* @date 14/12/2016
import java.util.*; public class AlgoDantzig{
private Graphe gr; // le graphe
private float matMin[][]; // la matrice contenant les chemins optimaux entre les sommets
public AlgoDantzig(){
}
public AlgoDantzig(Graphe gr){
….
}
public void algorithm(){
….
}
public float[][] getMatriceMinimal(){
….
}
public static void main(String args[]){
….
}
}
Commentaires
Enregistrer un commentaire