Q-表格方法python實現(xiàn)

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ī)則通常是:

image.png

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-表格如下:

image.png

Q-表格中的每個條目 Q(s, a) 表示在狀態(tài) s 下采取動作 a 后的預(yù)期長期回報忿檩。Q-表格中共16*4個元素燥透,每個元素代表兽掰,在該位置上分別采取4個動作后的價值。比如窖壕,第一行[0.83490833 0.92766808 0.83490833 0.92767592]表示杉女,在位置(或狀態(tài))上,分別采取上下左右四個動作后的價值速勇》炒牛可以看出都伪,向下和向右的價值差距不大积担,總得來說向右的價值是最大的帝璧,也有隨機(jī)的因素先誉。


image.png

如何使用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é)果為:

image.png

這就是根據(jù)迷宮布局,智能體根據(jù)Q-表格得出的最佳路徑渴庆。將其可視化后如下:

image.png

再將其與Q-表格對比漱病,可以看出买雾,智能體就是根據(jù)在當(dāng)前位置上,采取動作后的Q價值最大進(jìn)行路徑選擇的杨帽。


image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市嗤军,隨后出現(xiàn)的幾起案子叙赚,更是在濱河造成了極大的恐慌胧砰,老刑警劉巖击罪,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件竣稽,死亡現(xiàn)場離奇詭異娃弓,居然都是意外死亡恋博,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人署咽,你說我怎么就攤上這事慕匠。” “怎么了青伤?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長立帖。 經(jīng)常有香客問我,道長绑咱,這世上最難降的妖魔是什么窿克? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任只损,我火速辦了婚禮辈挂,結(jié)果婚禮上遥诉,老公的妹妹穿的比我還像新娘。我一直安慰自己债朵,他們只是感情好谚中,可當(dāng)我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布蝌麸。 她就那樣靜靜地躺著,像睡著了一般戚长。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機(jī)與錄音充蓝,去河邊找鬼娜谊。 笑死,一個胖子當(dāng)著我的面吹牛簸州,可吹牛的內(nèi)容都是我干的缩焦。 我是一名探鬼主播灾螃,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼乌助!你這毒婦竟也來了陌知?” 一聲冷哼從身側(cè)響起赏参,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤窖铡,失蹤者是張志新(化名)和其女友劉穎窒悔,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體振峻,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡烫堤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了凤价。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸽斟。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖利诺,靈堂內(nèi)的尸體忽然破棺而出富蓄,到底是詐尸還是另有隱情,我是刑警寧澤慢逾,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布格粪,位于F島的核電站,受9級特大地震影響氛改,放射性物質(zhì)發(fā)生泄漏帐萎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一胜卤、第九天 我趴在偏房一處隱蔽的房頂上張望疆导。 院中可真熱鬧,春花似錦葛躏、人聲如沸澈段。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽败富。三九已至悔醋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間兽叮,已是汗流浹背芬骄。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留鹦聪,地道東北人账阻。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像泽本,于是被迫代替她去往敵國和親淘太。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容