SteadfastAsArt / -Reinforcement-Learning-five-in-a-row-

基于DQN的五子棋人机对弈

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

1.基于 tensorflow 的强化学习的五子棋人机对弈

深度强化学习,即 Deep Reinforcement Learning, 通过给每个 action 特定的 reward, 进行不断的尝试,使程序在某个状态 (state),的时候 可以朝着最大化的受益 (reward) action 变换 state, 基于强化学习的五子棋对弈人机对弈系统就基于这个原理出发。

2. Deep Reinforcement Learning 原理

DQN 原理简述

2. 系统神经网络结构

网络结构

该神经网络的输入输出及相关状态:

  • 输入:19 * 19 的棋盘状态矩阵,现在改成了 1*722 的棋盘状态矩阵, 其中 1-366 是代表一方的落子状态,367-722 代表另外一方的落子状态。
  • 输出:一行 361 列的Q值矩阵,即是表示每个 action 所代表的q值(这里action用坐标表示)。五子棋神经网络用的双神经网络的方法,两个神神经网络的结构相同,分别是 Q-eval 和 Q_target.
  • Q_eval:参数时刻更新,用于得到q表,从而选取动作。
  • Q_target:参数滞后,主要用于保存以前的参数。

3.原理流程图

原理流程图

4.激活函数

ReLu(Rectified Linear Units)激活函数。

5.梯度下降

RMSProp方法。

6. 更新过程

储存落子过程 memory

[s1,r1,a1,s_1]
[s2,r2,a3,s_3]
[sn,rn,an,s_n]

即是
[state, reward, action, state_next]

表示当执行某个 action,使的 state 变为 state_next 获得的收益为 reward。

存储了一定的数据量的时候随机从 memory 中选取 m 项数据,将[s1,s2,s3…..,sm]输入 Q_eavl(具有最新参数的神经网络),得到 Q_eval = [q1:q2:q3,,,,:qm],同理 [s_1,s_2,s_3…..,s_m] 输入 _target(滞后参数神经网络),得到 Q_next = [q_1;q_2;q_3;,,,;q_m]。让后对相应 action 位置的 q 值进行更新,计算 target[0,ation] = R + gama * max(q_next), 其中gama为延迟回报率。计算误差:loss = target[0,ation]- Q_eval[0,ation],将误差反向传播,修改神经网络结构参数。从而使落子的决策可以得到更多的回报值。

7. 计算机的自我对弈

这里将期盼的状态 (state), 用一个一维数组表示,其中 1 代表该位置已被落子,这样棋盘的每个状态都可以用一个一位数组表示。该棋盘初始状态如下:

[
0, 0, 0, 0,....0,
0, 0, 0, 0,....0,
., ., ., .,.....,
., ., ., .,.....,
., ., ., .,.....,
0, 0, 0, 0,....0,
] 执行,先手(假设程序1)随机下,得到一个 state_0 [ // 对方落子情况,初始局所以都为 0 0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,

// 我方落子情况
0, 0, 0, 0,
0, 0, 1, 0,
0, 0, 0, 0,
0, 0, 0, 0,
]

此时程序2,将数组前后两部分对调,作为一个 state 输出到神经网络,得到并执行 action, 假设落子情况为如下
[
// 对方落子情况
0, 0, 0, 0,
0, 0, 1, 0,
0, 0, 0, 0,
0, 0, 0, 0,
// 我方落子(此处我方指程序 2 )
0, 0, 0, 0,
0, 0, 0, 0,
0, 1, 0, 0,
0, 0, 0, 0,
]

程序 1 侧目前所见目前棋盘状态如下 state_1

[ // 对方落子
0, 0, 0, 0,
0, 0, 0, 0,
0, 1, 0, 0,
0, 0, 0, 0, //我方落子
0, 0, 0, 0,
0, 0, 1, 0,
0, 0, 0, 0,
0, 0, 0, 0,
]

程序 1 将该 state_1 输入神经网络得到一个 action_1,并执行,假设如下,得到 state_2

[
// 对方落子
0, 0, 0, 0,
0, 0, 0, 0,
0, 1, 0, 0,
0, 0, 0, 0, //我方落子
0, 0, 0, 0,
0, 0, 1, 0,
0, 0, 1, 0,
0, 0, 0, 0,
]

然后根据 state_2, 根据棋盘的连子情况(自定得分规则), 得到该 action_1 动作的得分,即得到一条数据

[state_1, reward_1, action_1, state_2], 当执行到一定步数的时候,利用这些数据来反向修改神经网络的参数, 使其能够沿着能够生成最大 reward 的 action 趋近。

8. 运行截图

  1. 程序日志

程序日志

  1. 计算机自我对弈训练落子分布

计算机自我对弈训练

  1. 人机对弈落子分布

计算机自我对弈训练

9.运行环境

  • python 3.5
  • tensorflow
  • tkinter
  • numpy

10.运行方式

运行trun_this.py进行计算机自我对弈训练 运行run 经行人机对弈

11.总结

1. 结果

经过计算机不断地自我对弈,在计算机的人机对弈的测试中,计算机会根据最大的 q 值下,也都会收到一些回报值,也就是说,在对弈的过程中,计算机五子棋程序已具备一些智能。

2. 不足之处

落子不够智能 可能原因:

  1. 训练数据不够准确。
  2. 训练数据量太少
  3. 神经网络结构问题

About

基于DQN的五子棋人机对弈


Languages

Language:Python 100.0%