在有向图中查找具有给定长度的路径,允许循环和负长度

Posted

技术标签:

【中文标题】在有向图中查找具有给定长度的路径,允许循环和负长度【英文标题】:Find a path in a directed graph with a given length, allowing for loops and negative lengths 【发布时间】:2018-10-08 10:41:10 【问题描述】:

我有一个最多包含 7 个节点的有向图。每个节点都通过有向边连接到每个其他节点(当然不包括自身),并且边可以具有正权或负权。我的目标是找到从一个给定节点到另一个节点的路径,使得路径具有特定的长度。但是,有一个问题。我不仅可以使用循环,如果我到达结束节点,路径不必立即结束。这意味着我可以有一条通往结束节点的简单路径,然后从最终节点返回到自身的循环。同时,我必须最大化这条路径访问的唯一节点的数量,这样如果有多个所需长度的路径,我就会得到其中节点最多的路径。

除了循环的问题之外,我在用其他更简单的问题(例如最短路径或旅行推销员)重新表述时遇到了麻烦。我不知道如何开始解决这个问题。我的想法是找到所有简单路径和所有循环,并递归地组合每个路径,但这会带来循环内循环的问题。有没有更有效的方法来解决这个问题?

顺便说一句,我是用python写的。

编辑:我忘记提到的另一件事是节点之间的有向边对不一定具有相同的权重。所以 A -> B 的权重可能为 -1,但 B -> A 的权重可能为 9。

编辑 2: 根据要求,这是输入和输出:我得到了图形、起始节点和退出节点以及所需的长度,然后我返回所需长度的路径访问最多的节点。

【问题讨论】:

您是否需要找到一个节点到所有节点之间的路径长度,权重为负数和正数。如果是,您需要找到所有路径长度还是最长的路径长度或最短的路径长度?编辑您的问题,使其包含输入和所需的输出格式。 【参考方案1】:

听起来像是一个组合问题。因为你没有固定的结束状态。

让我们列出我们所知道的。

每个节点都连接到每个其他节点,尽管它是定向的。这是一个完整的有向图。链接:https://en.wikipedia.org/wiki/Complete_graph。 您可以在算法超出所需距离时切断算法。 但要小心无限循环;如果负权重能够等于正权重,则可能。

在此示例中,我将使用基于节点总数的最大深度的递归。虽然我不会做你的作业,但我会尝试使用伪代码启动。

def recursion(depth, graph, path, previous_node, score, results):
    // 1A. Return if max depth exceeded
    // 1B. Return if score exceeded 
    // 1C. Return if score match AND append path to results

    // 2. iterate and recurse through graph:
    for node in graph:
        path.append(node.name)
        score += node.weight
        recursion(depth, graph, path, node, score, results)

    return results

# The results should contain all the possible paths with the given score.

这就是我要开始的地方。祝你好运。

【讨论】:

我不认为我可以在超过分数时简单地切断,因为沿着一些负边缘会导致分数降低。我也可以经历一个负循环,并在我想多长时间内不断降低分数。 这是一个很好的观点。也许只包括最大深度以避免无限循环?我认为就最少循环而言,要问自己的问题是最大深度应该是多少。 既然最大循环大小等于图中的节点数,那么也许将节点数乘以某个任意常数?不过,我不希望每条路径都是最大长度。那么我将如何切断路径?也许如果我在出口节点并且当前的总重量是所需的,就返回,否则继续前进。 您可以尝试定义某种 A* 算法,根据唯一节点的数量和递归深度对搜索进行评分。例如。 Unique_nodes / 路径长度?如果低于阈值则关闭。

以上是关于在有向图中查找具有给定长度的路径,允许循环和负长度的主要内容,如果未能解决你的问题,请参考以下文章

图中具有特定长度的顶点不相交路径

有向图单源非负权值回路最短路径——BellmanFord算法

查找具有给定排名的所有固定长度子数组

从给定字符串中查找长度为 k 的所有排列/组合

有向图最短路 bfs NOIP2014 道路搜索

寻找道路