【发布时间】:2019-02-25 21:36:39
【问题描述】:
我正在尝试将一组 100 个对象分成两个子集。每个对象都有一组数字属性。
当前的目标函数是最小化每个集合的属性平均值之间的差异的平均值。换句话说,我们首先计算每个集合中每个属性的平均值,然后取集合之间每个属性的差值,最后取这些差值的平均值。
请注意,这个目标函数是几个使用过的函数之一(也是最简单的);无论目标函数如何计算,我都需要一个通用的解决方案。
我提出的解决方案相当初级:
- 使用贪心算法迭代地将新对象添加到其中一个子集
- 与上述相同,但允许回溯以在每次新分配后重新平衡子集
- 从完全种子集开始(基于随机分配),然后进行贪婪搜索以将对象从一个集合移动到另一个集合(如果它降低了目标函数)。
还有比这些更准确的方法吗?即,这将导致更紧密匹配的集合,但不会花费特别长的时间来评估?
【问题讨论】:
-
第二个子弹似乎在准确性和速度之间取得了很好的平衡。正如您正确推断的那样,第一个项目符号可能是最不准确的,而第三个项目符号在我看来是最准确的,但具有插入排序的性能特征。
-
你最后一句话的答案取决于你所说的“高效”是什么意思;你提出的方法太慢了吗?你需要多少改进?您是否分析过您的代码以了解它目前的执行情况?
-
你能解释一下“最小化属性之间的平均差吗?”。您是否希望对于每个属性,分区一侧的值之和尽可能接近另一侧?
-
您能更具体地介绍一下您的目标函数吗?您是否采用共享分区的所有属性和对的差异平均值?
-
抱歉,我已更新问题以反映我正在寻找更准确的答案(不是蛮力)。目标函数的定义也已更新。
标签: algorithm optimization partitioning bin-packing