Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#图遍历-任意两个节点之间的跟踪路径_C#_Graph Theory_Traversal_Depth First Search_Breadth First Search - Fatal编程技术网

C#图遍历-任意两个节点之间的跟踪路径

C#图遍历-任意两个节点之间的跟踪路径,c#,graph-theory,traversal,depth-first-search,breadth-first-search,C#,Graph Theory,Traversal,Depth First Search,Breadth First Search,正在寻找一种跟踪两个节点之间的宽度优先遍历的好方法,而不了解任何图形。与深度优先(如果路径无法平移,您可以丢弃路径)相比,在遍历过程中,您可能有很多“开放”的可能性。最简单的方法是构建一棵树,将源节点作为根节点,将其所有连接作为子节点。根据您拥有的空间大小,您可能需要在运行时消除循环。您可以使用位图实现这一点,其中每个位对应于图形中的一个不同节点。当您到达目标节点时,您可以沿着父链接返回到根节点,这就是您的路径。由于您选择的是广度优先,因此即使不消除循环,也可以确定这是一条最短路径。对于广度优先

正在寻找一种跟踪两个节点之间的宽度优先遍历的好方法,而不了解任何图形。与深度优先(如果路径无法平移,您可以丢弃路径)相比,在遍历过程中,您可能有很多“开放”的可能性。

最简单的方法是构建一棵树,将源节点作为根节点,将其所有连接作为子节点。根据您拥有的空间大小,您可能需要在运行时消除循环。您可以使用位图实现这一点,其中每个位对应于图形中的一个不同节点。当您到达目标节点时,您可以沿着父链接返回到根节点,这就是您的路径。由于您选择的是广度优先,因此即使不消除循环,也可以确定这是一条最短路径。

对于广度优先搜索,您需要存储至少两个内容。一个是已访问的节点集,另一个是可从访问的节点直接访问但自身未访问的节点集。然后继续将状态从后一个集合移动到前一个集合,向后一个集合添加新的可到达状态。如果需要具有从根到某些节点的路径,则还需要在上述集合中为每个节点(根除外)存储父节点

通常,访问的节点集和未访问的子节点集(即,看到的节点集)的并集存储在哈希表中。这是为了能够快速确定以前是否看到过“新”状态,如果是这种情况,则忽略它。如果您有大量的状态,您可能确实需要一个位数组(如Joseph Bui()所述),但除非您的状态可以(直接或间接)使用作为该数组的索引,您需要使用散列函数将状态映射到索引。在后一种情况下,您可能会完全忽略某些状态,因为它们被映射到与不同索引相同的索引(如图所示)另外,要获得路径,您仍然需要存储父信息,这在很大程度上否定了位数组的使用


未访问但已看到的节点集可以存储为队列。(位数组对该集没有用处,因为该数组大部分是空的,查找下一个集位的成本相对较高。)

我刚刚提交了一个同样适用于此问题的解决方案


基本上,我只保留一个列表(实际上是一个堆栈)在访问或保存解决方案之前将一个节点添加到列表中。总是在列表之后从.d/p> 中移除。如果您使用.NET 3.5,请考虑使用以防止重复的节点被扩展,这在图中有周期时发生。如果您对图的内容有任何了解,请考虑IMP。Lementan可以减少被扩展的节点数量。祝你好运,我希望这对你有用

如果你仍然是treeware的粉丝,有很多关于图形和图形搜索的优秀书籍,比如Peter Norvig和Stuart Russell的《人工智能:现代方法》

我的回复中的链接似乎有一个bug,它们是Hashset:和*搜索: