问题:嘿,我正试图创建一个网站,通过让用户提交他们自己的作品,然后从最好到最差排列其他五个提交的作品,对某些提交的作品进行排名
我的尝试: 我已经模拟了这种情况,其中提交的是0-num提交的数字,然后我引入了一些人为错误,采用排序数组,以75%、50%、25%和12%的概率进行1、2、3或4次交换。我对算法的第一次尝试如下。我们将数组拆分为5个子数组,然后根据每个数字已排序的次数对每个子数组进行排序,并在每个子数组中选择最小的已拾取数字。然后我用模拟错误对它们进行排序,并将它们放回正确的索引中
例如,如果我将初始数组设置为(格式num:times\u been\u sorted)
[1:0,11:0,29:0,7:0,0:0,21:0,2:0,27:0,25:0,28:0,22:0,5:0,4:0,14:0,10:0,20:0]
并根据5和每个数字的历史分割选择以下指数 [0,3,6,9,12]
我的初始子数组是 [1:0,7:0,2:0,28:0,4:0]
我的排序子数组如下 [1:0,2:0,4:0,7:0,28:0]
我的新阵列是这样的 [1:1,11:0,29:0,2:1,9:0,0:0,21:0,4:1,27:0,25:0,7:1,22:0,5:0,28:1,14:0,10:0,20:0]
这完全是我自己想出来的,所以我确信还有改进的余地,或者是另一个完全可以使用的算法,但我的研究中没有。我真的很感激任何形式的指导。谢谢大家!
编辑:
我的模拟代码如下:
from random import randrange
import matplotlib.pyplot as plt
from random import randrange
import matplotlib.pyplot as plt
import random
class Submission:
def __init__(self, num):
self.num = num
self.picks = 0
def __repr__(self):
return str(self.num) + ":" + str(self.picks)
def select_idx(arr):
idxs = []
top = int(len(arr) / subarray_size)
for i in range(subarray_size):
sort = sorted(range(top * i, top * (i + 1)), key=lambda k: arr[k].picks)
idxs.append(sort[0])
return idxs
def sort_w_error(arr, err):
sort = sorted(arr, key=lambda x: x.num)
rand = random.uniform(0, 1)
if err:
if rand < 0.75:
sort = swap(sort, randrange(len(arr)), randrange(len(arr)))
if rand < 0.5:
sort = swap(sort, randrange(len(arr)), randrange(len(arr)))
if rand < 0.25:
sort = swap(sort, randrange(len(arr)), randrange(len(arr)))
if rand < 0.12:
sort = swap(sort, randrange(len(arr)), randrange(len(arr)))
return sort
n = 400
subarray_size = 5
submissions_entries = random.sample(range(n), n)
submissions = []
for submission in submissions_entries:
submissions.insert(randrange(len(submissions) + 1), Submission(submission))
if len(submissions) > subarray_size:
random_idxs = select_idx(submissions)
random_arr = []
for idx in random_idxs:
random_arr.append(submissions[idx])
sort_arr = sort_w_error(random_arr, False)
sorted_idxs = sorted(random_idxs, key=lambda x: x)
for i, idx in enumerate(sorted_idxs):
submissions[idx] = sort_arr[i]
submissions[idx].picks = submissions[idx].picks + 1
print(submissions)
for idx, submission in enumerate(submissions):
if submission.picks <= 1:
plt.plot(idx, submission.num, 'b.')
elif submission.picks <= 3:
plt.plot(idx, submission.num, 'c.')
elif submission.picks <= 5:
plt.plot(idx, submission.num, 'g.')
elif submission.picks <= 7:
plt.plot(idx, submission.num, 'r.')
else:
plt.plot(idx, submission.num, 'k.')
plt.show()
如果您仍然对使用elo系统感兴趣,我为您提供一些简单的代码:
我想这是不言自明的
相关问题 更多 >
编程相关推荐