这是一个业余项目,将用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最后,每个司机的位置之和理想上应该与其他每个司机相同。什么是一个好的通用算法(在伪代码中)对我的问题,当驱动程序的数目和种族的数目可以改变?有什么算法可以看吗?
发布于 2017-03-30 08:00:45
我在github上找到了一个工作良好的PHP脚本,为我解决了这个问题。所以如果有人对我的问题有兴趣的话:https://github.com/FriendlyBaron/GridCreator
发布于 2016-11-15 21:59:11
我首先要说的是:
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车手(例如)。
另一种方法是为每个驱动程序确定您想要的分数,然后向后工作以生成网格。使用加权队列--给予得分最低的驱动程序最高优先级--并且在填充网格时,只需抓取得分最低的驱动程序,将其置于当前最高位置。这有点像垃圾箱的包装问题,但应该工作得相当好。
https://stackoverflow.com/questions/40620218
复制相似问题