From 7c9a687770c184ac2b524d9f0c136e0c3b9eed97 Mon Sep 17 00:00:00 2001 From: god <2501229495@qq.com> Date: Mon, 15 Dec 2025 22:33:08 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20DoubleDQN=20=E8=AE=AD?= =?UTF-8?q?=E7=BB=83=E4=B8=8E=E8=AF=84=E4=BC=B0=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Car-Racing/configs/double_dqn.yaml | 7 +++ .../doubledqn_model/eval_doubledqn.py | 45 +++++++++++++++++++ src/Car-Racing/{ => dqn_model}/DQN_model.py | 0 src/Car-Racing/{ => dqn_model}/eval_dqn.py | 0 .../{ => dqn_model}/training_dqn.py | 0 5 files changed, 52 insertions(+) create mode 100644 src/Car-Racing/configs/double_dqn.yaml create mode 100644 src/Car-Racing/doubledqn_model/eval_doubledqn.py rename src/Car-Racing/{ => dqn_model}/DQN_model.py (100%) rename src/Car-Racing/{ => dqn_model}/eval_dqn.py (100%) rename src/Car-Racing/{ => dqn_model}/training_dqn.py (100%) diff --git a/src/Car-Racing/configs/double_dqn.yaml b/src/Car-Racing/configs/double_dqn.yaml new file mode 100644 index 0000000000..b573651ac8 --- /dev/null +++ b/src/Car-Racing/configs/double_dqn.yaml @@ -0,0 +1,7 @@ +# Extends base DQN config +_extends: ./dqn.yaml + +hyperparameters: + # Double DQN specific + tau: 0.005 # For soft target updates + update_target_every: 10000 # Less frequent hard updates \ No newline at end of file diff --git a/src/Car-Racing/doubledqn_model/eval_doubledqn.py b/src/Car-Racing/doubledqn_model/eval_doubledqn.py new file mode 100644 index 0000000000..bdc3c02dd6 --- /dev/null +++ b/src/Car-Racing/doubledqn_model/eval_doubledqn.py @@ -0,0 +1,45 @@ +import os +import sys +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) + +import double_dqn_model.double_dqn as DDQN +import gymnasium as gym +from gymnasium.wrappers import GrayscaleObservation, ResizeObservation, FrameStackObservation, RecordVideo + +# Load the saved model +save_dir = 'training\saved_models' +model_file = 'DoubleDQN.pt' +driver = DDQN.DoubleDQNAgent( + state_space_shape=(4, 84, 84), + action_n=5, + load_state=True, + load_model=model_file +) + +# Evaluate +def evaluate_agent(agent, num_episodes=5, render=True): + env = gym.make("CarRacing-v3", continuous=False, render_mode="rgb_array") + env = RecordVideo(env, video_folder='videos\DoubleDQN') + env = DDQN.SkipFrame(env, skip=4) + env = GrayscaleObservation(env) + env = ResizeObservation(env, (84, 84)) + env = FrameStackObservation(env, stack_size=4) + agent.epsilon = 0 + seeds_list = [i for i in range(num_episodes)] + scores = [] + for episode, seed in enumerate(seeds_list): + state, info = env.reset(seed=seed) + score = 0 + updating = True + while updating: + action = agent.take_action(state) + state, reward, terminated, truncated, info = env.step(action) + score += reward + updating = not (terminated or truncated) + scores.append(score) + print(f"Evaluation Episode {episode+1}/{num_episodes} | Seed: {seed} | Score: {score:.1f}") + env.close() + return sum(scores) / len(scores) + +avg_score = evaluate_agent(driver, num_episodes=5, render=True) +print(f"Average evaluation score: {avg_score:.1f}") \ No newline at end of file diff --git a/src/Car-Racing/DQN_model.py b/src/Car-Racing/dqn_model/DQN_model.py similarity index 100% rename from src/Car-Racing/DQN_model.py rename to src/Car-Racing/dqn_model/DQN_model.py diff --git a/src/Car-Racing/eval_dqn.py b/src/Car-Racing/dqn_model/eval_dqn.py similarity index 100% rename from src/Car-Racing/eval_dqn.py rename to src/Car-Racing/dqn_model/eval_dqn.py diff --git a/src/Car-Racing/training_dqn.py b/src/Car-Racing/dqn_model/training_dqn.py similarity index 100% rename from src/Car-Racing/training_dqn.py rename to src/Car-Racing/dqn_model/training_dqn.py