首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于Q-Learning算法的SARSA在冰湖游戏中的实现

基于Q-Learning算法的SARSA在冰湖游戏中的实现
EN

Stack Overflow用户
提问于 2021-06-25 02:01:45
回答 1查看 88关注 0票数 1

我正在使用Q-Learning和SARSA算法解决冰冻湖游戏。我有Q-Learning算法的代码实现,这是可行的。这段代码摘自Maxim Lapan的“深度强化学习实践”的第5章。我试图对这段代码进行修改,以实现SARSA而不是Q-Learning,但我不知道如何做到这一点。我研究过这两种算法,但对如何将它们转换为代码感到迷惑。我必须对此代码进行哪些更改才能实现SARSA?

代码语言:javascript
复制
# Code pulled from Max Lapan textbook
#
#!/usr/bin/env python3
import gym
import collections
import tensorboard
import torch
from torch.utils.tensorboard import SummaryWriter

ENV_NAME = "FrozenLake-v0"
GAMMA = 0.9
TEST_EPISODES = 150


class Agent:
    def __init__(self):
        self.env = gym.make(ENV_NAME)
        self.state = self.env.reset()
        self.rewards = collections.defaultdict(float)
        self.transits = collections.defaultdict(collections.Counter)
        self.values = collections.defaultdict(float)

    def play_n_random_steps(self, count):
        for _ in range(count):
            action = self.env.action_space.sample()
            new_state, reward, is_done, _ = self.env.step(action)
            self.rewards[(self.state, action, new_state)] = reward
            self.transits[(self.state, action)][new_state] += 1
            self.state = self.env.reset() if is_done else new_state

    def select_action(self, state):
        best_action, best_value = None, None
        for action in range(self.env.action_space.n):
            action_value = self.values[(state, action)]
            if best_value is None or best_value < action_value:
                best_value = action_value
                best_action = action
        return best_action

    def play_episode(self, env):
        total_reward = 0.0
        state = env.reset()
        while True:
            action = self.select_action(state)
            new_state, reward, is_done, _ = env.step(action)
            self.rewards[(state, action, new_state)] = reward
            self.transits[(state, action)][new_state] += 1
            total_reward += reward
            if is_done:
                break
            state = new_state
        return total_reward

    def value_iteration(self):
        for state in range(self.env.observation_space.n):
            for action in range(self.env.action_space.n):
                action_value = 0.0
                target_counts = self.transits[(state, action)]
                total = sum(target_counts.values())
                for tgt_state, count in target_counts.items():
                    reward = self.rewards[(state, action, tgt_state)]
                    best_action = self.select_action(tgt_state)
                    action_value += (count / total) * (reward + GAMMA * self.values[(tgt_state, best_action)])
                self.values[(state, action)] = action_value


if __name__ == "__main__":
    test_env = gym.make(ENV_NAME)
    agent = Agent()
    writer = SummaryWriter(comment="-q-iteration")

    iter_no = 0
    best_reward = 0.0
    while True:
        iter_no += 1
        agent.play_n_random_steps(100)
        agent.value_iteration()

        reward = 0.0
        for _ in range(TEST_EPISODES):
            reward += agent.play_episode(test_env)
        reward /= TEST_EPISODES
        writer.add_scalar("reward", reward, iter_no)
        if reward > best_reward:
            print("Best reward updated %.3f -> %.3f" % (best_reward, reward))
            best_reward = reward
        if reward > 0.80:
            print("Solved in %d iterations!" % iter_no)
            break
    writer.close()
EN

回答 1

Stack Overflow用户

发布于 2021-06-26 17:06:43

我不知道它是否会有帮助,但我在过去开发了一种算法,可以在一个名为Gridworld的游戏中比较两个代理的性能。其中一个代理使用Q-learning,另一个使用SARSA。

您可以在以下位置找到代码文件:https://github.com/Elpazzu/AI-models/blob/master/Reinforcement-Learning/Gridworld

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68120692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档