GYM 游戏,如何去查看和修改 跳出每一个Episode的条件

每当我们运行 一个游戏后 如何去修改和设置成我们自己需要的条件呢?

import random
import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
import gym
from collections import namedtuple  # Import namedtuple
Transition = namedtuple('Transition', ('state', 'action', 'reward', 'next_state', 'done'))
# 定义神经网络模型
class DQN(nn.Module):
    def __init__(self, input_size, output_size):
        super(DQN, self).__init__()
        self.fc1 = nn.Linear(input_size, 128)
        self.fc2 = nn.Linear(128, 64)
        self.fc3 = nn.Linear(64, output_size)

    def forward(self, x):
        x = torch.relu(self.fc1(x))
        x = torch.relu(self.fc2(x))
        x = self.fc3(x)
        return x

# 经验回放缓冲区
class ReplayBuffer:
    def __init__(self, capacity):
        self.capacity = capacity
        self.buffer = []
        self.position = 0

    def push(self, state, action, reward, next_state, done):
        if len(self.buffer) < self.capacity:
            self.buffer.append(None)
        self.buffer[self.position] = (state, action, reward, next_state, done)
        self.position = (self.position + 1) % self.capacity

    def sample(self, batch_size):
        return random.sample(self.buffer, batch_size)

# DQN Agent
class DQNAgent:
    def __init__(self, state_dim, action_dim, buffer_capacity=10000, batch_size=32, lr=0.001, gamma=0.99):
        self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
        self.action_dim = action_dim
        self.batch_size = batch_size
        self.gamma = gamma

        self.policy_net = DQN(state_dim, action_dim).to(self.device)
        self.target_net = DQN(state_dim, action_dim).to(self.device)
        self.target_net.load_state_dict(self.policy_net.state_dict())
        self.target_net.eval()

        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=lr)
        self.criterion = nn.MSELoss()

        self.replay_buffer = ReplayBuffer(buffer_capacity)

    def select_action(self, state, epsilon):
        if random.random() < epsilon:
            return random.randint(0, self.action_dim - 1)
        else:
            with torch.no_grad():
                state = torch.FloatTensor(state).to(self.device)
                q_values = self.policy_net(state)
                return q_values.argmax().item()

    def update_model(self):
        if len(self.replay_buffer.buffer) < self.batch_size:
            return

        transitions = self.replay_buffer.sample(self.batch_size)

        batch = Transition(*zip(*transitions))

        state_batch = torch.Tensor(batch.state).to(self.device)
        action_batch = torch.tensor(batch.action, dtype=torch.int64).unsqueeze(1).to(self.device)

        reward_batch = torch.Tensor(batch.reward).to(self.device)
        next_state_batch = torch.Tensor(batch.next_state).to(self.device)
        done_batch = torch.Tensor(batch.done).to(self.device)

        q_values = self.policy_net(state_batch).gather(1, action_batch)

        next_q_values = self.target_net(next_state_batch).max(1)[0].unsqueeze(1)
        expected_q_values = reward_batch + (1 - done_batch) * self.gamma * next_q_values

        loss = self.criterion(q_values, expected_q_values)

        self.optimizer.zero_grad()
        loss.backward()
        self.optimizer.step()

    def update_target_network(self):
        self.target_net.load_state_dict(self.policy_net.state_dict())

# 主训练循环
env = gym.make('Acrobot-v1')
state_dim = env.observation_space.shape[0]
action_dim = env.action_space.n
agent = DQNAgent(state_dim, action_dim)

num_episodes = 1000
epsilon_start = 1.0
epsilon_final = 0.01
epsilon_decay = 0.995

for episode in range(num_episodes):
    state = env.reset()
    epsilon = max(epsilon_final, epsilon_start * (epsilon_decay ** episode))
    total_reward = 0

    while True:
        action = agent.select_action(state, epsilon)
        next_state, reward, done, _ = env.step(action)
        agent.replay_buffer.push(state, action, reward, next_state, done)
        state = next_state
        agent.update_model()
        total_reward += reward

        if done:
            break
        env.render()
    if episode % 10 == 0:
        agent.update_target_network()

    print(f"Episode: {episode}, Total Reward: {total_reward}")

env.close()

在gym.envs中即可查看:

代码是用于在OpenAI Gym中注册"Acrobot-v1"环境的。这段代码的作用是设置特定参数的环境,包括入口点、奖励阈值和最大回合步数。

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值