我正在寻找1x1在线游戏的配对算法。玩家必须像往常一样,不是通过他们的技能或水平匹配,而是通过一些特定的过滤器匹配。每个玩家发送请求,在那里他指定一组参数(通常是2-4个参数)。如果指定了某个参数,则播放器只能与使用完全相同的值发送此参数的人匹配,或者与未指定此参数的参与者匹配。
我需要这个算法是线程安全的,最好是快速的。如果它适用于3-4甚至更多参数,那将会很棒,但我也在寻找只使用一个参数的算法(在我的情况下是游戏赌注)。另外,我很感激如何在我的服务器平台上实现或改进此算法 - ASP.NET
。
UPD
我面临的另一个问题是在用户发送请求后无法立即执行查找匹配,因为如果其他用户在匹配前发送请求之前已完成,则即使他们可能也不会匹配。所以似乎匹配发现应该如期开始,我需要帮助如何优化它以及如何选择开始新匹配的时间间隔。
答案 0 :(得分:1)
最好的方法可能是创建一个专用的匹配制作线程,然后让其他线程发送请求。
对于匹配算法,尝试一种简单的方法,在链表上有所有不匹配的请求,当有新请求进入时,如果找不到匹配则从链表的底部开始强力搜索,将请求添加到链接列表的顶部。根据语言,匹配和优化的复杂性,在完全利用的核心上,每秒可以达到大约1亿比较。尽管这种方法具有蛮力性质,但您可能永远不会接近需要这么多的比较。
最早的第一种方法应该确保任何可能与列表中的几个匹配的请求都倾向于与最难找到配对的请求匹配,并且等待时间将尽可能地低。此外,通过这种技术,可以轻松实现高级匹配规则。
答案 1 :(得分:0)
为什么不构建算法的简单第一版。然后改进。将用户的新过滤条目与每个现有用户进行比较。
对于线程安全:只需正确锁定所有内容。
如果您有数千名用户,请进行优化。
答案 2 :(得分:0)
一个可能有效的简单方法是使用SQL数据库表,每个匹配参数都有一个可选列。对于每个传入的请求,请执行"SELECT * where parm1 = input1 and parm2 = input2 ...
省略未指定的参数。如果没有匹配项,请插入一个参数设置的行。
只要序列化db访问,就不会出现线程问题。