求解置换与约束问题

2024-06-06 22:06:55 发布

您现在位置:Python中文网/ 问答频道 /正文

快速和肮脏的时间表优化。举个例子:我有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分钟。 我有一些实用功能,评分不同的可能的做法时间表。你知道吗


Tags: 方法算法音乐时间数学时间表歌曲评分
1条回答
网友
1楼 · 发布于 2024-06-06 22:06:55

编辑:正如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”转换为“歌曲1的10分钟、歌曲2的10分钟、歌曲3的10分钟”),但转换很快。你知道吗

相关问题 更多 >