网站开发目的,纵横seo,沈阳营销型网站建设,韩国女排出线Hi#xff0c;大家好#xff0c;我是半亩花海。在本篇技术博客中#xff0c;我们将探讨如何使用 Q-Learning 算法来解决 Treasure on Right 游戏#xff0c;实现一个简单的强化学习。 一、游戏背景
Treasure on Right 游戏——一个简单的命令行寻宝游戏#xff0c;是一个… Hi大家好我是半亩花海。在本篇技术博客中我们将探讨如何使用 Q-Learning 算法来解决 Treasure on Right 游戏实现一个简单的强化学习。 一、游戏背景
Treasure on Right 游戏——一个简单的命令行寻宝游戏是一个经典的强化学习示例它模拟了一个智能体在有限状态空间中寻找宝藏的过程。游戏环境由一个线性状态空间组成智能体可以执行两个动作向左移动或向右移动。目标是让智能体学会在状态空间中移动找到宝藏它位于状态空间的最右侧。 二、Q-Learning 算法简介
Q-Learning 是一种基于值函数的强化学习算法用于解决智能体与环境交互的问题。它通过迭代更新状态-动作对的 Q 值来优化策略。Q 值表示在特定状态下采取特定动作的长期回报智能体通过学习最优的 Q 值来选择最佳动作。 三、代码拆解
1. 导入必要的库
首先导入 pandas、numpy 和 time 库以便进行数据处理、数组操作和控制程序运行时间。
import pandas as pd
import numpy as np
import time2. 定义常量和参数
在这个部分我们定义了游戏中所需的常量和参数包括状态数量、动作集合、epsilon 贪婪度、学习率、奖励衰减因子等。
N_STATES 6 # 状态数量
ACTIONS [left, right] # 动作集合
EPSILON 0.9 # epsilon-greedy算法中的贪婪度
ALPHA 0.1 # 学习率
GAMMA 0.9 # 奖励衰减因子
MAX_EPISODES 15 # 最大训练轮数
FRESH_TIME 0.3 # 每一步的时间间隔
TerminalFlag terminal # 终止状态标识3. 创建Q表
我们定义了一个函数来创建 Q 表格用于存储状态-动作对的 Q 值。初始时所有的 Q 值都被初始化为 0。
def build_q_table(n_states, actions):return pd.DataFrame( np.zeros((n_states, len(actions))), columnsactions )4. 选择动作
这个函数根据当前状态和 Q 表格选择动作。我们使用 ε-greedy 策略以一定的概率随机选择动作以便在探索和利用之间取得平衡。
def choose_action(state, q_table):state_table q_table.loc[state, :]if (np.random.uniform() EPSILON) or ((state_table 0).all()):action_name np.random.choice(ACTIONS)else:action_name state_table.idxmax()return action_name5. 获取环境反馈
这个函数模拟了智能体与环境的交互过程根据智能体采取的动作返回下一个状态和相应的奖励。
def get_env_feedback(S, A):if A right:if S N_STATES - 2:S_, R TerminalFlag, 1else:S_, R S 1, 0else:S_, R max(0, S - 1), 0return S_, R6. 更新环境
这个函数用于更新环境的显示以便智能体能够观察到当前状态。
def update_env(S, episode, step_counter):env_list [-] * (N_STATES - 1) [T] if S TerminalFlag: interaction Episode %s: total_steps %s % (episode 1, step_counter) print(interaction) time.sleep(2) else: env_list[S] 0 interaction .join(env_list) print(interaction) time.sleep(FRESH_TIME) 7. Q-learning主循环
这个函数包含了整个Q-learning的主要逻辑包括选择动作、获取环境反馈和更新Q值等步骤。
def rl():q_table build_q_table(N_STATES, ACTIONS)for episode in range(MAX_EPISODES): step_counter 0S 0is_terminated Falseupdate_env(S, episode, step_counter) while not is_terminated: A choose_action(S, q_table) S_, R get_env_feedback(S, A) q_predict q_table.loc[S, A] if S_ ! TerminalFlag: q_target R GAMMA * q_table.loc[S_, :].max() else: q_target R is_terminated True q_table.loc[S, A] ALPHA * (q_target - q_predict) S S_ update_env(S, episode, step_counter 1) step_counter 1 return q_table8. 主程序入口
在这部分代码中我们运行整个程序执行Q-learning算法并输出最终的Q表格。
if __name__ __main__:q_table rl() print(q_table) 四、项目意义和应用价值
Treasure on Right 游戏作为一个简单的强化学习示例展示了 Q-Learning 算法在解决智能体与环境交互问题中的应用。通过实现这个项目我们可以深入理解强化学习算法的工作原理并了解如何利用这种算法解决实际问题。Q-Learning 算法及其变体在许多领域都有广泛的应用如机器人控制、自动驾驶、游戏设计等。通过掌握这种算法我们可以为各种应用场景开发智能决策系统从而提高效率、优化资源利用甚至解决复杂的实时决策问题。
在学术界和工业界Q-Learning 算法已经被广泛应用并且不断被改进和扩展以解决更加复杂的问题。因此掌握 Q-Learning 算法对于从事人工智能和机器学习领域的工程师和研究人员来说是非常重要的。 五、完整代码
# 使用Q-Learning算法来实现treasure on right游戏(宝藏在最右边的位置:训练一个智能体去获得这个宝藏)
import pandas as pd
import numpy as np
import timeN_STATES 6 # 状态数量
ACTIONS [left, right] # 动作集合
EPSILON 0.9 # epsilon-greedy算法中的贪婪度
ALPHA 0.1 # 学习率
GAMMA 0.9 # 奖励衰减因子
MAX_EPISODES 15 # 最大训练轮数
FRESH_TIME 0.3 # 每一步的时间间隔
TerminalFlag terminal # 终止状态标识# 创建Q表
def build_q_table(n_states, actions):return pd.DataFrame( # 创建一个DataFrame对象np.zeros((n_states, len(actions))), # 用0初始化一个n_states行len(actions)列的数组columnsactions # 设置DataFrame的列名为动作列表)# 根据当前状态选择动作
def choose_action(state, q_table):state_table q_table.loc[state, :] # 获取Q表中对应状态行的值if (np.random.uniform() EPSILON) or ((state_table 0).all()): # 判断是否随机选择动作action_name np.random.choice(ACTIONS) # 如果满足条件随机选择一个动作else:action_name state_table.idxmax() # 否则选择具有最大值的动作return action_name # 返回选择的动作# 获取环境的反馈包括下一个状态和奖励
def get_env_feedback(S, A):if A right: # 如果动作是向右移动if S N_STATES - 2: # 如果当前状态是倒数第二个状态S_, R TerminalFlag, 1 # 下一个状态是终止状态奖励为1else: # 否则S_, R S 1, 0 # 下一个状态向右移动一步奖励为0else: # 如果动作不是向右移动S_, R max(0, S - 1), 0 # 下一个状态向左移动一步奖励为0return S_, R # 返回下一个状态和奖励# 更新环境
def update_env(S, episode, step_counter):env_list [-] * (N_STATES - 1) [T] # 创建一个环境列表长度为N_STATES-1最后一个元素为终止标志Tif S TerminalFlag: # 如果当前状态为终止状态interaction Episode %s: total_steps %s % (episode 1, step_counter) # 打印本次训练的步数print(interaction) # 打印信息time.sleep(2) # 等待2秒else: # 如果当前状态不是终止状态env_list[S] 0 # 在环境列表中将当前状态位置标记为0interaction .join(env_list) # 将环境列表转换为字符串print(interaction) # 打印环境状态time.sleep(FRESH_TIME) # 等待一段时间# Q-learning主循环
def rl():# 创建Q表: 存储的表记录的是, 在状态S下, 每个行为A的Q值q_table build_q_table(N_STATES, ACTIONS)for episode in range(MAX_EPISODES): # 对于每一轮训练(episode)step_counter 0 # 记录每个episode的步数S 0 # 初始状态is_terminated False # 用于判断是否到达终止状态update_env(S, episode, step_counter) # 更新环境显示# 在未到达终止状态的情况下进行循环while not is_terminated: # 如果未到达终止状态A choose_action(S, q_table) # 选择动作S_, R get_env_feedback(S, A) # 获取环境反馈下一个状态和奖励q_predict q_table.loc[S, A] # 获取Q值的预测值# 根据下一个状态是否为终止状态更新Q值的目标值if S_ ! TerminalFlag: # 如果下一个状态不是终止状态q_target R GAMMA * q_table.loc[S_, :].max() # 使用贝尔曼方程计算目标Q值else: # 如果下一个状态是终止状态q_target R # 目标Q值为即时奖励is_terminated True # 到达终止状态q_table.loc[S, A] ALPHA * (q_target - q_predict) # 使用Q-learning更新Q表S S_ # 更新当前状态update_env(S, episode, step_counter 1) # 更新环境显示step_counter 1 # 步数加1return q_tableif __name__ __main__:q_table rl() # 运行Q-learning算法print(q_table) # 打印Q表