Q-表格是一種簡單的策略迭代算法量没,用于解決MDP問題。它通過構(gòu)建一個Q-表來估計在給定狀態(tài)下采取某個動作的價值殴蹄。Q-表中的每個元素 Q(s, a) 代表了在狀態(tài)s下采取動作a之后預(yù)期的長期回報袭灯。
Q-學(xué)習(xí)算法步驟:
1稽荧、初始化:創(chuàng)建一個Q-表工腋,其中包含所有可能的狀態(tài)-動作對,并將它們的初始值設(shè)為0或隨機(jī)小數(shù)值构挤。
2筋现、選擇動作:基于當(dāng)前狀態(tài)s,選擇一個動作a一膨。這一步可以使用ε-greedy策略豹绪,即以一定概率ε隨機(jī)選取動作瞒津,以(1-ε)的概率選取當(dāng)前已知的最佳動作括尸。
3、執(zhí)行動作并觀察:根據(jù)選定的動作a屁柏,讓智能體與環(huán)境交互淌喻,得到新的狀態(tài)s'和即時獎勵r雀摘。
4阵赠、更新Q-表:根據(jù)觀測到的結(jié)果更新Q-表。更新規(guī)則通常是:
5、重復(fù):重復(fù)步驟2至4直到達(dá)到終止條件轧铁,如達(dá)到最大迭代次數(shù)或找到滿意的解決方案旦棉。
舉個例子:
構(gòu)建一個簡單的迷宮游戲環(huán)境,在這個環(huán)境中救斑,智能體需要找到從起點到終點的路徑。為了簡化問題穷娱,我們假設(shè)迷宮是一個4x4的網(wǎng)格泵额,其中有一些障礙物携添。
環(huán)境設(shè)定如下
狀態(tài):每個格子代表一個狀態(tài)。
動作:上羞秤、下瘾蛋、左母谎、右四個方向移動奇唤。
獎勵:到達(dá)終點時獲得+100分咬扇;碰到墻壁或障礙物時獲得-10分;其他情況下為-1分经窖。
終止條件:到達(dá)終點或達(dá)到最大步數(shù)画侣。
獲取Q-表格
import numpy as np
import random
# 迷宮布局
maze = [
[0, 0, 0, 0],
[0, -1, 0, -1],
[0, 0, 0, 0],
[-1, 0, 0, 1]
]
# 動作集
actions = ['up', 'down', 'left', 'right']
# 初始化Q表
q_table = np.zeros((len(maze), len(maze[0]), len(actions)))
q_table
# 參數(shù)設(shè)置
alpha = 0.1 # 學(xué)習(xí)率
gamma = 0.9 # 折扣因子
epsilon = 0.5 # 探索與利用的平衡
num_episodes = 1000 # 訓(xùn)練輪次
max_steps = 100 # 每輪的最大步數(shù)
# 獲取下一個位置
def get_next_position(position, action):
if action == 'up':
return (position[0] - 1, position[1])
elif action == 'down':
return (position[0] + 1, position[1])
elif action == 'left':
return (position[0], position[1] - 1)
elif action == 'right':
return (position[0], position[1] + 1)
# 檢查是否越界
def is_valid_position(position):
x, y = position
return 0 <= x < len(maze) and 0 <= y < len(maze[0]) and maze[x][y] != -1
# Q-學(xué)習(xí)算法
for episode in range(num_episodes):
state = (0, 0) # 起點
for step in range(max_steps):
# 選擇動作
if random.uniform(0, 1) < epsilon:
action_index = random.randint(0, len(actions) - 1)
else:
action_index = np.argmax(q_table[state[0], state[1], :])
action = actions[action_index]
print('action:',action)
next_state = get_next_position(state, action)
print('next_state:',next_state)
# 如果下一個位置無效,則保持原地不動
if not is_valid_position(next_state):
next_state = state
print('下一個位置是否有效:',is_valid_position(next_state))
# 計算獎勵
reward = maze[next_state[0]][next_state[1]]
print('獎勵:', reward)
# 更新Q表
old_value = q_table[state[0], state[1], action_index]
next_max = np.max(q_table[next_state[0], next_state[1], :])
new_value = (1 - alpha) * old_value + alpha * (reward + gamma * next_max)
q_table[state[0], state[1], action_index] = new_value
# 更新狀態(tài)
state = next_state
# 如果到達(dá)終點則結(jié)束本輪
if reward == 1:
break
基于上述代碼搬泥,迭代后的Q-表格如下:
Q-表格中的每個條目 Q(s, a) 表示在狀態(tài) s 下采取動作 a 后的預(yù)期長期回報忿檩。Q-表格中共16*4個元素燥透,每個元素代表兽掰,在該位置上分別采取4個動作后的價值。比如窖壕,第一行[0.83490833 0.92766808 0.83490833 0.92767592]表示杉女,在位置(或狀態(tài))上,分別采取上下左右四個動作后的價值速勇》炒牛可以看出都伪,向下和向右的價值差距不大积担,總得來說向右的價值是最大的帝璧,也有隨機(jī)的因素先誉。
如何使用Q-表格進(jìn)行決策
我們已經(jīng)訓(xùn)練了一個Q-表格,并希望使用它來指導(dǎo)智能體找到從起點到終點的最佳路徑的烁。
Q-表格使用
# 使用Q-表格選擇動作并執(zhí)行
state = (0, 0) # 起點
path = [state] # 記錄路徑
for step in range(max_steps):
# 選擇當(dāng)前狀態(tài)下Q值最高的動作
action_index = np.argmax(q_table[state[0], state[1], :])
action = actions[action_index]
next_state = get_next_position(state, action)
# 如果下一個位置無效褐耳,則保持原地不動
if not is_valid_position(next_state):
next_state = state
# 更新狀態(tài)
state = next_state
path.append(state)
# 如果到達(dá)終點則結(jié)束
if maze[state[0]][state[1]] == 1:
print("Found the goal!")
break
# 打印最終路徑
print("Path taken:", path)
根據(jù)上述代碼運(yùn)行后的結(jié)果為:
這就是根據(jù)迷宮布局,智能體根據(jù)Q-表格得出的最佳路徑渴庆。將其可視化后如下:
再將其與Q-表格對比漱病,可以看出买雾,智能體就是根據(jù)在當(dāng)前位置上,采取動作后的Q價值最大進(jìn)行路徑選擇的杨帽。