这是一个爱好项目,将使用Python实现,但这并不重要。我主要是在寻找一个好的算法。
我想主持一场有2到30名车手(num_drivers
)的赛车活动。该赛事有2到12场比赛(num_races
),我希望每位车手在一开始就根据他们的位置使用一些随机定位。问题是,我为每个种族分配了哪个起始位置?
示例:对于num_races=3
和num_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
最后,每个驾驶员的位置总和理想地应与每个其他驾驶员的位置相同。当驱动程序数量和种族数量变化时,我的问题会有什么好的通用算法(伪代码)?甚至已经有一个算法可以在哪里查看?
答案 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