Algorithm 我是否应该使用迭代深化深度优先搜索(IDDFS)在有向图上迭代?

Algorithm 我是否应该使用迭代深化深度优先搜索(IDDFS)在有向图上迭代?,algorithm,graph,artificial-intelligence,neural-network,Algorithm,Graph,Artificial Intelligence,Neural Network,示例:我有20个人作为对象,每个人都知道0-n个其他人。链接的方向很重要!一个人A可能知道B,但B可能不知道A。这是一个有向图 编辑:为简化起见,我的节点对象(在本例中为Person对象)可以存储任意信息。我知道这不是最好的设计,但就目前而言,这将是好的 所以在最坏的情况下,每个人都与其他人有联系,每个人都认识其他人。 这不是真正的用例,但我想为此编写一个测试来学习和使用。在生产环境中,对象的数量将限制在20个左右,但这些对象相互连接的方式是无限的 这以简化的方式说明了问题: 给定一个特定的人

示例:我有20个人作为对象,每个人都知道0-n个其他人。链接的方向很重要!一个人A可能知道B,但B可能不知道A。这是一个有向图

编辑:为简化起见,我的节点对象(在本例中为Person对象)可以存储任意信息。我知道这不是最好的设计,但就目前而言,这将是好的

所以在最坏的情况下,每个人都与其他人有联系,每个人都认识其他人。 这不是真正的用例,但我想为此编写一个测试来学习和使用。在生产环境中,对象的数量将限制在20个左右,但这些对象相互连接的方式是无限的

这以简化的方式说明了问题:

给定一个特定的人作为起点,我希望遍历整个图,并精确地检查每一条可能的路径一次,而不会陷入无限循环

让我们想象一个人A认识B,认识C,认识A。结果可能是:

A知道B知道C知道A(好的,但我们不想在无限循环中结束,所以我们停在这里) A知道C知道A A知道T知道R知道V

这将是愚蠢的,必须消除: A知道B知道C知道A知道C知道A知道T知道R知道V

我确实有一些疯狂的想法如何解决这个问题。但是

问题)我必须通过迭代深化深度优先搜索(IDDFS)来实现吗


乔恩很好地指出了这一点

我在文章中坚持这一部分:

深度优先搜索从, 假设 所示图形选择在右前 边,并假设搜索 记住以前访问过的节点和 不会重复它们(因为这是一个 小图),将访问中的节点 顺序如下:A,B,D,F,E,C, G.本次搜索中经过的边 形成一棵Trémaux树,一个具有 图的重要应用 理论

具体而言,本说明:

(因为这是一个小图表)


好吧,如果这是一个巨大的图形呢?

您的数据结构确实是一个图形


我不想提供这样一个简单的答案,但这个问题太基本了,在维基百科上已经足够了。这两种基本方法已经解释过了,还有伪代码。

我的朋友,在过去一两天里,你已经发布了很多。我建议你花点时间读一本关于图论的入门教材,或者找一些关于这个主题的教材

然后,您将至少知道如何识别和分类标准问题。你要做的就是找到这些资源的链接——不值得任何人花时间写一篇新的论述。当你有一个特定的问题,或者在理解一个特定的问题时,请提问,我们很乐意为你提供帮助,但你需要中途与我们会面


为了回答您的问题,您可以对任意图形执行深度优先搜索和广度优先搜索,就像您以前在树上所做的那样-您只需要跟踪您访问过的节点。在您遇到的任何代码/伪代码中都要注意这一点。你不必在树上记录访问过的笔记(就像在你的其他问题中一样),因为树是一个特殊的图形实例(一个连接的非循环图形),它不能“广泛地相互连接”。

在回答你的原始问题时,它在理论上是完全可以解决的。然而,如果你在寻找最短的路径,那么这看起来可疑地像是最短的路径


无论如何,有许多不同的图遍历算法(DFS、IDDFS、BFS等)可以使用。

编辑:我应该提到作者的标题和问题已经发生了很大变化,此答案中的一些信息可能不是100%相关

正如乔恩已经提到的,这确实是一个图表。实际上是一个有向图

我建议您看看,它们将为您提供如何达成解决方案的直接见解。 我想你最初的懒惰解决方案可能类似于;这很好,但实现起来并不容易,而且可能更难遍历。两者之间有两个主要区别

邻接列表将占用更多空间,但在更大的网络中,邻接列表在最小化未连接节点上的计算方面可能会更好;然而邻接矩阵稍微友好一些,但是存储每个边的数据,不管它是否存在(连接)

使用邻接表时,我发现的主要问题不是它们的理论空间,而是在C++中,我将每个连接的节点作为指针在每个节点内的向量中存储;一旦网络变得更大,这可能会失控,而且对可视化、管理新节点和删除节点都非常不友好。 与邻接矩阵相比,邻接矩阵对所有节点都有一个引用(可以存储在单个节点向量中),并且易于修改


如果你的问题真的是关于遍历的,那么如果你的图是作为一个邻接矩阵实现的,作为一个向量向量,那么遍历是简单的。请参见下面的伪代码:

读取(每个神经元)神经元轴突连接到的所有神经元(即神经元输出)

对于(size_t i=0;i
读取神经元树突连接到的所有(每个神经元)神经元(即神经元输入)

对于(size_t i=0;ifor (size_t i = 0; i < n; ++i) { // adjacency matrix is n * n
    Neuron& neuron = nodes[i];
    for (size_t j = 0; i < n; ++i) {
        Axon_connection& connection = edges[j][i];
        if (connection.exists()) {
            ...
        }
    }
}
for (size_t i = 0; i < n; ++i) { // adjacency matrix is n * n
    Neuron& neuron = nodes[i];
    for (size_t j = 0; i < n; ++i) {
        Dendrite& dendrite = edges[j][i];
        if (dendrite.exists()) {
            ...
        }
    }
}