File size: 2,139 Bytes
64ea2b1
 
 
 
5df372e
64ea2b1
5df372e
 
 
 
64ea2b1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5df372e
64ea2b1
 
 
 
 
 
 
 
 
 
 
 
5df372e
64ea2b1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import torch
from agents.dqn_agent import dqn_agent, QNetwork
from agents.greedy_agent import greedy_agent
from agents.q_learning_agent import q_learning_agent
from agents.baseline_agent import llm_agent         
from env.tasks import task_easy, task_medium, task_hard
from agents.hybrid_agent import hybrid_agent, load_q_table
from agents.q_learning_agent import Q
load_q_table(Q)  



def run_episode(env, agent) -> float:
    state = env.reset()
    total_reward = 0.0
    done = False
    while not done:
        action = agent(state)
        state, reward, done, _ = env.step(action)
        total_reward += reward.value
    return total_reward


def evaluate():
    # Initialize DQN model
    input_dim = 3 + 1 + 1 + 3 + 1 + 1  # interest_vector(3) + fatigue + session_time + topic_vector(3) + quality + length
    dqn_model = QNetwork(input_dim)

    # Load trained weights if available
    try:
        dqn_model.load_state_dict(torch.load("dqn_model.pth", map_location="cpu"))
        dqn_model.eval()
        print("[INFO] Loaded dqn_model.pth")
    except FileNotFoundError:
        print("[WARN] dqn_model.pth not found - DQN using random weights")

    tasks = [
        ("Easy",   task_easy,   4.0),
        ("Medium", task_medium, 7.0),
        ("Hard",   task_hard,  11.0),
    ]

    agents = [
        ("Greedy",      lambda state: greedy_agent(state)),
        ("LLM",         lambda state: llm_agent(state)),
        ("Q-Learning",  lambda state: q_learning_agent(state)),
        ("DQN",         lambda state: dqn_agent(state, dqn_model)),
        ("Hybrid",      lambda state: hybrid_agent(state, dqn_model, Q)),
    ]

    for task_name, task_fn, norm in tasks:
        print(f"\n{'='*56}")
        print(f"Task: {task_name}")
        print(f"{'='*56}")

        for agent_name, agent_fn in agents:
            # IMPORTANT: fresh env for every agent so state isn't shared
            env = task_fn()
            reward = run_episode(env, agent_fn)
            score = min(1.0, reward / norm)
            print(f"  {agent_name:<14} reward={reward:6.2f}  score={score:.3f}")


if __name__ == "__main__":
    evaluate()