【问题标题】:Approximate algorithm for minimum raggedness word wrap最小粗糙度自动换行的近似算法
【发布时间】:2011-03-27 23:14:53
【问题描述】:

我正在寻找一种有效的算法(理想情况下,类似 C 的伪代码)来为以下分区问题提供近似解决方案。给定一个序列 S = {a_i : i=1,...,n} 和一个边界 B,将 S 划分为若干个 m 的连续子序列,如下所示。对于每个k,令s_k 为第k 个子序列的元素之和。分区必须满足:

  1. s_kB 对于每个 k(假设 B 的值而 a_i 是这样的,这总是可能的)
  2. m 是最小的(没有更小的分区满足#1);
  3. 在所有大小为 的分区中,一些分散度量(例如,s_k 之间的方差或最大成对差异)最小米

我知道这与minimum raggedness word wrap algorithm 密切相关。我正在寻找可以为 n (小于 15)的小值提供“足够好”的解决方案的东西,而无需像动态编程那样拉出沉重的弹药,但也比蛮力快一点。

【问题讨论】:

  • 所以你想要介于“最小长度”和“最小粗糙度”之间的东西?
  • 如果您的目标是最小化m 和成对差异,我认为您需要选择哪一个是优先的
  • 对于这么小的 n 值,避免暴力破解会有回报吗?
  • @Gabe - 我想是的。最小长度太不均匀,但我不需要最小粗糙度,所以我想避免复杂性。
  • 我不认为动态编程是“重弹药”...我估计用 20 行代码来实现维基百科文章中的 TeX 算法。

标签: algorithm partitioning word-wrap


【解决方案1】:

让 S 表示所有项目的总和,让 n 是项目的数量。如果您将项目放在 m 行上,则每行至少有 S/m 重量。因为 S/m ≤ B、你得到m≥ S/B。我会从作为 m 的值的上限(S/B)开始,然后将 m 增加 1 直到找到解决方案。

当设置 m 并给出 n 时,这只是递归搜索正确边界的问题。您逐行(递归地)猜测行之间的边界,并在解决方案变得不可行时回溯。如果您找到解决方案,请将其存储以供参考,因为它可能是最好的分散方式。最终你会选择最好的解决方案。如果没有解决方案,则将 m 加一并重做。

【讨论】:

    【解决方案2】:

    我最终做了一个简单的回溯搜索。首先,我按照 antti.huima 的描述计算了 m(这部分非常简单且固定 m)。然后我贪婪地分配项目(尽可能按顺序包装每个分区)。最后,我运行了一个回溯算法来为每个分区边界的起始索引分配一个增量,从最后一个分区开始。每个 delta_j 表示从贪婪起始位置向后移动分区 j 的起始位置。不难证明每个 j > 1 的 0 m 的分区的搜索相比,这大大减少了搜索空间。

    我想这种搜索的某种启发式变体是可能的并且会更有效,但我并没有很努力地找到一个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-23
      • 2012-11-13
      • 1970-01-01
      相关资源
      最近更新 更多