【发布时间】:2014-11-14 17:43:55
【问题描述】:
我需要一种算法,将不同的制造部件分成不均匀的组。主要条件是组中的最大数量与所有其他数量之间的差异应尽可能小。对于
示例:
如果我们有列表[1,3,4,11,12,19,20,21],并且我们决定将其分为 3 个部分,则应将其分为[1,3,4],[11,12],[19,20,21]。在同样的情况下,如果我们决定将其分成 4 份,我们会得到:
[1,3,4],[11],[12],[19,20,21].
为了澄清“组中最大数量与所有其他人之间的差异” - [1,3,4] = 4 - 1 + 4 - 3 + 4 - 4 = 4,[11] = 11 - 11 = 0 ,[12,19] = 19 - 12 + 19 - 19 = 7 ,[20,21] = 21 -20 + 21 - 21 = 1. 总差 = 12. 在其他可能的情况下 [1,3,4 ] = 4 - 1 + 4 - 3 + 4 - 4 = 4,[11,12,19] = 19 - 11 + 19 - 12 + 19 - 19 = 12,[20,21] = 21 - 20 + 21 - 21 = 0。总差值 = 16。这是对性能过剩的计算。这是因为较大的数字(例如代表强度)需要替换组中的最小数字(最弱)。使用超强部件会太昂贵或太重,因此需要优化。
所以首先我想把列表分成所有可能的组合,然后计算“组中最大数量与组中所有其他人之间的差异”。然后选择最小差异最小的作为最终结果。
我想知道 python 或 Spyder 或类似中是否有一些内置函数。如果我需要写代码,你能帮我吗?
我正在尝试将随机列表分成 10 个,以便在不同情况下重新应用它。 l = sorted(random.sample(range(100), 10)).
【问题讨论】:
-
您能否说明测量“组中最大数量与所有其他数量之间的差异”数量的精确公式是什么?例如,在您的“分成 4”示例中,为什么该解决方案是正确的,而不是
[1,3,4],[11],[12,19],[20,21]?而且,您如何解决问题对于给定的一组子列表长度有许多不同的解决方案。就像在分为 3 的示例中一样,您可以简单地说[1,3,4],[11,12,19],[20,21]——它们的区别是什么? -
根据最终的标准,这可能是一个非常复杂的问题。对于不适用于分析解决方案的标准,您可以采用的一种方法是使用模拟退火。但是为此,您需要一种机制来从包含整数的集合空间中随机采样,这些整数加起来就是总长度。 As discussed here,一般来说这不是一个容易的问题。
-
为了澄清“组中最大数量与所有其他人之间的差异” - [1,3,4] = 4 - 1 + 4 - 3 + 4 - 4 = 4,[11] = 11 - 11 = 0 ,[12,19] = 19 - 12 + 19 - 19 = 7 ,[20,21] = 21 -20 + 21 - 21 = 1. 总差 = 12. 在其他可能的情况下 [ 1,3,4] = 4 - 1 + 4 - 3 + 4 - 4 = 4,[11,12,19] = 19 - 11 + 19 - 12 + 19 - 19 = 12,[20,21] = 21 - 20 + 21 - 21 = 0。总差 = 16。这是对性能过剩的计算。
标签: python algorithm list optimization partitioning