在阵列中相邻1的最小翻转次数

时间:2018-06-06 14:30:02

标签: algorithm graph-algorithm combinatorics np-hard

  

给定二进制矩阵(值为0或1),相邻的1表示“丘陵”。另外,给定一些数字k,找到您需要“翻转”为1的最小数量0,以便形成至少大小为k的小山。

编辑:为了澄清,相邻意味着左右上下社区。对角线计为相邻对象。例如,

[0 1 0 1]

是一个2号山,

[0 1 1 0]

定义了2个大小为1的山丘,

[0 1 1 1]

定义1个大小为3的小山,

[1 1 1 1]

定义了1个4号山丘。

另外,为了澄清,尺寸是由相邻的1b团形成的区域定义的。

我的初始解决方案涉及将每个现有山丘转换为图形的节点,并将成本作为到达每个其他节点的最小路径。然后,执行DFS(或类似算法)以找到最低成本。

如果选择某条路径可以降低另一条边的成本,那么就会失败,而解决这个问题的方法(我能想到的)与蛮力解决方案太接近了。

2 个答案:

答案 0 :(得分:3)

您的问题与rectilinear Steiner tree problem密切相关。

Steiner tree使用线段将一组点连接在一起,从而使线段的总长度最小。线段可以在任意位置相遇,而不必在集合中的点相遇(因此与minimum spanning tree不同)。例如,给定等边三角形角处的三个点,欧氏Steiner树通过在中间相遇来连接它们:

Euclidean Steiner tree

直线Steiner树是相同的,只是您将总Manhattan distance而不是总欧几里德距离最小化。

在您的问题中,不是将山丘与以欧几里德距离测量长度的线段连接起来,而是通过添加像素来连接山丘。连接数组中的两个单元所需翻转的总数为0,等于两个单元之间的曼哈顿距离,减去1。

直线斯坦纳树问题is known to be NP-complete,即使仅限于具有整数坐标的点。您的问题是一个概括,除了两个不同之处:

  • 测量曼哈顿距离时的“负1”部分。我怀疑这种微妙的区别是否足以将问题带入较低复杂度的类别,尽管我没有为您提供证明。
  • 整数点的坐标受矩阵大小的限制(正如Albert Hendriks在评论中指出的那样)。这确实很重要-这意味着直线Steiner树问题的pseudo-polynomial time将是您问题的多项式时间。

这意味着您的问题可能不是NP难题,这取决于直线Steiner树问题是weakly NP-complete还是strongly NP-complete。在文献中,我找不到确切的答案,除了学术文献之外,关于该问题的信息很少。据我所知,至少确实没有一种已知的伪多项式时间算法。

鉴于此,您最可能的选择是使用backtracking search来获得确切的解决方案,或者应用试探法以获得“足够好”的解决方案。一种可能的启发式方法as described by Wikipedia是计算rectilinear minimum spanning tree,然后尝试使用iterative improvement method改进RMST。 RMST本身可以在真正最佳值的1.5的恒定因子内提供解决方案。

答案 1 :(得分:0)

一座山由1的四个序列组成:

enter image description here

正确的序列由r'位'组成,向上序列具有u位,依此类推。

大小为k的小山为k= 1 + r + l + u + d(1个中心+序列),其中每个值为0 <= v < k

问题是组合。对于每个单元格,应测试满足前一种关系的{r,l,u,d}的所有可能组合。

在单元格中测试组合时,您必须计算组合中每个值中现有1的数量,它们不会“翻转”。这也将提前跳过其他一些组合。