先點關注,不迷路
前一段靈光一現,想出了這個演算法
不知道以前有沒有人寫過(應該是有的)
不過我覺得我還是可以大概說一下我的想法
還是那句話,講得不好勿噴~
**詳解
既然是自學習,那肯定是得學習的
石頭剪刀布這個遊戲本身可能是沒什麼可學的,隨機數就可以獲得不錯的勝率
由於勝負是由兩個人的決策決定的,只能通過隨機+猜對手的決策來進行決策,不存在永遠獲勝的方案
因此可以通過學習對手通常的決策或是偏好來提高勝率
另外,石頭剪刀布可以抽象成0, 1, 2或1, 2, 3
本人這裡用的1, 2, 3(沒錯,很髒)
儲存單元:每個儲存單元有三個資料組成a1, a2, a3, n分別表示對手出1, 2, 3, 總數的個數
//memory point
struct mempoint
;
這裡用all(n)而不用概率是因為要避免小數
每個的概率就是ai / all
整個儲存結構就由很多個儲存單元組成
至於多少個,各位可以按照自己的想法自己設計
我這裡用了3*3的,表示上一輪我和對手的狀態
//0~3->4
mempoint _mem[4]
[4];
//last turn status->foe decision
所以整個儲存結構的意思就是說在上回合的情況下,對手出1,2,3的概率
因為大多數人都是根據上一輪的資料來決定這一輪的決策,這樣就可以對一般人有很好的效果了
也可以根據對手的演算法來設計自己的儲存結構
但注意儲存深度越大,學習時間越長
前文說過,沒有永遠獲勝的方案
進行了學習對手的偏好優化後,仍然需要隨機數來決策
但由於知道對手當前出i的概率,我們可以針對對手的決策來進行決策
所以在這裡,隨機數是模擬對手的選擇
隨機數mod all+1, 得出乙個[1, all] 的數 k
1<=k<=a1 :a1/n的概率,這種情況下,我們認為對手會出1
a11+a2:a2/n的概率,這種情況下,我們認為對手會出2
a1+a2
3/n的概率,這種情況下,我們認為對手會出3
然後模擬出對手的決策,我們就可以出能贏他(她,它)的決策
void
decision
(int one,
int two,
int&res)
add+
=_mem[one]
[two]
._list[1]
;if(choose<=_mem[one]
[two]
._list[2]
+add)
res=1;
//cout<<"foe may choose 3, us choose 1";}
這邊注意一點初值問題,因為隨機數要mod all, 所以all!=0
但是開始第一局每種決策概率應該相等
又考慮到不能對以後的學習產生太大的影響
所以all=3, ai=1
void
genmem()
_mem[i]
[m]._all=3;
}}}
順便提一句,第一局的決策可以存在[0][0]裡面,因為開局人也是有偏好的
另外,不要忘記在對手做出決策後儲存在記憶陣列裡哦~
好了,差不多說完了
**我到時候會發粉絲專欄
如果有 錯誤/優化/疑問 歡迎提出
wechat:wxid_ffe28hxx677f32
(其實是我想認識大佬)
1.本文中all和n是同乙個東西,推到中用到的是n,**中寫的是all
2.mod即%,模數不能等於零(因為結果小於模數)
——by於斯為盛
python學習 演算法 石頭剪刀布
1.玩家 控制台輸入 石頭 1 剪刀 2 布 3 2.電腦隨機輸入石頭 剪刀 布 3.判斷勝負 石頭win剪刀,剪刀win布,布win石頭 import random player int input 請出拳 石頭 1 剪刀 2 布 3 computer random.randint 1,3 pri...
如何自學人工智慧?
一 人工智慧 不可多得的綜合性書籍,總體概述了人工智慧領域,幾乎涵蓋新手需要了解的所有基本概念。二 機器學習 電腦科學和統計學的交叉學科 機器學習基礎薄弱的,可以先去tutsplus課程 machine learning distilled 看一下相關概念簡述,coursera上的andrew ng...
學習記錄 python 石頭剪刀布遊戲
1.從控制台輸入你要出的拳 石頭 1,剪刀 2,布 3 2.電腦隨機出拳,假定電腦只會出石頭,完成整體 功能 3.比較勝負,輸出結果 練習 猜拳遊戲 1.從控制台輸入你要出的拳 石頭 1,剪刀 2,布 3 2.電腦隨機出拳,假定電腦只會出石頭,完成整體 功能 3.比較勝負,輸出結果 import r...