dijkstra, not functional

This commit is contained in:
Clement Lacau 2024-04-05 12:38:13 +02:00
parent 7db072a9f7
commit 4bd0c74fa4

View file

@ -1,5 +1,13 @@
package org.insa.graphs.algorithm.shortestpath;
import java.util.ArrayList;
import java.util.Arrays;
import org.insa.graphs.algorithm.utils.BinaryHeap;
import org.insa.graphs.model.Arc;
import org.insa.graphs.model.Graph;
import org.insa.graphs.model.Node;
public class DijkstraAlgorithm extends ShortestPathAlgorithm {
public DijkstraAlgorithm(ShortestPathData data) {
@ -11,6 +19,58 @@ public class DijkstraAlgorithm extends ShortestPathAlgorithm {
final ShortestPathData data = getInputData();
ShortestPathSolution solution = null;
// TODO:
// Heap of "sommets"
BinaryHeap<Label> queue = new BinaryHeap<Label>(); // change to a comparable type
Graph graph = data.getGraph();
final int nbNodes = graph.size();
// Initialize array of distances.
double[] distances = new double[nbNodes];
Arrays.fill(distances, Double.POSITIVE_INFINITY);
distances[data.getOrigin().getId()] = 0;
// Notify observers about the first event (origin processed).
notifyOriginProcessed(data.getOrigin());
// Init Dijkstra
ArrayList<Label> labels = new ArrayList<Label>();
for (Node node : graph.getNodes()) {
labels.add(new Label(node));
}
// Nodes set
for (Label label : labels) {
label.marked = false;
label.setPathCost(Float.MAX_VALUE);
label.parentNode = null;
}
// Origin set
Label s = labels.get(0);
s.setPathCost(0);
queue.insert(s);
boolean trouve = false; // TODO : breaking condition
Label x;
while (!queue.isEmpty() && !trouve) {
x = queue.ExtractMin();
x.mark();
for (Arc arc : x.node.getSuccessors()) {
// TODO : Retrieve label with node
Label y;
if (!arc.getDestination().marked) {
float new_cost = x.getCost() + (float) data.getCost(arc);
if (y.getCost() > new_cost) {
y.setPathCost(new_cost);
queue.insert(y);
y.setParentNode(x.getNode());
}
}
}
}
return solution;
}