在网格中找到随机哈密顿路径的算法?
我正在寻找一种有效的算法,能够在中找到尽可能随机的哈密尔顿路径双向 N*M 网格。
有谁知道我在哪里可以找到,或者如何构建这样的算法?
我已经找到了一种有效的方法(见下图)。这里的最终结果是哈密顿循环。删除随机边将使其成为哈密顿路径。该算法很有效,但没有提供足够的随机性。这种方法将始终使路径的起点和终点彼此相邻,而我希望将它们放在随机位置。 空间填充曲线 http://img593.imageshack.us/img593/8060/sfc.png 图片取自 http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.35.3648&rep=rep1&type=pdf
I'm looking for an efficient algorithm that is able to find an as random as possible Hamiltonian path in a bidirectional N*M grid.
Does anyone know where I can find, or how to go about constructing such an algorithm?
I've already found an efficient approach (see image below). The end result here is a Hamiltonian cycle. Removing a random edge will make it a Hamiltonian path. This algorithm is efficient, but does not provide enough randomness. This approach will always have the begin and end point of the path right next to each other, while I'd like to have those in random locations.
Space-filling curve http://img593.imageshack.us/img593/8060/sfc.png
Image taken from http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.35.3648&rep=rep1&type=pdf
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
首先,pdf 文件中图像上显示的算法不是汉密尔顿路径问题的解决方案,而是迷宫生成的解决方案,因为最终路径有多个分支。
要查找迷宫生成算法,请参阅:
https://en.wikipedia.org/wiki/Maze_ Generation_algorithm
现在这是一个生成的简单算法N*M 二维网格上的哈密顿路径:
现在我们有一条哈密顿路径。
只有起点和终点不会移动。要随机化结束或开始,可以用另一种算法替换初始锯齿形:
结果可能看起来像这样
:在该算法中,起点保留在角落,但终点可以在任何地方。要随机化开始和结束,您可以应用一种算法,您可以在开始或结束时根据需要迭代任意多次。让我们开始吧:
起点已移动两个单元格。起点和终点就像棋盘上的一样,只能在相同颜色的箱子上移动。
现在你的路径是完全随机的。
这是 Python 中的整个算法。你可以在这里运行它:
http://www.compileonline.com/execute_python3_online.php
结果存储在数组中(
self.gameGrid
)记录两次(使用箭头以及节点和线)。前两条粘合边称为排列,第二条称为交集。First of all, the algorithm displayed on your image from the pdf file is not a solution to the Hamilton path problem but a solution to a maze generation as the final path has several branches.
To find algorithms for a maze generation, see:
https://en.wikipedia.org/wiki/Maze_generation_algorithm
Now here is a simple algorithm to generate a Hamiltonian path on a N*M 2D grid:
Now we have a Hamiltonian path.
Only the start and the end will not move. To randomize the end or the start, you can replace the initial zigzag by another algorithm:
The result may look like that:
With this algorithm, the start remains on a corner but the end can be anywhere. To randomize the start AND the end, you can apply an algorithm that you can iterate as many times as you want either on the start or on the end. Let's take the start:
The start has moved two cells. The start and the end are as on a checkerboard and they only can move on a case with the same color.
Now your path is completely randomized.
Here is the whole algorithm in Python. You can run it here:
http://www.compileonline.com/execute_python3_online.php
The result is stored in an array (
self.gameGrid
) that is logged twice (with arrows and with nodes and lines). The first two glued edges are called a permutation and the second ones are called an intersection.本文描述了一种方法:
Oberdorf, R.;弗格森,A.;雅各布森,JL; Kondev, J. - 长致密聚合物中的二级结构 (arXiv.org)
该方法大致如下包含以下内容:从锯齿形图案(网格上的非随机哈密顿路径)开始,并对路径重复应用变换(称为“backbite”)。 Backbite 包括从端点 A 之一添加一条边到除 A 连接的顶点之外的相邻顶点 B(从而创建循环),然后删除从 B 开始的边,该边不是刚刚添加的边,导致循环(除了刚刚添加的循环之外,总是只有一个导致循环)。
作者添加了一些条件以获得粗略的均匀性(包括对应用背咬动作的次数的估计)。详细信息见论文。
作者还凭经验证明,他们的方法生成相邻端点的概率与均匀随机哈密顿路径中的理论概率大致匹配。
这里有一个 JavaScript 算法的实现:哈密尔顿路径生成器
This paper describes a method:
Oberdorf, R.; Ferguson, A.; Jacobsen, J.L.; Kondev, J. - Secondary Structures in Long Compact Polymers (arXiv.org)
The method roughly consists of the following: start with a zig-zag pattern (a non-random Hamiltonian path on the grid) and repeatedly apply a transformation (called "backbite") to the path. A backbite consists of adding an edge from one of the endpoints A to an adjacent vertex B other than the one A is connected to (thus creating a loop), and then remove the edge that starts in B that is not the one just added and that causes a loop (there will always be only one causing a loop other than the one just added).
The authors add some conditions to obtain rough uniformity (including an estimation on how many times to apply the backbite move). Details in the paper.
The authors also prove empirically that the probability of their method generating adjacent endpoints approximately matches the theoretical probability in uniform random Hamiltonian paths.
There is an implementation of the algorithm in JavaScript here: Hamiltonian Path Generator
您可以从您提到的方法开始寻找哈密顿路径。要进一步随机化解决方案,您可以开始旋转边缘,如
You can start with the approach you mentioned to find a Hamiltonian path. To further randomize the solution you can start rotating edges as mentioned on the wiki. Doing this more often will make the solution more random. Rotating a random edge N*M times keeps the algorithm in the efficient realm, while making the found Hamiltonian path more random.
足够的随机性是非常普遍的,
你应该有一些基准,最著名的欧几里得 TSP 算法有 3/2 近似值(Christofides 算法) ,它使用 MST(就像您提到的近似 2 的算法),正如您在 wiki 当前找到的最佳 PTAS 的运行时间取决于 (n log n)^f(c,2) c> 0(在像您的样本一样的二维空间中),近似值为 (1+1/c),具有常数因子的 TSP 的最佳近似值是
3/2 - 1/500
算法(最近发现),但是都是用逻辑方式,有一些随机用法,但它不会导致将所有内容留给随机选择。如果您只想使用随机,可以使用 Random Walk,它更随机,但请参阅Markov Chain 以获得更好的性能和随机性。Enough randomness is very general,
You should have some benchmarks, most famous algorithm for eucleadian TSP has 3/2 approximation (Christofides algorithm), which uses MST (like algorithm you mentioned which is 2-approximate), and as you can see in wiki best PTAS found currently has running time depending to (n log n)^f(c,2) for c > 0 (in 2 dimentional space like your sample) with approximation of (1+1/c), and best approximation for TSP with constant factor is
3/2 - 1/500
algorithm (recently found), but all of them using logical ways, there are some random usages but it doesn't cause to leave all things to random selections. if you just want using random you can use Random Walk, It's more random but see Markove Chain for better performance and randomness.你的问题是错误的。您正在寻找欧拉路径。根据定义,哈密顿路径始终是一个完整的循环(-1 边)。
欧拉路径也不像寻找环路那样是 NP 困难的。
You Question is Wrong. You are searching for a Eulerian path. A Hamiltonian path is ALWAYS a complete cycle (-1 edge) by definition.
An Eulerian path is also not NP-hard like finding a cycle.