我正在为虚拟城市商务游戏(Urbien.com)开发锦标赛模型,并希望得到一些算法建议。这是场景和当前的“基本”实现:
方案
需要解决的问题
当前解决方案
:
N =锦标赛中的参赛总数
D =所有玩家到目前为止在锦标赛中进行的决斗总数
Dx =到目前为止玩家x已经有多少决斗
要选择玩家x和y进行决斗,我们首先选择玩家x的概率:
p(x)=(1 - (Dx / D))/ N
然后按以下方式选择玩家: 按评分对玩家排序 让在排序列表中在索引jIdx处选择玩家j的概率为: p(j)= ...... 0,if(j == x) n * r ^ abs(jIdx - xIdx)否则
其中0 < r&lt; 1是要选择的系数,n是归一化因子。
基本上,x中任意一个方向的概率形成一个几何系列,归一化,因此它们总和为1.
关注
答案 0 :(得分:4)
而不是投入ELO和ad-hoc概率公式,您可以使用基于最大似然法的标准方法。
最大似然法是一种参数估计方法,它就像这样(例子)。每个参赛者(运动员)被分配参数s [i](1&lt; = i&lt; = N,其中N是参赛者的总数),其测量该运动员的力量或技能。你选择一个公式,将两个玩家的优势映射到第一个玩家获胜的概率。例如,
P(i, j) = 1/(1 + exp(s[j] - s[i]))
这是逻辑曲线(见http://en.wikipedia.org/wiki/Sigmoid_function)。如果您有一个显示用户之间实际结果的表格,则使用全局优化(例如梯度下降)来查找最大化概率的强度参数s [1] .. s [N]实际观察到的匹配结果例如。如果你有三个参赛者并且观察到两个结果:
然后你找到最大化产品价值的参数s [1],s [2],s [3]
P(1, 2) * P(2, 3)
顺便说一句,最大化
可能更容易 log P(1, 2) + log P(2, 3)
请注意,如果您使用物流曲线之类的东西,那么重要的只是强度参数的差异,因此您需要将值锚定在某处,例如任意选择
s[1] = 0
为了获得更多最近的比赛&#34;称重&#34;更多,您可以根据年龄调整匹配结果的重要性。如果t测量自匹配发生以来的时间(在某些时间单位),您可以最大化总和的值(使用示例)
e^-t log P(1, 2) + e^-t' log P(2, 3)
其中t和t&#39;是比赛1-2和2-3的年龄,所以那些最近发生的比赛更重。
这种方法的有趣之处在于,当强度参数具有值时,可以立即使用P(...)公式来计算任何未来匹配的赢/输概率。要匹配参赛者,您可以将P(...)值接近0.5的那些配对,然后选择那些经过时间调整的比赛数量的竞赛者(e ^ -t1 + e ^ -t2 +的总和... )对于匹配年龄t1,t2,...低。 最佳的事情是计算全球两个玩家之间的赢或输的总影响,然后更喜欢那些对评级产生最大预期影响的匹配,但是可能需要大量的计算。
您不需要一直运行最大似然估计/全局优化算法;你可以运行它,例如每天一次作为批次运行并使用第二天的结果将人们匹配在一起。时间调整的匹配质量无论如何都可以实时更新。
在算法方面,您可以根据s参数对最大似然运行后的玩家进行排序,因此很容易快速找到等强度玩家。