使用质量度量实现回溯 n 路分区算法

我在过去的考试中遇到过类似这样的问题:

设 X 是一个有序(递增)整数数组。我们想将这些整数分组为 k 个连续的子序列,即 k 路分区。我们希望每个组都最小化一个质量函数,定义为每个组元素与该组平均值之间差异的总和。这定义了,我们需要一个回溯算法,修剪非最优解分支并返回最小化总成本的 k 路分区。

但是,这就是我所困惑的:

  • 我为这个问题找到了这个漂亮的解决方案(嗯,几乎是一个完整的解决方案,我只需要完成成本函数):Recursive-backtracking algorithm for solving the partitioning problem 。但我想,回溯算法不应该检查每个解决方案的可行性吗?根据我对 Antti 回答的理解,所有 可能性都被计算出来(从具有最大大小的最后一个分区开始,然后从右到左将元素处理到其他分区)。
  • 我的另一个疑问与问题的规格有关,是不是要求回溯解决方案修剪非最佳分支与要求分支定界解决方案相同?我可以使用回溯解决方案,当发现不正确解决方案时回溯,但我认为修剪非最优太多了。

也就是说,我对 Antti ideia 的 Python 实现是这样的:

def get_best_partition(k_partition_index: int,k: int,values,partitions,best_partition,partitions_errors):
    if (k == len(partitions)):
        error = get_total_heterogeneity(values,partitions)
        partitions_errors.append(error)
        if error <= min(partitions_errors):
            partition_index = 0
            for partition in partitions:
                best_partition[partition_index] = partition
                partition_index += 1
        return
    
    for i in range(k_partition_index,len(values)):
        partitions[k] = i
        get_best_partition(i + 1,k + 1,partitions_errors)

它确实有效(至少它甚至对某些边界条件也有效),但我不确定为什么这是回溯,对我来说它看起来确实是详尽的搜索。我想就是这样。

非常感谢,社区。​​p>

zqnj2004 回答:使用质量度量实现回溯 n 路分区算法

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/641021.html

大家都在问