是否可以使用JGrapht在有向边权图中找到负周期?我浏览过Javadocs,发现我可以使用CycleDetector
来检测周期,但不是特别的负周期。 CycleDetector找到周期,但是不知道如何以其他方式探索它们,却无法判断它们是否为负值。谢谢!使用JGrapht找到有向边权图中的负周期
1
A
回答
1
一般而言,您可以使用BellmanFordShortestPath
检查图表中的负循环,尽管不存在最短路径只会告诉您是否至少存在一个负循环。我没有正确的看看JgraphT中的BellmanFordShortestPath
实现,所以我不能为你提供代码。
除此之外,在https://cs.stackexchange.com/questions/6919/getting-negative-cycle-using-bellman-ford有一个整洁的纸张链接。 的有效链接的文件应该是:
所以,如果一切都失败了,你至少可以实现一个工作算法本身,使用像DefaultDirectedWeightedGraph
1
一个JgraphT图你可以尝试使用BellmanFordShortestPath
,但是如果您查找从一个顶点到它自己的路径,则它不会找到循环,因为每个顶点都通过权重0
隐式连接到它自己。
DefaultDirectedWeightedGraph<String, DefaultWeightedEdge> directedGraph = new DefaultDirectedWeightedGraph<>(DefaultWeightedEdge.class);
...
BellmanFordShortestPath<String, DefaultWeightedEdge> algorithm = new BellmanFordShortestPath(graph);
GraphPath<String, DefaultWeightedEdge> path = algorithm.getPath(node1, node1);
int length = path.getLength(); // returns 0
double weight = path.getWeight(); // returns 0.0
我能找到的最好的是org.jgrapht.alg.cycle
的算法,给你所有周期,那么你必须计算周期周围的路径的总重量。
private boolean hasNegativeLoop(DefaultDirectedWeightedGraph<String, DefaultWeightedEdge> graph){
SzwarcfiterLauerSimpleCycles<String, DefaultWeightedEdge> cycleDetector = new SzwarcfiterLauerSimpleCycles<>(graph);
List<List<String>> cycles = cycleDetector.findSimpleCycles();
for (List<String> cycle : cycles){
double cycleWeight = getCycleWeight(graph, cycle);
if(cycleWeight < 0) return true;
}
return false;
}
private double getCycleWeight(DefaultDirectedWeightedGraph<String, DefaultWeightedEdge> graph, List<String> cycle) {
double totalWeight = 0;
for(int i = 1; i < cycle.size(); i++){
double weight = graph.getEdgeWeight(graph.getEdge(cycle.get(i-1), cycle.get(i)));
totalWeight += weight;
}
double weightBackToStart = graph.getEdgeWeight(graph.getEdge(cycle.get(cycle.size()-1), cycle.get(0)));
return totalWeight + weightBackToStart;
}
与贝尔曼福特负循环检测相比,这样做效率更低,但可以作为实施的参考。
相关问题
- 1. 如何在定向加权图中找到最短周期?
- 2. 如何检测无向图中的周期,并在该周期中删除具有最大权重的边沿?
- 3. 查找有向图中的所有周期
- 4. 即使在具有负边权重的图中,我们是否可以使用Dijkstra's来找到最短路径?
- 5. 查找所有周期的长度的有向图<= K
- 6. 有向边的加权边图及其权重的算法
- 7. 使用DFS检测有向图中的周期?
- 8. Jgrapht边缘颜色
- 9. Matlab的有向图最短周期
- 10. 图中的负边
- 11. 含有版本的有向图的最大周期数= | V |和边缘= | E |
- 12. 如果Dijkstra算法运行在负权重周期的有向图上,会发生什么情况?
- 13. 无向图中最长的周期
- 14. 图论:无向图中有界边权的查询
- 15. 查找图表中的周期数(Python)
- 16. 如何找到不使用“禁止”边的哈密尔顿周期数?
- 17. 使用DFS检查无向图中的周期?
- 18. 如何使用FFT查找周期函数的周期?
- 19. 如何找到数据中的周期?
- 20. 在加权图中查找边缘
- 21. 在RcppRoll中使用负权
- 22. 使用宽度优先搜索在图中找到周期的伪代码
- 23. 如何在无需创建周期的情况下将边添加到有向无环图中
- 24. 查找图实现中的所有周期
- 25. 在Excel中找到日期之前的周一或周日
- 26. 在有向图中找到树的根
- 27. JGrapht:使用DirectedSubgraph.java类生成子图
- 28. 用于查找图中边缘权重的MySQL查询
- 29. 停止向视图中添加周边div的主干?
- 30. 如何找到无向图中两条边的相等性?
我已经为我参加的课程编写了一个Bellman-Ford的实现。但我想要生成一些随机图,并将我的实现结果与能够专门检测负循环的其他实现进行比较。为此,我想我可以使用其他人的Bellman-Ford实现,或者自己写一些非Bellman-Ford的替代方案。 –