我试图在一个可能有循环但没有自循环的有向加权图中找到权重小于N 的两个顶点之间的所有路径。到目前为止,我只能通过使用AllDirectedPaths然后过滤掉权重大于 N 的路径来做到这一点:
SimpleDirectedWeightedGraph<String, DefaultWeightedEdge> g = new SimpleDirectedWeightedGraph<>(DefaultWeightedEdge.class);
AllDirectedPaths<String, DefaultWeightedEdge> allPaths = new AllDirectedPaths<>(g);
int maxWeight = 30;
List<GraphPath<String, DefaultWeightedEdge>> pathsLimitedByWeight = allPaths.getAllPaths(startVertex, endVertex, false, maxWeight / minGraphLatency)
.filter(graphPath -> graphPath.getWeight() < maxWeight)
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
这种方法显然是次优的,因为对于较大的图形它很慢。为了限制输出并使其更快,我提供maxPathLength了AllDirectedPaths#getAllPaths,我将其设置为路径可以除以图中边的最小权重的最大权重,因为在我的情况下,边权重是一个整数并且总是大于1.
我考虑过使用KShortestSimplePathscustom PathValidator,但它只支持简单的路径,即不允许循环。
如果有的话,我在 jgrapht 中还有什么其他选项可以用来解决查找所有路径而不必自己遍历图形。