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


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