返回列表

21st Place Solution - neibyr

421. Rock, Paper, Scissors | rock-paper-scissors

开始: 2020-11-02 结束: 2021-02-22 游戏AI AI大模型赛
第21名解决方案 - neibyr

第21名解决方案 - neibyr

作者:Kirill Tushin
发布时间:2021年2月23日

首先,我要感谢组织者举办这次比赛,这是一场激动人心且非常有趣的比赛。同时,我也要提到那些与社区分享想法的参赛者们。

我的解决方案基于智能体的使用,每个智能体都会生成许多具有不同博弈策略的基础智能体:

  1. 在生成招数时,扮演对手或对抗对手,换句话说,是将你的招数还是对手的招数视为你的前一步招数来计算。
  2. 每个智能体生成招数的概率,同时使用 softmax 或求和归一化作为归一化方法。
  3. 利用动作概率进行生成或分布。
  4. 滞后范围——延迟生成招数。
  5. 偏移——在生成预期招数后,进行偏移。

结果,每个智能体都生成了一组按照自己策略进行博弈的子智能体。

每种技术有何帮助?

  1. 如果我们能跟上对手的节奏,并且很好地理解他的行动方式,像他一样进行博弈,那么我们就能预测他的招数。
  2. 在生成招数时,我们可以用不同的方式生成招数的概率。当使用 softmax 时,我们更有可能选择分布中值较高的招数。相反,如果对手以此方式很容易预测我们,我们可以切换到通过求和归一化输出概率的智能体。
  3. 所有带有 rps_contest 的智能体都会预测动作。此外,对于其余的机器人,我们可以选择最可能的事件,并使用此方法重新排列概率。对于此类智能体,概率生成如下:p = np.random.random(3); p[action] += 3
  4. 延迟博弈有助于预测那些代码中可能存在错误且同样进行延迟博弈的玩家,例如,在生成招数后更新当前历史记录,而不使用对手的最后一步招数。
  5. 如果你已经学会了预测对手的招数,或者对手已经学会了预测你,偏移可以帮助你做出击败对手的招数,你可以利用这一点,对你的预测进行偏移。

利用这些技术,选择了以下智能体:

  1. 马尔可夫智能体——它处理不同的键长,并使用来自每个键的预测加权总和来生成分布。同时,作为属性使用了三种类型的智能体——基于自己的招数、基于对手的招数以及基于双方玩家的招数。
  2. rps_contest 智能体,共有22个机器人。
  3. SklearnAgent——基于公共内核的特征,我们可以使用具有 sklearn 类似 API 的模型。
  4. Iocaine——公共内核。

利用所有这些智能体,元智能体——MultiArmedAgent 进行博弈

该智能体根据子智能体与对手的对战情况给每个子智能体打分。
该分数是根据过去 WINDOW 步数计算的,等于:
reward + win_streak * 5 + tie_streak * 1 + lose_streak * (-10)
因此,我们要看智能体现在的速度有多快,为当前的连胜或连平加分,或者如果它连败则罚款。
连胜被视为连续游戏结果数除以 5。

使用这种评估方法,从所有子智能体中选择 TOP-N 个子智能体,在此基础上生成动作。

附加技术

对于附加技术,我会提到随机性。
最终的智能体在特定条件下随机博弈:

  1. 如果我们在游戏开始时,为了收集关于对手的统计信息并且不透露我们的策略,我们在前 100 步随机博弈。
  2. 如果我们以较大优势获胜,我们也开始随机博弈,以便该机器人不能用于事后分析。
  3. 如果我们开始输,那么我们的策略被识破了,我们必须通过随机博弈来打乱对手当前的统计数据。
  4. 以 0.25 的概率,我们随机出任何招数,无论是否满足先前的条件。

另外,我想提到的是,当 MultiArmedAgent 本身也是一个智能体时,无法使用“堆叠”。在这种情况下,智能体博弈得更加随机,只能击败基础智能体,而与较强的对手打成平局。

就是这样,代码可以在 GitHub 上查看:
https://github.com/KirillTushin/rps_kaggle
我要再次感谢大家参与这场激动人心的比赛!

同比赛其他方案