Browse Source

Dijkstra beta0.2

Favary Pierre 3 years ago
parent
commit
ad0e3a294f

+ 20
- 17
be-graphes-algos/src/main/java/org/insa/graphs/algorithm/shortestpath/DijkstraAlgorithm.java View File

1
 package org.insa.graphs.algorithm.shortestpath;
1
 package org.insa.graphs.algorithm.shortestpath;
2
 
2
 
3
 import org.insa.graphs.algorithm.utils.BinaryHeap;
3
 import org.insa.graphs.algorithm.utils.BinaryHeap;
4
+import org.insa.graphs.model.Arc;
4
 
5
 
5
 public class DijkstraAlgorithm extends ShortestPathAlgorithm {
6
 public class DijkstraAlgorithm extends ShortestPathAlgorithm {
6
 	
7
 	
16
         // TODO:
17
         // TODO:
17
         
18
         
18
         //initialisation
19
         //initialisation
19
-        BinaryHeap tas=new BinaryHeap();
20
+        BinaryHeap<Integer> tas=new BinaryHeap<Integer>();
20
         Label[] tablabel=new Label[data.getGraph().size()];
21
         Label[] tablabel=new Label[data.getGraph().size()];
21
         for (int i=0;i<tablabel.length;i++) {
22
         for (int i=0;i<tablabel.length;i++) {
22
-        	tablabel[i]=new Label(data.getGraph().get(i),null,Integer.MAX_VALUE);
23
+        	tablabel[i]=new Label(data.getGraph().get(i),null,Integer.MAX_VALUE);//non marqué par défaut
23
         }
24
         }
24
         tablabel[data.getOrigin().getId()].cout=0;
25
         tablabel[data.getOrigin().getId()].cout=0;
25
         tas.insert(data.getOrigin().getId());
26
         tas.insert(data.getOrigin().getId());
26
         
27
         
27
-        boolean exnonmar=true;
28
-        int min;
28
+        boolean exnonmar=true;//existe sommets non marqués
29
+        int x;//id du node qu'on étudie
29
         //itérations
30
         //itérations
30
-        while (exnonmar) {
31
-        	min=tas.deleteMin();
32
-        	tablabel[min].marque=true;
33
-        	for (successeurs y) {
34
-        		if (!tablabel[y].marque) {
35
-        			if (tablabel[y].cout>tablabel[x].cout+(int)tablabel[y].pere.getMinimumTravelTime()) {
36
-        				tablabel[y].cout=tablabel[x].cout+(int)tablabel[y].pere.getMinimumTravelTime();
37
-        				if (exist y in tas) {
38
-        					tas.update(y);
39
-        				}else {
40
-        					tas.insert(y);
31
+        while (exnonmar){
32
+        	x=tas.deleteMin();
33
+        	tablabel[x].marque=true;
34
+        	for (Arc arcy: data.getGraph().get(x).getSuccessors()) {
35
+        		if (!tablabel[arcy.getDestination().getId()].marque) {
36
+        			if (tablabel[arcy.getDestination().getId()].cout>tablabel[x].cout+(int)arcy.getMinimumTravelTime()) {
37
+        				tablabel[arcy.getDestination().getId()].cout=tablabel[x].cout+(int)arcy.getMinimumTravelTime();
38
+        				try{
39
+        					tas.remove(arcy.getDestination().getId());
40
+        				} finally {//méthode fortement douteuse pour opérer update ou inssert selon si l'élément est déjà dans le tas ou pas
41
+        					tas.insert(arcy.getDestination().getId());
41
         				}
42
         				}
42
         			}
43
         			}
43
         		}
44
         		}
45
+        	        	
46
+        	exnonmar=false;//pas ici; comment savoir quand le changer?
47
+        	//penser à gérer le cas "aucun chemin n'existe"
44
         	}
48
         	}
45
-        	
46
-        	exnonmar=false;
47
         }
49
         }
50
+        //créer le chemin solution grâce au tas
48
         
51
         
49
         return solution;
52
         return solution;
50
     }
53
     }

Loading…
Cancel
Save