【问题标题】:Finding minimum cost in a binary matrix在二进制矩阵中找到最小成本
【发布时间】:2013-06-24 21:07:07
【问题描述】:

考虑一个 n * n 二进制矩阵。该矩阵的每个单元格最多有 4 个邻居(如果存在)。如果它们是邻居并且它们的值不相等,我们称该矩阵的两个单元格不兼容。我们为每对不兼容的配对支付 $b。我们也可以通过支付 $a 来更改单元格的值。

问题是找到这个矩阵的最小成本。

我已经使用回溯并找到了O(2 ^ (n * n))的算法。有人可以帮我找到更有效的算法吗?

【问题讨论】:

  • 您在寻找最佳解决方案吗?或者可以做启发式?似乎 Gentic 算法和/或爬山可以很快带来不错的结果\
  • @fordprefect 为了使问题有意义,a 需要小于 4b,因为 4b 是您可以通过更改单元格避免支付的最大成本。编辑:哎呀,忍者。哦,好吧,把这个留在这里。
  • @Jack Newton 你能提供任何二进制矩阵的图像吗?矩阵如何由 4 个邻居而不是 8 个组成?
  • 我认为他指的是顶部、左侧、右侧和底部的邻居。
  • @EAGER_STUDENT 这只是来自将邻域定义为 4 连接而不是 8 连接。 IE。邻居是向上、向下和向侧面的单元格,而不是沿对角线的单元格。见this。 (它谈到了像素,但同样的概念也适用。)

标签: algorithm graph graph-coloring


【解决方案1】:

这个想法归功于 Greig、Porteous 和 Seheult。将矩阵视为容量有向图,其顶点对应于矩阵条目和从每个顶点到其四个邻居的弧,每个顶点的容量 b。引入另外两个顶点,一个源和一个汇,以及容量弧a:从源到每个顶点具有相应的 0 条目,从每个顶点到汇具有相应的 1 条目。找到最小割;变化后值为 0 的条目是切割源端的顶点,变化后值为 1 的条目是切割汇端的顶点。

这次削减的成本正是您的目标。在容量-a 源弧中,穿过切口的弧对应于从 0 到 1 的变化。在容量-a 到汇弧中,穿过切口的弧切割对应于从 1 到 0 的变化。在容量-b 弧中,穿过切割的弧对应于存在从 0 到 1 的弧的那些实例。

【讨论】:

    【解决方案2】:

    我建议您重新制定回溯,以便使用动态编程来修剪回溯树。这是我建议设计它的逻辑:

    在决定是否要更改单元格时,您如何分配之前的单元格并不重要,重要的是累积成本,因此您可以跟踪每个单元格以及每个可能的累积成本,已经找到的最小结果是什么。这样,每当您再次找到相同的配置时,您都会保存答案。

    所以你的 dp 矩阵应该是这样的:

    dp[top_bound][n][n];
    

    在进行回溯之前,您应该:

    if(dp[acc_cost][this_i][this_j] != -1)
        return dp[acc_cost][this_i][this_j];
    
    // Perform your calculations
    // ...
    
    dp[acc_cost][this_i][this_j] = result;
    return result;
    

    这里我假设-1 是结果中的无效值,如果不是,您只需选择任何无效值并将矩阵初始化为它。由于该矩阵的大小为 n*n*top_bound,因此正确实现的 DP 应该可以解决 O(n*n*top_bound) 中的问题。

    【讨论】:

      猜你喜欢
      • 2020-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-20
      • 2016-12-05
      • 1970-01-01
      • 2018-01-21
      • 1970-01-01
      相关资源
      最近更新 更多