【零基础强化学习】教你训练基于SARSA的出租车调用


更多代码: gitee主页:https://gitee.com/GZHzzz
博客主页CSDN:https://blog.csdn.net/gzhzzaa

写在前面

出租车调用

  • Gym库的Taxi-v2环境实现了出租车调度问题的环境。导入环境后,可以用env.reset()来初始化环境,用env.step()来执行一步,用env.render()来显示当前局势。env.render()会打印出的局势图,其中乘客的位置、目的地会用彩色字母显示,出租车的位置会高亮显示。具体而言,如果乘客不在车上,乘客等待地点(位置)的字母会显示为蓝色。目的地所在的字母会显示为洋红色。如果乘客不在车上,出租车所在的位置会用黄色高亮;如果乘客在车上,出租车所在的位置会用绿色高亮。

在这里插入图片描述

show me code, no bb

import numpy as np
np.random.seed(0)
import pandas as pd
import matplotlib.pyplot as plt
import gym

# 环境使用
env = gym.make('Taxi-v3')
env.seed(0)
print('观察空间 = {}'.format(env.observation_space))
print('动作空间 = {}'.format(env.action_space))
print('状态数量 = {}'.format(env.observation_space.n))
print('动作数量 = {}'.format(env.action_space.n))

state = env.reset()
taxirow, taxicol, passloc, destidx = env.unwrapped.decode(state)
print(taxirow, taxicol, passloc, destidx)
print('的士位置 = {}'.format((taxirow, taxicol)))
print('乘客位置 = {}'.format(env.unwrapped.locs[passloc]))
print('目标位置 = {}'.format(env.unwrapped.locs[destidx]))
env.render()
env.step(0)
env.render()
# SARSA
class SARSAAgent:
    def __init__(self, env, gamma=0.9, learning_rate=0.2, epsilon=.01):
        self.gamma = gamma
        self.learning_rate = learning_rate
        self.epsilon = epsilon
        self.action_n = env.action_space.n
        self.q = np.zeros((env.observation_space.n, env.action_space.n))

    def decide(self, state):
        if np.random.uniform() > self.epsilon:
            action = self.q[state].argmax()
        else:
            action = np.random.randint(self.action_n)
        return action

    def learn(self, state, action, reward, next_state, done, next_action):
        u = reward + self.gamma * \
            self.q[next_state, next_action] * (1. - done)
        td_error = u - self.q[state, action]
        self.q[state, action] += self.learning_rate * td_error

def play_sarsa(env, agent, train=False, render=False):
    episode_reward = 0
    observation = env.reset()
    action = agent.decide(observation)
    while True:
        if render:
            env.render()
        next_observation, reward, done, _ = env.step(action)
        episode_reward += reward
        next_action = agent.decide(next_observation) # 终止状态时此步无意义
        if train:
            agent.learn(observation, action, reward, next_observation,
                    done, next_action)
        if done:
            break
        observation, action = next_observation, next_action
    return episode_reward
agent = SARSAAgent(env)

# 训练
episodes = 3000
episode_rewards = []
for episode in range(episodes):
    episode_reward = play_sarsa(env, agent, train=True)
    episode_rewards.append(episode_reward)

plt.plot(episode_rewards)

# 测试
agent.epsilon = 0.  # 取消探索

episode_rewards = [play_sarsa(env, agent) for _ in range(100)]
print('平均回合奖励 = {} / {} = {}'.format(sum(episode_rewards),
                                     len(episode_rewards), np.mean(episode_rewards)))

# 显示最优价值估计
print(pd.DataFrame(agent.q))
# 显示最优策略估计
policy = np.eye(agent.action_n)[agent.q.argmax(axis=-1)]
print(pd.DataFrame(policy))


  • 代码全部亲自跑过,你懂的!😝

结果展示

在这里插入图片描述

写在最后

十年磨剑,与君共勉!
更多代码gitee主页:https://gitee.com/GZHzzz
博客主页CSDN:https://blog.csdn.net/gzhzzaa

  • Fighting!😎

基于pytorch的经典模型基于pytorch的典型智能体模型
强化学习经典论文强化学习经典论文
在这里插入图片描述

while True:
	Go life

在这里插入图片描述

谢谢点赞交流!(❁´◡`❁)

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
多智能体强化学习 (Multi-agent Reinforcement Learning, MARL) 是指一个由多个个体组成的环境中,每个个体都有自己的决策空间,目标是通过与环境的交互,获取最大的累积奖励。MARL 的特点是不同个体之间相互影响,一个个体的决策将会影响其他个体的决策,因此 MARL 的复杂度比单智能体强化学习要高。其主要应用于博弈论、自动驾驶、机器人、智能交通等领域。 基于Sarsa的多智能体强化学习算法可以通过如下步骤实现: 1. 初始化每个智能体的策略,价值函数以及环境模型。 2. 每个智能体与环境交互进行学习,按照如下步骤进行: a. 根据当前状态,每个智能体选择一个行为。这里使用 $\epsilon$-贪心策略,即以一定概率随机选择行为,以一定概率选择当前最优行为。 b. 执行行为,更新环境状态。 c. 获取奖励,用于更新价值函数。 d. 根据新状态和价值函数更新智能体的策略。这里使用Sarsa(state-action-reward-state-action)算法,即使用当前策略选择一个行为,然后观察下一个状态及奖励,利用下一个状态和奖励更新当前价值函数,再根据新的价值函数更新策略。 e. 将状态更新为新状态,继续执行下一个动作。 3. 迭代多次执行以上步骤,直到收敛。 下面是基于Sarsa的多智能体强化学习的Python代码: ```python import numpy as np import random #定义环境 class Gridworld: def __init__(self, size): self.size = size self.state = np.zeros(2, dtype=np.int32) self.actions = np.array([[0,1],[0,-1],[1,0],[-1,0]]) self.rewards = np.array([[0,-10],[-10,0],[0,-10],[0,-10]]) #判断当前状态是否终止状态 def is_terminal(self, state): if ((state == [0,0]).all() or (state == [self.size-1,self.size-1]).all()): return True else: return False #获取当前状态的所有可选行为 def get_actions(self): return self.actions #更新状态 def update_state(self, action): new_state = self.state + action if new_state[0] < 0 or new_state[0] >= self.size or new_state[1] < 0 or new_state[1] >= self.size: return False else: self.state = new_state return True #获取当前状态的奖励 def get_reward(self): return self.rewards[np.where(np.all(self.actions == self.action, axis=1))[0][0]] #定义智能体 class Agent: def __init__(self, id, grid): self.id = id self.grid = grid self.q_table = np.zeros((grid.size, grid.size, 4)) #价值函数 self.epsilion = 0.1 #探索概率 self.alpha = 0.5 #学习率 self.gamma = 0.9 #衰减系数 #根据当前状态选择一个行为 def choose_action(self, state): if random.uniform(0,1) < self.epsilion: action = random.choice(self.grid.get_actions()) else: action = self.greedy_policy(state) return action #根据epsilon-greedy策略选择一个行为 def greedy_policy(self, state): values = self.q_table[state[0], state[1], :] max_value = np.max(values) actions = self.grid.get_actions() candidate_actions = [a for a in actions if values[np.where(np.all(self.grid.actions == a, axis=1))[0][0]] == max_value] return random.choice(candidate_actions) #执行一个周期,包括选择行为、执行行为、更新价值函数和策略 def run_cycle(self, state): self.action = self.choose_action(state) self.grid.update_state(self.action) reward = self.grid.get_reward() next_state = self.grid.state next_action = self.choose_action(next_state) value = self.q_table[state[0], state[1], np.where(np.all(self.grid.actions == self.action, axis=1))[0][0]] next_value = self.q_table[next_state[0], next_state[1], np.where(np.all(self.grid.actions == next_action, axis=1))[0][0]] td_error = reward + self.gamma * next_value - value self.q_table[state[0], state[1], np.where(np.all(self.grid.actions == self.action, axis=1))[0][0]] += self.alpha * td_error self.epsilion *= 0.99 #探索概率指数衰减 #执行多个周期 def run_cycles(self, num_cycles): for i in range(num_cycles): if self.grid.is_terminal(self.grid.state): self.grid.state = np.zeros(2, dtype=np.int32) state = self.grid.state self.run_cycle(state) #定义多智能体 class MultiAgent: def __init__(self, num_agents, grid): self.grid = grid self.agents = [Agent(i, grid) for i in range(num_agents)] #执行一个周期,让每个智能体分别执行一个周期 def run_cycle(self): for agent in self.agents: if self.grid.is_terminal(self.grid.state): self.grid.state = np.zeros(2, dtype=np.int32) state = self.grid.state agent.run_cycle(state) #执行多个周期 def run_cycles(self, num_cycles): for i in range(num_cycles): self.run_cycle() #设定环境大小和智能体数量 size = 4 num_agents = 2 #初始化环境和多智能体 grid = Gridworld(size) multi_agent = MultiAgent(num_agents, grid) #执行多个周期 multi_agent.run_cycles(1000) #输出每个智能体的价值函数 for agent in multi_agent.agents: print('agent', agent.id) print(agent.q_table) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北郭zz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值