如何在多个集合上创建均匀分布?

时间:2016-11-15 21:43:41

标签: algorithm random

这是一个爱好项目,将使用Python实现,但这并不重要。我主要是在寻找一个好的算法。

我想主持一场有2到30名车手(num_drivers)的赛车活动。该赛事有2到12场比赛(num_races),我希望每位车手在一开始就根据他们的位置使用一些随机定位。问题是,我为每个种族分配了哪个起始位置?

示例:对于num_races=3num_drivers=4的事件(名为" A"到" D"),相当不错的设置将是

Race 1: A B C D
Race 2: C D B A
Race 3: D B A C

极点位置的值为1,第二个位置为2,依此类推。因此,此设置为每个驱动程序提供了相同的值:

A: 1+4+3 = 8
B: 2+3+2 = 7
C: 3+1+4 = 8
D: 4+2+1 = 7

最后,每个驾驶员的位置总和理想地应与每个其他驾驶员的位置相同。当驱动程序数量和种族数量变化时,我的问题会有什么好的通用算法(伪代码)?甚至已经有一个算法可以在哪里查看?

2 个答案:

答案 0 :(得分:1)

我从:

开始
Race 1: A B C D
Race 2: A B C D
Race 3: A B C D

按比赛号

旋转每一行
Race 1: A B C D 
Race 2: D A B C
Race 3: C D A B

,并提供:

A = 1 + 2 + 3  = 6
B = 2  + 3 + 4 = 8
C = 3 + 4 + 1  = 8
D = 4 + 1 + 2  = 7

这是一个不错的发行版,并且就像你要获得(我认为!)这样大小的游泳池一样好。

如果您有很多驱动程序,随机将会有效。

你总能做到这一点,找到你的低点和高点,并纠正闭环。因此,在上面的例子中,我注意到A是<< B和C,所以我可以将高C(4)与下一个高A(3)交换,并以7,8,7,7结束。

对于这个大小的一组来说是微不足道的,但是对于更大的网格可能没那么多。

如果你有4场比赛,你会得到DC(每个车手的得分为10),但我怀疑你想为64位车手进行64场比赛(例如)。

另一种方法是确定每个驱动程序所需的分数,然后向后工作以生成网格。使用加权队列 - 给予具有最低分数的驾驶员的最高优先级 - 并且在填充网格时,只需抓住具有最低分数的驾驶员以置于当前最高位置。这有点像装箱问题,但应该运作得相当好。

答案 1 :(得分:0)

我在github上找到了一个很好用的PHP脚本,为我解决了这个问题。 所以,如果有人对我的问题的答案感兴趣: https://github.com/FriendlyBaron/GridCreator