'Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習'

"
"
Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

前言

之前本號就有一篇文章是關於用Python編寫一個"拿石子"遊戲,一個能讓你與電腦對弈的小遊戲,但其中電腦玩家的選擇是隨機的,意味著你是與一個智障電腦在玩遊戲。

今天我們更進一步,編寫程序讓這個智障電腦可以自己與自己不斷玩這個"拿石子"遊戲,最終學會如何贏得這個遊戲。不僅如此,我們還可以通過這個訓練後的電腦玩家得知這個遊戲的必勝祕訣(文末處)。下面看看示意動圖。

"
Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

前言

之前本號就有一篇文章是關於用Python編寫一個"拿石子"遊戲,一個能讓你與電腦對弈的小遊戲,但其中電腦玩家的選擇是隨機的,意味著你是與一個智障電腦在玩遊戲。

今天我們更進一步,編寫程序讓這個智障電腦可以自己與自己不斷玩這個"拿石子"遊戲,最終學會如何贏得這個遊戲。不僅如此,我們還可以通過這個訓練後的電腦玩家得知這個遊戲的必勝祕訣(文末處)。下面看看示意動圖。

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

電腦自訓練

"
Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

前言

之前本號就有一篇文章是關於用Python編寫一個"拿石子"遊戲,一個能讓你與電腦對弈的小遊戲,但其中電腦玩家的選擇是隨機的,意味著你是與一個智障電腦在玩遊戲。

今天我們更進一步,編寫程序讓這個智障電腦可以自己與自己不斷玩這個"拿石子"遊戲,最終學會如何贏得這個遊戲。不僅如此,我們還可以通過這個訓練後的電腦玩家得知這個遊戲的必勝祕訣(文末處)。下面看看示意動圖。

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

電腦自訓練

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

與電腦對戰

高能預警,本文與之前的文章不一樣,需要自己實現一個強化學習中的一個小算法,但這個算法不難,而且可以廣泛應用到其他同類型的博弈問題中,可以讓你做出有趣的東西出來。我們開始吧。

[項目代碼地址](https://github.com/CrystalWindSnake/Creative/tree/master/python/rl_learning_stone)

"拿石子"遊戲規則

拿石子游戲規則很簡單,開始有一定數量的石子(假如是10),然後兩人輪流從石子堆中取走一定範圍的數量(例如是1到3),以此類推,最後拿走剩餘的所有石子的人就輸了。

本文需要的庫

  • numpy
  • pandas
  • retrying

如果你已經看過我關於如何安裝Anaconda的文章,那麼這些庫基本都不用操心了。

程序結構

由於本次程序較為複雜,並且日後我會繼續使用不同的方式去改善他。因此不會使用上次文章中的代碼結構,而是採用類的方式組織代碼。 整個遊戲有3個角色:

"
Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

前言

之前本號就有一篇文章是關於用Python編寫一個"拿石子"遊戲,一個能讓你與電腦對弈的小遊戲,但其中電腦玩家的選擇是隨機的,意味著你是與一個智障電腦在玩遊戲。

今天我們更進一步,編寫程序讓這個智障電腦可以自己與自己不斷玩這個"拿石子"遊戲,最終學會如何贏得這個遊戲。不僅如此,我們還可以通過這個訓練後的電腦玩家得知這個遊戲的必勝祕訣(文末處)。下面看看示意動圖。

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

電腦自訓練

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

與電腦對戰

高能預警,本文與之前的文章不一樣,需要自己實現一個強化學習中的一個小算法,但這個算法不難,而且可以廣泛應用到其他同類型的博弈問題中,可以讓你做出有趣的東西出來。我們開始吧。

[項目代碼地址](https://github.com/CrystalWindSnake/Creative/tree/master/python/rl_learning_stone)

"拿石子"遊戲規則

拿石子游戲規則很簡單,開始有一定數量的石子(假如是10),然後兩人輪流從石子堆中取走一定範圍的數量(例如是1到3),以此類推,最後拿走剩餘的所有石子的人就輸了。

本文需要的庫

  • numpy
  • pandas
  • retrying

如果你已經看過我關於如何安裝Anaconda的文章,那麼這些庫基本都不用操心了。

程序結構

由於本次程序較為複雜,並且日後我會繼續使用不同的方式去改善他。因此不會使用上次文章中的代碼結構,而是採用類的方式組織代碼。 整個遊戲有3個角色:

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

上述所有實現都在models.py中,有興趣的朋友請去github查看即可。

關鍵點說明

到底機器學習的程序與普通的應用開發程序有什麼不一樣?正如本文的實現,程序的邏輯走向不是通過我們寫代碼的方式編寫的,而是通過數據來決定。

下面就來簡單說明整個過程的關鍵點

"
Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

前言

之前本號就有一篇文章是關於用Python編寫一個"拿石子"遊戲,一個能讓你與電腦對弈的小遊戲,但其中電腦玩家的選擇是隨機的,意味著你是與一個智障電腦在玩遊戲。

今天我們更進一步,編寫程序讓這個智障電腦可以自己與自己不斷玩這個"拿石子"遊戲,最終學會如何贏得這個遊戲。不僅如此,我們還可以通過這個訓練後的電腦玩家得知這個遊戲的必勝祕訣(文末處)。下面看看示意動圖。

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

電腦自訓練

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

與電腦對戰

高能預警,本文與之前的文章不一樣,需要自己實現一個強化學習中的一個小算法,但這個算法不難,而且可以廣泛應用到其他同類型的博弈問題中,可以讓你做出有趣的東西出來。我們開始吧。

[項目代碼地址](https://github.com/CrystalWindSnake/Creative/tree/master/python/rl_learning_stone)

"拿石子"遊戲規則

拿石子游戲規則很簡單,開始有一定數量的石子(假如是10),然後兩人輪流從石子堆中取走一定範圍的數量(例如是1到3),以此類推,最後拿走剩餘的所有石子的人就輸了。

本文需要的庫

  • numpy
  • pandas
  • retrying

如果你已經看過我關於如何安裝Anaconda的文章,那麼這些庫基本都不用操心了。

程序結構

由於本次程序較為複雜,並且日後我會繼續使用不同的方式去改善他。因此不會使用上次文章中的代碼結構,而是採用類的方式組織代碼。 整個遊戲有3個角色:

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

上述所有實現都在models.py中,有興趣的朋友請去github查看即可。

關鍵點說明

到底機器學習的程序與普通的應用開發程序有什麼不一樣?正如本文的實現,程序的邏輯走向不是通過我們寫代碼的方式編寫的,而是通過數據來決定。

下面就來簡單說明整個過程的關鍵點

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

  • 整體上來說,電腦玩家每次選擇拿取多少個石子,是通過一個表的數據判斷出來。
  • 圖中的行索引(左邊綠色框中的),表示當前盤面的石子數量。
  • 列索引(上方紅色框中),表示可以選擇的數量
  • 那麼行列索引交叉點的數據,就表示這次選擇的價值,這個值越大,電腦玩家就會越可能選擇。
  • 所以你可以看到,當你與電腦玩家對戰時,其實他早就想好每一步要怎麼走了。

問題是,這個表格中的價值數據是怎麼得來的?沒錯,就是讓他與自己不斷的對戰從而獲得經驗而來。 我們來分析一下這個對戰過程

"
Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

前言

之前本號就有一篇文章是關於用Python編寫一個"拿石子"遊戲,一個能讓你與電腦對弈的小遊戲,但其中電腦玩家的選擇是隨機的,意味著你是與一個智障電腦在玩遊戲。

今天我們更進一步,編寫程序讓這個智障電腦可以自己與自己不斷玩這個"拿石子"遊戲,最終學會如何贏得這個遊戲。不僅如此,我們還可以通過這個訓練後的電腦玩家得知這個遊戲的必勝祕訣(文末處)。下面看看示意動圖。

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

電腦自訓練

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

與電腦對戰

高能預警,本文與之前的文章不一樣,需要自己實現一個強化學習中的一個小算法,但這個算法不難,而且可以廣泛應用到其他同類型的博弈問題中,可以讓你做出有趣的東西出來。我們開始吧。

[項目代碼地址](https://github.com/CrystalWindSnake/Creative/tree/master/python/rl_learning_stone)

"拿石子"遊戲規則

拿石子游戲規則很簡單,開始有一定數量的石子(假如是10),然後兩人輪流從石子堆中取走一定範圍的數量(例如是1到3),以此類推,最後拿走剩餘的所有石子的人就輸了。

本文需要的庫

  • numpy
  • pandas
  • retrying

如果你已經看過我關於如何安裝Anaconda的文章,那麼這些庫基本都不用操心了。

程序結構

由於本次程序較為複雜,並且日後我會繼續使用不同的方式去改善他。因此不會使用上次文章中的代碼結構,而是採用類的方式組織代碼。 整個遊戲有3個角色:

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

上述所有實現都在models.py中,有興趣的朋友請去github查看即可。

關鍵點說明

到底機器學習的程序與普通的應用開發程序有什麼不一樣?正如本文的實現,程序的邏輯走向不是通過我們寫代碼的方式編寫的,而是通過數據來決定。

下面就來簡單說明整個過程的關鍵點

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

  • 整體上來說,電腦玩家每次選擇拿取多少個石子,是通過一個表的數據判斷出來。
  • 圖中的行索引(左邊綠色框中的),表示當前盤面的石子數量。
  • 列索引(上方紅色框中),表示可以選擇的數量
  • 那麼行列索引交叉點的數據,就表示這次選擇的價值,這個值越大,電腦玩家就會越可能選擇。
  • 所以你可以看到,當你與電腦玩家對戰時,其實他早就想好每一步要怎麼走了。

問題是,這個表格中的價值數據是怎麼得來的?沒錯,就是讓他與自己不斷的對戰從而獲得經驗而來。 我們來分析一下這個對戰過程

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

  • 一開始的時候,整個表格的值全是0
  • 假設當前剩餘數量是10,那麼他就會看行索引10對應的那一行的數據。
  • 他發現那一行全是0,那麼他就會隨機來挑。對的,此時他就是在碰運氣。
  • 當他選好本次拿取數後,就會根據下一輪可能出現的狀態來計算價值,然後更新到本次選擇中。
  • 上圖包含了3種可能的選擇中的每個情況

當然,第一次訓練時,比較靠後的記錄都不會有任何更新。直到遇到獎勵或懲罰。下圖表明瞭這樣的情況

"
Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

前言

之前本號就有一篇文章是關於用Python編寫一個"拿石子"遊戲,一個能讓你與電腦對弈的小遊戲,但其中電腦玩家的選擇是隨機的,意味著你是與一個智障電腦在玩遊戲。

今天我們更進一步,編寫程序讓這個智障電腦可以自己與自己不斷玩這個"拿石子"遊戲,最終學會如何贏得這個遊戲。不僅如此,我們還可以通過這個訓練後的電腦玩家得知這個遊戲的必勝祕訣(文末處)。下面看看示意動圖。

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

電腦自訓練

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

與電腦對戰

高能預警,本文與之前的文章不一樣,需要自己實現一個強化學習中的一個小算法,但這個算法不難,而且可以廣泛應用到其他同類型的博弈問題中,可以讓你做出有趣的東西出來。我們開始吧。

[項目代碼地址](https://github.com/CrystalWindSnake/Creative/tree/master/python/rl_learning_stone)

"拿石子"遊戲規則

拿石子游戲規則很簡單,開始有一定數量的石子(假如是10),然後兩人輪流從石子堆中取走一定範圍的數量(例如是1到3),以此類推,最後拿走剩餘的所有石子的人就輸了。

本文需要的庫

  • numpy
  • pandas
  • retrying

如果你已經看過我關於如何安裝Anaconda的文章,那麼這些庫基本都不用操心了。

程序結構

由於本次程序較為複雜,並且日後我會繼續使用不同的方式去改善他。因此不會使用上次文章中的代碼結構,而是採用類的方式組織代碼。 整個遊戲有3個角色:

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

上述所有實現都在models.py中,有興趣的朋友請去github查看即可。

關鍵點說明

到底機器學習的程序與普通的應用開發程序有什麼不一樣?正如本文的實現,程序的邏輯走向不是通過我們寫代碼的方式編寫的,而是通過數據來決定。

下面就來簡單說明整個過程的關鍵點

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

  • 整體上來說,電腦玩家每次選擇拿取多少個石子,是通過一個表的數據判斷出來。
  • 圖中的行索引(左邊綠色框中的),表示當前盤面的石子數量。
  • 列索引(上方紅色框中),表示可以選擇的數量
  • 那麼行列索引交叉點的數據,就表示這次選擇的價值,這個值越大,電腦玩家就會越可能選擇。
  • 所以你可以看到,當你與電腦玩家對戰時,其實他早就想好每一步要怎麼走了。

問題是,這個表格中的價值數據是怎麼得來的?沒錯,就是讓他與自己不斷的對戰從而獲得經驗而來。 我們來分析一下這個對戰過程

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

  • 一開始的時候,整個表格的值全是0
  • 假設當前剩餘數量是10,那麼他就會看行索引10對應的那一行的數據。
  • 他發現那一行全是0,那麼他就會隨機來挑。對的,此時他就是在碰運氣。
  • 當他選好本次拿取數後,就會根據下一輪可能出現的狀態來計算價值,然後更新到本次選擇中。
  • 上圖包含了3種可能的選擇中的每個情況

當然,第一次訓練時,比較靠後的記錄都不會有任何更新。直到遇到獎勵或懲罰。下圖表明瞭這樣的情況

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

  • 假如當前剩餘數量是4,電腦玩家選擇,他選了取走3個。
  • 這是裁判反饋給他說,你贏了,因此在(行4,列3)那裡的價值加了10分。這就是電腦玩家可以自己學會玩遊戲的關鍵。
  • 如果裁判反饋給他說,你輸了,那麼以一樣的機制扣減價值分。

再來看看之後他是怎麼得到下面行的分數。假設現在已經訓練了幾個回合,表格上方的行陸陸續續有些得分

"
Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

前言

之前本號就有一篇文章是關於用Python編寫一個"拿石子"遊戲,一個能讓你與電腦對弈的小遊戲,但其中電腦玩家的選擇是隨機的,意味著你是與一個智障電腦在玩遊戲。

今天我們更進一步,編寫程序讓這個智障電腦可以自己與自己不斷玩這個"拿石子"遊戲,最終學會如何贏得這個遊戲。不僅如此,我們還可以通過這個訓練後的電腦玩家得知這個遊戲的必勝祕訣(文末處)。下面看看示意動圖。

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

電腦自訓練

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

與電腦對戰

高能預警,本文與之前的文章不一樣,需要自己實現一個強化學習中的一個小算法,但這個算法不難,而且可以廣泛應用到其他同類型的博弈問題中,可以讓你做出有趣的東西出來。我們開始吧。

[項目代碼地址](https://github.com/CrystalWindSnake/Creative/tree/master/python/rl_learning_stone)

"拿石子"遊戲規則

拿石子游戲規則很簡單,開始有一定數量的石子(假如是10),然後兩人輪流從石子堆中取走一定範圍的數量(例如是1到3),以此類推,最後拿走剩餘的所有石子的人就輸了。

本文需要的庫

  • numpy
  • pandas
  • retrying

如果你已經看過我關於如何安裝Anaconda的文章,那麼這些庫基本都不用操心了。

程序結構

由於本次程序較為複雜,並且日後我會繼續使用不同的方式去改善他。因此不會使用上次文章中的代碼結構,而是採用類的方式組織代碼。 整個遊戲有3個角色:

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

上述所有實現都在models.py中,有興趣的朋友請去github查看即可。

關鍵點說明

到底機器學習的程序與普通的應用開發程序有什麼不一樣?正如本文的實現,程序的邏輯走向不是通過我們寫代碼的方式編寫的,而是通過數據來決定。

下面就來簡單說明整個過程的關鍵點

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

  • 整體上來說,電腦玩家每次選擇拿取多少個石子,是通過一個表的數據判斷出來。
  • 圖中的行索引(左邊綠色框中的),表示當前盤面的石子數量。
  • 列索引(上方紅色框中),表示可以選擇的數量
  • 那麼行列索引交叉點的數據,就表示這次選擇的價值,這個值越大,電腦玩家就會越可能選擇。
  • 所以你可以看到,當你與電腦玩家對戰時,其實他早就想好每一步要怎麼走了。

問題是,這個表格中的價值數據是怎麼得來的?沒錯,就是讓他與自己不斷的對戰從而獲得經驗而來。 我們來分析一下這個對戰過程

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

  • 一開始的時候,整個表格的值全是0
  • 假設當前剩餘數量是10,那麼他就會看行索引10對應的那一行的數據。
  • 他發現那一行全是0,那麼他就會隨機來挑。對的,此時他就是在碰運氣。
  • 當他選好本次拿取數後,就會根據下一輪可能出現的狀態來計算價值,然後更新到本次選擇中。
  • 上圖包含了3種可能的選擇中的每個情況

當然,第一次訓練時,比較靠後的記錄都不會有任何更新。直到遇到獎勵或懲罰。下圖表明瞭這樣的情況

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

  • 假如當前剩餘數量是4,電腦玩家選擇,他選了取走3個。
  • 這是裁判反饋給他說,你贏了,因此在(行4,列3)那裡的價值加了10分。這就是電腦玩家可以自己學會玩遊戲的關鍵。
  • 如果裁判反饋給他說,你輸了,那麼以一樣的機制扣減價值分。

再來看看之後他是怎麼得到下面行的分數。假設現在已經訓練了幾個回合,表格上方的行陸陸續續有些得分

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

  • 假設當前剩餘數量為6,電腦玩家隨機選了1,那麼就可以確定下一個可能的狀態區域
  • 發現3行數據沒有一行全是0或全是負數,因此(行6,列1)那裡的價值分加3行區域中的最大值*學習率(就是一個百分比)
  • 以此類推,電腦玩家不斷與自己玩遊戲,不斷更新表格中的分數。
  • 注意一點,整個項目我們都沒有編寫任何的遊戲邏輯代碼。只有關於獎勵與懲罰相關的邏輯。

遊戲必勝祕訣

"
Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

前言

之前本號就有一篇文章是關於用Python編寫一個"拿石子"遊戲,一個能讓你與電腦對弈的小遊戲,但其中電腦玩家的選擇是隨機的,意味著你是與一個智障電腦在玩遊戲。

今天我們更進一步,編寫程序讓這個智障電腦可以自己與自己不斷玩這個"拿石子"遊戲,最終學會如何贏得這個遊戲。不僅如此,我們還可以通過這個訓練後的電腦玩家得知這個遊戲的必勝祕訣(文末處)。下面看看示意動圖。

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

電腦自訓練

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

與電腦對戰

高能預警,本文與之前的文章不一樣,需要自己實現一個強化學習中的一個小算法,但這個算法不難,而且可以廣泛應用到其他同類型的博弈問題中,可以讓你做出有趣的東西出來。我們開始吧。

[項目代碼地址](https://github.com/CrystalWindSnake/Creative/tree/master/python/rl_learning_stone)

"拿石子"遊戲規則

拿石子游戲規則很簡單,開始有一定數量的石子(假如是10),然後兩人輪流從石子堆中取走一定範圍的數量(例如是1到3),以此類推,最後拿走剩餘的所有石子的人就輸了。

本文需要的庫

  • numpy
  • pandas
  • retrying

如果你已經看過我關於如何安裝Anaconda的文章,那麼這些庫基本都不用操心了。

程序結構

由於本次程序較為複雜,並且日後我會繼續使用不同的方式去改善他。因此不會使用上次文章中的代碼結構,而是採用類的方式組織代碼。 整個遊戲有3個角色:

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

上述所有實現都在models.py中,有興趣的朋友請去github查看即可。

關鍵點說明

到底機器學習的程序與普通的應用開發程序有什麼不一樣?正如本文的實現,程序的邏輯走向不是通過我們寫代碼的方式編寫的,而是通過數據來決定。

下面就來簡單說明整個過程的關鍵點

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

  • 整體上來說,電腦玩家每次選擇拿取多少個石子,是通過一個表的數據判斷出來。
  • 圖中的行索引(左邊綠色框中的),表示當前盤面的石子數量。
  • 列索引(上方紅色框中),表示可以選擇的數量
  • 那麼行列索引交叉點的數據,就表示這次選擇的價值,這個值越大,電腦玩家就會越可能選擇。
  • 所以你可以看到,當你與電腦玩家對戰時,其實他早就想好每一步要怎麼走了。

問題是,這個表格中的價值數據是怎麼得來的?沒錯,就是讓他與自己不斷的對戰從而獲得經驗而來。 我們來分析一下這個對戰過程

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

  • 一開始的時候,整個表格的值全是0
  • 假設當前剩餘數量是10,那麼他就會看行索引10對應的那一行的數據。
  • 他發現那一行全是0,那麼他就會隨機來挑。對的,此時他就是在碰運氣。
  • 當他選好本次拿取數後,就會根據下一輪可能出現的狀態來計算價值,然後更新到本次選擇中。
  • 上圖包含了3種可能的選擇中的每個情況

當然,第一次訓練時,比較靠後的記錄都不會有任何更新。直到遇到獎勵或懲罰。下圖表明瞭這樣的情況

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

  • 假如當前剩餘數量是4,電腦玩家選擇,他選了取走3個。
  • 這是裁判反饋給他說,你贏了,因此在(行4,列3)那裡的價值加了10分。這就是電腦玩家可以自己學會玩遊戲的關鍵。
  • 如果裁判反饋給他說,你輸了,那麼以一樣的機制扣減價值分。

再來看看之後他是怎麼得到下面行的分數。假設現在已經訓練了幾個回合,表格上方的行陸陸續續有些得分

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

  • 假設當前剩餘數量為6,電腦玩家隨機選了1,那麼就可以確定下一個可能的狀態區域
  • 發現3行數據沒有一行全是0或全是負數,因此(行6,列1)那裡的價值分加3行區域中的最大值*學習率(就是一個百分比)
  • 以此類推,電腦玩家不斷與自己玩遊戲,不斷更新表格中的分數。
  • 注意一點,整個項目我們都沒有編寫任何的遊戲邏輯代碼。只有關於獎勵與懲罰相關的邏輯。

遊戲必勝祕訣

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

  • 上圖把電腦玩家學習到的表格數據顯示出來
  • 看到那些整行都是負數的嗎,那些就是必定會輸的狀態。
  • 這也是為什麼我設定於電腦對戰時默認是21開始並且是電腦先拿,這樣我才有機會贏。
  • 我們還看到從2開始,每個3段就會出現一個必輸的盤面。

小結

本文利用了最簡單的強化學習中的Q-Table機制,讓電腦自學玩遊戲,這是一個非常適合入門的例子(他需要你在Q-Table方法上做出變通)。

後續我會改善這個遊戲,用不同的機器學習的方式去實現這些功能,敬請期待。

如果覺得本文對你有所幫助,記得關注、評論、轉發、收藏噢~

如果你不會Python,但是想學習 ..

沒關係 ,小編已經給你準備好 Python學習資料

私信小編關鍵字“012”即可免費獲取,記得轉發文章+關注小編

"
Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

前言

之前本號就有一篇文章是關於用Python編寫一個"拿石子"遊戲,一個能讓你與電腦對弈的小遊戲,但其中電腦玩家的選擇是隨機的,意味著你是與一個智障電腦在玩遊戲。

今天我們更進一步,編寫程序讓這個智障電腦可以自己與自己不斷玩這個"拿石子"遊戲,最終學會如何贏得這個遊戲。不僅如此,我們還可以通過這個訓練後的電腦玩家得知這個遊戲的必勝祕訣(文末處)。下面看看示意動圖。

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

電腦自訓練

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

與電腦對戰

高能預警,本文與之前的文章不一樣,需要自己實現一個強化學習中的一個小算法,但這個算法不難,而且可以廣泛應用到其他同類型的博弈問題中,可以讓你做出有趣的東西出來。我們開始吧。

[項目代碼地址](https://github.com/CrystalWindSnake/Creative/tree/master/python/rl_learning_stone)

"拿石子"遊戲規則

拿石子游戲規則很簡單,開始有一定數量的石子(假如是10),然後兩人輪流從石子堆中取走一定範圍的數量(例如是1到3),以此類推,最後拿走剩餘的所有石子的人就輸了。

本文需要的庫

  • numpy
  • pandas
  • retrying

如果你已經看過我關於如何安裝Anaconda的文章,那麼這些庫基本都不用操心了。

程序結構

由於本次程序較為複雜,並且日後我會繼續使用不同的方式去改善他。因此不會使用上次文章中的代碼結構,而是採用類的方式組織代碼。 整個遊戲有3個角色:

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

上述所有實現都在models.py中,有興趣的朋友請去github查看即可。

關鍵點說明

到底機器學習的程序與普通的應用開發程序有什麼不一樣?正如本文的實現,程序的邏輯走向不是通過我們寫代碼的方式編寫的,而是通過數據來決定。

下面就來簡單說明整個過程的關鍵點

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

  • 整體上來說,電腦玩家每次選擇拿取多少個石子,是通過一個表的數據判斷出來。
  • 圖中的行索引(左邊綠色框中的),表示當前盤面的石子數量。
  • 列索引(上方紅色框中),表示可以選擇的數量
  • 那麼行列索引交叉點的數據,就表示這次選擇的價值,這個值越大,電腦玩家就會越可能選擇。
  • 所以你可以看到,當你與電腦玩家對戰時,其實他早就想好每一步要怎麼走了。

問題是,這個表格中的價值數據是怎麼得來的?沒錯,就是讓他與自己不斷的對戰從而獲得經驗而來。 我們來分析一下這個對戰過程

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

  • 一開始的時候,整個表格的值全是0
  • 假設當前剩餘數量是10,那麼他就會看行索引10對應的那一行的數據。
  • 他發現那一行全是0,那麼他就會隨機來挑。對的,此時他就是在碰運氣。
  • 當他選好本次拿取數後,就會根據下一輪可能出現的狀態來計算價值,然後更新到本次選擇中。
  • 上圖包含了3種可能的選擇中的每個情況

當然,第一次訓練時,比較靠後的記錄都不會有任何更新。直到遇到獎勵或懲罰。下圖表明瞭這樣的情況

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

  • 假如當前剩餘數量是4,電腦玩家選擇,他選了取走3個。
  • 這是裁判反饋給他說,你贏了,因此在(行4,列3)那裡的價值加了10分。這就是電腦玩家可以自己學會玩遊戲的關鍵。
  • 如果裁判反饋給他說,你輸了,那麼以一樣的機制扣減價值分。

再來看看之後他是怎麼得到下面行的分數。假設現在已經訓練了幾個回合,表格上方的行陸陸續續有些得分

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

  • 假設當前剩餘數量為6,電腦玩家隨機選了1,那麼就可以確定下一個可能的狀態區域
  • 發現3行數據沒有一行全是0或全是負數,因此(行6,列1)那裡的價值分加3行區域中的最大值*學習率(就是一個百分比)
  • 以此類推,電腦玩家不斷與自己玩遊戲,不斷更新表格中的分數。
  • 注意一點,整個項目我們都沒有編寫任何的遊戲邏輯代碼。只有關於獎勵與懲罰相關的邏輯。

遊戲必勝祕訣

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

  • 上圖把電腦玩家學習到的表格數據顯示出來
  • 看到那些整行都是負數的嗎,那些就是必定會輸的狀態。
  • 這也是為什麼我設定於電腦對戰時默認是21開始並且是電腦先拿,這樣我才有機會贏。
  • 我們還看到從2開始,每個3段就會出現一個必輸的盤面。

小結

本文利用了最簡單的強化學習中的Q-Table機制,讓電腦自學玩遊戲,這是一個非常適合入門的例子(他需要你在Q-Table方法上做出變通)。

後續我會改善這個遊戲,用不同的機器學習的方式去實現這些功能,敬請期待。

如果覺得本文對你有所幫助,記得關注、評論、轉發、收藏噢~

如果你不會Python,但是想學習 ..

沒關係 ,小編已經給你準備好 Python學習資料

私信小編關鍵字“012”即可免費獲取,記得轉發文章+關注小編

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

"
Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

前言

之前本號就有一篇文章是關於用Python編寫一個"拿石子"遊戲,一個能讓你與電腦對弈的小遊戲,但其中電腦玩家的選擇是隨機的,意味著你是與一個智障電腦在玩遊戲。

今天我們更進一步,編寫程序讓這個智障電腦可以自己與自己不斷玩這個"拿石子"遊戲,最終學會如何贏得這個遊戲。不僅如此,我們還可以通過這個訓練後的電腦玩家得知這個遊戲的必勝祕訣(文末處)。下面看看示意動圖。

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

電腦自訓練

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

與電腦對戰

高能預警,本文與之前的文章不一樣,需要自己實現一個強化學習中的一個小算法,但這個算法不難,而且可以廣泛應用到其他同類型的博弈問題中,可以讓你做出有趣的東西出來。我們開始吧。

[項目代碼地址](https://github.com/CrystalWindSnake/Creative/tree/master/python/rl_learning_stone)

"拿石子"遊戲規則

拿石子游戲規則很簡單,開始有一定數量的石子(假如是10),然後兩人輪流從石子堆中取走一定範圍的數量(例如是1到3),以此類推,最後拿走剩餘的所有石子的人就輸了。

本文需要的庫

  • numpy
  • pandas
  • retrying

如果你已經看過我關於如何安裝Anaconda的文章,那麼這些庫基本都不用操心了。

程序結構

由於本次程序較為複雜,並且日後我會繼續使用不同的方式去改善他。因此不會使用上次文章中的代碼結構,而是採用類的方式組織代碼。 整個遊戲有3個角色:

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

上述所有實現都在models.py中,有興趣的朋友請去github查看即可。

關鍵點說明

到底機器學習的程序與普通的應用開發程序有什麼不一樣?正如本文的實現,程序的邏輯走向不是通過我們寫代碼的方式編寫的,而是通過數據來決定。

下面就來簡單說明整個過程的關鍵點

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

  • 整體上來說,電腦玩家每次選擇拿取多少個石子,是通過一個表的數據判斷出來。
  • 圖中的行索引(左邊綠色框中的),表示當前盤面的石子數量。
  • 列索引(上方紅色框中),表示可以選擇的數量
  • 那麼行列索引交叉點的數據,就表示這次選擇的價值,這個值越大,電腦玩家就會越可能選擇。
  • 所以你可以看到,當你與電腦玩家對戰時,其實他早就想好每一步要怎麼走了。

問題是,這個表格中的價值數據是怎麼得來的?沒錯,就是讓他與自己不斷的對戰從而獲得經驗而來。 我們來分析一下這個對戰過程

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

  • 一開始的時候,整個表格的值全是0
  • 假設當前剩餘數量是10,那麼他就會看行索引10對應的那一行的數據。
  • 他發現那一行全是0,那麼他就會隨機來挑。對的,此時他就是在碰運氣。
  • 當他選好本次拿取數後,就會根據下一輪可能出現的狀態來計算價值,然後更新到本次選擇中。
  • 上圖包含了3種可能的選擇中的每個情況

當然,第一次訓練時,比較靠後的記錄都不會有任何更新。直到遇到獎勵或懲罰。下圖表明瞭這樣的情況

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

  • 假如當前剩餘數量是4,電腦玩家選擇,他選了取走3個。
  • 這是裁判反饋給他說,你贏了,因此在(行4,列3)那裡的價值加了10分。這就是電腦玩家可以自己學會玩遊戲的關鍵。
  • 如果裁判反饋給他說,你輸了,那麼以一樣的機制扣減價值分。

再來看看之後他是怎麼得到下面行的分數。假設現在已經訓練了幾個回合,表格上方的行陸陸續續有些得分

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

  • 假設當前剩餘數量為6,電腦玩家隨機選了1,那麼就可以確定下一個可能的狀態區域
  • 發現3行數據沒有一行全是0或全是負數,因此(行6,列1)那裡的價值分加3行區域中的最大值*學習率(就是一個百分比)
  • 以此類推,電腦玩家不斷與自己玩遊戲,不斷更新表格中的分數。
  • 注意一點,整個項目我們都沒有編寫任何的遊戲邏輯代碼。只有關於獎勵與懲罰相關的邏輯。

遊戲必勝祕訣

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

  • 上圖把電腦玩家學習到的表格數據顯示出來
  • 看到那些整行都是負數的嗎,那些就是必定會輸的狀態。
  • 這也是為什麼我設定於電腦對戰時默認是21開始並且是電腦先拿,這樣我才有機會贏。
  • 我們還看到從2開始,每個3段就會出現一個必輸的盤面。

小結

本文利用了最簡單的強化學習中的Q-Table機制,讓電腦自學玩遊戲,這是一個非常適合入門的例子(他需要你在Q-Table方法上做出變通)。

後續我會改善這個遊戲,用不同的機器學習的方式去實現這些功能,敬請期待。

如果覺得本文對你有所幫助,記得關注、評論、轉發、收藏噢~

如果你不會Python,但是想學習 ..

沒關係 ,小編已經給你準備好 Python學習資料

私信小編關鍵字“012”即可免費獲取,記得轉發文章+關注小編

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

Python做人工智能?讓電腦自己學會玩遊戲,實戰帶你入門機器學習

"

相關推薦

推薦中...