根据属性将输入数据分类为集合

时间:2009-05-27 20:04:23

标签: algorithm optimization

问候!

我觉得这个问题与bin打包问题有关,也可能与设置分区问题有关......我只是想在我走得太远之前把它从某人身上反弹。

我输入数据(在数据文件中)如下:

entry_one 55
entry_two 56
entry_three 61
entry_four 62
entry_five 62
entry_six 68
entry_seven 72
entry_eight 73
entry_nine 78
entry_ten 79
entry_eleven 84
entry_twelve 85
entry_thirteen 91
entry_fourteen 92
entry_fifteen 99
entry_sixteen 100
entry_seventeen 121
entry_eighteen 125
entry_nineteen 127
entry_twenty 161

有了这些数据,我希望有一个算法:将条目分组成组,使得组内的条目相关数值在X内(在我的例子中,X是16)。例如,一个安排可能是:

group one:
 entry_one
 entry_two
 entry_three
 entry_four
 entry_five
 entry_six

group two:
 entry_seven
 entry_eight
 entry_nine
 entry_ten
 entry_eleven
 entry_twelve

group three:
 entry_thirteen
 entry_fourteen
 entry_fifteen
 entry_sixteen

group four:
 entry_seventeen
 entry_eighteen
 entry_nineteen

group five:
 entry_twenty

这种特殊安排是使用一种天真的贪婪算法实现的,其中我以最低值(entry_one的55)开始,并允许55 + 16以下的所有值成为该组的一部分。然后我开始使用不在该组中的下一个条目(entry_seven的72)并允许所有低于72 + 16的值成为 组(第二组)的一部分,依此类推那个命令。

我相信虽然一个天真的贪婪算法有效,但它不太可能给我一个最佳的分组/分类,我定义了“最佳分组”,以便组的总数< / em>是最小化的(在我的情况下,这是为了作业调度,所以我希望尽可能地将工作分组,以尽量减少转换。)

人们可以建议的任何想法,模块,算法,示例代码?

谢谢!

编辑:我想我应该补充一下这与垃圾箱包装问题的区别。在装箱问题中,优化是:“给定这些固定尺寸的箱子,这些具有固定尺寸的物体,如何将这些固定尺寸的物体中的大部分填充到这些箱子中而不会溢出每个箱子。”在我的情况下,我所拥有的是无限大小但是过滤条目的箱子,因此如果一个对象“匹配”一个箱子的签名,它可以插入到所述箱子中,但是我们是什么希望是最小化我们需要创建的垃圾箱总数。

2 个答案:

答案 0 :(得分:1)

  1. 从距离中点最近的点开始
  2. 选择范围一半的所有值
  3. 使用您现有的解决方案向两个方向展开。
  4. 使用原始选择中的每个其他点重复步骤2。
  5. 选择最佳结果。

  6. 最糟糕的情况是O(n 2 )问题,因为您可以将“重复所有点”替换为第4步。

答案 1 :(得分:0)

如果我理解问题,那么贪心算法实际上是最优的。让G成为贪婪的解决方案让S成为任何解决方案。考虑G与S不同的第一组。由于G是贪心解,G的组大于S的。例如,

G : [1, 2, 3][4, 5, 6, 7][8, 9, 10][11, 12]...
S : [1, 2, 3][4, 5, 6][7, 8, 9][10, 11, 12]...

我们可以从S得到一个新的解决方案S',它与更长的前缀上的G一致而不引入新的组。只需从下一组中偷走一些物品。生成的组有效,因为一个已经在G中,另一个是有效组的子组。

S': [1, 2, 3][4, 5, 6, 7][8, 9][10, 11, 12]...

通过归纳,G实际上是最佳的。