创建歌曲列表算法

时间:2013-01-04 01:18:07

标签: algorithm traveling-salesman knapsack-problem

我想创建一个程序,为我的乐队创建随机集合列表;但是,我不希望这些集合完全随机。有些歌曲最好开始播放,有些歌曲最好结束。有些歌曲需要更换乐器,所以我想限制开关的数量。从快速歌曲到慢速歌曲通常不是一个好主意,但从慢到快是首选。我们不能连续打180分钟,所以我想将这场演出分成三组,每组50分钟。

我可以把这些歌曲的关系想象成一个完全连接的有向图,每首歌作为一个节点,它们之间的联系是一个分数,表示一首歌会跟随前一首歌有多好,这有助于旅行推销员。但是,我不想要最短路径,我希望在50分钟内设置最好的歌曲转换(每首歌有持续时间,并且设置列表中所有歌曲的总持续时间不得超过50分钟),这听起来更像一个背包问题。

有人可以帮助我吗?我应该研究什么算法?

编辑(更多信息):

我已经想到了一个功能,可以对两首歌曲f(s,t)之间的过渡进行评分,产生0到100之间的整数值,其中100是更好的过渡。我还考虑过为节目开始(“START”),节目结束(“END”)和中断(“BREAK 1”,“BREAK 2”等)之间的节点创建节点。之前提到的功能可以获得从“开始”到另一首歌曲或歌曲到“BREAK 1”的转换,以表示打开一组或​​关闭给定特定歌曲的一组。

1 个答案:

答案 0 :(得分:3)

TSP可能不是对这个问题的非常好的描述。原因是你实际上没有找到最好的设置列表,因为你只是在寻找一些好的设置列表。

话虽如此,你的问题让我想起了很多使用粒子过滤器试图找到某些东西的位置。

调整方法有点像这样:

  1. 使用加权概率随机生成100个集合列表。手动挑选一些可能​​是有用的。
  2. 计算每个集合列表的分数,然后使用这些分数作为权重随机选择10个集合列表。
  3. 对于每个集合列表,使用加权概率随机生成10首歌曲。例如,您可以使用歌曲的分数作为权重来确定是否应该更改它(低相对分数意味着更有可能更改歌曲)。
  4. 根据需要重复第二步和第三步。
  5. 选择当前最佳,或随机选择当前的100。
  6. 我使用了一个100的例子,但你可以使用几乎任何样本大小,大概一百万左右,除非你有很多时间让它运行。请注意您选择的数量与您从所选数量中选择的数量。生成的数字的选定次数应该等于您最初开始的数字。

    编辑:

    不确定您是否熟悉加权概率,因此我应该总结一下,因为它对算法非常重要。假设您有歌曲A-C,分别为1-3。处理加权概率的一种方法是从[A,B,C](未加权)中随机选取100个元素,实际上你从[A,B,B,C,C,C]中随机选取100个元素。由于C的重量是A的3倍,因此它的可能性是3倍。

    理想情况下,如果您正在使用该方法,则应将分数保持为整数,并且它们应该相对较低(以便从中挑选元素的列表的最大长度不会太高)。如果你不介意精度损失(在这种情况下可能没什么问题),你也可以规范化概率并使用它来创建一个更容易预测的列表。这可以通过对权重求和,然后将每个除以总和,然后将所有结果乘以一个数来完成。因此,例如,如果您的权重为[1000,10000,100000]而不是1-3,则将每个除以总和(111000)得到大约[0.009,0.090,0.901],其乘以100(这给出了列表大小)约为100)并舍入到最接近的整数给出:[1,9,90]因此,您随机选择元素的列表应该包含1 A,9 B和90 C。有可能只选择A进行重新采样(步骤3),但这种情况不太可能发生,尽管如果发生这种情况会有问题。在这种情况下,您可能需要重新运行该程序。有一些方法可以解决这个问题,但你最终会失去很多算法的随机性。

    哦,加上3)更改歌曲时,计算可以取代该歌曲的每首歌曲的分数。删除所有重量较轻或可能低于其重量*的部分*的歌曲,然后将分数用作重量并随机选择将替换它的新歌曲(如果分数相当高,则可能实际上是同一首歌曲)

    *这是可选的,但如果您认为可能有用,可能并不是一个坏主意,因为您可以将其设置为低于0.0 *的权重。