8 邻域中的最小点 link
Minimum point link in 8-neighborhood
这是我的问题,我有一个矩阵中的点列表,我想 link 所有这些点并最小化这个覆盖。
我在 8-neighborhood 工作,link 也一定是对的。
例如一种解法:
╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗
║ ║ * ║*2 ║ ║ ║ ║ ║ ║ ║ ║
╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣
║ 5*║ ║ ║ ║ ║ ║ ║ ║ ║ ║
╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣
║ ║ * ║ ║ ║ 3*║ ║ ║ ║ ║ ║
╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣
║ ║ * ║ ║ ║ * ║ ║ ║ ║ ║ ║
╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣
║ ║ ║ * ║ * ║ ║ * ║ ║ * ║ * ║*4 ║
╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣
║ ║ 1*║ ║ ║ ║ ║ 6*║ ║ ║ ║
╚═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╝
另一个:
╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗
║ ║ ║*2 ║ ║ ║ ║ ║ ║ ║ ║
╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣
║ 5*║ * ║ ║ ║ ║ ║ ║ ║ ║ ║
╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣
║ ║ ║ * ║ ║ 3*║ ║ ║ ║ ║ ║
╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣
║ ║ ║ ║ * ║ ║ * ║ ║ ║ ║ ║
╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣
║ ║ ║ * ║ ║ ║ ║ * ║ * ║ * ║*4 ║
╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣
║ ║ 1*║ ║ ║ ║ ║ 6*║ ║ ║ ║
╚═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╝
所以我搜索了一种算法来找到我的点集的这个最小覆盖。
我在互联网上搜索但没有找到我需要的东西,但类似的问题如最小生成树、最小顶点覆盖...
一些想法将不胜感激
这是 Steiner tree problem 和 NP-hard。
在您的示例中,由于允许使用对角线,因此您似乎在这里得到了一个 8 邻域网格。在4邻域的情况下,有一个特殊版本叫做Rectilinear Steiner tree
(仍然是 NP-hard)。
您的问题似乎是 Steiner tree in graphs 变体的示例。
直线斯坦纳算法不是您想要的;它主要取决于可用移动的正交性。
相反,我认为您需要 Bresenham 的直线算法(正如您已经说过的那样)来连接通过添加的基本 属性 Steiner 节点找到的点:每个 Steiner 节点具有三个以 120 度角相交的边. The node is the Fermat point of a triangle with appropriately chosen vertices (such that those vertices form a minimal triangle in the Steiner tree).
在您的示例中,您的最小三角形是节点 2、3、5;费马点 A(四舍五入到格子)就在 5 的右边,如第二张图中所示。您连接的树是节点 2、3、5、A。
下一个包含新节点的"best"三角形是A, 3, 1。费马点B将与节点2在同一列,在节点3下方一行。连接的树是现在是 1、2、3、5、A、B。
扩展这个过程,你剩下的三角形将是3、B、6(加点C)和(我认为)C、6、4。然后会有少量的格子抖动来达到最终的结果(从树中删除 B 和 C)。这是你的第二个例子。请注意,原始连接 AB 和 B1 可以选择左侧一个单位的点;抖动需要让它们更接近节点 3,然后从树中移除 B。
╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗
║ ║ ║*2 ║ ║ ║ ║ ║ ║ ║ ║
╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣
║ 5*║ A*║ ║ ║ ║ ║ ║ ║ ║ ║
╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣
║ ║ ║ * ║ ║ 3*║ ║ ║ ║ ║ ║
╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣
║ ║ ║ B ║ * ║ C ║ * ║ ║ ║ ║ ║
╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣
║ ║ ║ * ║ ║ ║ ║ D*║ * ║ * ║*4 ║
╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣
║ ║ 1*║ ║ ║ ║ ║ 6*║ ║ ║ ║
╚═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╝
这是我的问题,我有一个矩阵中的点列表,我想 link 所有这些点并最小化这个覆盖。 我在 8-neighborhood 工作,link 也一定是对的。
例如一种解法:
╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗
║ ║ * ║*2 ║ ║ ║ ║ ║ ║ ║ ║
╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣
║ 5*║ ║ ║ ║ ║ ║ ║ ║ ║ ║
╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣
║ ║ * ║ ║ ║ 3*║ ║ ║ ║ ║ ║
╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣
║ ║ * ║ ║ ║ * ║ ║ ║ ║ ║ ║
╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣
║ ║ ║ * ║ * ║ ║ * ║ ║ * ║ * ║*4 ║
╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣
║ ║ 1*║ ║ ║ ║ ║ 6*║ ║ ║ ║
╚═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╝
另一个:
╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗
║ ║ ║*2 ║ ║ ║ ║ ║ ║ ║ ║
╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣
║ 5*║ * ║ ║ ║ ║ ║ ║ ║ ║ ║
╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣
║ ║ ║ * ║ ║ 3*║ ║ ║ ║ ║ ║
╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣
║ ║ ║ ║ * ║ ║ * ║ ║ ║ ║ ║
╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣
║ ║ ║ * ║ ║ ║ ║ * ║ * ║ * ║*4 ║
╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣
║ ║ 1*║ ║ ║ ║ ║ 6*║ ║ ║ ║
╚═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╝
所以我搜索了一种算法来找到我的点集的这个最小覆盖。 我在互联网上搜索但没有找到我需要的东西,但类似的问题如最小生成树、最小顶点覆盖...
一些想法将不胜感激
这是 Steiner tree problem 和 NP-hard。
在您的示例中,由于允许使用对角线,因此您似乎在这里得到了一个 8 邻域网格。在4邻域的情况下,有一个特殊版本叫做Rectilinear Steiner tree (仍然是 NP-hard)。
您的问题似乎是 Steiner tree in graphs 变体的示例。
直线斯坦纳算法不是您想要的;它主要取决于可用移动的正交性。
相反,我认为您需要 Bresenham 的直线算法(正如您已经说过的那样)来连接通过添加的基本 属性 Steiner 节点找到的点:每个 Steiner 节点具有三个以 120 度角相交的边. The node is the Fermat point of a triangle with appropriately chosen vertices (such that those vertices form a minimal triangle in the Steiner tree).
在您的示例中,您的最小三角形是节点 2、3、5;费马点 A(四舍五入到格子)就在 5 的右边,如第二张图中所示。您连接的树是节点 2、3、5、A。
下一个包含新节点的"best"三角形是A, 3, 1。费马点B将与节点2在同一列,在节点3下方一行。连接的树是现在是 1、2、3、5、A、B。
扩展这个过程,你剩下的三角形将是3、B、6(加点C)和(我认为)C、6、4。然后会有少量的格子抖动来达到最终的结果(从树中删除 B 和 C)。这是你的第二个例子。请注意,原始连接 AB 和 B1 可以选择左侧一个单位的点;抖动需要让它们更接近节点 3,然后从树中移除 B。
╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗
║ ║ ║*2 ║ ║ ║ ║ ║ ║ ║ ║
╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣
║ 5*║ A*║ ║ ║ ║ ║ ║ ║ ║ ║
╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣
║ ║ ║ * ║ ║ 3*║ ║ ║ ║ ║ ║
╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣
║ ║ ║ B ║ * ║ C ║ * ║ ║ ║ ║ ║
╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣
║ ║ ║ * ║ ║ ║ ║ D*║ * ║ * ║*4 ║
╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣
║ ║ 1*║ ║ ║ ║ ║ 6*║ ║ ║ ║
╚═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╝