224 lines
6.3 KiB
Java
224 lines
6.3 KiB
Java
package org.insa.graph;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.Collections;
|
|
import java.util.List;
|
|
|
|
/**
|
|
* Class representing a path between nodes in a graph.
|
|
*
|
|
* A path is represented as a list of {@link Arc} and not a list of {@link Node}
|
|
* due to the multigraph nature of the considered graphs.
|
|
*
|
|
*/
|
|
public class Path {
|
|
|
|
/**
|
|
* Create a new path that goes through the given list of nodes (in order),
|
|
* choosing the fastest route if multiple are available.
|
|
*
|
|
* @param graph Graph containing the nodes in the list.
|
|
* @param nodes List of nodes to build the path.
|
|
*
|
|
* @return A path that goes through the given list of nodes.
|
|
*
|
|
* @throws IllegalArgumentException If the list of nodes is not valid, i.e. two
|
|
* consecutive nodes in the list are not connected in the graph.
|
|
*
|
|
* @deprecated Need to be implement.
|
|
*/
|
|
public static Path createFastestPathFromNodes(Graph graph, List<Node> nodes)
|
|
throws IllegalArgumentException {
|
|
List<Arc> arcs = new ArrayList<Arc>();
|
|
// TODO:
|
|
return new Path(graph, arcs);
|
|
}
|
|
|
|
/**
|
|
* Create a new path that goes through the given list of nodes (in order),
|
|
* choosing the shortest route if multiple are available.
|
|
*
|
|
* @param graph Graph containing the nodes in the list.
|
|
* @param nodes List of nodes to build the path.
|
|
*
|
|
* @return A path that goes through the given list of nodes.
|
|
*
|
|
* @throws IllegalArgumentException If the list of nodes is not valid, i.e. two
|
|
* consecutive nodes in the list are not connected in the graph.
|
|
*
|
|
* @deprecated Need to be implement.
|
|
*/
|
|
public static Path createShortestPathFromNodes(Graph graph, List<Node> nodes)
|
|
throws IllegalArgumentException {
|
|
List<Arc> arcs = new ArrayList<Arc>();
|
|
// TODO:
|
|
return new Path(graph, arcs);
|
|
}
|
|
|
|
/**
|
|
* Concatenate the given paths.
|
|
*
|
|
* @param paths Array of paths to concatenate.
|
|
*
|
|
* @return Concatenated path.
|
|
*
|
|
* @throws IllegalArgumentException if the paths cannot be concatenated (IDs of
|
|
* map do not match, or the end of a path is not the beginning of the
|
|
* next).
|
|
*/
|
|
public static Path concatenate(Path... paths) throws IllegalArgumentException {
|
|
if (paths.length == 0) {
|
|
throw new IllegalArgumentException("Cannot concatenate an empty list of paths.");
|
|
}
|
|
final String mapId = paths[0].getGraph().getMapId();
|
|
for (int i = 1; i < paths.length; ++i) {
|
|
if (!paths[i].getGraph().getMapId().equals(mapId)) {
|
|
throw new IllegalArgumentException(
|
|
"Cannot concatenate paths from different graphs.");
|
|
}
|
|
}
|
|
ArrayList<Arc> arcs = new ArrayList<>();
|
|
for (Path path: paths) {
|
|
arcs.addAll(path.getArcs());
|
|
}
|
|
Path path = new Path(paths[0].getGraph(), arcs);
|
|
if (!path.isValid()) {
|
|
throw new IllegalArgumentException(
|
|
"Cannot concatenate paths that do not form a single path.");
|
|
}
|
|
return path;
|
|
}
|
|
|
|
// Graph containing this path.
|
|
private final Graph graph;
|
|
|
|
// Origin of the path
|
|
private final Node origin;
|
|
|
|
// List of arcs in this path.
|
|
private final List<Arc> arcs;
|
|
|
|
/**
|
|
* Create an empty path corresponding to the given graph.
|
|
*
|
|
* @param graph Graph containing the path.
|
|
*/
|
|
public Path(Graph graph) {
|
|
this.graph = graph;
|
|
this.origin = null;
|
|
this.arcs = new ArrayList<>();
|
|
}
|
|
|
|
/**
|
|
* Create a new path containing a single node.
|
|
*
|
|
* @param graph Graph containing the path.
|
|
* @param node Single node of the path.
|
|
*/
|
|
public Path(Graph graph, Node node) {
|
|
this.graph = graph;
|
|
this.origin = node;
|
|
this.arcs = new ArrayList<>();
|
|
}
|
|
|
|
/**
|
|
* Create a new path with the given list of arcs.
|
|
*
|
|
* @param graph Graph containing the path.
|
|
* @param arcs Arcs to construct the path.
|
|
*/
|
|
public Path(Graph graph, List<Arc> arcs) {
|
|
this.graph = graph;
|
|
this.arcs = arcs;
|
|
this.origin = arcs.size() > 0 ? arcs.get(0).getOrigin() : null;
|
|
}
|
|
|
|
/**
|
|
* @return Graph containing the path.
|
|
*/
|
|
public Graph getGraph() {
|
|
return graph;
|
|
}
|
|
|
|
/**
|
|
* @return First node of the path.
|
|
*/
|
|
public Node getOrigin() {
|
|
return origin;
|
|
}
|
|
|
|
/**
|
|
* @return Last node of the path.
|
|
*/
|
|
public Node getDestination() {
|
|
return arcs.get(arcs.size() - 1).getDestination();
|
|
}
|
|
|
|
/**
|
|
* @return List of arcs in the path.
|
|
*/
|
|
public List<Arc> getArcs() {
|
|
return Collections.unmodifiableList(arcs);
|
|
}
|
|
|
|
/**
|
|
* Check if this path is empty (it does not contain any node).
|
|
*
|
|
* @return true if this path is empty, false otherwise.
|
|
*/
|
|
public boolean isEmpty() {
|
|
return arcs.isEmpty();
|
|
}
|
|
|
|
/**
|
|
* Check if this path is valid.
|
|
*
|
|
* A path is valid if it is empty, contains a single node (without arcs) or if
|
|
* the first arc has for origin the origin of the path and, for two consecutive
|
|
* arcs, the destination of the first one is the origin of the second one.
|
|
*
|
|
* @return true if the path is valid, false otherwise.
|
|
*
|
|
* @deprecated Need to be implement.
|
|
*/
|
|
public boolean isValid() {
|
|
// TODO:
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @return Total length of the path.
|
|
*
|
|
* @deprecated Need to be implement.
|
|
*/
|
|
public float getLength() {
|
|
// TODO:
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Compute the time required to travel this path if moving at the given speed.
|
|
*
|
|
* @param speed Speed to compute the travel time.
|
|
*
|
|
* @return Time (in seconds) required to travel this path at the given speed (in
|
|
* kilometers-per-hour).
|
|
*
|
|
* @deprecated Need to be implement.
|
|
*/
|
|
public double getTravelTime(double speed) {
|
|
// TODO:
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* @return Minimum travel time of the in seconds (assuming maximum speed).
|
|
*
|
|
* @deprecated Need to be implement.
|
|
*/
|
|
public double getMinimumTravelTime() {
|
|
// TODO:
|
|
return 0;
|
|
}
|
|
|
|
}
|