【强化学习】Qlearning代码实现

前言

Qlearning其实就是在SARSA作了一点点修改,如果采取随机探索,时序差分的更新仍然使用概率最大。这种方法雀食能够在一定程度上加速模型的收敛。

代码实现

import gymnasium as gym
import numpy as np

class Qlearning():
    def __init__(self, states_n, action_n, greedy_e=0.1):
        self.Q = np.zeros((states_n, action_n)) #动作价值矩阵
        self.greedy_e = greedy_e #随机探索的概率
        self.states_n = states_n #环境状态个数
        self.action_n = action_n #行动状态个数
        self.gamma=0.9 #价值衰减值
        self.lr=0.1 #学习率

    def predict(self, states):
        action_list=self.Q[states] #先拿出对应的行
        #再取出对应价值最大的行为,如果有重复则在重复项中随机选取,返回索引
        action=np.random.choice(np.flatnonzero(action_list==action_list.max()))
        return action
    def act(self, states):
        '''
        由对应环境产生对应的行动
        @param states: 当前环境
        @return: 行动动作
        '''
        if np.random.uniform() < self.greedy_e: #是否采取随即探索
            action = np.random.choice(np.arange(self.action_n)) #随机探索
        else:
            action = self.predict(states) # 根据行动价值矩阵进行预测
        return action
    def learning(self,state,action,reward,next_state,does):
        '''
        学习更新参数
        @param state: 环境状态
        @param action: 采取的行动
        @param reward: 回报
        @param next_state: 采取行动后的下一个环境状态
        @param does: 游戏是否结束
        @return:
        '''
        current_q=self.Q[state,action] #取出对应的行动价值
        if does:
            next_q=reward #查看是否已经完成游戏,完成则直接将当前回报作为下一个行动价值
        else:
            #计算当前回报和下一个环境状态对应的最大价值,加和
            next_q=reward+self.gamma*self.Q[next_state].max()
        self.Q[state,action]+=self.lr*(next_q-current_q) #时序差分,更新行动价值矩阵


def train():
    env = gym.make("CliffWalking-v0", render_mode="human") #初始化游戏环境
    obs,info=env.reset() #重置位置
    agent=Qlearning(env.observation_space.n,env.action_space.n) #初始化模型
    action = agent.act(obs) #预测行为
    num=0
    while True:
        num+=1
        #由行为产生回报和下一个环境状态
        next_obs, reward, done, truncated, info = env.step(action)
        #更新参数
        agent.learning(obs,action,reward,next_obs,done)
        obs=next_obs
        action = agent.act(obs) #预测下一个环境所对应的行为
        if done or truncated: #判断游戏是否结束或者中断,是则重置游戏
            obs, info = env.reset()
        if num % 100 == 0 :
            env.close()


if __name__ == '__main__':
    train()
  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Q-learning 是一种基于反馈的学习算法,用于解决强化学习问题,它通过学习一系列动作和状态之间的最优策略来实现目标。Q-learning 的核心思想是通过不断地更新动作值函数 Q(s, a) 来找到最优的动作策略。 Q-learning 的基本步骤如下: 1. 初始化 Q(s, a) 表,其中 s 是状态,a 是动作,初始值可以是 0 或者随机值。 2. 选择动作 a ,并观察环境的反馈奖励 r 和新的状态 s'。 3. 更新 Q(s, a) 值:Q(s, a) = Q(s, a) + α * (r + γ * max(Q(s', a')) - Q(s, a)),其中 α 是学习率,γ 是折扣因子。 4. 将状态 s 更新为 s'。 5. 重复步骤 2-4 直到达到终止状态或者达到最大迭代次数。 下面是一个简单的 Q-learning 代码示例: ```python import numpy as np # 初始化 Q 表 Q = np.zeros([num_states, num_actions]) # 定义学习率 alpha = 0.1 # 定义折扣因子 gamma = 0.9 # 定义探索率,用于在训练过程中平衡探索和利用 epsilon = 0.1 for episode in range(num_episodes): state = env.reset() done = False while not done: # 在 ε-greedy 策略下选择动作 if np.random.rand() < epsilon: action = env.action_space.sample() # 随机选择一个动作 else: action = np.argmax(Q[state, :]) # 根据 Q 表选择最优动作 # 执行所选择的动作 next_state, reward, done, _ = env.step(action) # 根据 Q-learning 更新 Q 表 Q[state, action] = Q[state, action] + alpha * (reward + gamma * np.max(Q[next_state, :]) - Q[state, action]) state = next_state ``` 在这个示例中,我们使用了一个简单的环境来说明 Q-learning 的基本实现过程。在实际应用中,可以根据具体问题对算法做出一些改进和调整,以达到更好的性能和效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值