Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 最小粗糙度换行的近似算法_Algorithm_Partitioning_Word Wrap - Fatal编程技术网

Algorithm 最小粗糙度换行的近似算法

Algorithm 最小粗糙度换行的近似算法,algorithm,partitioning,word-wrap,Algorithm,Partitioning,Word Wrap,我正在寻找一种有效的算法(理想情况下,类似C的伪代码)来为下面的分区问题提供近似的解决方案。给定一个序列S={a_i:i=1,…,n}和一个界B,确定将S划分为若干m个连续子序列,如下所示。对于每个k,设s_k是第k个子序列的元素之和。分区必须满足: 苏克≤ B对于每个k(假设B和a_i的值总是可能的) m是最小的(没有较小的分区满足#1) 在大小为m的所有分区中,分散度的某些度量(例如,s_k之间的方差或最大成对差异)是最小的 我知道,这是密切相关的。我正在寻找一种可以为n(小于15)的小值提

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

  • 苏克≤ B对于每个k(假设B和a_i的值总是可能的)
  • m是最小的(没有较小的分区满足#1)
  • 在大小为m的所有分区中,分散度的某些度量(例如,s_k之间的方差或最大成对差异)是最小的

  • 我知道,这是密切相关的。我正在寻找一种可以为n(小于15)的小值提供“足够好”的解决方案,而不需要像动态规划那样拿出沉重的弹药,但也可以找到比暴力略快的解决方案。

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


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

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


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

    我最后做了一个简单的回溯搜索。首先,我按照antti.huima的描述计算了m(这一部分非常简单,并且固定了m)。然后我贪婪地分配项目(尽可能按顺序打包每个分区)。最后,我运行了一个回溯算法,从最后一个分区开始,为每个分区边界的开始索引分配一个增量。每个delta_j表示将分区j的起点从贪婪开始位置向后移动多远。不难看出0是1(否则贪婪算法的行为会有所不同)。与填充从1到m的分区的搜索相比,这大大减少了搜索空间


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

    我最后做了一个简单的回溯搜索。首先,我按照antti.huima的描述计算了m(这一部分非常简单,并且固定了m)。然后我贪婪地分配项目(尽可能按顺序打包每个分区)。最后,我运行了一个回溯算法,从最后一个分区开始,为每个分区边界的开始索引分配一个增量。每个delta_j表示将分区j的起点从贪婪开始位置向后移动多远。不难看出0是1(否则贪婪算法的行为会有所不同)。与填充从1到m的分区的搜索相比,这大大减少了搜索空间


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

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