建立AI以赢得2048游戏
关于2048年,最重要的是通过移动瓷砖并合并相同的瓷砖来达到最高分。
我们必须定义如何在游戏中移动瓷砖以及在每一步之后如何生成新的瓷砖。
代码在Env.py
中
我的第一个尝试是使用蒙特卡洛树搜索方法赢得游戏。我试图在给定的搜索深度中仔细阅读所有可能的动作,然后比较结果中的分数,以选择特定情况下的最佳决定。
代码在2048_Search.py
中
在这种方法中,我将深度从1到5设置,每个深度为100次。
这是一些结果。
PS:平均获胜率代表达到2048年的机会。
平均最大分数:210.24
平均获胜率:0%
最大触及 | 计数 | 累积% | 反向积累% |
---|---|---|---|
32 | 1 | 1% | 100% |
64 | 6 | 7% | 99% |
128 | 39 | 46% | 93% |
256 | 47 | 93% | 54% |
512 | 7 | 100% | 7% |
1024 | 0 | 100% | 0% |
平均最大分数:1223.68
平均获胜率:30%
最大触及 | 计数 | 累积% | 反向积累% |
---|---|---|---|
256 | 4 | 4% | 100% |
512 | 19 | 23% | 96% |
1024 | 47 | 70% | 77% |
2048 | 29 | 99% | 30% |
4096 | 1 | 100% | 1% |
8192 | 0 | 100% | 0% |
平均最大分数:1646.08
平均获胜率:54%
最大触及 | 计数 | 累积% | 反向积累% |
---|---|---|---|
256 | 1 | 1% | 100% |
512 | 9 | 10% | 99% |
1024 | 36 | 46% | 90% |
2048 | 48 | 94% | 54% |
4096 | 6 | 100% | 6% |
8192 | 0 | 100% | 0% |
平均最大分数:2216.96
平均获胜率:78%
最大触及 | 计数 | 累积% | 反向积累% |
---|---|---|---|
256 | 0 | 0% | 100% |
512 | 3 | 3% | 100% |
1024 | 19 | 22% | 97% |
2048 | 58 | 80% | 78% |
4096 | 20 | 100% | 20% |
8192 | 0 | 100% | 0% |
平均最大分数:2467.84
平均获胜率:78%
最大触及 | 计数 | 累积% | 反向积累% |
---|---|---|---|
256 | 0 | 0% | 100% |
512 | 2 | 2% | 100% |
1024 | 20 | 22% | 98% |
2048 | 48 | 70% | 78% |
4096 | 29 | 99% | 30% |
8192 | 1 | 100% | 1% |
我的计算机MacBook Pro 15“ 2012年(中)无法处理大量计算数量。对于那些对此主题感兴趣的人,可以尝试设置更大的深度数量以查看正在发生的事情。
我为这个问题尝试了另一种方法。在游戏的开始阶段,我使用了小深度来搜索以加快过程。深度从2开始,每400移动到达到设定的深度后,再增加一个更大的。
我跑了200个时代,只有42.5%的比赛达到深度6。但是,深度6的结果令人印象深刻。
最大触及 | 计数 | 累积% | 反向积累% |
---|---|---|---|
1024 | 1 | 1.18% | 100% |
2048 | 50 | 60% | 98.8% |
4096 | 34 | 100% | 40% |
在深度5中,分数和相应的移动数。我们可以看到,平均而言,我们必须超过1600个步骤才能达到2048年。
最大触及 | 计数 | 移动之和 | 每场比赛的平均举动数量 |
---|---|---|---|
512 | 2 | 1172 | 586 |
1024 | 25 | 25321 | 1012.84 |
2048 | 56 | 93276 | 1665.64 |
4096 | 17 | 48163 | 2833.12 |
实施搜索方法后,我研究了一些强化学习(RL)方法。为了更全面地了解RL,我实现了DQN,这是2048年游戏中RL的一个主要分支。
DQN正在使用Q值作为评估机器做出的决定的奖励。
代码在DQN文件夹中。
Sarsa也是一种RL。 SARSA与DQN略有不同。
简而言之,不同之处在于,SARSA政策选择了避免游戏中故障(游戏结束)的最安全方法。
另一方面,DQN政策总是选择达到最高分数的方式,有时在早期比赛中会失败。
这些代码位于SARSA文件夹中。