用于重新排列权重序列的算法

时间:2011-03-29 09:18:36

标签: algorithm sequence

我有一些数组中的项目,每个项目都与一定的权重相关联。有一条商业规则规定,没有两个相邻的商品的总重量不能超过某个值,简单来说就是100。

例如,以下是可以的:

[40,60,40,50]

但不是这个(因为50 + 60 = 110)

[50,60,40] 

我正在尝试实施一种算法,该算法将重新排列项目(如果可能),以便完成业务规则。例如,第二个可以重新排列为   [60,40,50]或[50,40,60]

该算法还应该使用最小化移动项目的数量,即上面的第一个解决方案是最合适的,因为维持了“子置换”[60,40]

我不是在寻找完整的答案或代码示例,但如果有人可以为此目的指出一些算法或算法类别,我们会很高兴。依靠现有的和经过验证的算法比一些自制的东西要好得多。

注意:实际上,项目数量非常大,因此测试所有不同的排列不是一种选择。

4 个答案:

答案 0 :(得分:6)

漂亮的贪心解决方案:首先取最大数量。对于每个下一个地方,在满足您的条件之前从最大数字中取出最大值。如果您放置所有数字 - 您已找到解决方案。否则解决方案不存在,为什么 - 这对你来说是一个练习。

我的证明:想象一个解决方案存在。显示,我的算法会找到它。让我们a_1,...,a_n - 任何解决方案。设a_i - 最大元素。那么a_i,a_ {i-1},...,a_1,a_ {i + 1},a_ {i + 2},...,a_n也是一个解决方案,因为a_1< = a_i,a_1 + a_ {i + 1}< = a_i + a_ {i + 1},所以(a_i,a_ {i + 1})是一对好的。接下来,根据我的解决方案,让a_1,...,a_j是元素。显示,a_ {j + 1}可以是元素,正如我的解决方案所假设的那样。设a_i - 来自a_ {j + 1},..,a_n的最大值。然后a_1,...,a_j,a_i,a_ {i-1},...,a {j + 1},a_ {i + 1},...,a_n也是一个解决方案。它表明algo总能找到解决方案。

答案 1 :(得分:4)

大件商品只能放在小商品旁边。

  1. 对列表进行排序
  2. 切成两半
  3. 反向下半场
  4. 交换一半
  5. 随机播放(从每一半中取出第一项,重复)
  6. 示例:[1,3,8,4,2,4,1,7]

    1. [1,1,2,3,4,4,7,8]
    2. [1,1,2,3] [4,4,7,8]
    3. [1,1,2,3] [8,7,4,4]
    4. [8,7,4,4] [1,1,2,3]
    5. [8,1,7,1,4,2,4,3]
    6. 我很确定你不能比这更好。如果违反了业务规则,则无法解决问题。 Prove / Counterexample留作练习; - )

      编辑:先拿最大的项目!

答案 2 :(得分:1)

这看起来类似于装箱问题,请查看(例如)http://en.wikipedia.org/wiki/First_fit_algorithm

我很确定它不一样,但它可能会给你一些线索。

你还需要考虑如果一个sigle项目超出限制会发生什么 - 你将如何处理?

答案 3 :(得分:0)

如果您正在从数据文件中读取并发现异常(该值大于目标值),则可以选择终止程序或将其排除。同样,如果先前的解决方案失败,则可以通过切换最后一步来调整LumpN提供的解决方案。基本上向后拖曳。