【发布时间】:2016-06-02 02:25:50
【问题描述】:
我正在尝试实现 Dijkstra 算法,以获得从一个顶点到另一个顶点的最短和最便宜的路径,而不是针对所有顶点。该图是通过使用随机权重连接的随机节点随机构建的。
但是要么我得到负成本,要么两种方法的路径,最便宜和最短,是相同的。 我试图通过使用相同的方法找到这两个结果,因为最短路径只是忽略了权重。这由一个布尔变量控制。
Dijkstra - 类:
public class Dijkstra {
private Graph graph;
private int[] distance;
private boolean[] visited;
private int[] parents;
private int startNode;
private int endNode;
public Dijkstra(Graph graph, int startNode, int endNode) {
this.graph = graph;
distance = new int[graph.getAdjList().length];
visited = new boolean[graph.getAdjList().length];
parents = new int[graph.getAdjList().length];
this.startNode = startNode;
this.endNode = endNode;
}
public void findPath(boolean isUnweighted) {
if (endNode == startNode) {
System.out.println(
"Starting node " + startNode + " and target node " + endNode + " are identical.");
return;
}
System.out.println("Starting node: " + startNode);
System.out.println("Target node: " + endNode);
int[][] adjList = graph.getAdjList();
int[][] graphForPathFinding = new int[adjList.length][adjList.length];
if (isUnweighted) {
// set all weights to 1
graphForPathFinding = convertGraphToUnweighted(graphForPathFinding);
} else
graphForPathFinding = adjList;
// initialize
for (int i = 0; i < adjList.length; i++) {
parents[i] = Integer.MAX_VALUE;
visited[i] = false;
distance[i] = Integer.MAX_VALUE;
}
distance[startNode] = 0;
for (int i = 0; i < graphForPathFinding.length; i++) {
int nextNode = getMinDistance();
if (nextNode == -1) { // no path found
System.out.println(
"No path found between " + startNode + " and " + endNode);
return;
}
visited[nextNode] = true;
parents[i] = nextNode;
if (nextNode == endNode) {
printResults();
return; // target node reached
}
int[] neighbors = graph.getNeighbors(nextNode);
for (int j = 0; j < neighbors.length; j++) {
if (!visited[j] && neighbors[j] > 0 && distance[nextNode] !=
Integer.MAX_VALUE
&& distance[nextNode] + neighbors[j] < distance[j])
distance[j] = distance[nextNode] + neighbors[j];
}
}
}
private int getMinDistance() {
int min = Integer.MAX_VALUE;
int min_index = -1;
for (int i = 0; i < graph.getAdjList().length; i++) {
if (visited[i] == false && distance[i] <= min) {
min = distance[i];
min_index = i;
}
}
return min_index;
}
private int[][] convertGraphToUnweighted(int[][] graphForConverting) {
for (int i = 0; i < graph.getAdjList().length; i++) {
for (int j = 0; j < graph.getAdjList()[i].length; j++) {
//if (graph.getAdjList()[i][j] > 0) {
graphForConverting[i][j] = 1;
// }
}
}
return graphForConverting;
}
private void printResults() {
int weight = 0;
int steps = 0;
System.out.println("Pfad: ");
for(int i = endNode; i>=0; i--){
if(parents[i] < Integer.MAX_VALUE){
System.out.print(parents[i] + " ");
steps++;
weight += graph.getAdjList()[i][parents[i]];
}
}
System.out.println();
System.out.println("Number of nodes: " + steps);
System.out.println("Weight: " + weight);
}
}
图表 - 类 getNeighbors
public int[] getNeighbors(int node){
int neighborCount = 0;
for(int i = 0; i < adjList[node].length; ++i)
if(adjList[node][i] > 0)
++neighborCount;
int[] neighbours = new int[neighborCount];
neighborCount = 0;
for(int i = 0; i < adjList[node].length; ++i)
if(adjList[node][i] > 0)
neighbours[neighborCount++] = i;
return neighbours;
}
主方法:
public static void main(String[] args) {
int startNode = rnd.nextInt(graph.getAdjList().length);
int endNode = rnd.nextInt(graph.getAdjList().length);
Dijkstra d = new Dijkstra(graph, startNode, endNode);
System.out.println("Shortest path:");
d.findPath(true); // true = unweighted, false = weighted
System.out.println();
System.out.println("Cheapest path:");
d.findPath(false);
}
【问题讨论】:
标签: java graph dijkstra path-finding adjacency-matrix