習(xí)實戰(zhàn):從Q-learning到DQN的迷宮尋路實現(xiàn)與避坑指南)
簡介本資源是一份面向人工智能課程學(xué)習(xí)者與初學(xué)者的強化學(xué)習(xí)工程實踐項目聚焦迷宮路徑規(guī)劃這一經(jīng)典控制問題完整實現(xiàn)Q-learning算法在離散環(huán)境中的建模、訓(xùn)練與策略可視化。資源共30個文件包含10個核心Python源碼如ui.py、train_qtable.py、maze_map.py等、12個預(yù)訓(xùn)練Q表.npy文件、1份PDF技術(shù)報告、1個可執(zhí)行程序ui.exe及README說明文檔整體壓縮包大小為164.77MB其中Python代碼模塊化清晰涵蓋環(huán)境構(gòu)建、智能體訓(xùn)練、UI交互與結(jié)果繪圖四大功能層.npy文件支持快速加載不同規(guī)模迷宮如maze7_1、maze10_3的訓(xùn)練成果PDF報告詳述狀態(tài)空間設(shè)計、獎勵函數(shù)設(shè)定與探索策略調(diào)優(yōu)過程。目前已有54人學(xué)習(xí)下載資源已通過高校課程評審并獲98分高分可直接用于期末大作業(yè)提交、畢業(yè)設(shè)計參考或強化學(xué)習(xí)入門實戰(zhàn)附帶詳細注釋與自定義地圖配置能力顯著降低理解門檻與二次開發(fā)成本。 說實話一開始接到“強化學(xué)習(xí)實現(xiàn)迷宮尋路”這個題目時我腦子里第一個念頭是這年頭隨便拿個A*都能秒殺迷宮為什么還要費勁寫強化學(xué)習(xí)但真當(dāng)我把一個智能體從瞎逛到學(xué)會找路的完整過程跑下來反而覺得這個場景特別適合講清楚RL最核心的思維邏輯。這篇博文我就從自己的實操角度出發(fā)把狀態(tài)、動作、獎勵函數(shù)的設(shè)計以及Q-learning到DQN的遷移過程完整寫一遍附帶我踩過的坑。這東西能解決什么問題簡單說當(dāng)你不想給每條路都寫死規(guī)則或者環(huán)境會動態(tài)變化比如迷宮墻壁位置改變、目標(biāo)點移動傳統(tǒng)路徑規(guī)劃算法要重新計算而強化學(xué)習(xí)可以通過與環(huán)境的交互不斷自適應(yīng)。它更接近讓智能體自己“學(xué)會”怎么走而不是我們告訴它怎么走。適合剛?cè)腴T強化學(xué)習(xí)、想跑通一個小型實戰(zhàn)項目或者正在做機器人導(dǎo)航相關(guān)工作的朋友參考內(nèi)容以Python和經(jīng)典算法為主。1. 整體思路為什么選迷宮作為強化學(xué)習(xí)的練兵場1.1 迷宮是理解RL核心要素的最佳抽象環(huán)境迷宮路徑規(guī)劃看起來簡單但它天然具備強化學(xué)習(xí)的幾個關(guān)鍵要素狀態(tài)智能體當(dāng)前所在位置、動作上下左右移動、獎勵撞墻懲罰、到達終點的正獎勵、策略從起點到終點的行走策略。而且迷宮的可視化程度極高每一步的決策好壞可以直接在二維網(wǎng)格上看出來對調(diào)試和理解算法行為特別友好。傳統(tǒng)算法比如Dijkstra、BFS和A*確實能在靜態(tài)迷宮中輕松找到最短路徑而且速度極快。那為什么還要用強化學(xué)習(xí)關(guān)鍵在于適用場景不同。傳統(tǒng)算法要求環(huán)境可建模、完全已知、靜態(tài)不變而強化學(xué)習(xí)不依賴全局地圖信息只通過與環(huán)境的“試錯”交互來學(xué)習(xí)策略。換句話說如果迷宮有一面墻在你走過去之后才突然出現(xiàn)或者終點會動態(tài)移動傳統(tǒng)算法就得重新規(guī)劃而強化學(xué)習(xí)可以在線調(diào)整策略雖然效率未必最高但是思路完全不同。在做這個項目之前我建議你先想清楚一個問題你是為了在迷宮里找到最短路徑還是為了理解強化學(xué)習(xí)算法的工作機制如果目標(biāo)是前者直接去用A*如果目標(biāo)是后者迷宮就是一個絕佳的“教學(xué)環(huán)境”。這個定位決定了后面整個實驗設(shè)計的方向也決定了你在調(diào)試時關(guān)注的重點是“算法是否收斂”而不是“路徑是否絕對最短”。1.2 實驗方案的總體框架與算法選型我最終選定的技術(shù)棧是Python 3.10 GymnasiumOpenAI Gym的維護分支 NumPy算法先以Q-learning作為基線然后擴展到一個簡單的DQN實現(xiàn)。之所以先選Q-learning因為它邏輯簡單、代碼量小幾乎不會出現(xiàn)“環(huán)境寫對了但算法不收斂”的困擾非常適合作為實驗的對照組。而DQN則用來驗證“當(dāng)狀態(tài)空間變大后值函數(shù)逼近能否發(fā)揮價值”。整體實驗框架分四層環(huán)境層自定義一個網(wǎng)格迷宮環(huán)境支持不同尺寸和墻壁布局負責(zé)維護智能體位置、判斷碰撞、檢測終點。算法層實現(xiàn)Q-learning和DQN兩套算法統(tǒng)一接口便于切換對比。訓(xùn)練層管理訓(xùn)練輪數(shù)、探索率衰減、獎勵記錄、模型保存。分析層統(tǒng)計收斂步數(shù)、成功率、路徑長度并繪制學(xué)習(xí)曲線。這個分層思路其實不限于迷宮后續(xù)遷移到其他強化學(xué)習(xí)項目時你只需要替換環(huán)境層即可算法層和分析層基本可以復(fù)用。我在設(shè)計時還留了隨機種子的固定接口方便實驗復(fù)現(xiàn)。2. 核心細節(jié)狀態(tài)空間、動作空間與獎勵函數(shù)的工程設(shè)計2.1 狀態(tài)空間的設(shè)計從離散網(wǎng)格到特征編碼強化學(xué)習(xí)的第一步是定義“狀態(tài)”也就是智能體每個決策時刻需要感知的信息。在迷宮場景中最簡單的狀態(tài)就是一個二元組(row, col)表示智能體當(dāng)前所在網(wǎng)格坐標(biāo)。對Q-learning來說狀態(tài)索引的計算方式是把二維坐標(biāo)映射為一維數(shù)字state_id row * maze_width col這樣Q表就是形狀為(狀態(tài)數(shù), 動作數(shù))的二維數(shù)組。但這里有一個非常關(guān)鍵的設(shè)計問題狀態(tài)到底應(yīng)不應(yīng)該包含目標(biāo)點的相對位置我一開始偷懶狀態(tài)只放了當(dāng)前坐標(biāo)結(jié)果Q-learning在小迷宮里也能收斂但拿到更大的迷宮后明顯力不從心。后來我查閱相關(guān)資料才知道這涉及馬爾可夫性質(zhì)——狀態(tài)必須包含做出正確決策所需的全部信息。如果智能體不知道目標(biāo)在哪它就必須純靠試錯記憶每條路的轉(zhuǎn)向時機這在環(huán)境復(fù)雜時效率極低。所以我在進階版本里將狀態(tài)編碼擴展為(當(dāng)前行, 當(dāng)前列, 目標(biāo)相對行偏移, 目標(biāo)相對列偏移, 周圍四格障礙標(biāo)志位)。這樣智能體不僅知道自己在哪還知道目標(biāo)在哪個方向、周圍有哪些障礙決策信息更充分。代價是狀態(tài)空間維度大幅上升Q表不再可行只能轉(zhuǎn)向DQN這類函數(shù)逼近方法。2.2 動作空間與移動邏輯的坑動作空間一般就是四個離散動作上、下、左、右。實現(xiàn)移動邏輯時有個常見的坑不能直接修改智能體坐標(biāo)后判斷碰撞而應(yīng)先計算“目標(biāo)位置”如果目標(biāo)位置合法且不是墻才更新坐標(biāo)。這聽起來很基礎(chǔ)但我在初版代碼里犯過一個錯誤——先移動再檢測越界導(dǎo)致智能體卡在邊界后不斷獲得負獎勵卻不知道是為什么。動作空間還有個容易被忽略的細節(jié)無效動作的反饋。當(dāng)智能體試圖撞墻或走出邊界時環(huán)境應(yīng)該返回一個負獎勵還是原狀態(tài)不變我的做法是位置不變獎勵為-1并且將truncated標(biāo)志設(shè)為False。這里有個微妙之處如果撞墻懲罰太大智能體會傾向于原地不動因為靜止的期望回報可能比亂撞更高但如果懲罰太小它又可能反復(fù)試探墻體邊界。經(jīng)過多次實驗我發(fā)現(xiàn)撞墻懲罰設(shè)為-1、每步時間懲罰設(shè)為-0.04是一個比較均衡的組合。2.3 獎勵函數(shù)讓智能體學(xué)會“引力”和“斥力”獎勵函數(shù)是強化學(xué)習(xí)實驗中最能決定成敗的部分。迷宮場景的天然獎勵結(jié)構(gòu)是稀疏獎勵——只有到達終點才給一個大正數(shù)其余時間沒有任何反饋。稀疏獎勵的優(yōu)點是設(shè)計簡單、不需要領(lǐng)域知識但缺點也非常突出在稍大一點的迷宮里智能體隨機探索很難在有限步數(shù)內(nèi)第一次碰到終點導(dǎo)致訓(xùn)練久久不收斂。為了解決這個問題我參考了“基于勢能的獎勵成形”思路也就是在獎勵中引入一個引導(dǎo)項。具體做法是定義智能體當(dāng)前位置到目標(biāo)點的歐氏距離d_t和上一步距離d_{t-1}然后用距離差構(gòu)造獎勵r_potential λ * (d_{t-1} - d_t)。這個獎勵的本質(zhì)就是“靠近目標(biāo)給正反饋遠離目標(biāo)給負反饋”相當(dāng)于施加了一個指向目標(biāo)的“引力場”。同時為了避開墻壁我在狀態(tài)編碼里已經(jīng)包含了周圍障礙信息智能體學(xué)習(xí)到撞墻行為會帶來負獎勵相當(dāng)于“斥力場”。整體獎勵函數(shù)如下def compute_reward(self, prev_dist, new_dist, is_wall, reached_goal): step_penalty -0.04 # 每走一步的小懲罰促使智能體盡快到達 wall_penalty -1.0 # 撞墻懲罰 goal_reward 10.0 # 到達終點獎勵 potential_reward 0.5 * (prev_dist - new_dist) # 距離成形獎勵 if reached_goal: return goal_reward if is_wall: return wall_penalty return step_penalty potential_reward需要額外說明的是使用勢能成形獎勵時要注意一個理論前提——好的成形函數(shù)不應(yīng)該改變最優(yōu)策略。如果λ系數(shù)太大距離獎勵會壓過終點獎勵智能體可能學(xué)出“在終點附近來回試探以持續(xù)獲得距離獎勵”的投機行為。我在實際實驗中將λ設(shè)為0.5并保證終點獎勵遠大于單步距離獎勵的累計值才避免了這個陷阱。這個“引力加斥力”的獎勵設(shè)計思路后來我遷移到機器人避障仿真場景時同樣適用。3. 實操過程從零搭建迷宮環(huán)境并實現(xiàn)Q-learning3.1 自定義迷宮環(huán)境Gymnasium接口的規(guī)范實現(xiàn)我建議直接基于Gymnasium的接口來封裝環(huán)境這樣以后可以用現(xiàn)成的強化學(xué)習(xí)庫比如Stable-Baselines3無縫對接。所謂接口規(guī)范本質(zhì)就是實現(xiàn)reset()和step(action)兩個核心方法分別表示一局開始時的初始化以及智能體走一步的交互邏輯。迷宮我直接用二維數(shù)組來表示0表示可通行空地1表示墻壁2表示終點。下面是我環(huán)境類中step方法的核心邏輯def step(self, action): # 動作編碼0上1下2左3右 directions [(-1, 0), (1, 0), (0, -1), (0, 1)] d_row, d_col directions[action] new_row self.agent_pos[0] d_row new_col self.agent_pos[1] d_col # 檢查目標(biāo)位置是否合法 if self._is_wall(new_row, new_col) or self._is_out_of_bounds(new_row, new_col): # 撞墻或越界位置不變返回負獎勵 next_state self._get_observation() reward -1.0 terminated False else: # 更新位置 self.agent_pos (new_row, new_col) next_state self._get_observation() terminated self.maze[new_row][new_col] 2 # 到達終點 reward 10.0 if terminated else -0.04 return next_state, reward, terminated, False, {}這里我踩過一個非常隱蔽的坑terminated與truncated的區(qū)別。terminated表示“智能體完成了任務(wù)”比如到達終點truncated表示“智能體沒完成任務(wù)但因為步數(shù)超限而被迫中止”。在訓(xùn)練時如果你把兩者混為一談DQN的目標(biāo)值計算會出錯該terminated的轉(zhuǎn)移不應(yīng)該計算后續(xù)Q值而該truncated的轉(zhuǎn)移卻要計算。我在初版代碼里把兩者都設(shè)為False結(jié)果智能體到終點后不結(jié)算獎勵行為完全失控。3.2 Q-learning算法表格型強化學(xué)習(xí)的經(jīng)典實現(xiàn)Q-learning的核心更新公式是Q[s, a] Q[s, a] lr * (r gamma * max(Q[s_next, :]) - Q[s, a])實現(xiàn)時我用greedy-epsilon策略來平衡探索與利用。訓(xùn)練初期將epsilon設(shè)為1.0也就是完全隨機探索隨著訓(xùn)練進行逐步衰減到0.05讓智能體更多依靠已學(xué)到的Q值來選擇動作。完整實現(xiàn)如下class QLearningAgent: def __init__(self, state_size, action_size, lr0.1, gamma0.95, epsilon1.0, eps_decay0.995, eps_min0.05): self.q_table np.zeros((state_size, action_size)) self.lr lr self.gamma gamma self.epsilon epsilon self.eps_decay eps_decay self.eps_min eps_min def choose_action(self, state): if np.random.random() self.epsilon: return np.random.randint(self.action_size) return np.argmax(self.q_table[state]) def update(self, state, action, reward, next_state, terminated): best_next_q 0 if terminated else np.max(self.q_table[next_state]) td_target reward self.gamma * best_next_q td_error td_target - self.q_table[state, action] self.q_table[state, action] self.lr * td_error def decay_epsilon(self): self.epsilon max(self.epsilon * self.eps_decay, self.eps_min)訓(xùn)練主循環(huán)的邏輯也很直接在訓(xùn)練過程中只調(diào)用env.step()拿獎勵和下一個狀態(tài)同時累積回報統(tǒng)計收斂情況。我設(shè)置的訓(xùn)練輪數(shù)是5000輪每輪最大步數(shù)限制為500步如果超過步數(shù)上限就結(jié)束該輪并進入下一輪。有一個很值得記錄的細節(jié)Q-learning的收斂速度和迷宮大小直接相關(guān)。在7x7的迷宮里大約800輪就能看到明顯的路徑優(yōu)化在15x15的迷宮里即使有勢能成形獎勵也得跑滿3000輪以上才勉強穩(wěn)定。所以做實驗時不要一上來就挑戰(zhàn)大迷宮先把小地圖上的邏輯跑通再逐步放大。3.3 DQN實現(xiàn)的關(guān)鍵改造點當(dāng)迷宮擴大到20x20以上時Q表的規(guī)模會急劇膨脹。以每個狀態(tài)包含5個特征維度、每維約10個可能值來估算狀態(tài)空間就有10萬級別Q表不再是好選擇。這時我從Q-learning切換到了DQN核心改動有兩處。第一用一個三層全連接神經(jīng)網(wǎng)絡(luò)替代Q表。輸入是狀態(tài)向量我用的是基于網(wǎng)格的相對坐標(biāo)和障礙標(biāo)志拼接而成中間層128個神經(jīng)元加ReLU激活輸出層4個神經(jīng)元對應(yīng)四個動作的Q值。損失函數(shù)用均方誤差算預(yù)測Q值和目標(biāo)Q值之間的差距。第二引入經(jīng)驗回放和固定目標(biāo)網(wǎng)絡(luò)。經(jīng)驗回放是把每一步的轉(zhuǎn)移(s, a, r, s, terminated)存進一個緩沖區(qū)訓(xùn)練時隨機采樣一小批來更新網(wǎng)絡(luò)參數(shù)打破樣本之間的時序相關(guān)性。固定目標(biāo)網(wǎng)絡(luò)則是每隔一定步數(shù)才把參數(shù)同步給目標(biāo)網(wǎng)絡(luò)避免訓(xùn)練目標(biāo)頻繁變化導(dǎo)致的不穩(wěn)定。這兩項是DQN革命性的改進沒有它們神經(jīng)網(wǎng)絡(luò)版Q學(xué)習(xí)在迷宮這種場景里極易發(fā)散。DQN的更新代碼片段如下def train_step(self): if len(self.memory) self.batch_size: return batch random.sample(self.memory, self.batch_size) states, actions, rewards, next_states, terminated zip(*batch) states torch.FloatTensor(states) actions torch.LongTensor(actions).unsqueeze(-1) rewards torch.FloatTensor(rewards).unsqueeze(-1) next_states torch.FloatTensor(next_states) terminated torch.FloatTensor(terminated).unsqueeze(-1) q_values self.q_net(states).gather(1, actions) next_q_values self.target_net(next_states).max(1, keepdimTrue)[0].detach() target_q_values rewards self.gamma * next_q_values * (1 - terminated) loss F.mse_loss(q_values, target_q_values) self.optimizer.zero_grad() loss.backward() self.optimizer.step()我在實現(xiàn)中把terminated乘到目標(biāo)值上這一步至關(guān)重要。如果忽略了它一個到達終點的轉(zhuǎn)移會被錯誤地計算一個很大的未來回報模型將學(xué)會“永遠不死”而不是“盡快到達終點”。4. 實驗設(shè)計與結(jié)果分析從混亂到穩(wěn)定的成長曲線4.1 對比實驗設(shè)計三個維度攤開看差距我設(shè)計了三個對照組來全面分析算法表現(xiàn)。第一組是“無勢能獎勵的Q-learning”用來驗證獎勵成形的效果。第二組是“含勢能獎勵的Q-learning”也就是完整版。第三組是“含勢能獎勵的DQN”。記錄的核心指標(biāo)有三個成功率達到95%的訓(xùn)練輪數(shù)、平均路徑步數(shù)、單輪訓(xùn)練耗時。迷宮的復(fù)雜度我也做了分層從小到大依次是7x7簡單迷宮、12x12中等迷宮、18x18復(fù)雜迷宮。每張地圖都隨機生成多次取平均結(jié)果盡量避免單次隨機種子帶來的偏差。這里有個實驗設(shè)計上的小心思成功率的統(tǒng)計采用滑動窗口也就是最近100輪內(nèi)成功到達終點的比例比單純用某個回合是否成功更能反映收斂趨勢。4.2 實驗結(jié)果數(shù)據(jù)與現(xiàn)象解讀直接上我最具代表性的一組數(shù)據(jù)12x12迷宮上三種方案的對比算法配置成功率95%所需輪數(shù)收斂后平均步數(shù)單輪耗時Q-learning無勢能獎勵未能在3000輪內(nèi)穩(wěn)定達到約86步約3msQ-learning含勢能獎勵約1200輪約42步約3msDQN含勢能獎勵約1800輪約38步約45ms從數(shù)據(jù)上能看到幾個有意思的現(xiàn)象。第一無勢能獎勵的Q-learning在12x12迷宮上表現(xiàn)掙扎雖然偶爾能到達終點但極不穩(wěn)定這與“稀疏獎勵在復(fù)雜環(huán)境下的探索困難”理論完全吻合。第二加了勢能獎勵之后收斂速度顯著提升而且收斂后的路徑更短說明好的獎勵引導(dǎo)不僅加速訓(xùn)練還能優(yōu)化策略質(zhì)量。第三DQN的收斂輪數(shù)比Q-learning略多但收斂后的步數(shù)更優(yōu)同時在18x18復(fù)雜迷宮上依然能工作這是Q-learning無法做到的。我必須提醒大家上面的數(shù)據(jù)是在固定隨機種子下得到的換一個種子結(jié)果會有波動但整體趨勢不變。我在寫實驗報告時特意把所有隨機種子都記錄在配置文件中方便復(fù)現(xiàn)對比這個好習(xí)慣值得保留。4.3 學(xué)習(xí)曲線波動背后的原因分析訓(xùn)練過程中的獎勵曲線并不是單邊上升的而是呈現(xiàn)出“階梯式”和“周期性波動”。階梯式上升很好理解——智能體某次偶然找到了新路徑或繞開了一個障礙后續(xù)策略會迅速跟進曲線就上一個臺階。周期性波動則與探索率衰減有關(guān)當(dāng)epsilon比較高時智能體會隨機犯錯導(dǎo)致平均回報短暫回落當(dāng)epsilon逐漸降低后波動幅度也會收窄。我在調(diào)試時遇到的一個有趣現(xiàn)象是智能體在水池式迷宮中學(xué)會了“走回頭路”。原因是距離獎勵引導(dǎo)它靠近終點但它在某個死胡同里反復(fù)進出因為靠近終點的每一步都會獲得正的勢能獎勵。這個問題最終通過增大撞墻懲罰、并加入連續(xù)重復(fù)位置檢測10步內(nèi)如果位置沒有明顯變化就強制打亂探索來緩解。這樣的細節(jié)如果不做實驗光看論文是永遠想不到的。5. 常見問題與調(diào)試避坑指南5.1 Q值爆炸、不收斂與探索率設(shè)置問題Q值爆炸是我在DQN調(diào)試過程中遇到的頭號難題?,F(xiàn)象是訓(xùn)練到幾百輪后Q值的絕對值突然變得巨大完全失去指導(dǎo)意義。原因通常是兩個學(xué)習(xí)率過大導(dǎo)致參數(shù)震蕩或者獎勵函數(shù)的尺度不一致比如距離獎勵和終點獎勵差了一個數(shù)量級。我通過把一個經(jīng)驗池樣本的TD誤差打印出來的方式定位到問題發(fā)現(xiàn)是目標(biāo)網(wǎng)絡(luò)更新過慢導(dǎo)致舊網(wǎng)絡(luò)對某些狀態(tài)給出極其離譜的預(yù)測。解決方案是把目標(biāo)網(wǎng)絡(luò)同步步數(shù)從1000步降低到100步并把Adam優(yōu)化器的學(xué)習(xí)率從0.01降到0.001。探索率衰減設(shè)置在Q-learning和DQN中同樣重要。我見過很多新手把epsilon初始值設(shè)為0.1理由是“想讓它盡快利用已有知識”結(jié)果智能體從沒充分探索過環(huán)境永遠學(xué)不會正確的路徑。我建議的初始值是0.9到1.0衰減系數(shù)設(shè)為0.995到0.999之間并設(shè)置一個最小值如0.01到0.05。判斷探索是否充分的一個實用技巧是在訓(xùn)練前100輪人為打印智能體到達過的狀態(tài)覆蓋率如果覆蓋率低于60%說明動作空間探索不夠應(yīng)該降低衰減速度。5.2 環(huán)境隨機生成導(dǎo)致的不可復(fù)現(xiàn)問題迷宮如果每次訓(xùn)練都隨機生成實驗就失去了可對比性。我在初期就踩了這個坑算法明明這輪跑得很好換了環(huán)境后又完全不行根本分不清是算法改進帶來的收益還是環(huán)境難度變化導(dǎo)致的隨機波動。解決方法是所有環(huán)境生成邏輯都依賴一個可配置的隨機種子每次訓(xùn)練開始時用np.random.seed()和random.seed()固定種子。這樣每次實驗的環(huán)境序列完全一致算法對比才有意義。5.3 狀態(tài)編碼不一致導(dǎo)致的策略失效還有一個特別隱蔽的問題訓(xùn)練時狀態(tài)編碼用row * width col計算測試時如果迷宮寬高不一致或者狀態(tài)特征順序有變化智能體策略就會失靈。我在從Q-learning遷移到DQN時為了增加狀態(tài)信息臨時調(diào)整了特征拼接順序結(jié)果原有模型的權(quán)重全部廢掉。建議是把狀態(tài)編碼封裝成獨立的函數(shù)并寫單元測試驗證編碼的往返一致性避免低級錯誤消耗大量調(diào)試時間。5.4 典型問題速查表現(xiàn)象可能原因解決方案訓(xùn)練獎勵始終為負毫無上升趨勢稀疏獎勵導(dǎo)致探索困難加入勢能成形獎勵Q值絕對值越來越大學(xué)習(xí)率過高或目標(biāo)網(wǎng)絡(luò)更新過慢降低學(xué)習(xí)率提高同步頻率收斂后路徑繞遠路距離獎勵系數(shù)過大降低λ確保終點獎勵占主導(dǎo)測試時策略完全錯亂狀態(tài)編碼不一致統(tǒng)一特征編碼函數(shù)并加測試智能體原地踏步撞墻懲罰過重降低撞墻懲罰或加入重復(fù)位置檢測寫在最后一點實操感受這個項目讓我對強化學(xué)習(xí)的理解發(fā)生了質(zhì)的改變。以前讀論文時總覺得獎勵函數(shù)設(shè)計是個“調(diào)參活”真正動手做迷宮實驗才明白獎勵函數(shù)其實是先驗知識的編碼方式——你希望智能體學(xué)出什么樣的行為就應(yīng)該在獎勵里體現(xiàn)什么樣的引導(dǎo)。迷宮雖小卻把“探索與利用的權(quán)衡”“環(huán)境建模對學(xué)習(xí)的影響”“神經(jīng)網(wǎng)絡(luò)訓(xùn)練技巧與RL的耦合”這些核心問題全暴露出來了。如果你也想動手試一試我強烈建議不要直接抄一段現(xiàn)成的代碼就跑。先自己用字典或者NumPy數(shù)組手寫一個5x5的極簡迷宮把Q-learning的更新公式每一行吃透再逐步增加迷宮尺寸和算法復(fù)雜度。這條路走下來比刷十篇教程都有用。等到跑通之后再往里面加隨機動態(tài)障礙、加入多智能體共享環(huán)境你會發(fā)現(xiàn)這個迷宮項目已經(jīng)變成了一個可以無限擴展的仿真沙盤。本文還有配套的精品資源點擊獲取