【问题标题】:Partitioning set of objects对对象集进行分区
【发布时间】:2019-02-25 21:36:39
【问题描述】:

我正在尝试将一组 100 个对象分成两个子集。每个对象都有一组数字属性。

当前的目标函数是最小化每个集合的属性平均值之间的差异的平均值。换句话说,我们首先计算每个集合中每个属性的平均值,然后取集合之间每个属性的差值,最后取这些差值的平均值。

请注意,这个目标函数是几个使用过的函数之一(也是最简单的);无论目标函数如何计算,我都需要一个通用的解决方案。

我提出的解决方案相当初级:

  • 使用贪心算法迭代地将新对象添加到其中一个子集
  • 与上述相同,但允许回溯以在每次新分配后重新平衡子集
  • 从完全种子集开始(基于随机分配),然后进行贪婪搜索以将对象从一个集合移动到另一个集合(如果它降低了目标函数)。

还有比这些更准确的方法吗?即,这将导致更紧密匹配的集合,但不会花费特别长的时间来评估?

【问题讨论】:

  • 第二个子弹似乎在准确性和速度之间取得了很好的平衡。正如您正确推断的那样,第一个项目符号可能是最不准确的,而第三个项目符号在我看来是最准确的,但具有插入排序的性能特征。
  • 你最后一句话的答案取决于你所说的“高效”是什么意思;你提出的方法太慢了吗?你需要多少改进?您是否分析过您的代码以了解它目前的执行情况?
  • 你能解释一下“最小化属性之间的平均差吗?”。您是否希望对于每个属性,分区一侧的值之和尽可能接近另一侧?
  • 您能更具体地介绍一下您的目标函数吗?您是否采用共享分区的所有属性和对的差异平均值?
  • 抱歉,我已更新问题以反映我正在寻找更准确的答案(不是蛮力)。目标函数的定义也已更新。

标签: algorithm optimization partitioning bin-packing


【解决方案1】:

我不确定是否有一个可以证明更好的答案。您可以从 k-means 开始,它至少是您第二种方法的系统版本,或者基因优化作为您的第三种方法的更系统版本。无论如何,请查看一些分类算法,看看适合您的情况。

如果你想证明什么,那么最后,你的属性的维度可能是关键:

如果您只有一个数字属性,则解决方案很简单。如果你有很多属性并且分布足够均匀,那么不分区可以是“好”的。尝试使用你的度量将超立方体分成两半来感受一下。

在其他情况下,可能会通过将点投影到一维上来获得几何解决方案,并尽可能保持距离。这样做的一种方法是多维缩放(MDS)。

【讨论】:

  • 感谢您的回答,但我正在寻找一种允许我更改目标函数的解决方案。提供的是我选择的最简单的案例;有些涉及减少跨维度的 Kolmogorov-Smirnov 距离等。
【解决方案2】:

如果我正确理解了您的目标函数,您似乎可以直接计算每个对象的成本。对数据进行一次遍历以计算每个属性的平均值。
然后cost(obj) := sum( [ obj.attr[i]-mean[i] for i in len(obj.attr) ])

这将问题归结为Partition Problem,这是经过充分研究的。

您可能需要将每个值标准化为观察范围的百分比,以防止范围广泛的属性主导决策。可以在与平均值相同的过程中找到范围。

【讨论】:

  • 描述中的目标函数只是我们使用的几个之一(选择它是因为它最简单)。我需要一个适用于任何目标函数的通用解决方案。
猜你喜欢
  • 2016-07-16
  • 2018-03-17
  • 2023-02-05
  • 2019-07-08
  • 2015-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多