gym平衡木训练Q-learning完整代码

本文介绍了如何使用Python的gym库和Q-learning算法在CartPole-v0环境中训练一个AI模型,通过离散化状态和动作,实现强化学习过程中的决策制定和Q-table更新。
摘要由CSDN通过智能技术生成

在这里插入图片描述

安装

pip install gym

编码运行

#coding=utf8

import gym
import numpy as np

env = gym.make('CartPole-v0')

max_number_of_steps = 200   # 每一场游戏的最高得分
#---------获胜的条件是最近100场平均得分高于195-------------
goal_average_steps = 195
num_consecutive_iterations = 100
#----------------------------------------------------------
num_episodes = 5000 # 共进行5000场游戏
last_time_steps = np.zeros(num_consecutive_iterations)  # 只存储最近100场的得分(可以理解为是一个容量为100的栈)

# q_table是一个256*2的二维数组
# 离散化后的状态共有4^4=256中可能的取值,每种状态会对应一个行动
# q_table[s][a]就是当状态为s时作出行动a的有利程度评价值
# 我们的AI模型要训练学习的就是这个映射关系表
q_table = np.random.uniform(low=-1, high=1, size=(4 ** 4, env.action_space.n))

# 分箱处理函数,把[clip_min,clip_max]区间平均分为num段,位于i段区间的特征值x会被离散化为i
def bins(clip_min, clip_max, num):
    return np.linspace(clip_min, clip_max, num + 1)[1:-1]

# 离散化处理,将由4个连续特征值组成的状态矢量转换为一个0~~255的整数离散值
def digitize_state(observation):
    # 将矢量打散回4个连续特征值
    cart_pos, cart_v, pole_angle, pole_v = observation
    # 分别对各个连续特征值进行离散化(分箱处理)
    digitized = [np.digitize(cart_pos, bins=bins(-2.4, 2.4, 4)),
                 np.digitize(cart_v, bins=bins(-3.0, 3.0, 4)),
                 np.digitize(pole_angle, bins=bins(-0.5, 0.5, 4)),
                 np.digitize(pole_v, bins=bins(-2.0, 2.0, 4))]
    # 将4个离散值再组合为一个离散值,作为最终结果
    return sum([x * (4 ** i) for i, x in enumerate(digitized)])

# 根据本次的行动及其反馈(下一个时间步的状态),返回下一次的最佳行动
def get_action(state, action, observation, reward, episode):
    next_state = digitize_state(observation)
    epsilon = 0.5 * (0.99 ** episode)
    if  epsilon <= np.random.uniform(0, 1):
        next_action = np.argmax(q_table[next_state])
    else:
        next_action = np.random.choice([0, 1])
    #-------------------------------------训练学习,更新q_table----------------------------------
    alpha = 0.2     # 学习系数α
    gamma = 0.99    # 报酬衰减系数γ
    q_table[state, action] = (1 - alpha) * q_table[state, action] + alpha * (reward + gamma * q_table[next_state, next_action])
    # -------------------------------------------------------------------------------------------
    return next_action, next_state

# 重复进行一场场的游戏
for episode in range(num_episodes):
    observation = env.reset()   # 初始化本场游戏的环境
    state = digitize_state(observation)     # 获取初始状态值
    action = np.argmax(q_table[state])      # 根据状态值作出行动决策
    episode_reward = 0
    # 一场游戏分为一个个时间步
    for t in range(max_number_of_steps):
        env.render()    # 更新并渲染游戏画面
        observation, reward, done, info = env.step(action)
        # 对致命错误行动进行极大力度的惩罚,让模型恨恨地吸取教训
        if done:
            reward = -200
        action, state = get_action(state, action, observation, reward, episode)
        if done:
            print('%d Episode finished after %f time steps / mean %f' % (episode, t + 1,
                last_time_steps.mean()))
            last_time_steps = np.hstack((last_time_steps[1:], [t + 1]))
            break
            # 如果最近100场平均得分高于195
        if (last_time_steps.mean() >= goal_average_steps):
            print('Episode %d train agent successfuly!' % episode)
            break

    print('Failed!')

参考文章

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Q 学习(Q Learning)是一种强化学习算法,它可以帮助智能体在未知环境中学习最优行动策略。下面是一段关于Q 学习的Python 代码:import numpy as np# 定义Q Table Q = np.zeros([5,5])# 定义学习率 lr = 0.8# 定义折扣因子 gamma = 0.95# 定义环境参数 episodes = 1000# 定义奖励值 rewards = np.array([[0,0,0,0,1], [0,0,0,1,0], [0,0,1,0,0], [0,1,0,0,0], [1,0,0,0,0]])# 定义行动矩阵 action = np.array([[0,1,2,3,4], [4,3,2,1,0], [0,1,2,3,4], [4,3,2,1,0], [0,1,2,3,4]])# 开始循环 for i in range(episodes): # 随机选择起始状态 state = np.random.randint(0, 5) # 开始循环 while True: # 选择动作 action_index = np.random.randint(0, 5) # 获得下一个状态 next_state = action[state][action_index] # 计算Q值 q_target = rewards[state][action_index] + gamma * Q[next_state][np.argmax(Q[next_state])] q_predict = Q[state][action_index] # 更新Q值 Q[state][action_index] += lr * (q_target - q_predict) # 更新状态 state = next_state # 检查是否已经到达终止状态 if state == 4: break答:Q 学习是一种强化学习算法,用于帮助智能体学习如何在未知环境中作出最优行动。Python 代码实现Q 学习的关键步骤包括定义Q 表、设定学习率、定义折扣因子以及环境参数,然后通过计算Q值来更新Q 表,最终实现Q 学习的目的。 ### 回答2: Q-learning是一种强化学习算法,用于在不需要先验知识的情况下进行自我学习和优化。下面是一个关于Q-learning的简单示例代码: ``` import numpy as np # 创建一个有状态空间和动作空间的简单环境 env = np.array([ [0, -1, 0, -1, 0], [0, 0, -1, -1, -1], [0, -1, 0, -1, 100], [-1, -1, 0, 0, -1], [0, -1, 0, -1, 100] ]) # 定义q-table,用于存储状态-动作对的Q值 q_table = np.zeros((5, 5)) # 定义超参数 epochs = 1000 # 迭代次数 gamma = 0.8 # 折扣因子 epsilon = 0.1 # 探索因子 # Q-learning算法 for epoch in range(epochs): state = np.random.randint(0, 5) # 随机初始化状态 while True: if np.random.rand() < epsilon: action = np.random.randint(0, 5) # 以ε的概率进行随机探索 else: action = np.argmax(q_table[state]) # 选择具有最高Q值的动作 next_state = np.argmax(env[state]) # 根据当前动作选择下一个状态 max_q = np.max(q_table[next_state]) # 获取下一个状态的最大Q值 q_table[state, action] = env[state, action] + gamma * max_q # 更新Q值 state = next_state # 更新当前状态 if state == 4: # 到达目标状态时停止迭代 break # 打印训练后的Q-table print(q_table) ``` 在这段代码中,我们首先定义了一个简单的环境,包含5个状态和5个动作。然后,我们创建了一个Q-table,并初始化其所有Q值为0。接下来,使用Q-learning算法在环境中进行迭代训练,通过不断更新Q值来优化策略。在每个迭代步骤中,我们随机选择一个初始状态,并利用ε-greedy策略来选择动作。根据选择的动作和当前状态,我们更新Q-table中对应的Q值。当达到目标状态时,训练停止,并打印出训练后的Q-table。这样,我们就可以使用训练后的Q-table来进行最优策略的动作选择。 ### 回答3: 下面是关于Q-learning代码段: ``` import numpy as np # 定义Q-learning算法 def q_learning(env, num_episodes, learning_rate, discount_rate, epsilon): # 初始化Q表,维度为[state_space_size, action_space_size] q_table = np.zeros((env.observation_space.n, env.action_space.n)) # 开始训练 for episode in range(num_episodes): state = env.reset() # 初始化环境,获取初始状态 done = False # 当前回合是否结束 while not done: # 选择动作 if np.random.random() < epsilon: action = env.action_space.sample() # 随机选择一个动作 else: action = np.argmax(q_table[state, :]) # 根据Q表选择最佳动作 # 执行动作,观察下一个状态和回报 next_state, reward, done, _ = env.step(action) # 更新Q值 q_table[state, action] += learning_rate * (reward + discount_rate * np.max(q_table[next_state, :]) - q_table[state, action]) state = next_state # 更新状态 epsilon *= 0.99 # 衰减探索率 return q_table # 主程序 env = gym.make('FrozenLake-v0') # 创建FrozenLake环境 num_episodes = 10000 # 迭代次数 learning_rate = 0.1 # 学习率 discount_rate = 0.99 # 折扣率 epsilon = 1.0 # 探索率 trained_q_table = q_learning(env, num_episodes, learning_rate, discount_rate, epsilon) print(trained_q_table) ``` 这段代码实现了Q-learning算法,其中使用一个Q表来存储每个状态动作对的估计Q值。算法根据当前状态选择动作,执行动作后观察下一个状态和回报,并根据此更新Q值。通过多次迭代训练,最终得到训练好的Q表。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值