8邻域中的最小点链接

时间:2017-10-23 18:59:42

标签: algorithm matrix optimization cover

这是我的问题,我有一个矩阵点的列表,我想链接所有这些点并最小化这个封面。 我在8邻居工作,链接也必须在点上。

例如,一个解决方案:

╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗
║   ║ * ║*2 ║   ║   ║   ║   ║   ║   ║   ║
╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣
║ 5*║   ║   ║   ║   ║   ║   ║   ║   ║   ║
╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣
║   ║ * ║   ║   ║ 3*║   ║   ║   ║   ║   ║
╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣
║   ║ * ║   ║   ║ * ║   ║   ║   ║   ║   ║
╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣
║   ║   ║ * ║ * ║   ║ * ║   ║ * ║ * ║*4 ║
╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣
║   ║ 1*║   ║   ║   ║   ║ 6*║   ║   ║   ║
╚═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╝

另一个:

╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗
║   ║   ║*2 ║   ║   ║   ║   ║   ║   ║   ║
╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣
║ 5*║ * ║   ║   ║   ║   ║   ║   ║   ║   ║
╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣
║   ║   ║ * ║   ║ 3*║   ║   ║   ║   ║   ║
╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣
║   ║   ║   ║ * ║   ║ * ║   ║   ║   ║   ║
╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣
║   ║   ║ * ║   ║   ║   ║ * ║ * ║ * ║*4 ║
╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣
║   ║ 1*║   ║   ║   ║   ║ 6*║   ║   ║   ║
╚═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╝

所以我搜索一个算法来找到我的一组点的最小覆盖。 我在互联网上搜索,但我找不到我需要的东西,但类似的问题,如最小生成树,最小顶点覆盖......

一些想法将不胜感激

2 个答案:

答案 0 :(得分:1)

直线Steiner算法并不是你想要的;它主要取决于可用移动的正交性。

相反,我认为你需要Bresenham的线算法(正如你已经说过的)将连接点与添加的Steiner节点的基本属性连接起来:每个Steiner节点有三条边以120度角相交。节点是三角形的Fermat点,具有适当选择的顶点(这样顶点在Steiner树中形成最小三角形)。

在您的示例中,您的最小三角形是节点2,3,5;如第二张图所示,Fermat点A(四舍五入到晶格)位于5的右侧。连接的树是节点2,3,5,A。

下一个"最佳"包含新节点的三角形是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*║   ║   ║   ║
╚═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╝

答案 1 :(得分:0)

这是Steiner tree problem和NP-hard。

在你的例子中,似乎你有一个8邻域网格,因为允许对角线。在4-neighborhood的情况下,有一个名为Rectilinear Steiner tree 的特殊版本(仍然是NP-hard)。

您的问题似乎是图表变体中Steiner树的一个示例。