Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 权重序列的重新排列算法_Algorithm_Sequence - Fatal编程技术网

Algorithm 权重序列的重新排列算法

Algorithm 权重序列的重新排列算法,algorithm,sequence,Algorithm,Sequence,我在一个数组中有许多项,每个项都与某个权重相关。有一条商业规则说,没有两个相邻的项的总重量不能超过某个值,为了简单起见,我们假设为100 例如,以下是确定的: [40,60,40,50] 但不是这个(因为50+60=110) 我正在尝试实现一个算法,该算法将重新安排项目(如果可能的话),以便满足业务规则。例如,第二个可以重新排列为 [60,40,50]或[50,40,60] 算法还应尽可能减少移动项目的数量,即,上述第一种解决方案最合适,因为“子排列”[60,40]是保持不变的 我不是在寻找一

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

例如,以下是确定的:

[40,60,40,50]
但不是这个(因为50+60=110)

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

算法还应尽可能减少移动项目的数量,即,上述第一种解决方案最合适,因为“子排列”
[60,40]
是保持不变的

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


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

大项目只能在小项目旁边

  • 对列表排序
  • 一分为二
  • 下半场倒转
  • 对半
  • 洗牌(每半场取第一项,重复)
  • 示例:[1,3,8,4,2,4,1,7]

  • [1,1,2,3,4,4,7,8]
  • [1,1,2,3][4,4,7,8]
  • [1,1,2,3][8,7,4,4]
  • [8,7,4,4][1,1,2,3]
  • [8,1,7,1,4,2,4,3]
  • 我很确定你做得再好不过了。如果违反了业务规则,则没有解决方案。证明/反例留作练习;-)


    编辑:先拿最大的物品

    这看起来类似于箱子包装问题,请看(例如)

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


    你还需要考虑如果一个单项超过了极限会发生什么,你将如何处理?

    < P>贪婪的解决方案:第一,取最大数。对于下一个位置,在满足您的条件之前,从未标记的数字中取最大值。如果你把所有的数字放在一起,你就找到了解决办法。否则这个解决方案就不存在了,为什么?这是你的练习


    我的证据是:想象一个解决方案存在。显示,我的算法会找到它。让我们来讨论一下,任何解决方案。设a_i-最大元素。然后a_i,a_{i-1},…,a_1,a_{i+1},a_{i+2},…,a_n也是一个解决方案,因为a_1如果从数据文件中读取并发现异常(大于目标值的值),那么您可以选择终止程序或排除它。此外,如果以前的解决方案失败,可以通过切换最后一步来调整LumpN提供的解决方案。基本上是向后移动。

    这就是我的想法,最高值和最低值在理论上都不应该违反规则。@LumpN我很确定,当最大值为9时,这将打破1,2,7,8。该算法将给出8+2=10>9的1,8,2,7,而实际上可以用8,1,2,7来求解。这应该可以通过第二个列表中的项目首先得到8,1,7,2来解决,这也是正确的。我喜欢它!非常简单(以一种好的方式)并且易于解释。然而,对于“简单”序列(只要移动一个项目就足够了),必须有一种更好地保留原始序列的解决方案。也许我会选择一种组合,在这种组合中,您的解决方案将作为“最后的手段”…@quasiverse:通过将最大的项目放在第一位来利用列表边界的好处。@Artem您有反例吗?嘎!我讨厌人们那样做。为什么?因为我不仅要做这项工作,而且常常意味着他们也不确定@不完全是。我知道证据,但我不想花时间解释不必要的事情。我想让问题的作者自己来证明,如果他失败了,我会发布证据。证明这一事实很简单,不是吗?对不起,输入错误,可以每5分钟编辑一次评论。好吧,这就是我的证据:想象一个解决方案存在。显示,我的算法会找到它。让我们来讨论一下,任何解决方案。设a_i-最大元素。然后a_i,a_{i-1},…,a_1,a_{i+1},a_{i+2},…,a_n也是一个解决方案,因为a_1@Artem:谢谢你,伙计!我也会查这个(谢谢你的证明):)谢谢你的提示,我会查的。如果有一个项目超出了限制,那么我想没什么可做的了……但在现实生活中不应该发生。
    [50,60,40]