在使用Dijkstra算法计算最段路径的时候,如果只有多条最段路径默认只能输出一条,其实只要修改一下代码就可以得到多条最段路径。
public ArrayList<ArrayList<Node>> shortPathAstar(Node src,Node des){
open.clear();
closed.clear();
open.add(src);
while(open.size() > 0){
float lowest = Float.MAX_VALUE;
int c = -1;
//找到Open列表中当前路径最小值节点
for(int i = 0; i < open.size(); i++){
Node temp = (Node) open.get(i);
if(temp.getF() < lowest){
lowest = temp.getF();
c = i;
}
}
Node current = (Node) open.remove(c);
closed.add(current);
if(current.equals(des)){
break;
}
for(int i = 0; i < current.getLinks().size(); i++){
Connector a = (Connector) current.getLinks().get(i);
Node adjacent = a.getDes();
if(!arrayListContains(closed, adjacent)){
if(!arrayListContains(open, adjacent)){//不在open表中
open.add(adjacent);
adjacent.setParenet(current);
adjacent.setF(current.getF()+a.getDistance());
}else{//在open表中
if(adjacent.getF() > current.getF()+a.getDistance()){
adjacent.setParenet(current);
adjacent.setF(current.getF()+a.getDistance());
}else if(adjacent.getF() == current.getF()+a.getDistance()){
//如果相等于把其放入到open 表中,以便能搜索多条最短路径
//主要的策略是复制一个节点,并把这个节点放入到候选的open表中作为
//又一个候选节点
Node dup = new Node(adjacent.getName());
dup.setParenet(current);
dup.setF(current.getF()+a.getDistance());
dup.setLinks(adjacent.getLinks());
open.add(dup);
}
}//end if
}//end if
}//end For
}//end while
ArrayList<ArrayList<Node>> path = new ArrayList<ArrayList<Node>>();
Node pathNode = des;
ArrayList<Node> result = new ArrayList<Node>();
while(pathNode != null){
result.add(pathNode);
pathNode = pathNode.getParenet();
}
Collections.reverse(result);
path.add(result);
//找到多条最短的路径
for(Node node:open){
ArrayList<Node> temp = new ArrayList<Node>();
if(node.equals(des)){
while(node != null){
temp.add(node);
node = node.getParenet();
}
Collections.reverse(temp);
path.add(temp);
}
}
return path;
}
分享到:
相关推荐
### 最短路径算法及其应用 #### 一、单源最短路径问题 在日常生活中,当我们需要找到两个地点之间的最短路径时,...随着技术的发展,最短路径算法的研究仍在不断深入,未来可能会出现更多高效、实用的算法和技术。
单源点最短路径问题的贪心算法有很多实际应用,例如,在交通网络中,找到从某个城市到所有其他城市的最短路径;在电信网络中,找到从某个交换机到所有其他交换机的最短路径等。 贪心算法是一种简单而有效的解决单源...
本话题将深入探讨数据结构中的最短路径算法及其C++实现。最短路径问题广泛应用于网络路由、物流配送、社交网络分析等多个领域,解决的是如何在图中找到从一个顶点到另一个顶点的最短路径。 一、Dijkstra算法 ...
蚁群算法是一种模拟生物群体行为的优化算法,它在寻找多条最短路径问题上表现优秀,尤其在解决复杂网络中的路由问题上有着广泛的应用。MATLAB作为一种强大的数学建模和计算工具,常被用于实现各种算法,包括蚁群算法...
Martin的算法基于Dijkstra的最短路径算法,但扩展了其功能以找到多条路径。Dijkstra算法是一种贪心策略,每次迭代都找到当前未访问节点中最短的路径,直到到达目标节点。然而,仅使用Dijkstra算法无法保证找到前k条...
《MapReduce实现单元最短路径算法》 MapReduce是一种分布式计算模型,常用于处理大数据集。在本文档中,我们探讨了如何利用MapReduce来解决图论中的单元最短路径问题。单元最短路径问题旨在寻找图中从一个源节点到...
总之,第K条最短路径算法通过二重扫除策略,结合推广的运算,有效地解决了在网络中寻找多条次优路径的问题。这种方法虽然比单源最短路径算法复杂,但对于需要多个备选方案的场景,它是必不可少的工具。
K-最短路径算法的核心是通过迭代的方式,每次增加一条路径直到找到k条满足条件的路径。在每一轮迭代中,算法会从当前已知的最短路径集合中选择一条路径,并尝试通过扩展这条路径来找到更短的路径。这个过程通常涉及...
### Dijkstra最短路径算法详解及其高效实现 #### 一、引言 随着信息技术与地理信息系统的迅速发展,网络分析已成为GIS(Geographic Information System,地理信息系统)领域中不可或缺的一部分。其中,最短路径...
2. 最短路径算法:实验的目标是实现一种算法,找到图中某个顶点到其他所有顶点的最短路径。常见的求解最短路径的算法有Dijkstra算法、Floyd-Warshall算法等。在实验中,可能采用了其中的一种或自定义的算法来解决这...
4. 在此过程中,每个节点记录多条次优路径,以便在需要时作为备用路径。 在智能交通系统中,基于洪泛查询的最短路径算法能够快速响应道路状况的变化,实时提供最优路径建议,有助于减少交通拥堵,提高道路通行能力...
【最短路径算法】 最短路径算法是一种在图论中寻找两点之间最短路径的数学方法,广泛应用于网络路由、交通规划、物流优化等领域。Dijkstra算法是其中一种经典算法,由荷兰计算机科学家艾兹格·迪科斯彻于1956年提出...
为了验证和展示算法的效果,实验提供的压缩包文件“多段图最短路径”可能包含了一些示例图的数据结构、代码实现或者测试用例,这些可以帮助我们更好地理解和实现多段图最短路径算法。 总结来说,多段图最短路径问题...
即如果dist[i][k] + dist[k][j] [i][j],则更新dist[i][j]为dist[i][k] + dist[k][j],其中dist矩阵记录了当前状态下所有顶点对的最短路径。 3. 重复步骤2,直到遍历过所有节点k。在遍历完所有中间节点后,dist矩阵...
Dijkstra)提出的Dijkstra算法是一种经典的单源最短路径算法,用于寻找图中两点之间的最短路径。尽管该算法已经被广泛应用,但在GIS领域,特别是当需要考虑多条最短路径时,传统的Dijkstra算法存在一定的局限性。...
### Dijkstra最短路径算法的一种高效率实现 #### 摘要 本文旨在探讨Dijkstra最短路径算法的一种高效实现方式。随着地理信息系统(GIS)技术的快速发展与广泛应用,网络分析成为了GIS研究的一个核心领域。其中,计算...
在这个"基于java的最短路径算法实现 k-shortest-paths.zip"压缩包中,很显然包含了一个用Java实现的求解最短路径问题的程序,尤其是K-Shortest Paths(K条最短路径)算法。 K-Shortest Paths算法是一种扩展了...
最短路径算法是图论中的一个经典问题,广泛应用于网络路由、交通规划、社交网络分析等领域。本压缩包提供了一种基于Brute Force(暴力枚举)方法的Java实现,适用于简单无权或有权图的最短路径计算。下面将详细介绍...
算法基于贪心策略,每次扩展当前已知最短路径中最短的一条边,逐步扩大已找到最短路径的范围。 1. **算法步骤**: - 初始化:设置源点距离为0,其余顶点距离为无穷大,创建一个空集合记录已找到最短路径的顶点。 ...
最短路径问题有很多种解决方法,常见的有Dijkstra算法、Floyd-Warshall算法、A*搜索算法等。在这个特定的情境下,由于十字网格没有权重,Dijkstra算法是一个理想的解决方案。Dijkstra算法是一种贪婪算法,它通过不断...