{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Notebook 02: Agents in Grid World\n",
"\n",
"Trong notebook này, chúng ta sẽ cài đặt và so sánh ba loại agent:\n",
"- Reflex agent (tác nhân phản xạ)\n",
"- Goal-based agent (tác nhân dựa trên mục tiêu)\n",
"- Utility-based agent (tác nhân dựa trên hàm hữu dụng)\n",
"\n",
"Môi trường minh họa là **Grid World**."
]
},
{
"cell_type": "code",
"execution_count": 184,
"metadata": {},
"outputs": [],
"source": [
"import random\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"\n",
"class GridWorld:\n",
" def __init__(self, size=5, start=(0,0), goal=(4,4), obstacles=[]):\n",
" self.size = size\n",
" self.start = start\n",
" self.goal = goal\n",
" self.obstacles = obstacles\n",
" self.reset()\n",
"\n",
" def reset(self):\n",
" self.agent_pos = self.start\n",
" return self.agent_pos\n",
"\n",
" def step(self, action):\n",
" x, y = self.agent_pos\n",
" if action == 'UP':\n",
" new_pos = (x-1, y)\n",
" elif action == 'DOWN':\n",
" new_pos = (x+1, y)\n",
" elif action == 'LEFT':\n",
" new_pos = (x, y-1)\n",
" elif action == 'RIGHT':\n",
" new_pos = (x, y+1)\n",
" else:\n",
" new_pos = self.agent_pos\n",
"\n",
" # Kiểm tra biên và chướng ngại vật\n",
" if (0 <= new_pos[0] < self.size and 0 <= new_pos[1] < self.size and new_pos not in self.obstacles):\n",
" self.agent_pos = new_pos\n",
" \n",
" reward = -1\n",
" done = False\n",
" if self.agent_pos == self.goal:\n",
" reward = 10\n",
" done = True\n",
" return self.agent_pos, reward, done\n",
"\n",
" def render(self, trajectory=None, agent_pos=None, show=True):\n",
" fig, ax = plt.subplots(figsize=(5,5))\n",
" ax.set_xticks(range(self.size))\n",
" ax.set_yticks(range(self.size))\n",
" ax.grid(True)\n",
" ax.set_xlim(-0.5, self.size - 0.5)\n",
" ax.set_ylim(-0.5, self.size - 0.5)\n",
" ax.invert_yaxis()\n",
"\n",
" # Vẽ chướng ngại vật\n",
" for (x,y) in self.obstacles:\n",
" ax.text(y, x, \"X\", ha=\"center\", va=\"center\", fontsize=14, color=\"red\")\n",
"\n",
" # Vẽ start & goal\n",
" ax.text(self.start[1], self.start[0], \"S\", ha=\"center\", va=\"center\", fontsize=14, color=\"blue\")\n",
" ax.text(self.goal[1], self.goal[0], \"G\", ha=\"center\", va=\"center\", fontsize=14, color=\"green\")\n",
"\n",
" # Vẽ quỹ đạo\n",
" if trajectory is not None and len(trajectory) > 1:\n",
" xs, ys = zip(*trajectory)\n",
" ax.plot(ys, xs, marker=\"o\", linestyle=\"--\", alpha=0.7, color=\"orange\")\n",
"\n",
" # Vẽ agent\n",
" cur = agent_pos if agent_pos is not None else self.agent_pos\n",
" ax.text(cur[1], cur[0], \"A\", ha=\"center\", va=\"center\", fontsize=14, color=\"purple\")\n",
"\n",
" # Tiêu đề: số bước\n",
" steps = (len(trajectory)-1) if trajectory else 0\n",
" ax.set_title(f\"Agent at {cur} | Steps: {steps}\")\n",
"\n",
" if show:\n",
" plt.show()\n",
" else:\n",
" return fig, ax\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 185,
"metadata": {},
"outputs": [],
"source": [
"class ReflexAgent:\n",
" def __init__(self, env):\n",
" self.env = env\n",
"\n",
" def act(self):\n",
" # Chọn hành động ngẫu nhiên nhưng tránh va chạm\n",
" possible_actions = ['UP','DOWN','LEFT','RIGHT']\n",
" random.shuffle(possible_actions)\n",
" for action in possible_actions:\n",
" x, y = self.env.agent_pos\n",
" if action == 'UP': new_pos = (x-1, y)\n",
" elif action == 'DOWN': new_pos = (x+1, y)\n",
" elif action == 'LEFT': new_pos = (x, y-1)\n",
" else: new_pos = (x, y+1)\n",
" if (0 <= new_pos[0] < self.env.size and 0 <= new_pos[1] < self.env.size and new_pos not in self.env.obstacles):\n",
" return action\n",
" return 'UP'"
]
},
{
"cell_type": "code",
"execution_count": 186,
"metadata": {},
"outputs": [],
"source": [
"class GoalBasedAgent:\n",
" def __init__(self, env):\n",
" self.env = env\n",
"\n",
" def act(self):\n",
" # Di chuyển tham lam hướng về goal\n",
" ax, ay = self.env.agent_pos\n",
" gx, gy = self.env.goal\n",
" if gx > ax:\n",
" return 'DOWN'\n",
" elif gx < ax:\n",
" return 'UP'\n",
" elif gy > ay:\n",
" return 'RIGHT'\n",
" elif gy < ay:\n",
" return 'LEFT'\n",
" else:\n",
" return random.choice(['UP','DOWN','LEFT','RIGHT'])"
]
},
{
"cell_type": "code",
"execution_count": 187,
"metadata": {},
"outputs": [],
"source": [
"class UtilityBasedAgent:\n",
" def __init__(self, env):\n",
" self.env = env\n",
"\n",
" def act(self):\n",
" # Chọn hành động dựa trên hàm hữu dụng (khoảng cách Manhattan)\n",
" actions = ['UP','DOWN','LEFT','RIGHT']\n",
" best_action = None\n",
" best_utility = -float('inf')\n",
" for action in actions:\n",
" x, y = self.env.agent_pos\n",
" if action == 'UP': new_pos = (x-1, y)\n",
" elif action == 'DOWN': new_pos = (x+1, y)\n",
" elif action == 'LEFT': new_pos = (x, y-1)\n",
" else: new_pos = (x, y+1)\n",
"\n",
" if (0 <= new_pos[0] < self.env.size and 0 <= new_pos[1] < self.env.size and new_pos not in self.env.obstacles):\n",
" # Utility = - khoảng cách đến goal\n",
" gx, gy = self.env.goal\n",
" utility = - (abs(new_pos[0]-gx) + abs(new_pos[1]-gy))\n",
" if utility > best_utility:\n",
" best_utility = utility\n",
" best_action = action\n",
" return best_action if best_action else random.choice(actions)"
]
},
{
"cell_type": "code",
"execution_count": 188,
"id": "64ceb558",
"metadata": {},
"outputs": [],
"source": [
"import random\n",
"\n",
"# Định nghĩa RandomAgent thật sự ngẫu nhiên\n",
"class RandomAgent:\n",
" def __init__(self, env):\n",
" self.env = env\n",
"\n",
" def act(self):\n",
" possible_actions = ['UP', 'DOWN', 'LEFT', 'RIGHT']\n",
" return random.choice(possible_actions)\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 189,
"id": "179405bb",
"metadata": {},
"outputs": [],
"source": [
"import random\n",
"import numpy as np\n",
"\n",
"class LearningAgent:\n",
" def __init__(self, env,\n",
" alpha=0.5, gamma=0.9,\n",
" epsilon=1.0, epsilon_min=0.1, epsilon_decay=0.9995,\n",
" episodes=20000, max_steps=50):\n",
" self.env = env\n",
" self.alpha = alpha # Learning rate\n",
" self.gamma = gamma # Discount factor\n",
" self.epsilon = epsilon # Exploration rate\n",
" self.epsilon_min = epsilon_min\n",
" self.epsilon_decay = epsilon_decay\n",
" self.episodes = episodes\n",
" self.max_steps = max_steps # giới hạn bước mỗi episode\n",
" self.actions = ['UP','DOWN','LEFT','RIGHT']\n",
" self.q_table = {} # {(state, action): value}\n",
"\n",
" def get_q(self, state, action):\n",
" return self.q_table.get((state, action), 0.0)\n",
"\n",
" def choose_action(self, state):\n",
" \"\"\"Epsilon-greedy policy\"\"\"\n",
" if random.random() < self.epsilon:\n",
" return random.choice(self.actions)\n",
" qs = [self.get_q(state, a) for a in self.actions]\n",
" return self.actions[np.argmax(qs)]\n",
"\n",
" def learn(self):\n",
" \"\"\"Huấn luyện nhiều episode\"\"\"\n",
" for ep in range(self.episodes):\n",
" self.env.reset()\n",
" state = self.env.agent_pos\n",
" done = False\n",
" steps = 0\n",
"\n",
" while not done and steps < self.max_steps:\n",
" action = self.choose_action(state)\n",
" next_state, _, done = self.env.step(action)\n",
"\n",
" # 🎯 Reward shaping\n",
" if next_state == self.env.goal:\n",
" reward = 100\n",
" done = True\n",
" elif next_state in self.env.obstacles:\n",
" reward = -50\n",
" done = True\n",
" else:\n",
" reward = -1\n",
"\n",
" # Q-learning update\n",
" max_q_next = max([self.get_q(next_state, a) for a in self.actions])\n",
" old_q = self.get_q(state, action)\n",
" new_q = old_q + self.alpha * (reward + self.gamma * max_q_next - old_q)\n",
" self.q_table[(state, action)] = new_q\n",
"\n",
" state = next_state\n",
" steps += 1\n",
"\n",
" # Decay epsilon (khám phá ít dần)\n",
" self.epsilon = max(self.epsilon_min, self.epsilon * self.epsilon_decay)\n",
"\n",
" # Decay alpha nhẹ (tránh overfitting)\n",
" self.alpha = max(0.01, self.alpha * 0.999)\n",
"\n",
" def act(self):\n",
" \"\"\"Chọn hành động greedy khi chạy thử nghiệm\"\"\"\n",
" state = self.env.agent_pos\n",
" qs = [self.get_q(state, a) for a in self.actions]\n",
" return self.actions[np.argmax(qs)]\n"
]
},
{
"cell_type": "code",
"execution_count": 190,
"metadata": {},
"outputs": [],
"source": [
"def run_episode(env, agent, max_steps=50):\n",
" pos = env.reset()\n",
" done = False\n",
" trajectory = [pos]\n",
" for _ in range(max_steps):\n",
" action = agent.act()\n",
" pos, reward, done = env.step(action)\n",
" trajectory.append(pos)\n",
" if done:\n",
" break\n",
" return trajectory"
]
},
{
"cell_type": "code",
"execution_count": 191,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"Running Reflex agent:\n",
"Trajectory: [(0, 0), (1, 0), (2, 0), (3, 0), (4, 0), (5, 0), (6, 0), (6, 1), (6, 2), (6, 1), (6, 2), (5, 2), (4, 2), (3, 2), (4, 2), (4, 1), (4, 0), (4, 1), (4, 0), (3, 0), (4, 0), (5, 0), (6, 0), (6, 1), (5, 1), (5, 0), (6, 0), (6, 1), (5, 1), (4, 1), (5, 1), (5, 2), (5, 3), (6, 3), (5, 3), (5, 2), (5, 1), (5, 0), (5, 1), (6, 1), (5, 1), (4, 1), (5, 1), (5, 2), (5, 3), (5, 4), (5, 5), (5, 4), (5, 5), (4, 5), (3, 5)]\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAaoAAAHDCAYAAAB1dF5kAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjUsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvWftoOwAAAAlwSFlzAAAPYQAAD2EBqD+naQAALvdJREFUeJzt3Ql8FeW9//FvEkIQAVECsoXFBZBVZPEqLuxUAcXrVkDBvVLABfm3Wr0VWhV6KxZLKYtYtHoRLIooF8SoCKJw2UoFq4KKRUG2FggQDIHM//V7eCUNWUhOSHKeM/m8X695neScyczzzBzmO88zzwxxQRAEAgDAU/HRLgAAACdDUAEAvEZQAQC8RlABALxGUAEAvEZQAQC8RlABALxGUAEAvEZQAQC8RlABhVi1apUqV66sf/zjH/LBP//5T51++ulauHBhsf+ma9euuu2228q0XEBZI6gqmD/+8Y+Ki4vTxRdfLF/L98ILL5T6cp966im98cYbEf3No48+qoEDB6px48Y57z333HO68sordfbZZyspKUlNmzbV7bffrm+++abEZbP62j4paNqxY0fOfLVq1dJdd92l//qv/1JZ2LBhg2644QZX3ypVqqhBgwbq1auXJk2adMrb0icff/yxLrvsMlWtWlV169bVfffdp4MHD0a7WDiJOJ71V7F06dJF27dvdwfWzZs367zzzpNPWrdureTkZH3wwQelutxq1aq5g3BxQ3D9+vVq3769O6hdcsklOe//9Kc/VXp6utq0aaMzzzxTW7ZsceF17Ngx/e1vf1P9+vUjLpuVycLuV7/6lQu+3KzMFhrZPvvsM7Vs2VLvvfeeunfvXqwWVZMmTYqst9WzW7duatSokYYOHeoO4N9++61Wrlypr776Sl9++WWJt6VPbL/a/rzgggt0zz336LvvvtPTTz/t6r5o0aJoFw+FqFTYBwgfO6jaAen111/XT37yE/3P//yPHn/88WgXy0szZ850B+3/+I//yNfiy2vAgAHq2LGj/vznP+vhhx8u8Tqvuuoqt5yTsQOshbmFRHGCqriefPJJnXHGGVq9erVq1qx5wme7du1SWPziF79wJxh2IlSjRg33ngX53XffrXfeeUe9e/eOdhFRALr+KhALJvtH2rdvX3dGbL8Xdi3k1ltvdf+Q7aBlZ9jWWrCuqLxn0Z9//rlb1llnneXO/O1A++abbxbYtfXRRx9p1KhRql27trvWct1112n37t0589kB49NPP9XSpUtzur6sRXAydjZ86aWXum6x0047TR06dNDcuXNPmMeWc+jQIb344os5yy3quo11bVkQ2LxFsXKbffv26VQdOHDAtc5Oxrrj3nrrLZVmZ4i1mlq1apUvpEydOnWKvS23bdumO+64I6dr1Jb5pz/96YTlWUjY382ZM8cFh7Xe7PtwzTXXuFZcbtbqv/7669089v1q2LChfvzjH2v//v058+zZs8d9D62lezJpaWlKTU3VLbfckhNSZsiQIa6V+Oqrr0a41VBurOsPFUOLFi2CO++80/28bNkyO8oFq1atOmGeY8eOBZdcckmQkJAQjBgxIvjDH/4Q9OrVK2jXrp2bf+bMmTnzbty4MTjjjDOCli1bBr/5zW/cvFdccUUQFxcXvP766znz2d/Y37Zv3z7o3r17MGnSpOChhx5y67jpppty5ps3b17QsGFDV86XXnrJTe+8885J62Tz//SnP3XrfuaZZ4LOnTu7dS1YsCBnHltOUlJScPnll+cs9+OPPy50md99951bxu9///tC59mzZ0+wc+fOYPXq1UH//v3d/EWVtTDZ26datWrutXLlym6ZmzZtKnD+l19+2c23YcOGIpd95ZVXBkOHDi1yvt69ewfVq1cvcpkn25Y7duxw+yMlJSX41a9+FUyZMiW45pprXFl/97vf5SxjyZIl7r02bdoEbdu2dfvt4YcfDqpUqRI0a9YsSE9Pd/NlZGQETZs2DerXrx888cQTwYwZM4KxY8cGnTp1Cr755puc5T3++ONuebbck1m+fLmbb86cOfk+u+yyy4KLLrqoyO2E6CCoKog1a9a4f6Spqanu96ysLHdQuf/++0+Y77XXXnPzTZw48YTwsoDJG1Q9evRwB5sffvgh5z1b7qWXXhqcf/75+Q7EPXv2dJ9ne/DBB11Y7du3L+e9Vq1auYNrcWUf1LIdOXIkaN26tStvbqeffnqxDtjm3XffdeV96623Cp3HDtY2j021atU6aagVxQ6ct912W/Diiy+6sH7ssceCqlWrBsnJycHWrVvzzW/BUNgBt6RBZSFr+8ImO1H52c9+FixevNhtz7wK25Z2ElSvXj0X4rn9+Mc/dic02fsqO6gaNGgQpKWl5cz36quvuvefffZZ9/tf//pX9/tf/vKX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",
"text/plain": [
"<Figure size 500x500 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"Running GoalBased agent:\n",
"Trajectory: [(0, 0), (1, 0), (2, 0), (3, 0), (4, 0), (4, 1), (4, 2), (4, 3), (4, 4)]\n"
]
},
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 500x500 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"Running UtilityBased agent:\n",
"Trajectory: [(0, 0), (1, 0), (2, 0), (3, 0), (4, 0), (4, 1), (4, 2), (4, 3), (4, 4)]\n"
]
},
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 500x500 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"Running Random agent:\n",
"Trajectory: [(0, 0), (0, 0), (1, 0), (1, 0), (2, 0), (2, 0), (2, 1), (2, 0), (1, 0), (1, 0), (0, 0), (0, 1), (0, 1), (0, 2), (0, 1), (0, 0), (1, 0), (1, 0), (1, 0), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (1, 0), (0, 0), (0, 0), (0, 1), (0, 0), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (0, 2), (1, 2), (1, 2), (1, 2), (1, 2), (1, 3), (2, 3), (1, 3), (2, 3), (2, 4), (1, 4), (0, 4), (0, 5), (1, 5), (0, 5), (0, 6)]\n"
]
},
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 500x500 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"Running Learning agent:\n",
"Trajectory: [(0, 0), (1, 0), (2, 0), (3, 0), (4, 0), (4, 1), (4, 2), (4, 3), (4, 4)]\n"
]
},
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 500x500 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"=== Evaluation Results ===\n",
"Reflex: Steps=51, Collisions=0, Revisits=31\n",
"GoalBased: Steps=9, Collisions=0, Revisits=0\n",
"UtilityBased: Steps=9, Collisions=0, Revisits=0\n",
"Random: Steps=51, Collisions=0, Revisits=36\n",
"Learning: Steps=9, Collisions=0, Revisits=0\n"
]
}
],
"source": [
"# Khởi tạo environment\n",
"env = GridWorld(\n",
" size=7, \n",
" start=(0,0), \n",
" goal=(4,4), \n",
" obstacles=[(1,1),(2,2),(3,1)]\n",
")\n",
"\n",
"# Tạo LearningAgent và huấn luyện trước\n",
"learning_agent = LearningAgent(env, episodes=5000)\n",
"learning_agent.learn() # ✅ huấn luyện\n",
"\n",
"# Thêm vào danh sách agent\n",
"agents = {\n",
" 'Reflex': ReflexAgent(env),\n",
" 'GoalBased': GoalBasedAgent(env),\n",
" 'UtilityBased': UtilityBasedAgent(env),\n",
" 'Random': RandomAgent(env),\n",
" 'Learning': learning_agent # đã train\n",
"}\n",
"\n",
"results = {}\n",
"\n",
"# Chạy thử nghiệm cho từng agent\n",
"for name, agent in agents.items():\n",
" print(f\"\\nRunning {name} agent:\")\n",
" traj = run_episode(env, agent)\n",
" print(\"Trajectory:\", traj)\n",
" env.render()\n",
"\n",
" # --- Thống kê ---\n",
" steps = len(traj)\n",
" collisions = sum(1 for pos in traj if pos in env.obstacles)\n",
" revisits = steps - len(set(traj))\n",
"\n",
" results[name] = {\n",
" \"steps\": steps,\n",
" \"collisions\": collisions,\n",
" \"revisits\": revisits\n",
" }\n",
"\n",
"# In kết quả so sánh\n",
"print(\"\\n=== Evaluation Results ===\")\n",
"for name, stats in results.items():\n",
" print(f\"{name}: Steps={stats['steps']}, Collisions={stats['collisions']}, Revisits={stats['revisits']}\")\n"
]
},
{
"cell_type": "code",
"execution_count": 192,
"metadata": {},
"outputs": [],
"source": [
"from IPython.display import clear_output, display\n",
"import time\n",
"\n",
"def animate_episode(env, agent, max_steps=50, delay=0.3):\n",
" \"\"\"Chạy và trực quan hóa đường đi của agent theo từng bước.\n",
" - clear_output để cập nhật khung hình\n",
" - env.render(show=False) để lấy fig/ax và hiển thị ngay trong cell\n",
" \"\"\"\n",
" pos = env.reset()\n",
" done = False\n",
" steps = 0\n",
" trajectory = [pos]\n",
" while not done and steps < max_steps:\n",
" action = agent.act()\n",
" pos, reward, done = env.step(action)\n",
" trajectory.append(pos)\n",
" clear_output(wait=True)\n",
" fig, ax = env.render(show=False)\n",
" display(fig)\n",
" plt.close(fig)\n",
" time.sleep(delay)\n",
" steps += 1\n",
" return trajectory, steps, done\n"
]
},
{
"cell_type": "code",
"execution_count": 193,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAaoAAAHDCAYAAAB1dF5kAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjUsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvWftoOwAAAAlwSFlzAAAPYQAAD2EBqD+naQAAKLZJREFUeJzt3Ql0lOW9x/FfEgLI5hYCslMXFBBEFqu2yirKoij0tsIVqrdSaaB4kZ7KcaW9XmiVHjxIAStFS4vYiyLWskXZRKFsUkHF7WCxIIR42YMQyNzzf3KHZgMyMTD/Sb6fc16GmXnnnSfPvHl/77O8k6RIJBIRAABOJce7AAAAnApBBQBwjaACALhGUAEAXCOoAACuEVQAANcIKgCAawQVAMA1ggoA4BpBBZzEmjVrVLVqVf3jH/+QBx988IGqVKmizZs3l/o1zZo10+OPP35GywWcaQRVJfPb3/5WSUlJuuaaa+S1fM8//3y5b/e///u/9eqrr8b0moceekh33nmnmjZtWuLzubm5atmyZajPp556qpxKKvXo0SNsc/jw4YUet/fq3bu3Hn30UZ0JK1eu1C233KKGDRuqevXqatKkifr27atZs2adWCcnJycE37Jly5SoXnvtNV199dUnfsbHHntMx44di3excAoEVSXzpz/9KZxlW2vh008/lTdegmrjxo164403dN999510nUmTJmnbtm0qT6+88opWrVp10uetPHPnztVnn31Wru/7P//zP7rhhhu0a9cujRw5Mvxs//7v/649e/bod7/7XaGgGjt2bMIG1YIFC9SvXz+dd9554We0///Xf/2XRowYEe+i4RSqnOpJVCxbt27VO++8Ew6GP/7xj0No2dkkipsxY0Y42/72t79d4vNZWVn6xS9+oZ///Ofl1sL5+uuv9cADD5xym927d9f555+vF154Ibx/ebFWkrXYVq9eHbo7i/6sFcXo0aPVpk0bLV68OHSjmjp16oQTGQvoyy+/PN5FRAloUVUiFkx2kLPuowEDBoT7Jfnqq6901113hV9gO/McMmSI/v73v4fuqKKtnS1btoRtXXDBBaErpUOHDqFrpSB7jb327bff1qhRo1S3bl3VrFlTt99+u3bv3n1iPWvpvf/++1q+fHlY35bOnTuf8meyLrfrrrtOF154oc455xy1b99ec+bMKbSObefQoUPh4B7d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",
"text/plain": [
"<Figure size 500x500 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"--- Kết quả agent Learning ---\n",
"Đã hoàn thành? True\n",
"Số bước đi: 8\n",
"Vị trí cuối: (4, 4)\n",
"Quỹ đạo: [(0, 0), (1, 0), (2, 0), (3, 0), (4, 0), (4, 1), (4, 2), (4, 3), (4, 4)]\n",
"\n",
"=== Tất cả kết quả ===\n",
"Reflex: steps=36, done=True, last_pos=(4, 4)\n",
"GoalBased: steps=8, done=True, last_pos=(4, 4)\n",
"UtilityBased: steps=8, done=True, last_pos=(4, 4)\n",
"Random: steps=20, done=True, last_pos=(4, 4)\n",
"Learning: steps=8, done=True, last_pos=(4, 4)\n"
]
}
],
"source": [
"# ====== Chạy animation và lưu kết quả cho từng agent ======\n",
"env = GridWorld(size=5, start=(0,0), goal=(4,4), obstacles=[(1,1),(2,2),(3,1)])\n",
"learning_agent = LearningAgent(env, episodes=5000)\n",
"learning_agent.learn()\n",
"agents = {\n",
" 'Reflex': ReflexAgent(env),\n",
" 'GoalBased': GoalBasedAgent(env),\n",
" 'UtilityBased': UtilityBasedAgent(env),\n",
" 'Random': RandomAgent(env),\n",
" 'Learning': learning_agent # đã train\n",
"}\n",
"\n",
"results = {} # dictionary để lưu kết quả từng agent\n",
"\n",
"for name, agent in agents.items():\n",
" print(f\"\\n>>> Bắt đầu chạy agent: {name} (animation)...\")\n",
" \n",
" traj, steps, done = animate_episode(env, agent, max_steps=60, delay=0.25)\n",
" \n",
" # Lưu kết quả\n",
" results[name] = {\n",
" 'traj': traj,\n",
" 'steps': steps,\n",
" 'done': done,\n",
" 'last_pos': traj[-1]\n",
" }\n",
" \n",
" # In kết quả ngay sau khi agent chạy xong\n",
" print(f\"--- Kết quả agent {name} ---\")\n",
" print(f\"Đã hoàn thành? {done}\")\n",
" print(f\"Số bước đi: {steps}\")\n",
" print(f\"Vị trí cuối: {traj[-1]}\")\n",
" print(f\"Quỹ đạo: {traj}\")\n",
"\n",
"# ✅ Sau vòng lặp, bạn vẫn có thể truy xuất kết quả của tất cả agent\n",
"print(\"\\n=== Tất cả kết quả ===\")\n",
"for name, res in results.items():\n",
" print(f\"{name}: steps={res['steps']}, done={res['done']}, last_pos={res['last_pos']}\")\n"
]
},
{
"cell_type": "markdown",
"id": "fcbdb1de",
"metadata": {},
"source": [
"## 6. Thảo luận\n",
"\n",
"### 6.1 Khả năng thích nghi khi môi trường thay đổi\n",
"\n",
"| Tác tử | Thích nghi khi môi trường thay đổi | Giải thích |\n",
"|------------------|------------------------------------|----------------------------------------------------------------------------------------------------------------|\n",
"| **RandomAgent** | Kém | Di chuyển ngẫu nhiên, không có chiến lược tổng thể. Khi lưới lớn hoặc nhiều vật cản, quỹ đạo dài, nhiều va chạm. |\n",
"| **ReflexAgent** | Trung bình | Tránh va chạm cục bộ tốt, chỉ dựa vào thông tin xung quanh. Khi môi trường phức tạp, dễ đi vòng lặp, chưa tối ưu. |\n",
"| **GoalBasedAgent** | Tốt | Luôn chọn đường đi ngắn nhất tới goal. Môi trường thay đổi ảnh hưởng ít, tác tử vẫn đến đích nhanh, không va chạm. |\n",
"| **UtilityBasedAgent**| Tốt | Chọn đường đi dựa trên giá trị utility, ổn định và ngắn. Một số trường hợp đặc biệt có thể bị kẹt. |\n",
"| **LearningAgent** | Rất tốt | Học từ kinh nghiệm, tối ưu hóa đường đi. Khi môi trường thay đổi, tác tử tự điều chỉnh chiến lược, dần thích nghi. |\n",
"\n",
"**Kết luận:**\n",
"- Trong môi trường tĩnh, **GoalBasedAgent** và **UtilityBasedAgent** là hiệu quả nhất.\n",
"- Khi môi trường thay đổi, **LearningAgent** thích nghi tốt nhất nhờ khả năng học và tối ưu hóa dựa trên kinh nghiệm, giảm va chạm và bước đi thừa theo thời gian.\n",
"\n",
"---\n",
"\n",
"### 6.2 Ưu/nhược điểm trong thực tế\n",
"\n",
"| Tác tử | Ưu điểm | Nhược điểm |\n",
"|------------------|------------------------------------------------------------------------|---------------------------------------------------------------------------|\n",
"| **RandomAgent** | Đơn giản, không cần tính toán phức tạp | Di chuyển ngẫu nhiên, tốn năng lượng, nhiều va chạm, không tối ưu |\n",
"| **ReflexAgent** | Tránh vật cản trực tiếp, dễ triển khai trên robot đơn giản | Không có chiến lược tổng thể, dễ đi vòng lặp, quỹ đạo dài |\n",
"| **GoalBasedAgent** | Luôn đi thẳng đến mục tiêu, ít bước thừa, không va chạm | Cần biết trước vị trí goal, khó thích nghi nếu môi trường thay đổi |\n",
"| **UtilityBasedAgent**| Tối ưu hóa đường đi dựa trên giá trị utility, ổn định | Có thể bị kẹt trong môi trường phức tạp, cần xác định utility chính xác |\n",
"| **LearningAgent** | Thích nghi với môi trường thay đổi, học được đường đi tối ưu | Cần thời gian học, ban đầu có thể đi vòng lặp hoặc va chạm, phức tạp khi triển khai thực tế |\n",
"\n",
"**Ví dụ thực tế:**\n",
"- **Robot hút bụi:** Nên dùng LearningAgent hoặc ReflexAgent vì môi trường nhà thay đổi, vật cản di động.\n",
"- **Xe tự lái:** Kết hợp GoalBasedAgent, UtilityBasedAgent và LearningAgent để đi đúng đường, tránh vật cản, học từ trải nghiệm thực tế."
]
},
{
"cell_type": "markdown",
"id": "297c0ec1",
"metadata": {},
"source": [
"## 📝 Bài tập cho sinh viên\n",
"\n",
"1. **Thay đổi môi trường**\n",
" - Thử tạo lưới có kích thước khác (ví dụ 7x7, 10x10).\n",
" - Thêm/bớt chướng ngại vật và quan sát sự thay đổi trong quỹ đạo di chuyển.\n",
"\n",
"2. **Điều chỉnh thuật toán tác tử**\n",
" - Bổ sung thêm một tác tử **RandomAgent**: luôn chọn hành động ngẫu nhiên.\n",
" - So sánh quỹ đạo và độ dài đường đi của RandomAgent với các tác tử khác.\n",
"\n",
"3. **Đánh giá hiệu quả**\n",
" - Tính tổng số bước mà mỗi tác tử đi từ start đến goal.\n",
" - Ghi nhận số lần tác tử va phải chướng ngại vật hoặc quay lại ô cũ.\n",
"\n",
"4. **Nâng cấp tác tử**\n",
" - Thiết kế một **LearningAgent** đơn giản dùng Q-learning hoặc SARSA để học cách di chuyển đến goal.\n",
" - So sánh hiệu quả của LearningAgent với UtilityBasedAgent.\n",
"\n",
"5. **Quan sát trực quan**\n",
" - Cập nhật hàm `render()` để hiển thị thêm:\n",
" - Quỹ đạo các bước đi.\n",
" - Số bước đã đi.\n",
" - Ký hiệu khác biệt cho start (S), goal (G), chướng ngại vật (X), tác tử (A).\n",
" - Vẽ đồ thị (sử dụng matplotlib) biểu diễn số bước cần thiết của mỗi tác tử.\n",
"\n",
"6. **Thảo luận**\n",
" - Khi môi trường thay đổi, tác tử nào thích nghi tốt nhất? Vì sao?\n",
" - Ưu/nhược điểm của từng loại tác tử trong thực tế (ví dụ: robot hút bụi, xe tự lái).\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.13.6"
}
},
"nbformat": 4,
"nbformat_minor": 5
}