使用强化学习NatureDQN来玩打砖块

目标

打砖块是gym游戏中相对复杂一些的游戏,不同于CartPole游戏,状态空间较少,基本上10分钟左右训练就可以玩到最高分,打砖块要训练非常长的时间,因此对于更进一步去理解和优化DQN非常有帮助。

第一版尝试

打砖块的基础

打砖块的reward设置是敲打到砖块:reward = 1
5次球都未接到或者全部砖块打完了done = 1
state就是整个游戏中的全体像素
在这里插入图片描述

预处理

图片预处理

首先图片可以转为单通道,且像素只需要具体游戏区内的部分,且分辨率可以降低,因此预处理如下:

def preprocess(img):
    img_temp = img[31:195]
    img_temp = img_temp.mean(axis = 2)
    img_temp = cv2.resize(img_temp,(IMG_SIZE,IMG_SIZE))
    img_temp = (img_temp - 127.5) / 127.5
    return img_temp

状态预处理

单张图片很难表述出球运动的方向,为了更好的表现出游戏中的状态就需要连续多张图片,这里我取了连续4张图片。

网络设计

这里贴出代码,先使用三层卷积网络降维后

  def create_Q_network(self):
    # network weights
    input_layer = Input(shape=(IMG_SIZE,IMG_SIZE,4), name="unet_input")
    #converlution
    cnn1 = Convolution2D(nb_filter=32, nb_row=8, nb_col=8, border_mode='same', subsample=(4, 4))(input_layer)
    cnn1 = ReLU()(cnn1)
    cnn2 = Convolution2D(nb_filter=64, nb_row=4, nb_col=4, border_mode='same', subsample=(2, 2))(cnn1)
    cnn2 = ReLU()(cnn2)
    cnn2 = Convolution2D(nb_filter=64, nb_row=3, nb_col=3, border_mode='same', subsample=(1, 1))(cnn1)
    cnn2 = ReLU()(cnn2)
    #full connect
    fc0 = Flatten()(cnn2)
    fc1 = Dense(512)(fc0)
    #get Q_value
    q_value= Dense(self.action_dim)(fc1)
    self.model = Model(input=[input_layer], output=[q_value], name='Q_net')
    self.model.compile(loss='mse',optimizer=Adam(lr=self.learning_rate))

第二版本尝试

由于第一版读取整个图片,且需要连续4帧,在图片处理环节就需要消耗大量时间,且获得得信息其实与真正乒乓球相关得只有球得坐标以及板子的位置,且仅需要两帧就可以用于表述需要的状态,因此我改进了状态变量的,之用了4个维度。

def preprocess(img):
    img_temp = img.mean(axis = 2)
#    img_temp = cv2.resize(img_temp,(IMG_SIZE,IMG_SIZE))
    x = -1
    y = -1
    flag = 0
    if len(np.where((img_temp[100:189,8:152])!= 0)[0]) != 0:
        x = np.where((img_temp[100:189,8:152])!= 0)[0][0]
        y = np.where((img_temp[100:189,8:152])!= 0)[1][0]
    if len(np.where((img_temp[193:,8:152])!= 0)[0]) != 0:
        x = np.where((img_temp[193:,8:152])!= 0)[0][0] + 93
        y = np.where((img_temp[193:,8:152])!= 0)[1][0]
        flag = 1
#         x = -2
#         y = -2
    p = int(np.where(img_temp[191:193,8:152])[1].mean() - 7.5)
    #return img_temp
    return (x,y,p,flag)
    for step in range(STEP):
        print("episode:%d step:%d" % (episode,step))
        action = agent.egreedy_action(state_shadow)    
        next_state,reward,done,_ = env.step(action)
        (x2,y2,p2,flag) = preprocess(next_state)
        next_state_shadow = np.array([x1,y1,x2,y2,p2])
        # Define reward for agent
        #reward_agent = -1 if done else 0.1
        #加大落下的惩罚
        if flag == 1:
            reward = -10
            done = True
        else:
            reward = 0.1
        agent.perceive(state_shadow,action,reward,next_state_shadow,done)
#         if cur_loss is not None:
#             total_loss += cur_loss
        total_reward += reward
        state_shadow = next_state_shadow
        x1,y1,p1 = x2,y2,p2
        if done:
            break

经过14000 episode的迭代的效果如下:
测试出的Reward虽然整体有上升的趋势但:

  • 测试集上波动太过明显
  • 整体reward未达到期望(以我设定的step满足大于20才是比较好的效果也就是基本一个球不掉)
    在这里插入图片描述

第三版本尝试

引入prioritised,改变训练样本的权重。训练了差多15个小时左右,平均收益任然不是很理想,不过玩起来的感觉还不错了
在这里插入图片描述

代码目录:

https://github.com/hlzy/operator_dnn

### 回答1: 打砖块是一种经典的游戏,可以采用强化学习算法来进行智能化的实现。 首先,我们需要将游戏界面作为状态输入,例如可以使用截图作为状态。然后,我们可以使用深度强化学习算法,例如深度Q网络(DQN)来对游戏进行训练。DQN算法使用神经网络来估计每个状态下采取不同行动的价值函数,通过最大化价值函数来实现最优策略。 具体步骤如下: 1. 将游戏界面作为状态输入,例如使用OpenCV库来捕获游戏界面的截图。 2. 使用深度神经网络来估计每个状态下采取不同行动的价值函数,例如使用卷积神经网络(CNN)来处理游戏界面的图像。 3. 使用DQN算法来训练神经网络,使得神经网络可以最大化价值函数。 4. 在游戏中使用神经网络来预测行动,并根据预测结果来进行游戏操作。 5. 不断重复训练和预测的过程,直到神经网络能够实现较好的游戏表现。 需要注意的是,由于打砖块游戏具有高度的随机性,训练过程可能需要较长的时间,并且需要对神经网络的结构和参数进行调优。 ### 回答2: 强化学习是一种通过与环境交互并通过试错学习来训练智能体做出决策的机器学习方法。在打砖块游戏中使用强化学习的目标是让智能体学会寻找最优的策略来打砖块,并获得尽可能高的得分。 首先,需要定义游戏的状态空间、动作空间和奖励机制。状态空间可以定义为游戏界面的像素值,动作空间可以定义为可行的游戏操作,如移动板子的方向和速度。奖励机制可以定义为当球击中砖块时给予奖励,当球触底或板子未击中球时给予惩罚。 接下来,可以使用深度强化学习算法,如深度Q网络(DQN),来训练智能体。DQN结合了深度神经网络和强化学习的思想,可以通过迭代地更新神经网络的参数来逼近最优策略。 在每个时间步,智能体根据当前的状态选择一个动作,并将其应用于游戏。然后,智能体根据所获得的奖励和从下一个状态中预测到的最大奖励值更新神经网络的参数。重复这个过程直到达到预定的训练轮数或达到一定的性能指标。 在训练结束后,可以使用训练好的模型来测试智能体的性能。将智能体与人类家进行比较,评估其在游戏中的表现,并对其进行改进。 值得注意的是,强化学习在实现打砖块游戏时具有一定的挑战性。例如,对于状态空间的定义,需要考虑如何表示游戏界面的像素值以及如何捕捉到球和板子的位置信息。此外,如何设计合适的奖励机制也是一个重要的问题。这些都需要经过仔细的实验和调整来优化算法的训练效果。 ### 回答3: 强化学习是一种机器学习方法,通过与环境交互来训练智能体,使其能够从环境中获取反馈并不断改善自己的决策策略。在打砖块游戏中,我们可以使用强化学习来训练一个智能体学会打破砖块的最佳策略。 首先,我们要定义游戏状态和动作空间。游戏状态可以由球的位置、板的位置以及砖块的布局表示。动作空间包括板的移动方向,可以是左移、右移或不动。我们可以使用一个二维数组表示游戏状态,每个元素可以表示砖块的存在与否。 然后,我们需要定义奖励函数。在打砖块游戏中,我们希望智能体能够打掉尽可能多的砖块,因此可以设置奖励为每打掉一个砖块加一分,而掉落球或未打掉砖块则惩罚智能体,减一分。 接下来,我们可以使用强化学习算法来训练智能体。一个常用的算法是Q-learning算法。我们可以设置一个Q表,其中行表示游戏状态,列表示动作空间,值表示在某个状态下采取某个动作的收益。智能体根据当前状态选择最大Q值的动作进行游戏,并根据环境的反馈更新Q表中的值。 在每一轮游戏中,智能体通过与环境交互来不断更新Q表,使其逐渐学会在不同状态下选择最佳的动作。当智能体训练足够多的次数后,可以在实际游戏中使用训练好的Q表来指导智能体的决策,从而使其能够高效地打破砖块。 综上所述,使用强化学习实现打砖块的方法包括定义游戏状态和动作空间、设计奖励函数、使用Q-learning算法来训练智能体,并通过迭代训练来提高其游戏能力。使用强化学习可以使智能体通过与环境交互自主学习最佳策略,从而实现在打砖块游戏中的高水平表现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值