所以我扮演纽特的英雄。我有愿望做一个统计程序,显示哪一队的5名英雄和另外5名英雄获胜最多。如果有85个英雄和游戏是85个选择5比80选择5,这是很多的组合。
从本质上说,我将获取游戏服务器允许我获得的统计数据,并将其放入一个有英雄的数组中,当他们获得1,2,3,4,5W:1之后,在我从历史游戏数据中解析和构建数组之后,我可以将我想看到的5个英雄放入其中,我可以得到所有相关的游戏数据,告诉我哪些英雄阵容赢/输得最多。
我需要帮助启动一个简单的算法来写出我的数组。下面是我需要的类似的输出:(我已经将其简化为1-10,在这里,我得到的代码只需将10改为x,以确定有多少英雄)。
1,2,3,4,5
1,2,3,4,6
1,2,3,4,7
1,2,3,4,8
1,2,3,4,9
1,2,3,4,10
1,2,3,5,6
1,2,3,5,7
1,2,3,5,8
1,2,3,5,9
1,2,3,5,10
1,2,3,6,7
1,2,3,6,8
1,2,3,6,9
1,2,3,6,10
1,2,3,7,8
1,2,3,7,9
1,2,3,7,10
1,2,3,8,9
1,2,3,8,10
1,2,3,9,10
1,2,4,5,6
1,2,4,5,7
1,2,4,5,8
1,2,4,5,9
1,2,4,5,10
1,2,4,6,7
1,2,4,6,8.
1,2,4,6,9
1,2,4,6,10
1,2,4,7,8
1,2,4,7,9
1,2,4,7,10
1,2,4,8,9
1,2,4,8,10
1,2,4,9,10
..。
你知道这个主意。没有重复和秩序并不重要。从本质上说,它被切成两半并不重要,数组的顺序也不重要。只需要列出可以相互对抗的所有组合。
编辑:附加思想..。
经过很长时间的思考。我想出了一些主意。而不是写入整个数组的85*84*83*82*81可能的组合字符,这将必须使更大的引入新的英雄,以保持数组的相关性和不断更新。
相反,当从服务器读取时,解析信息并从那里构建数组。在没有找到一个元素的情况下,仅仅在数组中创建一个元素要简单得多,因为以前从未播放过这种组合。然后解析数据将是1通过,并构建您的数组,因为它符合。是的,这可能需要一段时间,但所创建的值将值得等待。随着时间的推移,也可以做到这一点。从一个小的测试案例开始,比如1000场比赛,并计算出已经进行的比赛的数量。另一个想法是从我们现在的时间点开始,然后从那里建立数据库。没有必要回到第一场比赛,根据英雄在那个时间框架内发生的变化,但是说回到2-3个月前给它一些基础和数据的可靠性,而且每一天只变得更加准确。
数组的解析和构建示例:
get match(x)
if length < 15/25, x++; //determine what length matches we want and discredit shorter than 15 for sure.
if players != 10, x++; //skip the match because it didn't finish with 10 players.
if map != normal_mm_map // rule out non mm games, and mid wars
if != mm, rule out custom games
//and so forth
match_psr = match(x).get(average_psr);
match_winner = match(x).get(winner);
//Hero ids of winners
Wh1 = match.(x).get(winner.player1(hero_id)))
Wh2 = match.(x).get(winner.player2(hero_id)))
Wh3 = match.(x).get(winner.player3(hero_id)))
Wh4 = match.(x).get(winner.player4(hero_id)))
Wh5 = match.(x).get(winner.player5(hero_id)))
//hero ids of losers
Lh1 = match.(x).get(loser.player1(hero_id)))
Lh2 = match.(x).get(loser.player2(hero_id)))
Lh3 = match.(x).get(loser.player3(hero_id)))
Lh4 = match.(x).get(loser.player4(hero_id)))
Lh5 = match.(x).get(loser.player5(hero_id)))
//some sort of sorting algorithim to put the Wh1-5 in order of hero id from smallest to largest
//some sort of sorting algorithim to put the Lh1-5 in order of hero id from smallest to largest
if(array([Wh1, Wh2, Wh3, Wh4, Wh5],[Lh1,Lh2,Lh3,Lh4,Lh5],[],[],[],[],[],[],[],[],[]) != null)
array([Wh1, Wh2, Wh3, Wh4, Wh5],[Lh1,Lh2,Lh3,Lh4,Lh5],[],[],[],[],[],[],[],[],[]) += array([],[],[1],[][][][](something with psr)[][][[])
else(array.add_element([Wh1, Wh2, Wh3, Wh4, Wh5],[Lh1,Lh2,Lh3,Lh4,Lh5],[1],[][][][](something with psr)[][][[])
有什么想法吗?
发布于 2012-08-13 15:02:32
使用一个简单的方案0. 84对游戏中的每个参与者进行编码
你可以在游戏中保持一个由85*85名演员组成的2D矩阵。
将此数组中的每个条目初始化为零。
现在只使用矩阵的上三角部分。
因此,对于任何两个玩家P1,P2,在数组中都有一个唯一的条目,比如arraysmall(p1,p2)。
数组( p1,p2)表示p1对p2赢了多少。
事件循环可以如下所示:
For each stat like H=(H1,H2,H3,H4,H5) won against L=(L1,L2,L3,L4,L5) do
For each tuple in H*L (h,l) do
if h<l
increment array[h][l] by one
else
decrement array[l][h] by one
现在,在这个循环的末尾,您有一个关于玩家相互之间的信息的聚合信息。下一步是一个有趣的优化问题。
错误的方法:在这个矩阵中选择5个字段,这样没有两个字段的行和列是相同的,并且它们的绝对值的总和是最大的。我认为对于这个问题,你可以得到很好的优化算法。这里,我们将计算五个元组(h1,l1),(h2,l2),(h3,l3) .h1对l1的胜利是最大化的,但你仍然没有看到它,l1对h2是好的。
更简单和正确的选项是在(85*84)C5元组上使用蛮力。
https://stackoverflow.com/questions/11929013
复制相似问题