第三部《強化學習》29/100 模擬遊戲實作:21 點 BlackJack 🃏 訓練會算牌的 AI!

更新 發佈閱讀 12 分鐘

AI時代系列(3) 機器學習三部曲: 📘 第三部:《強化學習 —— AI 的決策與進化》

29/100 第三週:📌 蒙地卡羅方法(Monte Carlo Methods)

29.模擬遊戲實作:21 點 BlackJack 🃏 訓練會算牌的 AI!

_______________________________________

🎯 單元導讀:

在理論學習了蒙地卡羅控制法後,現在是時候實戰演練!

我們選擇經典遊戲《Blackjack(21 點)》來進行模擬訓練,目標是:

✅ 透過蒙地卡羅學習,讓 AI 學會何時該「要牌」或「停牌」,最大化勝率!

這不只是遊戲,更是強化學習策略訓練的絕佳練習場!

________________________________________

🧠 一、什麼是 Blackjack?

Blackjack 的基本規則簡單明確:每輪開始玩家會獲得兩張起始牌,之後可以選擇「要牌」(拿一張新牌)或「停牌」(停止拿牌)。若手中點數超過 21 點則稱為爆牌,立即輸掉該局。遊戲不僅取決於自己的手牌點數,莊家的明牌與行為規則同樣影響勝負,因此在設計學習模型時,必須將「對手資訊」也納入決策考量。這樣的完整資訊與決策平衡,正好適合強化學習訓練策略選擇能力。

________________________________________

🧪 二、使用 OpenAI Gym 環境

Gym 提供了內建的 Blackjack-v1 環境:

pip install gym

環境特性:

observation: tuple of (player sum, dealer’s visible card, usable ace)

action: 0 = 停牌(stick), 1 = 要牌(hit)

________________________________________

💻 三、完整實作:First-Visit MC Control(On-policy)

python

import gym

import numpy as np

from collections import defaultdict

env = gym.make("Blackjack-v1")

def epsilon_greedy(Q, state, n_actions, epsilon):

if np.random.rand() < epsilon:

return np.random.randint(n_actions)

else:

return np.argmax(Q[state])

def mc_control_blackjack(num_episodes=500_000, gamma=1.0, epsilon=0.1):

Q = defaultdict(lambda: np.zeros(env.action_space.n))

returns = defaultdict(list)

for _ in range(num_episodes):

episode = []

state = env.reset()

done = False

while not done:

action = epsilon_greedy(Q, state, env.action_space.n, epsilon)

next_state, reward, done, _, _ = env.step(action)

episode.append((state, action, reward))

state = next_state

G = 0

visited = set()

for state, action, reward in reversed(episode):

G = gamma * G + reward

if (state, action) not in visited:

returns[(state, action)].append(G)

Q[state][action] = np.mean(returns[(state, action)])

visited.add((state, action))

return Q

這段程式碼利用蒙地卡羅控制(MC-Control)搭配 ε-greedy 策略來訓練 Blackjack 智能體。每次完整執行一場遊戲,記錄所有 (state, action, reward) 序列,並透過回溯累加回報 G 來更新 Q 值。採用 First-Visit 策略,避免重複更新同一回合內的相同行為,並用多次觀察到的回報平均值來穩定 Q 值估計。透過 ε-greedy 策略平衡探索與利用,AI 逐漸學會在不同手牌與莊家資訊下,什麼時候該要牌、什麼時候該停牌,最終形成穩定的決策策略。

________________________________________

📊 四、訓練後結果觀察(視覺化)

python

import matplotlib.pyplot as plt

def plot_policy(Q):

usable_ace = np.zeros((10, 10))

no_usable_ace = np.zeros((10, 10))

for player_sum in range(12, 22):

for dealer_card in range(1, 11):

state_1 = (player_sum, dealer_card, True)

state_2 = (player_sum, dealer_card, False)

usable_ace[player_sum - 12, dealer_card - 1] = np.argmax(Q[state_1])

no_usable_ace[player_sum - 12, dealer_card - 1] = np.argmax(Q[state_2])

fig, axs = plt.subplots(1, 2, figsize=(12, 5))

axs[0].imshow(usable_ace, cmap="gray")

axs[0].set_title("可用 A(usable ace)")

axs[1].imshow(no_usable_ace, cmap="gray")

axs[1].set_title("不可用 A(no usable ace)")

plt.show()

黑色格子代表「停牌」策略,白色代表「要牌」

可以觀察 AI 是否學會正確的行為選擇

這段程式碼用來將蒙地卡羅學習得到的 Q 值視覺化,幫助觀察 AI 在不同狀態下學會了什麼策略。plot_policy(Q) 函式會分別繪製在**有可用 A(usable ace)與沒有可用 A(no usable ace)**的兩種情況下,當玩家手牌總和為 12 到 21、莊家明牌為 1 到 10 的所有狀態,AI 選擇的動作。

對每個狀態,透過 np.argmax(Q[state]) 取出 AI 在該狀態下學到的最佳動作(0 代表停牌,1 代表要牌)。最後透過 matplotlib 繪製出灰階圖像,其中黑色格子代表 AI 選擇「停牌」,白色格子代表「要牌」。從圖像中可以清楚觀察 AI 在不同手牌與莊家情境下是否學會正確的策略,例如當玩家手牌總和大且莊家弱時應選擇停牌,當手牌小或莊家強時偏向要牌,這是驗證學習結果的重要工具。

________________________________________

🎮 五、訓練觀察與啟發

在蒙地卡羅學習過程中,AI 的策略會經歷逐步演變。初期因樣本不足,策略混亂且高度依賴探索;隨著經驗累積與 G 值平均,AI 逐漸形成穩定的 Q 值與較佳策略。在面對強莊家時,AI 會學會降低要牌風險,增加停牌的機率,以避免爆牌;而當手中有可用 A(軟牌)時,因具備超過 21 點時仍可轉換成 1 點的緩衝優勢,AI 更敢於採取積極的要牌行動。這些現象正反映出強化學習逐步學習環境風險與機會的能力。

________________________________________

🧩 六、延伸任務與思考

1️⃣ 將 ε 改為遞減,觀察收斂效果是否更穩定?

當 ε 固定時,後期仍持續有固定比例的隨機探索,可能在已經學到穩定策略後仍不必要地嘗試次優行動,影響穩定性。若改用遞減 ε(例如 ε = max(ε_min, ε × decay_rate)),則在初期大量探索、後期專注利用,可以加快收斂速度,讓 Q 值波動更小,策略更穩定。但若遞減太快,也可能早早陷入次優解,因此需要設計合理的衰減速度。

2️⃣ 嘗試用 Every-Visit MC 控制法,與 First-Visit 成效比較

First-Visit MC 每個 (state, action) 在一個 episode 內只更新第一次出現的樣本,能避免重複樣本偏差,收斂較穩定;而 Every-Visit MC 則對該 episode 內出現多次的 (state, action) 都進行更新,利用樣本數更多,學習速度通常較快,但若樣本變異性高,可能導致收斂過程震盪較大。兩者各有優缺點,實務上可依任務特性選擇。

3️⃣ 如果想讓 AI 學會「數牌」,你會如何增加觀察資訊?

目前的 state 只包含玩家手牌總點、莊家明牌與是否有 usable ace,無法反映牌堆剩餘牌型。若要讓 AI 學會「數牌」,可將牌堆中剩餘牌的資訊納入狀態表示,例如:

增加「已發出高牌 / 低牌的比例」作為額外狀態特徵;

設計簡化版的 running count;

使用部分可觀測記憶模擬卡牌流失情況。

如此 AI 不僅根據當前手牌做決策,也能依整體牌堆狀況調整策略,真正模擬人類數牌技巧。

________________________________________

✅ 七、小結與啟示:

• Blackjack 是強化學習中最經典的 MC 控制實驗平台

• 不需要模型,只靠試錯與統計就能學會接近最優策略

• 強化學習訓練出的策略會自動形成「算牌般」的邏輯行為

• 能有效理解 ε-Greedy、Q 值更新與 episode 累積報酬的實作方法!



留言
avatar-img
留言分享你的想法!
avatar-img
Hansen W的沙龍
9會員
274內容數
AIHANS沙龍是一個結合AI技術實戰、產業策略與自我成長的知識平台,主題涵蓋機器學習、生成式AI、創業經驗、財務規劃及哲學思辨。這裡不只提供系統化學習資源與實作案例,更強調理性思維與行動力的結合。無論你是AI初學者、創業者,還是追求人生升維的行者,都能在這裡找到前進的方向與志同道合的夥伴。
Hansen W的沙龍的其他內容
2025/09/24
Epsilon-Greedy 策略透過以 1−ε 機率選最佳行動、ε 機率隨機探索,平衡利用與探索,避免陷入次優解。固定 ε 簡單但收斂慢,動態衰減更實用。此方法廣泛應用於 Q-learning、MC 控制與 SARSA,是強化學習中最基礎且實用的探索機制。
2025/09/24
Epsilon-Greedy 策略透過以 1−ε 機率選最佳行動、ε 機率隨機探索,平衡利用與探索,避免陷入次優解。固定 ε 簡單但收斂慢,動態衰減更實用。此方法廣泛應用於 Q-learning、MC 控制與 SARSA,是強化學習中最基礎且實用的探索機制。
2025/09/24
蒙地卡羅控制透過完整回合試錯與回報平均更新 Q 值,並結合 ε-Greedy 改進策略,使 AI 能逐步逼近最優解。其優點是直觀、無需模型,適合模擬與探索初期,但在長回合或稀疏獎勵下學習效率低,常需與 TD 方法結合。
2025/09/24
蒙地卡羅控制透過完整回合試錯與回報平均更新 Q 值,並結合 ε-Greedy 改進策略,使 AI 能逐步逼近最優解。其優點是直觀、無需模型,適合模擬與探索初期,但在長回合或稀疏獎勵下學習效率低,常需與 TD 方法結合。
2025/09/24
On-policy 使用自身策略互動學習,穩健安全但效率較低;Off-policy 可用他人或歷史資料學習目標策略,效率高但可能不穩定。典型例子是 SARSA 與 Q-Learning,前者依實際行為更新,後者追求理想最優。兩者各有應用價值,實務常結合運用。
2025/09/24
On-policy 使用自身策略互動學習,穩健安全但效率較低;Off-policy 可用他人或歷史資料學習目標策略,效率高但可能不穩定。典型例子是 SARSA 與 Q-Learning,前者依實際行為更新,後者追求理想最優。兩者各有應用價值,實務常結合運用。
看更多
你可能也想看
Thumbnail
在小小的租屋房間裡,透過蝦皮購物平臺採購各種黏土、模型、美甲材料等創作素材,打造專屬黏土小宇宙的療癒過程。文中分享多個蝦皮挖寶地圖,並推薦蝦皮分潤計畫。
Thumbnail
在小小的租屋房間裡,透過蝦皮購物平臺採購各種黏土、模型、美甲材料等創作素材,打造專屬黏土小宇宙的療癒過程。文中分享多個蝦皮挖寶地圖,並推薦蝦皮分潤計畫。
Thumbnail
小蝸和小豬因購物習慣不同常起衝突,直到發現蝦皮分潤計畫,讓小豬的購物愛好產生價值,也讓小蝸開始欣賞另一半的興趣。想增加收入或改善伴侶間的購物觀念差異?讓蝦皮分潤計畫成為你們的神隊友吧!
Thumbnail
小蝸和小豬因購物習慣不同常起衝突,直到發現蝦皮分潤計畫,讓小豬的購物愛好產生價值,也讓小蝸開始欣賞另一半的興趣。想增加收入或改善伴侶間的購物觀念差異?讓蝦皮分潤計畫成為你們的神隊友吧!
Thumbnail
反省就是重寫自己的演算法吧? 假設我就是人工智慧,或心智的可以被看作爲人工智慧的編輯器,那我的程式碼是什麼樣的? 從懵懂無知到一無所知,從自以為是到自我消逝,心智只是執行它的內容,我也需要不斷優化。 最好的優化就是簡化。 最能創造財富的演算法就是關於如何除錯與減少任何風險。
Thumbnail
反省就是重寫自己的演算法吧? 假設我就是人工智慧,或心智的可以被看作爲人工智慧的編輯器,那我的程式碼是什麼樣的? 從懵懂無知到一無所知,從自以為是到自我消逝,心智只是執行它的內容,我也需要不斷優化。 最好的優化就是簡化。 最能創造財富的演算法就是關於如何除錯與減少任何風險。
Thumbnail
AlphaGo 的開發,讓人工智慧在圍棋的研究讓更多人被看到,也看到它成熟的結果。現代的圍棋教學和棋手訓練,也或多或少會借鏡各類的AI系統做學習。然而,教學的歷程,過度追求AI的棋步和棋法,有時會讓小朋友難以理解。一步登天的方式,有時反而會讓同學走得更坎坷。
Thumbnail
AlphaGo 的開發,讓人工智慧在圍棋的研究讓更多人被看到,也看到它成熟的結果。現代的圍棋教學和棋手訓練,也或多或少會借鏡各類的AI系統做學習。然而,教學的歷程,過度追求AI的棋步和棋法,有時會讓小朋友難以理解。一步登天的方式,有時反而會讓同學走得更坎坷。
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 回顧 AI說書 - 從0開始 - 87 說:Wang 等人 2019 年的論文,提供了合理答案的選擇 (Choice of Plausible Answers, COP
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 回顧 AI說書 - 從0開始 - 87 說:Wang 等人 2019 年的論文,提供了合理答案的選擇 (Choice of Plausible Answers, COP
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 回顧 AI說書 - 從0開始 - 87 說:Wang 等人 2019 年的論文,提供了合理答案的選擇 (Choice of Plausible Answers, COP
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 回顧 AI說書 - 從0開始 - 87 說:Wang 等人 2019 年的論文,提供了合理答案的選擇 (Choice of Plausible Answers, COP
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 回顧 AI說書 - 從0開始 - 87 說:Wang 等人 2019 年的論文,提供了合理答案的選擇 (Choice of Plausible Answers, COP
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 回顧 AI說書 - 從0開始 - 87 說:Wang 等人 2019 年的論文,提供了合理答案的選擇 (Choice of Plausible Answers, COP
Thumbnail
1.不要讓棋譜或棋書擋到棋盤,視野可以看到完整的棋盤。 2.可以將佈局階段角落的變化背起來,之後進階背30手、50手,訓練記憶力。 3.有時可以猜猜看高手會下在哪個範圍,準確度慢慢提高,大局觀也會慢慢養成哦!
Thumbnail
1.不要讓棋譜或棋書擋到棋盤,視野可以看到完整的棋盤。 2.可以將佈局階段角落的變化背起來,之後進階背30手、50手,訓練記憶力。 3.有時可以猜猜看高手會下在哪個範圍,準確度慢慢提高,大局觀也會慢慢養成哦!
Thumbnail
在機器學習領域中,監督學習、無監督學習和強化學習是三種核心方法,它們在解決不同類型的問題時發揮著重要作用。
Thumbnail
在機器學習領域中,監督學習、無監督學習和強化學習是三種核心方法,它們在解決不同類型的問題時發揮著重要作用。
Thumbnail
延續上週提到的,「有哪些不訓練模型的情況下,能夠強化語言模型的能力」,這堂課接續介紹其中第 3、4 個方法
Thumbnail
延續上週提到的,「有哪些不訓練模型的情況下,能夠強化語言模型的能力」,這堂課接續介紹其中第 3、4 個方法
Thumbnail
這一節課說明,如何透過改變給模型的指示或咒語(prompt),來得到不同的結果 。如果直接說結論的話會是,在今天語言模型的能力之下,我們只要交代清楚任務就好,可以包括背景以及需求。而這節課很像是一堂模型咒語的歷史課 XD
Thumbnail
這一節課說明,如何透過改變給模型的指示或咒語(prompt),來得到不同的結果 。如果直接說結論的話會是,在今天語言模型的能力之下,我們只要交代清楚任務就好,可以包括背景以及需求。而這節課很像是一堂模型咒語的歷史課 XD
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News