CFR, Counterfactual Regret Minimization,是一个用于解决 信息不对称1 游戏中决策的经典算法。我搜索到网上相关的中文资料比较少,当然这个算法相对于现在来说可以说是有些过时。但我认为作为入门的算法还是很有帮助的。
本人也只是个初学者,如果有错误,尽请指出。
本文主要关注于实现,对于理论部分只是略微概述,详情还是推荐阅读论文原文
如算法的名字,CFR是基于遗憾的,或者是后悔。算法先做出决策,然后基于游戏结果来判断游戏中决策的效果,判断是否应该这么做。就是后悔做了什么和后悔没有做什么。
CFR是基于深度优先搜索的。训练时,它针对所得到的信息
递归遍历每一种决策,直到游戏结束,在返回的时候根据游戏结果来对每一步的决策进行后悔。将后悔与信息一一对应起来2,决策时,根据这个做出决策。
决策时只根据信息
来进行决策,与之前的决策历史
无关。可以通过将决策历史
加入到信息
中,以实现决策时参考决策历史
来进行决策。
网上都是石头剪刀布和打牌,而我想做的是射击游戏,让电脑学会CQB!!!
游戏非常简单,一个二维俯瞰视角的射击游戏。
玩家自己是黑色的,敌人是黄色的,红色的三角形表示面朝的方向。
可以观察到,右侧画面的玩家面朝上方,看不到处在他右侧的敌人。左侧画面的玩家面朝左侧,可以看到他正面的敌人。
具体游戏代码在Github上
完整代码
def cfr(self, server:Shoots, history:str, player_id:int) -> float:
server.update_model() # 判断玩家死亡,判断视野内的敌人
if [i.dead for i in server.players].count(False) == 1: # 只剩下一个活着的玩家,游戏结束,递归结束
actions