游戏AI的创造思路-技术基础-强化学习(2)

上一篇中引出了深度强化学习这个大坑,本篇浅浅填一下~~~~

目录

6. 深度强化学习概述

6.1. 基本概念

6.2. 发展历史

6.3. 基本公式

6.4. Python实现

6.5. 运行原理

6.5.1. 核心要素

6.5.2. 运行原理

6.5.3. 典型算法

6.5.4. Python实现代码

6.6. 优缺点

6.6.1. 优点

6.6.2. 缺点

6.7. 游戏AI中的应用实例


6. 深度强化学习概述

6.1. 基本概念

深度强化学习(Deep Reinforcement Learning, DRL)是强化学习(Reinforcement Learning, RL)与深度学习(Deep Learning)的结合。

在强化学习中,智能体(Agent)通过与环境(Environment)的交互来学习如何完成任务。

它通过学习策略(Policy)来最大化从环境中获得的累积奖励(Reward)。

深度学习在这里用于估计策略或值函数(Value Function),使得强化学习能够在高维空间(如图像或语音)中进行有效的决策。

6.2. 发展历史

深度强化学习的发展可以追溯到2013年DeepMind发表的DQN(Deep Q-Network)论文,该论文首次展示了深度学习模型可以在强化学习任务中成功应用,并实现了在Atari游戏上的超人类表现。

此后,DRL在AlphaGo等项目中大放异彩,进一步推动了其研究和应用。

6.3. 基本公式

  1. 策略(Policy):π(a|s),表示在状态s下采取动作a的概率。
  2. 状态值函数(State Value Function):Vπ(s),表示从状态s开始,遵循策略π的期望回报。
  3. 动作值函数(Action Value Function):Qπ(s, a),表示在状态s下采取动作a,然后遵循策略π的期望回报。
  4. 贝尔曼方程(Bellman Equation)
    • Vπ(s) = E[R(s,a) + γVπ(s') | s0=s]
    • Qπ(s, a) = E[R(s,a) + γmax_a' Qπ(s', a') | s0=s, a0=a]

其中,R是奖励,γ是折扣因子,s'是下一个状态。

6.4. Python实现

以下是一个简单的深度Q网络实现示例,使用PyTorch框架:

import torch  
import torch.nn as nn  
import torch.optim as optim  
import numpy as np  
import random  class DQN(nn.Module):  def __init__(self, input_size, output_size):  super(DQN, self).__init__()  self.fc1 = nn.Linear(input_size, 24)  self.fc2 = nn.Linear(24, 24)  self.fc3 = nn.Linear(24, output_size)  def forward(self, x):  x = torch.relu(self.fc1(x))  x = torch.relu(self.fc2(x))  return self.fc3(x)  class Agent:  def __init__(self, input_size, output_size):  self.network = DQN(input_size, output_size)  self.optimizer = optim.Adam(self.network.parameters(), lr=0.001)  self.loss_fn = nn.MSELoss()  self.replay_memory = []  self.gamma = 0.99  self.epsilon = 1.0  self.epsilon_decay = 0.995  self.epsilon_min = 0.01  def act(self, state):  if random.random() < self.epsilon:  return random.randint(0, output_size-1)  else:  with torch.no_grad():  return self.network(state).argmax().item()  def replay(self, batch_size):  minibatch = random.sample(self.replay_memory, batch_size)  states, actions, rewards, next_states, dones = zip(*minibatch)  states = torch.tensor(states)  actions = torch.tensor(actions)  rewards = torch.tensor(rewards)  next_states = torch.tensor(next_states)  dones = torch.tensor(dones)  q_vals = self.network(states).collect()  next_q_vals = self.network(next_states).max(dim=1)[0].detach()  expected_q_vals = rewards + self.gamma * next_q_vals * (1 - dones)  loss = self.loss_fn(q_vals[range(len(actions)), actions], expected_q_vals)  self.optimizer.zero_grad()  loss.backward()  self.optimizer.step()  self.epsilon = max(self.epsilon_min, self.epsilon * self.epsilon_decay)  # 实例化环境、代理等,并运行训练循环

6.5. 运行原理

在游戏AI中,DRL允许AI智能体通过与环境互动,学习并优化其行为策略,以最大化累积奖励。

6.5.1. 核心要素

DRL的核心要素包括:

  1. 智能体(Agent):执行动作的主体,通过与环境互动来学习。
  2. 环境(Environment):智能体所处的外部世界,可以是游戏世界、物理模拟器或现实世界的一部分。
  3. 状态(State):环境的当前快照,包含智能体决策所需的所有信息。
  4. 动作(Action):智能体在特定状态下可以采取的行为。
  5. 奖励(Reward):环境对智能体动作的反馈,用于衡量动作的好坏。
  6. 策略(Policy):从状态到动作的映射,指导智能体在给定状态下应采取何种动作。

6.5.2. 运行原理

  1. 观察(Observations):智能体在每个时间步骤上从环境中获取状态信息。
  2. 选择动作(Action Selection):根据当前状态和策略选择执行的动作。
  3. 执行动作(Action Execution):智能体执行选定的动作,环境状态随之改变。
  4. 接收奖励(Reward Reception):环境根据智能体的动作给出奖励信号。
  5. 更新策略(Policy Update):智能体根据奖励信号更新其策略,以最大化累积奖励。

6.5.3. 典型算法

在游戏AI中,常用的DRL算法包括:

  1. 深度Q网络(DQN):使用神经网络来近似Q值函数,通过迭代更新Q值来学习最优策略。
  2. 策略梯度方法(Policy Gradient Methods):直接优化策略函数,如PPO(Proximal Policy Optimization)算法,通过最小化目标策略和原策略的对数似然差来优化策略。
  3. Actor-Critic方法:结合值函数和策略函数,一方面估计状态-动作值函数,另一方面优化策略函数,如DDPG(Deep Deterministic Policy Gradient)算法。

6.5.4. Python实现代码

 下面是一个简化的Python代码示例,展示了游戏AI使用深度强化学习的完整运行原理。这个例子使用了一个非常简单的环境(比如一个格子世界),智能体(Agent)的目标是移动到这个格子的终点。我们将使用DQN(深度Q网络)作为我们的强化学习算法。

import numpy as np  
import random  
from collections import deque  
from keras.models import Sequential  
from keras.layers import Dense  
from keras.optimizers import Adam  class DQNAgent:  def __init__(self, state_size, action_size):  self.state_size = state_size  self.action_size = action_size  self.memory = deque(maxlen=2000)  self.gamma = 0.95    # discount rate  self.epsilon = 1.0   # exploration rate  self.epsilon_min = 0.01  self.epsilon_decay = 0.995  self.learning_rate = 0.001  self.model = self._build_model()  def _build_model(self):  # Neural Net for Deep-Q learning Model  model = Sequential()  model.add(Dense(24, input_dim=self.state_size, activation='relu'))  model.add(Dense(24, activation='relu'))  model.add(Dense(self.action_size, activation='linear'))  model.compile(loss='mse',  optimizer=Adam(lr=self.learning_rate))  return model  def remember(self, state, action, reward, next_state, done):  self.memory.append((state, action, reward, next_state, done))  def act(self, state):  if np.random.rand() <= self.epsilon:  return random.randrange(self.action_size)  act_values = self.model(state)  return np.argmax(act_values[0])  # returns action  def replay(self, batch_size):  minibatch = random.sample(self.memory, batch_size)  for state, action, reward, next_state, done in minibatch:  target = reward  if not done:  target = (reward + self.gamma *  np.amax(self.model.predict(next_state)[0]))  target_f = self.model.predict(state)  target_f[0][action] = target  self.model.fit(state, target_f, epochs=1, verbose=0)  if self.epsilon > self.epsilon_min:  self.epsilon *= self.epsilon_decay  class GridEnvironment:  def __init__(self):  self.state_size = 10  # assuming a simple grid world of size 10  self.action_size = 4  # move left, right, up, down  def reset(self):  return np.array([0] * self.state_size)  # start state  def step(self, action, state):  # simple grid world logic  if action == 0:  # move left  next_state = np.array(state - 1 if state > 0 else 0)  elif action == 1:  # move right  next_state = np.array(state + 1 if state < self.state_size - 1 else self.state_size - 1)  # add more actions as needed...  reward = 1 if next_state == self.state_size - 1 else 0  # reward for reaching the end  done = True if next_state == self.state_size - 1 else False  return next_state, reward, done  # Initialize environment and agent  
env = GridEnvironment()  
agent = DQNAgent(env.state_size, env.action_size)  # Training loop  
batch_size = 32  
epochs = 1000  for e in range(epochs):  state = env.reset()  state = np.reshape(state, [1, env.state_size])  for time_t in range(50):  # max steps per epoch  action = agent.act(state)  next_state, reward, done = env.step(action, state[0])  reward = reward if not done else -10  # penalty for ending the game  next_state = np.reshape(next_state, [1, env.state_size])  agent.remember(state, action, reward, next_state, done)  state = next_state  if done:  print("epoch: {}/{}, score: {}, e: {:.2}"  .format(e, epochs, time_t, agent.epsilon))  break  if len(agent.memory) > batch_size:  agent.replay(batch_size)

这段代码定义了一个简单的格子世界环境和一个使用DQN的深度强化学习智能体。

智能体通过与环境互动来学习如何达到格子的终点,并在此过程中优化其策略。

代码包括初始化环境和智能体、定义智能体的动作、对智能体动作的反馈奖励、观察、选择动作、接收奖励以及更新策略的所有步骤。

6.6. 优缺点

6.6.1. 优点

  1. 自主学习能力:DRL允许智能体通过与环境互动自主学习并优化策略,无需显式编程复杂的规则。
  2. 适应性:能够适应不同的环境变化,具有一定的泛化能力。
  3. 解决复杂任务:可以处理高维、非线性状态和动作空间的问题,适用于复杂的游戏任务。
  4. 提高游戏体验:通过模拟人类的学习过程,可以创造更有趣、更挑战性的游戏。
  5. 发现创新策略:在游戏、机器人控制等领域,DRL能够发现人类未曾预见的创新策略。

6.6.2. 缺点

  1. 训练时间长:深度学习模型通常需要大量的样本和计算资源,特别是对于复杂的任务,训练可能非常耗时。
  2. 不稳定收敛:强化学习的回报往往不稳定,可能导致训练过程不稳定或收敛困难。
  3. 解释性较差:由于决策过程依赖于黑箱模型,理解模型如何做出决策有时较难。
  4. 过度拟合:没有足够的探索,模型可能会过度依赖已有的经验,导致在新环境中表现不佳。
  5. 需要大量标注数据:尽管是无监督学习,但在某些领域仍需辅助指导,如预训练的策略网络。
  6. 伦理问题:在某些领域,如自动驾驶和金融交易中,DRL可能面临伦理问题,如如何处理紧急情况、避免不当行为等。

6.7. 游戏AI中的应用实例

深度强化学习已被广泛应用于各种游戏中,如Atari游戏、围棋(AlphaGo)、星际争霸II(AlphaStar)等。在这些应用中,DRL模型通过学习游戏中的策略,逐渐提高游戏水平,并最终达到或超过人类玩家的水平。

在实际应用中,需要根据具体游戏的特点设计状态表示、奖励函数等,以及选择合适的DRL算法进行训练。

以下是一个使用PyTorch实现的简单深度Q网络(DQN)代码,用于训练一个智能体在玩一个简单的游戏(比如CartPole)时的策略。

请注意,为了运行此代码,你需要先安装gympytorch库。

import gym  
import torch  
import torch.nn as nn  
import torch.optim as optim  
import random  
from collections import deque  class DQN(nn.Module):  def __init__(self, input_size, output_size):  super(DQN, self).__init__()  self.fc1 = nn.Linear(input_size, 24)  self.fc2 = nn.Linear(24, 24)  self.fc3 = nn.Linear(24, output_size)  def forward(self, x):  x = torch.relu(self.fc1(x))  x = torch.relu(self.fc2(x))  return self.fc3(x)  class Agent:  def __init__(self, state_size, action_size):  self.state_size = state_size  self.action_size = action_size  self.memory = deque(maxlen=2000)  self.model = DQN(state_size, action_size)  self.optimizer = optim.Adam(self.model.parameters(), lr=0.001)  self.loss_fn = nn.MSELoss()  self.gamma = 0.99  self.epsilon = 1.0  self.epsilon_decay = 0.995  self.epsilon_min = 0.01  def act(self, state):  if random.random() < self.epsilon:  return random.randint(0, self.action_size - 1)  else:  with torch.no_grad():  state = torch.FloatTensor(state).unsqueeze(0)  action_values = self.model(state)  return action_values.argmax().item()  def replay(self, batch_size):  if len(self.memory) < batch_size:  return  minibatch = random.sample(self.memory, batch_size)  state_batch, action_batch, reward_batch, next_state_batch, done_batch = zip(*minibatch)  state_batch = torch.FloatTensor(state_batch)  action_batch = torch.LongTensor(action_batch)  reward_batch = torch.FloatTensor(reward_batch)  next_state_batch = torch.FloatTensor(next_state_batch)  done_batch = torch.BoolTensor(done_batch)  q_vals = self.model(state_batch).collect()  next_q_vals = self.model(next_state_batch).max(dim=1)[0].detach()  expected_q_vals = reward_batch + self.gamma * next_q_vals * (1 - done_batch)  loss = self.loss_fn(q_vals[range(len(action_batch)), action_batch], expected_q_vals)  self.optimizer.zero_grad()  loss.backward()  self.optimizer.step()  self.epsilon = max(self.epsilon_min, self.epsilon * self.epsilon_decay)  def remember(self, state, action, reward, next_state, done):  self.memory.append((state, action, reward, next_state, done))  # Initialize gym environment and the agent  
env = gym.make('CartPole-v1')  
state_size = env.observation_space.shape[0]  
action_size = env.action_space.n  
agent = Agent(state_size, action_size)  # Training loop  
num_episodes = 1000  
for e in range(num_episodes):  state = env.reset()  for timestep in range(1000):  action = agent.act(state)  next_state, reward, done, _ = env.step(action)  agent.remember(state, action, reward, next_state, done)  state = next_state  if done:  print("episode: {}/{}, score: {}, e: {:.2}"  .format(e, num_episodes, timestep, agent.epsilon))  break  agent.replay(32)

这段代码首先定义了一个简单的DQN网络,然后定义了一个Agent类,该类包含了DQN模型、优化器、损失函数以及一些用于训练和决策的方法。

在训练循环中,智能体通过与环境交互来学习如何玩游戏。每当智能体采取一个动作,它都会记住这个经验(状态、动作、奖励、下一个状态、是否结束),并定期使用这些经验来更新它的模型。

这个代码是基于CartPole游戏开发的。CartPole是OpenAI Gym库中的一个经典控制问题,用于测试强化学习算法。在CartPole游戏中,目标是通过左右移动一个底部装有单摆的小车,来保持单摆竖直向上。如果单摆偏离垂直位置太远,或者小车移动出屏幕,游戏就会结束。

在提供的代码中,通过定义一个DQN(深度Q网络)模型和一个Agent类,实现了智能体与环境(CartPole游戏)的交互,并通过强化学习的方法(如经验回放和ε-贪心策略)来训练智能体,使其学会如何玩CartPole游戏。

值得注意的是,虽然原始问题可能询问的是类似贪吃蛇这样的经典游戏,但提供的代码实际上是针对CartPole游戏的一个实现示例。这可能是因为CartPole游戏因其简单性和易于实现,在强化学习领域被广泛用作测试基准。而贪吃蛇游戏虽然也是一个经典的游戏,但其实现可能涉及更复杂的游戏逻辑和图形界面处理,因此在强化学习的入门示例中可能较少见到。不过,使用Pygame等库也可以实现贪吃蛇游戏的图形界面和基本逻辑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/42052.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大厂面试官赞不绝口的后端技术亮点【后端项目亮点合集(2)】

本文将持续更新~~ hello hello~ &#xff0c;这里是绝命Coding——老白~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#xff1a;绝命C…

提高论文发表机会:Nature Communications 最新研究教你如何巧妙回复审稿意见

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 对于科研搬砖人来说&#xff0c;在论文投稿过程中&#xff0c;如何有效回复审稿意见才能得到审稿人的认可&#xff0c;一直是一个让人困惑又带点玄学的问题。 但是&#xff0c…

【强化学习的数学原理】课程笔记--3(蒙特卡洛方法)

目录 蒙特卡洛方法MC Basic算法sparse reward MC Greedy 算法样本使用效率MC ϵ \epsilon ϵ-Greedy 算法一些例子 蒙特卡洛方法 第二节 推导贝尔曼最优公式中的&#xff1a; q π k ( s , a ) ∑ r P ( r ∣ s , a ) r γ ∑ s ′ P ( s ′ ∣ s , a ) v π k ( s ′ ) q…

vue3 ~ pinia学习

先看两个图 一个vuex 一个pinia 根据图看出来 pinia更简单了 那么具体怎么操作呢 我们来看下~ 第一步 下载 yarn add pinia # 或者使用 npm npm install pinia 第二步 注册 创建一个 pinia 实例 (根 store) 并将其传递给应用&#xff1a; import { createApp } from v…

代码随想录算法训练Day57|LeetCode200-岛屿数量、LeetCode695-岛屿的最大面积

岛屿数量 题目描述 力扣200-岛屿数量 给你一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。 岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此…

前端vue后端java使用easyexcel框架下载表格xls数据工具类

一 使用alibaba开源的 easyexcel框架&#xff0c;后台只需一个工具类即可实现下载 后端下载实现 依赖 pom.xml <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependen…

MATLAB-分类CPO-RF-Adaboost冠豪猪优化器(CPO)优化RF随机森林结合Adaboost分类预测(二分类及多分类)

MATLAB-分类CPO-RF-Adaboost冠豪猪优化器&#xff08;CPO&#xff09;优化RF随机森林结合Adaboost分类预测&#xff08;二分类及多分类&#xff09; 分类CPO-RF-Adaboost冠豪猪优化器&#xff08;CPO&#xff09;优化RF随机森林结合Adaboost分类预测&#xff08;二分类及多分类…

【web前端HTML+CSS+JS】--- HTML学习笔记01

学习链接&#xff1a;黑马程序员pink老师前端入门教程&#xff0c;零基础必看的h5(html5)css3移动端前端视频教程_哔哩哔哩_bilibili 学习文档&#xff1a; Web 开发技术 | MDN (mozilla.org) 一、前后端工作流程 WEB模型&#xff1a;前端用于采集和展示信息&#xff0c;中…

Web漏洞扫描工具AppScan与AWVS测评及使用体验

AppScan和AWVS业界知名的Web漏洞扫描工具&#xff0c;你是否也好奇到底哪一个能力更胜一筹呢&#xff1f;接下来跟随博主一探究竟吧。 1. 方案概览 第一步&#xff1a;安装一个用于评测的Web漏洞靶场&#xff08;本文采用最知名和最广泛使用的靶场&#xff0c;即OWASP Benchma…

啥?你没听过SpringBoot的FatJar?

写在最前面&#xff1a; SpringBoot是目前企业里最流行的框架之一&#xff0c;SpringBoot的部署方式多数采用jar包形式。通常&#xff0c;我们使用java -jar便可以直接运行jar文件。普通的jar只包含当前 jar的信息&#xff0c;当内部依赖第三方jar时&#xff0c;直接运行则会报…

robotframework-appiumLibrary 应用 - 实现 app 自动化

1、安装appiumLibrary第三方库 运行pip命令&#xff1a;pip install robotframework-appiumlibrary 若已安装&#xff0c;需要更新版本可以用命令&#xff1a;pip install -U robotframework-appiumlibrary 2、安装app自动化环境。 参考我的另外一篇专门app自动化环境安装的…

设计模式探索:策略模式

1. 什么是策略模式&#xff08;Strategy Pattern&#xff09; 定义 策略模式&#xff08;Strategy Pattern&#xff09;的原始定义是&#xff1a;定义一系列算法&#xff0c;将每一个算法封装起来&#xff0c;并使它们可以相互替换。策略模式让算法可以独立于使用它的客户端而…

打卡第4天----链表

通过学习基础,发现我的基本功还得需要再练练,思路得再更加清晰明了,这样子做算法题才能驾轻就熟。每天记录自己的进步。 一、两两交换 题目编号:24 题目描述: 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本…

[数据结构] 基于交换的排序 冒泡排序快速排序

标题&#xff1a;[数据结构] 基于交换的排序 冒泡排序&&快速排序 水墨不写bug &#xff08;图片来源于网络&#xff09; 目录 &#xff08;一&#xff09;冒泡排序 优化后实现&#xff1a; &#xff08;二&#xff09;快速排序 I、实现方法&#xff1a; &#…

opencv环境搭建-python

最近遇到了一些图像处理的需求&#xff0c;所以需要学习一下opencv,来记录一下我的学习历程。 安装numpy pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy安装matplotlib pip install -i https://pypi.tuna.tsinghua.edu.cn/simple matplotlib安装opencv …

ctfshow web入门 web338--web344

web338 原型链污染 comman.js module.exports {copy:copy };function copy(object1, object2){for (let key in object2) {if (key in object2 && key in object1) {copy(object1[key], object2[key])} else {object1[key] object2[key]}}}login.js var express …

gcc/g++的四步编译

目录 前言1.预处理&#xff08;进行宏替换&#xff09;2.编译&#xff08;生成汇编&#xff09;3.汇编&#xff08;生成二进制文件&#xff09;4. 链接 &#xff08;生成可执行文件&#xff09;a. 动态库 && 动态链接b. 静态库 && 静态链接c. 验证d. 动静态链接…

技术实现路径怎么写?(Word项目技术路径文档参考)

软件项目编写技术实现路径至关重要&#xff0c;因为它为项目团队提供了清晰的开发蓝图。这一路径明确了从项目启动到交付各阶段所需的技术方案、步骤及预期成果&#xff0c;有助于团队统一认识&#xff0c;确保开发工作有序进行。同时&#xff0c;技术实现路径有助于识别潜在的…

HetuEngine简介

目录 HetuEngine是什么&#xff1f; HetuEngine的特点以及使用场景 特点 使用场景 HetuEngine介绍 结构 近期用到了Hetu&#xff0c;了解下这个工具是起什么作用的。 HetuEngine是什么&#xff1f; 是引擎&#xff0c;设计是为了让与当前的大数据生态完美融合的引擎&am…

本安防爆手机:危险环境下的安全通信解决方案

在石油化工、煤矿、天然气等危险环境中&#xff0c;通信安全是保障工作人员生命安全和生产顺利进行的关键。防爆智能手机作为专为这些环境设计的通信工具&#xff0c;提供了全方位的安全通信解决方案。 防爆设计与材料&#xff1a; 防爆智能手机采用特殊的防爆结构和材料&…