2048
1 需求
让用户在规定时间或步数内,玩到死局,但过程要做到平滑。
2 解决方案
2.1 方案一
设计一个评估函数,对游戏局面进行评估,用评估分数控制游戏的难度。
2.1.1 具体步骤
状态:用户连接棋子后的游戏局面(即有空缺格子的游戏局面);
动作:系统在空缺的位置填充数字;
- 获取用户连接后的状态。
- 穷举出所有可能的动作。
- 利用评估函数对填充后的游戏局面进行打分。
- 根据游戏进行的时间或步数选择相应得分的动作。
2.1.2 评估函数
MaxLength:当前局面能够连接的路径的最大长度;
Lines:用户可以选择的连接线路的总数;
Deep:用户所能连接线路的最大深度;
Single:整体局面的单调性(上面的数字小,下面的数字大,简称为单调);
公式:
S c o r e = a ∗ M a x L e n g t h + b ∗ L i n e s + c ∗ D e e p + d ∗ S i n g l e Score = a*MaxLength + b*Lines + c*Deep + d*Single Score=a∗MaxLength+b∗Lines+c∗Deep+d∗Single
2.1.3 已有工作
单目标数字评估函数:
- 评估函数的输入为:
a. 生成数字的坐标
b. 生成的数字矩阵
- 评估函数的输出为:
a. 该选择的评分(浮点数)
- 评估函数影响因子
a. 中位性
即对于每个生成的数字,都会计算该数在其本身和左右两列中不同数字的频率,对频率位于前三时给予一定奖励(可以使得产生得数字更普遍,提高连线产生概率),其奖励函数如下:
W m = { 4 − i , x ∈ t o p 3 0 , x ∉ t o p 3 W_m=\left\{\begin{matrix}4-i,x\in top3\\0,x\notin top3 \end{matrix}\right. Wm={4−i,x∈top30,x∈/top3
其中 i i i表示生成数字在 t o p 3 top3 top3中的前几位,例如频率前三的数字为{2,4,8} ,而生成数字为4,则奖励 W m W_m Wm为 4 − 1 = 3 4-1=3 4−1=3 。
b. 单调性
单调性主要为了使数字矩阵从上到下呈现由小到大的布局,从而可以从上往下越消越大。并控制生成数字与下方数字的差距,避免在低处存在过小的数字无法消除。
2.2 方案二
我们采用DQN的目标是怎样在最短的时间内让游戏达到死局。因此我们用此时的DQN网络去给动作打分,它的分越低,说明它让游戏达到死局所需的步数就越长,所以我们可以根据需要,去选择不同分数的动作,让游戏在我们要求的步数内到达死局。
2.2.1 具体步骤
DQN建模
输入:状态
输出:所有动作的Q值
奖励:局面评估函数的得分结果
目标:在最短时间内让游戏最难
2.2.2 已有工作
实现了DQN,同时应用到了我们的游戏场景中,但效果不怎么好。
2.2.3 问题
- DQN只能处理小规模的离散动作或连续动作,无法处理大规模离散动作。
- 控制不同个数棋子所对应的动作空间不一样。
2.2.4 解决思路
- 减少控制的棋子个数,例如:空缺出三个棋子,但我们只控制两个棋子,另一个随机生成。
- 为了减小动作空间,有想过使用聚类算法,将对局面影响相似的动作归为一类,但最后发现,我们使用DQN的目的就是为了解决游戏状态过多的问题,如果要使用聚类算法的话,就需要穷举出每一个状态的所有动作,违背了初衷。
3 后续工作
先利用评估函数,看能否达到平滑过渡的效果。
3.1 确定评估函数参数
方法一:
利用超定方程组确定超参数。
我们人为设定不同状态的理想得分,然后去拟合参数的值。
例子:
假设:
(1,1,1,1)= 3
(2,1,1,1) = 4
(3,1,1,1) = 5
通过解这样超定方程组,来拟合参数的值。
方法二:
通过设置步数N,来调节评估函数的超参数。