强化学习
为什么是强化学习?
为了方便理解,这里就用最白话的方式说明
在之前的转珠算法中,想要实现记忆化存储,即记录每个状态下每个动作的结果,通过查表即可直接获取数据。
举个例子,比如版面是:
1 1 2
2 2 3
3 3 4
将第二行第三个数字向下移动一格就可以完成一次combo(reward)
从数据角度来看 就相当于
动作1 | 动作2 | … | |
---|---|---|---|
状态1(112,223,334的版面) | (2,3)的珠子往下移动一格 | … | |
… | … | … |
所以我们在状态1的时候采取了动作1,得到一次消除,所以Q(状态1,动作1) = 1
在3X3的版面下,需要存多少个映射?
答案是 63*3 *actions (actions=总动作数)
也就是在3X3的版面下需要存储10e+个状态值(虽然大部分重复可以过滤),一旦扩展到5X6版面,基本上是不可能通过这种方法得到结果(也没有足够的内存保存它)
这时候需要借助神经网络的力量了
如果你不了解神经网络,建议去了解一下相关知识
懒的话,你就把它想象成一种会学习的机器,通过让他学习知识,他会对结果做出一种猜测
所以我们可以利用神经网络,替代这种的映射表格。
一般的神经网络学习,需要通过告诉电脑正确的结果(有监督学习),但是强化学习的其中一个优势就是可以让电脑自己找答案(无监督学习),通过时间让它越来越聪明。
回到这个问题上来,也就是我们通过强化学习,可以训练一个电脑玩家,他会对当前版面的每一步操作做一个估计,然后选取它认为最好的一个。当然强化学习不止于此,他可以对后续连续状态做出预测。因为转珠游戏不是三消游戏,这也是选择强化学习的原因。
Q-learning
我们先想想为什么会有这么多映射?
因为涉及了连续未来状态的预测,而且我们不是要移动一步,我们要连续移动好几步!
移动一步的话也就4种动作值,但是移动10步就要410的可能性!
所以我们介绍一种算法解决它:q-learning!
先看看这个例子:
○ ? ?
× × ?
× ? ?
我们从○起手,一步可能做不到消除,但是我们可以通过↓→两步操作达到一次消除!
也就是说Q(状态1,↓)=0,但是Q(状态1,↓→)=1
所以我们可以把第二部操作获得的奖励乘以一个数加给第一步(可以理解为第一步虽然没拿到奖励,但是给奖励做了铺垫,这一步不是毫无意义的!)
这其实就是q-learning的理念,我们来看看实际算法
其实核心就是更新的时候,拿实际得到的值(乘y),减去之前状态预测出来的值,用这个差值去学习。然后为了避免陷入局部最优,加了一个e-greedy,就是不管结果如何有10%的概率一定随机选操作.
然后不停的训练下去,我们的Q就有了状态积累,这样机器就有了很强的洞察力
比如转珠,虽然走某一步没有消除,但是这可能是最优解的必经之路
伪代码
q-learning不适用转珠,只是作为知识科普,所以只给一个伪代码用于学习
初始化 Q = {};
while Q 未收敛:
随机创建版面S,开始转珠
while S != 最大combo && S.step<最大限制步数:
使用策略π,获得动作a=π(S)
使用动作a移动珠子,获得新位置S’,与奖励R(S,a)
Q[S,A] ← (1-α)Q[S,A] + α(R(S,a) + γ* max Q[S’,a]) // 更新Q
S ← S’
虽然解决了对未来预测的问题,但是映射表格还是太多了!
但是我们可以借助神经网络来解决!
最最最最最简单的神经网络
如果你知道神经网络,可以跳过,这边用最简单的代码让大家了解一下神经网络做了什么
比如现在有一个功能是输出y=2a+b+1
def func1(a,b)