Dijkstra tests
This commit is contained in:
parent
f79d9148c0
commit
7776e34f92
4 changed files with 144 additions and 0 deletions
|
@ -168,6 +168,35 @@ public class ArcInspectorFactory {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// No filter (all arcs allowed), time:
|
||||||
|
filters.add(new ArcInspector() {
|
||||||
|
@Override
|
||||||
|
public boolean isAllowed(Arc arc) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double getCost(Arc arc) {
|
||||||
|
return arc.getMinimumTravelTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getMaximumSpeed() {
|
||||||
|
return GraphStatistics.NO_MAXIMUM_SPEED;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Mode getMode() {
|
||||||
|
return Mode.TIME;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "Fastest path, all roads allowed";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// Add your own filters here (do not forget to implement toString()
|
// Add your own filters here (do not forget to implement toString()
|
||||||
// to get an understandable output!):
|
// to get an understandable output!):
|
||||||
|
|
||||||
|
|
|
@ -42,12 +42,20 @@ public class DijkstraAlgorithm extends ShortestPathAlgorithm {
|
||||||
heap.insert(labels.get(originId));
|
heap.insert(labels.get(originId));
|
||||||
notifyOriginProcessed(data.getOrigin());
|
notifyOriginProcessed(data.getOrigin());
|
||||||
|
|
||||||
|
// int iterationCounter = 0;
|
||||||
|
|
||||||
while (!heap.isEmpty()) {
|
while (!heap.isEmpty()) {
|
||||||
|
// iterationCounter++;
|
||||||
// Get the node with the minimum cost
|
// Get the node with the minimum cost
|
||||||
Label currentLabel = heap.deleteMin();
|
Label currentLabel = heap.deleteMin();
|
||||||
currentLabel.mark();
|
currentLabel.mark();
|
||||||
Node currentNode = currentLabel.getNode();
|
Node currentNode = currentLabel.getNode();
|
||||||
|
|
||||||
|
// System.out.printf("Label marked : cost = %f; %d succesors; heap valid = %b \n",
|
||||||
|
// currentLabel.getCost(),
|
||||||
|
// currentNode.getSuccessors().size(),
|
||||||
|
// ((BinaryHeap<Label>)heap).isValid());
|
||||||
|
|
||||||
for (Arc arc : currentNode.getSuccessors()) {
|
for (Arc arc : currentNode.getSuccessors()) {
|
||||||
Node dest = arc.getDestination();
|
Node dest = arc.getDestination();
|
||||||
Label destLabel = labels.get(dest.getId());
|
Label destLabel = labels.get(dest.getId());
|
||||||
|
@ -89,6 +97,9 @@ public class DijkstraAlgorithm extends ShortestPathAlgorithm {
|
||||||
currentLabel = labels.get(arc.getOrigin().getId());
|
currentLabel = labels.get(arc.getOrigin().getId());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// System.out.printf("Nombre d'arcs du plus court chemin : %d\n", path.size());
|
||||||
|
// System.out.printf("Nombre d'itérations : %d\n", iterationCounter);
|
||||||
|
|
||||||
Collections.reverse(path);
|
Collections.reverse(path);
|
||||||
|
|
||||||
return new ShortestPathSolution(data, AbstractSolution.Status.OPTIMAL, new Path(graph, path));
|
return new ShortestPathSolution(data, AbstractSolution.Status.OPTIMAL, new Path(graph, path));
|
||||||
|
|
|
@ -37,6 +37,29 @@ public class BinaryHeap<E extends Comparable<E>> implements PriorityQueue<E> {
|
||||||
this.array = new ArrayList<E>(heap.array);
|
this.array = new ArrayList<E>(heap.array);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if each element is lower than its children
|
||||||
|
* @return true if valid, false otherwise
|
||||||
|
*/
|
||||||
|
public boolean isValid() {
|
||||||
|
for (int i = 0; i <= indexParent(currentSize - 1); i++) {
|
||||||
|
E element = array.get(i);
|
||||||
|
// Check left child
|
||||||
|
if (indexLeft(i) < currentSize) {
|
||||||
|
E leftChild = array.get(indexLeft(i));
|
||||||
|
if (leftChild.compareTo(element) < 0)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// Check right child
|
||||||
|
if (indexRight(i) < currentSize) {
|
||||||
|
E rightChild = array.get(indexRight(i));
|
||||||
|
if (rightChild.compareTo(element) < 0)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set an element at the given index.
|
* Set an element at the given index.
|
||||||
*
|
*
|
||||||
|
@ -66,6 +89,13 @@ public class BinaryHeap<E extends Comparable<E>> implements PriorityQueue<E> {
|
||||||
return index * 2 + 1;
|
return index * 2 + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Index of the right child of the given index.
|
||||||
|
*/
|
||||||
|
protected int indexRight(int index) {
|
||||||
|
return (index + 1) * 2;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Internal method to percolate up in the heap.
|
* Internal method to percolate up in the heap.
|
||||||
*
|
*
|
||||||
|
|
|
@ -0,0 +1,74 @@
|
||||||
|
package org.insa.graphs.algorithm.shortestpath;
|
||||||
|
|
||||||
|
import org.insa.graphs.algorithm.ArcInspector;
|
||||||
|
import org.insa.graphs.algorithm.ArcInspectorFactory;
|
||||||
|
import org.insa.graphs.model.*;
|
||||||
|
import org.insa.graphs.model.io.BinaryGraphReader;
|
||||||
|
import org.insa.graphs.model.io.GraphReader;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
|
|
||||||
|
public class DijkstraAlgorithmTest {
|
||||||
|
|
||||||
|
String[] maps = {
|
||||||
|
"/home/yohan/Documents/etudes/be-graphes/maps/carre.mapgr",
|
||||||
|
"/home/yohan/Documents/etudes/be-graphes/maps/insa.mapgr",
|
||||||
|
"/home/yohan/Documents/etudes/be-graphes/maps/toulouse.mapgr",
|
||||||
|
};
|
||||||
|
|
||||||
|
ArcInspector[] arcInspectors = {
|
||||||
|
ArcInspectorFactory.getAllFilters().get(0),
|
||||||
|
ArcInspectorFactory.getAllFilters().get(2),
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDoRun() {
|
||||||
|
Random random = new Random();
|
||||||
|
for (String map : maps) {
|
||||||
|
try (GraphReader reader = new BinaryGraphReader(new DataInputStream(new BufferedInputStream(
|
||||||
|
new FileInputStream(map))))) {
|
||||||
|
Graph graph = reader.read();
|
||||||
|
List<Node> nodes = graph.getNodes();
|
||||||
|
|
||||||
|
Node orig;
|
||||||
|
Node dest;
|
||||||
|
|
||||||
|
// Test random paths
|
||||||
|
for (int i = 0; i < 3; i++) {
|
||||||
|
orig = nodes.get(random.nextInt(nodes.size()));
|
||||||
|
do {
|
||||||
|
dest = nodes.get(random.nextInt(nodes.size()));
|
||||||
|
} while (orig == dest);
|
||||||
|
for (ArcInspector arcInspector : arcInspectors) {
|
||||||
|
ShortestPathData data = new ShortestPathData(graph, orig, dest, arcInspector);
|
||||||
|
ShortestPathSolution sol = new DijkstraAlgorithm(data).doRun();
|
||||||
|
if (sol.isFeasible())
|
||||||
|
assertTrue(sol.getPath().isValid());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test zero-length path
|
||||||
|
orig = nodes.get(random.nextInt(nodes.size()));
|
||||||
|
dest = orig;
|
||||||
|
for (ArcInspector arcInspector : arcInspectors) {
|
||||||
|
ShortestPathData data = new ShortestPathData(graph, orig, dest, arcInspector);
|
||||||
|
ShortestPathSolution sol = new DijkstraAlgorithm(data).doRun();
|
||||||
|
if (sol.isFeasible())
|
||||||
|
assertTrue(sol.getPath().isValid());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue