Knowledge篇(三),让AI玩真假游戏
前言
哎,狼人杀的逻辑好难实现,这毕竟不是大模型,给几个目标让他们自己练就可以,首先得我自己搞懂狼人杀的发言逻辑,所以今天还是先从比较简单的真假游戏开始,相信看完这篇,你也会和我一样眼前一亮,完整代码见 https://github.com/zong4/AILearning。
游戏规则
同样的简单讲一下规则,这游戏我第一次接触是小学学奥数的时候。
简单来说,就是会有几个人,他们要么是骑士要么是恶魔,骑士只能说真话,而恶魔可以是假话也可以是真话,我们需要从他们说的话来判断他们的身份。
所以我们首先创建所有会用到的 Symbol。
1 | AKnight = Symbol("A is a Knight") |
游戏逻辑
OK,这一块的话就是重中之重了,来举个简单的例子先,考虑下面这个问题。
1 | 假设只有一个 A。 |
大家可以先想一下这个问题的 KB 应该怎么表示再往下看。
答案一共是四句,首先要说明 A 只能是骑士或者恶魔,然后再用推理来表示 A 说的话,如果 A 是骑士,那么他说的话就为真,反之则不一定。
1 | knowledge0 = And( |
同样的,接下来还有三个问题,大家可以尝试自行解决,然后再看看我的代码 https://github.com/zong4/AILearning。
1 | # Puzzle 1 |
后记
哈哈哈,今天文章好像有点水,但是今天是除夕,应该大家也不介意。
不过这个游戏要实现还是挺耗脑子的,因为你需要仔细思考如何原封不动的转述给 AI,比如那个例子,你可能一看到就知道 A 是恶魔,但是你不能直接给 KB 里面放一个 A 是恶魔,你必须得用那些连接符和 Symbols 来解释,还是挺痛苦的。
不过大家现在看完应该也发现了,狼人杀的发言跟这个就是异曲同工,所以明天一定给大家端出来。
最后给大家讲一段挺有意思的代码,就是下面这个判断每个人的角色。
1 | for puzzle, knowledge in puzzles: |
这代码妙就妙在,通过 model_check 只打印了 symbol 为真的情况,这样就不需要二次修改输出了,直接就能出现这样的结果。
1 | Puzzle 1 |
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.