这是一个优化的工作,一个非常复杂的一个,如果你正在寻找的最佳解决方案。幸运的是,我相信这将是足够好的事例之一。
首先要做的是建立数学质量标准,即给定列表的排列将返回一个描述该排列的好坏的数字。
一个简单的公式建议,应该给您要考虑的每个准则一个权重,对重要准则赋予较高的权重,而对于许多歌曲具有相同属性的准则,则赋予较低的权重,以使这些歌曲不占主导地位:
For each song on the list
For each other song on the list
For each criteria
If the two songs share that criteria
Add to the quality value: square root( [criteria weight]/[distance between the two songs] )
此过程产生的值越低,列表排列就越好。
进行排列
现在,您可以将此公式用于math.stackexchange,并让他们告诉您,找到除了数量不多的歌曲之外的其他任何东西的最佳解决方案是多么疯狂,甚至可能几乎是不可能的,或者您可以只花一个时钟周期并获得一个好的解决方案。
有很多方法可以做到,这是一种:
Start with a random permutation of the list.
Several million times do the following:
Select two entries at random
For each of those two entries calculate their contribution to the quality value
Swap the positions of the two entries
Calculate the contribution to the quality value of the two entries at their new position
If the sum of the calculations in the new positions is greater than the sum in the old positions
Swap back
这是一种有点浪费的算法,但是它易于实现,并且可以根据需要处理尽可能多的标准。
最佳化
可以应用不同的调整和优化的负载,以下是一些:
在质量值计算中,不要费心检查一首歌曲与列表中的其他每首歌曲,而只是针对100首左右的最近一首歌曲进行检查。对于常用值,此速度优化实际上对结果质量没有影响。
对于给定属性的稀有值,跟踪该值的现有实例可能比搜索它们更有效。
如果您认为将几乎没有实例的值的间距接近于偶数而不是相距很远很重要,则可能有必要增加这些特定值的权重,而不要增加该标准的其他值。
从列表中以均等分布挑选所有可能的对的伪随机函数,其每次挑选的效率可能比正常随机挑选的效率略高。