石頭剪刀布自學習人工智慧

2021-10-07 23:00:10 字數 2067 閱讀 8839

先點關注,不迷路

前一段靈光一現,想出了這個演算法

不知道以前有沒有人寫過(應該是有的)

不過我覺得我還是可以大概說一下我的想法

還是那句話,講得不好勿噴~

**詳解

既然是自學習,那肯定是得學習的

石頭剪刀布這個遊戲本身可能是沒什麼可學的,隨機數就可以獲得不錯的勝率

由於勝負是由兩個人的決策決定的,只能通過隨機+猜對手的決策來進行決策,不存在永遠獲勝的方案

因此可以通過學習對手通常的決策或是偏好來提高勝率

另外,石頭剪刀布可以抽象成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...