问题描述
我在过去的考试中遇到过类似这样的问题:
设 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>
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)