Tag: dijkstra

在为TreeSet实现自定义比较器时遇到问题(Dijkstra’s)

我目前正在尝试使用Adjacency Lists实现我自己的Dijkstra定制O(N.lgN)解决方案。 现在,如果您熟悉此算法(很可能是您),我就无法存储每个Vertex的元组。 如果你不知道我在说什么,请联系: http ://qr.ae/LoESY 元组可以很容易地用C ++存储 pair . 无论如何,我找到了解决方案,并且不顾一切地知道类似的类存在它被称为’AbstractMap.SimpleEntry’类。 详情如下: https://stackoverflow.com/a/11253710/4258892 现在您已经阅读了它,它的工作方式几乎与pair 相同,并且足以将Adjacent Edge作为键存储,而Weight则作为元组中的Value存储。 声明:Map.Entry pair = new AbstractMap.SimpleEntry(1,2); 现在,我将所有输入以元组的forms存储在每个向量的ArrayList中。 我计划将输入的源的元组添加到TreeSet中,并按权重的升序排序(对吗?)。 但是,如果我只是将这些元组添加到TreeSet中,我会抛出一个错误: Exception in thread “main” java.lang.ClassCastException:java.util.AbstractMap$SimpleEntry cannot be cast to java.lang.Comparable 现在我不知道如何为TreeSet实现一个自定义比较器,它会逐步对我的值进行排序(在Dijkstra中,权重最小的边缘会先出现吗?)。 此外,如果TreeSet不可能,你能为我提供一个优先级队列,并实现比较器吗? 即使你没有关注,这是我的代码。 希望你能理解: 编辑代码根据以下答案的建议编辑 package GRAPH; import java.io.*; import java.util.*; /** * Created by Shreyans on 3/25/2015 at 7:26 PM […]

原始地理坐标与图形节点之间的最短路径

我已经实现了一个简单的Dijkstra算法,用于在Java上查找.osm地图上的最短路径。 从.osm文件创建的图形中的路径查找效果非常好。 但是,如果用户的当前位置和/或目的地不是此图的节点(只是原始坐标),我们如何将这些坐标“链接”到图形以进行寻路工作? 简单直接的解决方案“找到最接近当前位置节点并绘制直线”似乎不太现实。 如果我们遇到附图所示的情况怎么办? (UPD) 这里的问题是,在我们开始任何“智能”寻路算法(如Dijkstra’s)之前,我们将当前位置与图形“链接”,但它只是根据毕达哥拉斯定理的一个愚蠢的公式(从斜方解释定义的斜边)找到最近的节点。地理坐标和这个公式不是“路径” – 它不能考虑障碍和节点类型。 换句话说 – 如果B是图中的节点,我们如何找到A和B之间的最短路径,而A不是节点? 你有没有听说过这个问题的其他解决方案?

是否有任何双向搜索Dijkstra算法的实现?

我正在寻找Java中Dijkstra(或任何其他源到目的地最短路径算法)的双向搜索(也称为“中间相遇”算法)的实现。 由于双向搜索处理比它看起来更棘手( 图算法,第26页 ),我想在重新发明轮子之前考虑现有的实现! PS:我说的是双向搜索 ,不要与双向图混淆) 这是一个棘手的图表示例:

公交车公共交通算法

我正在开发一个可以找到公交路线的离线C#应用程序。 我可以提取时间表/公交车/路线数据。 我正在寻找可以使用基本数据的最简单的解决方案。 什么算法可用于查找从公交车站“A”到公交车站“B”的路线? 是否有针对C#/ Java的开源解决方案? 数据库的谷歌GTFS格式是否适用于简单的解决方案? http://code.google.com/transit/spec/transit_feed_specification.html 谢谢你的帮助。 我坚持这个。 我不知道从哪里开始 – 如何存储数据以及如何查找路径。 我知道Dijkstra / A *,但我只在不依赖时间的图表上使用它们…

Java:使用Fibonacci堆实现Dijkstra算法

在这里新,但作为客人已经潜伏了相当长的一段时间:) 好吧,所以我一直在尝试使用Fibonacci堆(在Java中)做Dijkstra的最短路径算法。 经过一些搜索,我设法偶然发现了两个代表Fibonacci堆的现成实现。 第一个实现相当精美,可以在这里找到。 第二个实现,似乎不那么优雅,就在这里 。 现在,这一切看起来都很好。 但是,我想在我的Dijkstra算法版本中使用其中一个实现,但我还没有运气。 Dijkstra的使用实施如下: public void dijkstra(Vertex source) { { source.minDistance = 0.; PriorityQueue vertexQueue = new PriorityQueue(); vertexQueue.add(source); while (!vertexQueue.isEmpty()) { Vertex u = vertexQueue.poll(); // Visit each edge exiting u for (Edge e : u.adjacencies) { Vertex v = e.target; double weight = e.weight; double distanceThroughU = u.minDistance […]

扭曲的最短路径

我有n个顶点和m无向加权边(重量代表分钟)。 每个顶点包含在该顶点上喝咖啡所需的分钟数。 我想确定从顶点v到顶点w所需的最短时间(分钟),但是我必须在从v到w路上的一个顶点上喝咖啡。 示例 : (顶点中的数字是喝咖啡所需的分钟数,边缘上的重量表示行进此边缘所需的分钟数) 从v到w并在途中喝咖啡,输出最小的必要时间(输出应为30)。 我目前的方法是找到Dijkstra的最短路径(总结该路径上所有边的权重),然后将该路径上具有最低咖啡时间的顶点值添加到我的结果中,以获得总量从v到w必要时间。 我的方法不起作用,这是我的方法失败的一个例子(我的方法的结果是12分钟,实际结果应该是6分钟): 如何确定从顶点v到w的最短时间,以及我需要在路径上喝咖啡的约束?

Dijkstra的算法带有’必须通过’节点

我正在尝试实现Dijkstra的算法,该算法可以找到起始节点和结束节点之间的最短路径。 在到达终端节点之前,有一些“必须通过”的中间节点(多于一个),例如2或3必须通过必须在到达终端节点之前通过的节点。 如果我有一个必须通过节点,我找到的解决方案是找到从必须传递节点到目的地的两个不同路径,并从必须传递节点到启动节点。 我没有想法如何实现这样的算法。 有什么建议么? 谢谢。 List closestPathFromOrigin = null; double maxD = Double.POSITIVE_INFINITY; double _distance = 0; int temp1 = 0; List referencePath = new ArrayList(); boolean check = false; Node startNode = null; public List recursion(ArrayList points, ArrayList intermediatePoints) { if (!check) { System.out.println(“— DATA —“); System.out.println(“Intermediate points: ” + intermediatePoints); System.out.println(“points: ” […]

在Dijkstra算法中使用哪种数据类型作为队列?

我正在尝试用Java实现Dijkstra的算法(自学)。 我使用维基百科提供的伪代码( 链接 )。 现在接近算法的末尾,我应该decrease-key v in Q; 。 我想我应该用BinaryHeap或类似的东西实现Q? 在这里使用什么是正确的(内置)数据类型? private void dijkstra(int source) { int[] dist = new int[this.adjacencyMatrix.length]; int[] previous = new int[this.adjacencyMatrix.length]; Queue q = new LinkedList(); for (int i = 0; i < this.adjacencyMatrix.length; i++) { dist[i] = this.INFINITY; previous[i] = this.UNDEFINED; q.add(i); } dist[source] = 0; while(!q.isEmpty()) { // […]