解决排列和约束问题

时间:2016-06-21 13:57:16

标签: python algorithm permutation

快速和肮脏的计划优化。一个例子:我有7种不同的歌可以练习。我有30分钟的练习时间。我可以把它打破到5分钟的窗口。所以我可以练习一首歌30分钟,或6首不同的歌曲,每首5首,或者一首25分钟,一首5分钟,等等。另外,我有一个实用功能,可以计算最佳配置。

我需要生成所有各种练习分配。之前我做过类似的事情,"算法"令人反感 - 我生成了[0,5,10,15,20,25,30] ^ 7的所有可能组合,然后扔掉了那些没有总和到30的行。

总的,愚蠢的方法,我知道。我一直试图通过数学方法确定这个问题,然后我应该能够在Python中找到一个有效的算法来解决它。唉,我无法用谷歌来形容这一点。

有人可以建议这个问题类或适当的算法来解决吗?

=====

我做了一个描述问题的糟糕工作。让我再试一次:

我有一个30分钟的窗口来练习我的音乐。 我有七首不同的歌曲可以在30分钟的窗口内练习。 对于七首歌曲中的每首歌曲,我可以练习0,5,10,......,25,30分钟,但所有歌曲的总练习时间必须为30分钟。 我有一些效用函数可以对不同的练习计划进行评分。

1 个答案:

答案 0 :(得分:0)

编辑:正如Gassa指出的那样,订单似乎并不重要。所以如果我现在理解这个问题,你需要itertools.combinations_with_replacement([1,2,3,4,5,6,7], r=6)

旧答案:

您正在寻找的是[1,2,3,4,5,6,7](您的歌曲数组)长度为6的所有排列(替换)。总共应该有7 ^ 6 = 117649。使用this answer中描述的方法:

import itertools
x = [1,2,3,4,5,6,7]
print len([p for p in itertools.product(x, repeat=6)])
# prints 117649

这为您提供了所有可能的调度 - 它们与您描述的格式不同(即您需要将“123123”转换为“10分钟的歌曲1分钟,10分钟的歌曲2分钟,10分钟的歌曲3” “),但转换很快。