【问题标题】:Algorithm for re-arranging a sequence of weights重新排列权重序列的算法
【发布时间】:2011-03-29 09:18:35
【问题描述】:

我在一个数组中有许多项目,每个项目都与特定的权重相关联。有一条商业规则说,没有两个相邻项目的总重量不能超过某个值,为简单起见,假设为 100。

例如,以下是可以的:

[40,60,40,50]

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

[50,60,40] 

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

该算法还应该尽量减少移动项目的数量,即上面的第一个解决方案是最合适的,因为“子排列”[60,40] 被保持。

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

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

【问题讨论】:

    标签: algorithm sequence


    【解决方案1】:

    很好的贪心解决方案:首先取最大数。对于下一个位置,在满足您的条件之前从未使用的数字中取最大值。如果您输入所有数字 - 您已经找到了解决方案。否则解决方案不存在,为什么 - 这对你来说是一个练习。

    我的证明:假设存在解决方案。显示,我的算法会找到它。让我们 a_1, ..., a_n - 任何解决方案。让 a_i - 最大元素。那么 a_i, a_{i-1}, ..., a_1, a_{i+1}, a_{i+2}, ..., a_n 也是一个解,因为 a_1

    【讨论】:

    • 啊!当人们这样做时,我讨厌它。为什么?因为不仅我必须做这项工作,而且经常,这意味着他们也不确定!
    • @quasiverse,不完全是。我知道证据,但我不想花时间解释不必要的事情。我希望问题的作者自己证明这一点,如果他失败了,我会发布证明。证明这个事实很容易,不是吗?
    • 抱歉,输入错误,可以每 5 分钟编辑 cmets 1 次。
    • 好的,这就是我的证明:想象一下存在解决方案。显示,我的算法会找到它。让我们 a_1, ..., a_n - 任何解决方案。让 a_i - 最大元素。那么 a_i, a_{i-1}, ..., a_1, a_{i+1}, a_{i+2}, ..., a_n 也是一个解,因为 a_1
    • @Artem:非常感谢!我也会检查一下(并感谢您的证明):)
    【解决方案2】:

    大物品只能放在小物品旁边。

    1. 对列表进行排序
    2. 切成两半
    3. 后半段反转
    4. 交换一半
    5. 随机播放(从每一半中取出第一项,重复)

    示例:[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]

    我很确定你不能做得比这更好。如果无论如何都违反了业务规则,则没有解决方案。证明/反例作为练习;-)

    编辑:先取最大的物品!

    【讨论】:

    • 我就是这么想的,理论上最高值和最低值不应该违反规则。
    • @LumpN 我很确定当最大值为 9 时这会中断 1,2,7,8。该算法将给出 1,8,2,7 具有 8+2=10>9虽然它实际上可以用 8,1,2,7 解决。这应该可以通过首先获取第二个列表中的项目给出 8,1,7,2 来轻松解决,这也是正确的。
    • 我喜欢!真的很简单(以一种很好的方式)并且很容易解释。但是,对于“简单”序列(移动一个项目就足够了),必须有一个解决方案以更好的方式保留原始序列。也许我会选择一个组合,你的解决方案将作为“最后的手段”......
    • @quasiverse:通过将最大的项目放在首位来利用列表边界的好处。
    • @Artem 你有反例吗?
    【解决方案3】:

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

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

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

    【讨论】:

    • 感谢您的提示,我会检查一下。如果一件物品超过了限制,我想没什么可做的……但在现实生活中应该不会发生。
    【解决方案4】:

    如果您从数据文件中读取并发现异常(一个大于目标值的值),那么您可以选择终止程序或排除它。此外,如果先前的解决方案失败,则可以通过切换最后一步来调整 LumpN 提供的解决方案。基本上是向后洗牌。

    【讨论】:

      猜你喜欢
      • 2019-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-07
      • 2013-08-08
      • 2013-02-10
      • 1970-01-01
      相关资源
      最近更新 更多