2048工作总结

2048

1 需求

让用户在规定时间或步数内,玩到死局,但过程要做到平滑。

2 解决方案

2.1 方案一

设计一个评估函数,对游戏局面进行评估,用评估分数控制游戏的难度。

2.1.1 具体步骤

状态:用户连接棋子后的游戏局面(即有空缺格子的游戏局面);
动作:系统在空缺的位置填充数字;

  1. 获取用户连接后的状态。
  2. 穷举出所有可能的动作。
  3. 利用评估函数对填充后的游戏局面进行打分。
  4. 根据游戏进行的时间或步数选择相应得分的动作。

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=aMaxLength+bLines+cDeep+dSingle

2.1.3 已有工作

单目标数字评估函数:

  1. 评估函数的输入为:
    a. 生成数字的坐标
    b. 生成的数字矩阵
  2. 评估函数的输出为:
    a. 该选择的评分(浮点数)
  3. 评估函数影响因子
    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={4ixtop30x/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 41=3
    b. 单调性
    单调性主要为了使数字矩阵从上到下呈现由小到大的布局,从而可以从上往下越消越大。并控制生成数字与下方数字的差距,避免在低处存在过小的数字无法消除。

2.2 方案二

我们采用DQN的目标是怎样在最短的时间内让游戏达到死局。因此我们用此时的DQN网络去给动作打分,它的分越低,说明它让游戏达到死局所需的步数就越长,所以我们可以根据需要,去选择不同分数的动作,让游戏在我们要求的步数内到达死局。

2.2.1 具体步骤

DQN建模

输入:状态
输出:所有动作的Q值
奖励:局面评估函数的得分结果
目标:在最短时间内让游戏最难

2.2.2 已有工作

实现了DQN,同时应用到了我们的游戏场景中,但效果不怎么好。

2.2.3 问题

  1. DQN只能处理小规模的离散动作或连续动作,无法处理大规模离散动作。
  2. 控制不同个数棋子所对应的动作空间不一样。

2.2.4 解决思路

  1. 减少控制的棋子个数,例如:空缺出三个棋子,但我们只控制两个棋子,另一个随机生成。
  2. 为了减小动作空间,有想过使用聚类算法,将对局面影响相似的动作归为一类,但最后发现,我们使用DQN的目的就是为了解决游戏状态过多的问题,如果要使用聚类算法的话,就需要穷举出每一个状态的所有动作,违背了初衷。

3 后续工作

先利用评估函数,看能否达到平滑过渡的效果。

3.1 确定评估函数参数

方法一:
利用超定方程组确定超参数。
我们人为设定不同状态的理想得分,然后去拟合参数的值。
例子:
假设:
(1,1,1,1)= 3
(2,1,1,1) = 4
(3,1,1,1) = 5
通过解这样超定方程组,来拟合参数的值。

方法二:
通过设置步数N,来调节评估函数的超参数。

你可能感兴趣的:(日报,python)