tomohxxの日記

麻雀プログラミング

麻雀AI開発DL編(6)

はじめに

これまでmjai環境で自作のAIの評価を行ってきました。以前も言及しましたが、この評価方法ではAIの強さを(mjaiを知らない)第三者に説明しにくいという問題があります。そこで開発を次の段階に進める前に天鳳自動打ちによってAIの評価を行うことにしました。なお、このために天鳳自動打ちのプログラムを一から作成しました。

結果

"Mar1422"というIDで一般卓東南戦を200戦行ったところ二段R1809という結果になりました。安定段位は二段のようです。

f:id:tomohxx:20220322163202p:plain
通算成績

天鳳IDログ検索サイトへのリンクはこちら。https://nodocchi.moe/tenhoulog/#!&name=Mar1422


牌譜(クリックすると確認できます)


所感

一般卓東南戦での二段のポイント配分は30p, 15p, 0p, -60pです。1戦あたりに獲得できるポイント期待値が2.78と低いことから、三段へ昇段するには4位率を下げる必要があります。やはり押し引きが課題と言えそうです。

おわりに

同卓していただいた皆様ありがとうございました。今後は強化学習を用いて麻雀AIを開発しようと考えています。

一人麻雀における和了確率を書き下す(4)

はじめに

今回はついに非復元抽出を想定して一人麻雀における和了確率を書き下します。これが本当の意味での一人麻雀です。非復元抽出を想定するとこれまで扱ってきた復元抽出よりも問題の難易度が上がります。当初は前回の解法を踏襲しようと試みたのですが私の計算能力不足のためそれが無理だったので、前回の「おわりに」で触れた手順少な目のルートを使って和了確率を導きます。

問題

 n-1向聴の手があってこのときの有効牌の枚数を a_0枚、 n-2向聴のときの有効牌の枚数を a_1枚、以降同様に定め聴牌のときの有効牌の枚数を a_{n-1}枚とする。はじめ( t=0)に S枚の牌があるとして t巡目に和了している確率を求めよ。ただし一度捨てた牌は再び山に戻さないという非復元抽出を想定する。

解法

 t巡目に n-1向聴である確率を p^{(0)}_t t巡目に n-2向聴である確率を p^{(1)}_t、以降同様に定め t巡目に和了している確率を p^{(n-1)}_tとする。これらは以下の連立確率漸化式に従う。


\left\{
\begin{aligned}
p^{(0)}_{t+1} &= \left( 1-\frac{a_0}{S-t} \right) p^{(0)}_t & p^{(0)}_0 &= 1 \\
p^{(i)}_{t+1} &= \left( 1-\frac{a_i}{S-t} \right) p^{(i)}_t + \frac{a_{i-1}}{S-t} p^{(i-1)}_t & p^{(i)}_0 &= 0 & (0 \le i \le n-1) \\
p^{(n)}_{t+1} &= \frac{a_{n-1}}{S-t} p^{(n-1)}_t + p^{(n)}_t & p^{(n)}_0 &= 0
\end{aligned}
\right.
\tag{1}

(1)式を行列を使って書き直す。なお以降 a_n = 0とする。


A_t =
\begin{pmatrix}
1-\frac{a_0}{S-t} & 0 & \dots & 0 & 0 \\
\frac{a_0}{S-t} & 1-\frac{a_1}{S-t} & \dots & 0 & 0 \\
\vdots & \vdots & \ddots & \vdots & \vdots \\
0 & 0 & \dots & 1-\frac{a_{n-1}}{S-t} & 0 \\
0 & 0 & \dots & \frac{a_{n-1}}{S-t} & 1-\frac{a_n}{S-t} \\
\end{pmatrix}
\tag{2}

P_t = 
\begin{pmatrix}
p^{(0)}_t \\
p^{(1)}_t \\
\vdots \\
p^{(n-1)}_t \\
p^{(n)}_t
\end{pmatrix}
\tag{3}

とすると


P_{t+1} = A_t P_t
\tag{4}

となる。(4)式を解くと

 \displaystyle
P_t = \left\{ \prod_{u=0}^{t-1} A_u \right\} P_0
\tag{5}

となる。ここで A_tは下三角行列であるから \displaystyle \prod_{u=0}^{t-1} A_uも下三角行列でありその対角成分は A_u \ (0 \le u \le t-1)の対角成分の積である。また下三角行列の固有値は対角成分であるが a_i \ (0 \le i \le n-1)はすべて異なるから \displaystyle \prod_{u=0}^{t-1} A_uは対角化可能である。よって適当な対角行列 D正則行列 Xが存在して

 \displaystyle
\prod_{u=0}^{t-1} A_u = X D X^{-1}
\tag{6}

のように書ける。(6)式より適当な係数 c_i \ (0 \le i \le n)を定めればp^{(n)}_t

 \displaystyle
\begin{aligned}
p^{(n)}_t &= \sum_{i=0}^{n} c_i \prod_{u=0}^{t-1} \left( 1 - \frac{a_i}{S-u} \right) \\
&= \sum_{i=0}^{n} c_i \times \frac{_{S-a_i}P_t}{_{S}P_t} \\
&= \frac{1}{_{S}P_t} \sum_{i=0}^{n} c_i \times _{S-a_i} P_t
\end{aligned}
\tag{7}

と表せる。この係数 c_iを初期条件


\begin{aligned}
p^{(n)}_0 &= p^{(n)}_1 = \dots = p^{(n)}_{n-1} = 0 \\
p^{(n)}_{n} &= \prod_{i=0}^{n-1} \frac{a_i}{S-i} = \frac{1}{_SP_n} \prod_{i=0}^{n-1} a_i = \frac{C}{_SP_n}
\end{aligned}
\tag{8}

によって定める。これは


\begin{pmatrix}
1 & 1 & \dots & 1 & 1 \\
S-a_0 & S-a_1 & \dots & S-a_{n-1} & S-a_n \\
\vdots & \vdots & \ddots & \vdots & \vdots \\
_{S-a_0}P_{n-1} & _{S-a_1}P_{n-1} & \dots & _{S-a_{n-1}}P_{n-1} & _{S-a_{n}}P_{n-1} \\
_{S-a_0}P_{n} & _{S-a_1}P_{n} & \dots & _{S-a_{n-1}}P_{n} & _{S-a_{n}}P_{n} \\
\end{pmatrix}
\begin{pmatrix}
c_0 \\
c_1 \\
\vdots \\
c_{n-1} \\
c_{n}
\end{pmatrix}
=
\begin{pmatrix}
0 \\
0 \\
\vdots \\
0 \\
C
\end{pmatrix}
\tag{9}

と表せる。(9)式の行列を Vと表すことにする。 \det Vはヴァンデルモンド行列式のように計算できて

 \displaystyle
\det{V}  = \prod_{0 \le j < k \le n} (a_j - a_k)
\tag{10}

である。これとクラメルの公式を使って係数 c_i

 \displaystyle
c_i = \frac{\det{V_i}}{\det{V}}
\tag{11}

と表せる。 \det V_iは余因子展開を使えば

 \displaystyle
\det V_i = {(-1)}^{n+i} C \prod_{0 \le j < k \le n,\  j \neq i,\ k \neq i} (a_j - a_k)
\tag{12}

と書ける。よって(11)式は

 \displaystyle
c_i = C \prod_{j \neq i} \frac{1}{a_j - a_i}
\tag{13}

となる。ここで(7)式を整理する( a_n = 0に注意)。

 \displaystyle
\begin{aligned}
p^{(n)}_t &= \sum_{i=0}^{n-1} c_i \times \frac{_{S-a_i}P_t}{_SP_t} + c_n \\
&= \sum_{i=0}^{n-1} c_i \times \frac{_{S-a_i}P_t}{_SP_t} + \sum_{i=0}^{n-1} c_i \\
&= \sum_{i=0}^{n-1} c_i \times \left( \frac{_{S-a_i}P_t}{_SP_t} - 1 \right)
\end{aligned}
\tag{14}

また

 \displaystyle
\begin{aligned}
c_i &= C \left\{ \prod_{0 \le j \le n-1,\ j \neq i} \frac{1}{a_j - a_i} \right\} \times \frac{1}{a_n - a_i} \\
&= -C \left\{ \prod_{0 \le j \le n-1,\ j \neq i} \frac{1}{a_j - a_i} \right\} \times \frac{1}{a_i} & (0 \le i \le n-1)
\end{aligned}
\tag{15}

なので、これを(14)式に代入して整理すると

 \displaystyle
\begin{aligned}
p^{(n)}_t &= C \sum_{i=0}^{n-1} \frac{1}{a_i} \left( 1 - \frac{_{S-a_i}P_t}{_SP_t} \right) \prod_{j \neq i} \frac{1}{a_j - a_i} \\
&= \left\{ \prod_{i=0}^{n-1} a_i \right\} \times \sum_{i=0}^{n-1} \frac{1}{a_i} \left( 1 - \frac{_{S-a_i}P_t}{_SP_t} \right) \prod_{j \neq i} \frac{1}{a_j - a_i}
\end{aligned}
\tag{16}

となり解を得る。

補足

復元抽出との関係

非復元抽出を想定した和了確率は復元抽出を想定した和了確率で \displaystyle \left( 1-\frac{a_i}{S} \right)^tを形式的に \displaystyle \frac{_{S-a_i}P_t}{_SP_t}に置き換えたものに等しい

証明

前回の記事の(15)式において \displaystyle \alpha_i = 1-\frac{a_i}{S}の置き換えを行うと

tomohxx.hatenablog.com

 \displaystyle
\begin{aligned}
p^{(n)}_t &= \left\{ \prod_{i=0}^{n-1} (1-\alpha_i) \right\} \times \sum_{i=0}^{n-1} \frac{1-\alpha_i^t}{1-\alpha_i} \prod_{j \neq i} \frac{1}{\alpha_i - \alpha_j} \\
&= \left\{ \prod_{i=0}^{n-1} a_i \right\} \times \sum_{i=0}^{n-1} \frac{1}{a_i} \left\{ 1 - \left( 1 - \frac{a_i}{S} \right)^t \right\} \prod_{j \neq i} \frac{1}{a_j - a_i}
\end{aligned}
\tag{17}

となるが、 \displaystyle \left( 1-\frac{a_i}{S} \right)^t \displaystyle \frac{_{S-a_i}P_t}{_SP_t}に置き換えると確かに(16)式に等しい。

最大値

 p^{(n)}_t t = S - \max\{a_i\} p^{(n)}_t = 1となる。

近似

非復元抽出を想定した和了確率は S \gg tの条件で復元抽出を想定した和了確率に近似できる。

証明

 \displaystyle
\begin{aligned}
\frac{_{S-a_i}P_t}{_SP_t} &= \prod_{u=0}^{t-1} \frac{S-u-a_i}{S-u} \\
&= \prod_{u=0}^{t-1} \frac{1 - \frac{u}{S} - \frac{a_i}{S}}{1 - \frac{u}{S}} \\
&\approx \left( 1 - \frac{a_i}{S} \right)^t
\end{aligned}
\tag{18}

よって

 \displaystyle
p^{(n)}_t \approx \left\{ \prod_{i=0}^{n-1} a_i \right\} \times \sum_{i=0}^{n-1} \frac{1}{a_i} \left\{ 1 - \left( 1 - \frac{a_i}{S} \right)^t \right\} \prod_{j \neq i} \frac{1}{a_j - a_i}
\tag{19}

と近似できる。

おわりに

非復元抽出を想定した一人麻雀における和了確率を書き下しました。今後はこの成果を基に和了確率を計算するアルゴリズムを改良できないか考えてみます。もしかしたら否定的な結果に終わるかもしれません。

一人麻雀における和了確率を書き下す(3)

はじめに

これまで2回にわたって一人麻雀における和了確率を求めてきましたが、そこで扱ったのはそれぞれ一向聴と二向聴の手でした。今回は前回記事の最後で触れた一般の n-1向聴の手を扱います。前回も述べたように行列を使った解法が見通しがよいので今回もそれを踏襲します。

問題

 n-1向聴の手があってこのときの有効牌の枚数を a_0枚、 n-2向聴のときの有効牌の枚数を a_1枚、以降同様に定め聴牌のときの有効牌の枚数を a_{n-1}枚とする。はじめ( t=0)に S枚の牌があるとして t巡目に和了している確率を求めよ。ただし一度捨てた牌は再び山に戻すという復元抽出を想定する。

解法

 t巡目に n-1向聴である確率を p^{(0)}_t t巡目に n-2向聴である確率を p^{(1)}_t、以降同様に定め t巡目に和了している確率を p^{(n-1)}_tとする。また表記を簡単にするため有効牌を引かない確率として \displaystyle \alpha_i = 1-\frac{a_{i}}{S} \ (0 \le i \le n-1)を導入する。これらは以下の連立確率漸化式に従う。


\left\{
\begin{aligned}
p^{(0)}_{t+1} &= \alpha_0 p^{(0)}_t & p^{(0)}_0 &= 1 \\
p^{(i)}_{t+1} &= \alpha_i p^{(i)}_t + (1-\alpha_{i-1}) p^{(i-1)}_t & p^{(i)}_0 &= 0 & (0 \le i \le n-1) \\
p^{(n)}_{t+1} &= (1-\alpha_{n-1}) p^{(n-1)}_t + p^{(n)}_t & p^{(n)}_0 &= 0
\end{aligned}
\right.
\tag{1}

(1)式を形式的に解くと

 \displaystyle
p^{(n)}_t = (1-\alpha_{n-1}) \sum_{u=0}^{t-1} p^{(n-1)}_u \ (t \ge 1)
\tag{2}

が得られるから p^{(n-1)}_tを求めることにする。 p^{(n)}_tを除いた(1)式を行列を使って書き直す。


A =
\begin{pmatrix}
\alpha_0 & 0 & \dots & 0 & 0 \\
1-\alpha_0 & \alpha_1 & \dots & 0 & 0 \\
\vdots & \vdots & \ddots & \vdots & \vdots \\
0 & 0 & \dots & \alpha_{n-2} & 0 \\
0 & 0 & \dots & 1-\alpha_{n-2} & \alpha_{n-1} \\
\end{pmatrix}
\tag{3}

P_t = 
\begin{pmatrix}
p^{(0)}_t \\
p^{(1)}_t \\
\vdots \\
p^{(n-2)}_t \\
p^{(n-1)}_t
\end{pmatrix}
\tag{4}

とすると


P_{t+1} = AP_t
\tag{5}

となる。(5)式を解くと


P_t = A^t P_0
\tag{6}

となるから A^tを求めればよい。ここで A固有値 \alpha_i \ (0 \le i \le n-1)はすべて異なるから Aは対角化可能である。 D = X^{-1} A Xのように対角化できるとすると A^t = X D^t X^{-1}である。よって適当な係数 c_i \ (0 \le i \le n-1)を定めればp^{(n-1)}_t

 \displaystyle
p^{(n-1)}_t = \sum_{i=0}^{n-1} c_i \alpha_i^t
\tag{7}

と表せる。この係数 c_iを初期条件


\begin{aligned}
p^{(n-1)}_0 &= p^{(n-1)}_1 = \dots = p^{(n-1)}_{n-2} = 0 \\
p^{(n-1)}_{n-1} &= \prod_{i=0}^{n-2} (1-\alpha_i) = C
\end{aligned}
\tag{8}

によって定める。これは


\begin{pmatrix}
1 & 1 & \dots & 1 & 1 \\
\alpha_0 & \alpha_1 & \dots & \alpha_{n-2} & \alpha_{n-1} \\
\vdots & \vdots & \ddots & \vdots & \vdots \\
\alpha_0^{n-2} & \alpha_1^{n-2} & \dots & \alpha_{n-2}^{n-2} & \alpha_{n-1}^{n-2} \\
\alpha_0^{n-1} & \alpha_1^{n-1} & \dots & \alpha_{n-1}^{n-1} & \alpha_{n-1}^{n-1} \\
\end{pmatrix}
\begin{pmatrix}
c_0 \\
c_1 \\
\vdots \\
c_{n-2} \\
c_{n-1}
\end{pmatrix}
=
\begin{pmatrix}
0 \\
0 \\
\vdots \\
0 \\
C
\end{pmatrix}
\tag{9}

と表せる。(9)式の行列はヴァンデルモンド行列であり Vと表すことにする。ヴァンデルモンド行列式

 \displaystyle
\det{V}  = \prod_{0 \le j < k \le n-1} (\alpha_k - \alpha_j)
\tag{10}

である。これとクラメルの公式を使って係数 c_i

 \displaystyle
c_i = \frac{\det{V_i}}{\det{V}}
\tag{11}

と表せる。 \det V_iは余因子展開を使えば

 \displaystyle
\det V_i = {(-1)}^{n+i+1} C \prod_{0 \le j < k \le n-1,\ j \neq i,\ k \neq i} (\alpha_k - \alpha_j)
\tag{12}

と書ける。よって(11)式は

 \displaystyle
c_i = C \prod_{j \neq i} \frac{1}{\alpha_i - \alpha_j}
\tag{13}

となる。(8)式(13)式を(7)式に代入して整理すると

 \displaystyle
p^{(n-1)}_t = \left\{ \prod_{i=0}^{n-2} (1-\alpha_i) \right\} \times \sum_{i=0}^{n-1} \alpha_i^t \prod_{j \neq i} \frac{1}{\alpha_i - \alpha_j}
\tag{14}

(14)式を(2)式に代入して計算すると p^{(n)}_t

 \displaystyle
p^{(n)}_t = \left\{ \prod_{i=0}^{n-1} (1-\alpha_i) \right\} \times \sum_{i=0}^{n-1} \frac{1-\alpha_i^t}{1-\alpha_i} \prod_{j \neq i} \frac{1}{\alpha_i - \alpha_j}
\tag{15}

となり解を得る。なお(15)式において p^{(n)}_0 = 0となるため(2)式の tの範囲の制限を削除した。

補足

対称性

任意の \alpha_j, \alpha_kの置換に対して(14)式(15)式は不変である。

証明

 c_i = c_i (\alpha_0, \alpha_1, \ldots, \alpha_{n-1})と表すことにすると以下より成り立つ。


\begin{aligned}
c_i (\alpha_0, \alpha_1, \ldots, \alpha_k, \ldots, \alpha_j, \alpha_{n-1}) &= c_i (\alpha_0, \alpha_1, \ldots, \alpha_j, \ldots, \alpha_k, \alpha_{n-1})  & (i \neq j,\ i \neq k) \\
c_j (\alpha_0, \alpha_1, \ldots, \alpha_k, \ldots, \alpha_j, \alpha_{n-1}) &= c_k (\alpha_0, \alpha_1, \ldots, \alpha_j, \ldots, \alpha_k, \alpha_{n-1}) \\
c_k (\alpha_0, \alpha_1, \ldots, \alpha_k, \ldots, \alpha_j, \alpha_{n-1}) &= c_j (\alpha_0, \alpha_1, \ldots, \alpha_j, \ldots, \alpha_k, \alpha_{n-1})
\end{aligned}
\tag{16}

極限値

 \displaystyle \lim_{t \to \infty} p^{(n)}_t =1である。

証明1

 p^{(i)}_t \ (0 \le i \le n-2)についても(7)式と同様に書けるので

 \displaystyle
\lim_{t \to \infty} p^{(i)}_t = 0 \ {(0 \le i \le n-1)}
\tag{17}

である。すべての tに対して全事象の確率が保存されなければならないからこの命題が成り立つ。

証明2

(15)式より以下が成り立つ。

 \displaystyle
\lim_{t \to \infty} p^{(n)}_t = \left\{ \prod_{i=0}^{n-1} (1-\alpha_i) \right\} \times \sum_{i=0}^{n-1} \frac{1}{1-\alpha_i} \prod_{j \neq i} \frac{1}{\alpha_i - \alpha_j}
\tag{18}

 \alpha_n = 1を導入すると(18)式は

 \displaystyle
\begin{aligned}
\lim_{t \to \infty} p^{(n)}_t &= \left\{ \prod_{i=0}^{n-1} (1-\alpha_i) \right\} \times \sum_{i=0}^{n-1} \left(-\frac{1}{\alpha_i - \alpha_n} \right) \prod_{j \neq i} \frac{1}{\alpha_i - \alpha_j} \\
&= \left\{ \prod_{i=0}^{n-1} (1-\alpha_i) \right\} \times \sum_{i=0}^{n-1} \left(- \prod_{0 \le j \le n,\ j \neq i} \frac{1}{\alpha_i - \alpha_j} \right)
\end{aligned}
\tag{18}

と書ける。ここで

 \displaystyle
c'_i = \prod_{0 \le j \le n,\ j \neq i} \frac{1}{\alpha_i - \alpha_j}
\tag{19}

とすると c'_iは次の連立方程式の解である。


\begin{pmatrix}
1 & 1 & \dots & 1 & 1 \\
\alpha_0 & \alpha_1 & \dots & \alpha_{n-1} & \alpha_{n} \\
\vdots & \vdots & \ddots & \vdots & \vdots \\
\alpha_0^{n-1} & \alpha_1^{n-1} & \dots & \alpha_{n-1}^{n-1} & \alpha_{n}^{n-1} \\
\alpha_0^{n} & \alpha_1^{n} & \dots & \alpha_{n-1}^{n} & \alpha_{n}^{n} \\
\end{pmatrix}
\begin{pmatrix}
c'_0 \\
c'_1 \\
\vdots \\
c'_{n-2} \\
c'_{n-1}
\end{pmatrix}
=
\begin{pmatrix}
0 \\
0 \\
\vdots \\
0 \\
1
\end{pmatrix}
\tag{20}

(19)式(20)式より

 \displaystyle
\sum_{i=0}^{n-1} \left(- \prod_{0 \le j \le n,\ j \neq i} \frac{1}{\alpha_i - \alpha_j} \right) = - \sum_{i=0}^{n-1} c'_i = c'_n
\tag{21}

を得る。 c'_n

 \displaystyle
c'_n = \prod_{i=0}^{n-1} \frac{1}{\alpha_n - \alpha_i} = \prod_{i=0}^{n-1} \frac{1}{1 - \alpha_i}
\tag{22}

だから

 \displaystyle
\sum_{i=0}^{n-1} \left(- \prod_{0 \le j \le n,\ j \neq i} \frac{1}{\alpha_i - \alpha_j} \right) = \prod_{i=0}^{n-1} \frac{1}{1 - \alpha_i}
\tag{23}

である。これを(18)式に代入すると \displaystyle \lim_{t \to \infty} p^{(n)}_t =1となる。

おわりに

復元抽出の条件でようやく一般の向聴数の手の和了確率を求めることができました。補足の極限値ですが個人的には証明2のほうが好きです。ところで極限値を求める際に N+1次行列を使いましたが(3)式の行列も N次ではなく N+1次でもよかった気がします。そのほうが解を求める手順が減り、極限値が1になることの証明も簡単になります。 \alpha_n = 1なのは(1)式の p^{(n)}_tの係数が1であることに関係していたわけです。まあ今回示した解法では事実上 p^{(i)}_t \ (1 \le i \le n-1)も求めているのでこちらのほうがお得なのではないかと思います。さて次は非復元抽出の条件で和了確率を求めたいと思います。

麻雀AI開発DL編(5)

はじめに

再び麻雀AIの評価を行います。これまでに私の開発したAI(以下、自AI)の一局戦vs Manueと東風戦vs Akochanによる評価を行ってきました。一局戦vs Manueでは平均順位においてManueよりも強いことを示せましたが、東風戦vs AkochanではAkochanの平均順位を下回りました。今回は東南戦に変更してvs Manueとvs Akochanの評価を行いました。結論から述べると、東南戦では平均順位においてManueとAkochan両方に勝ち越すことができました。

結果

東南戦vs Manue

  • 自AI 1体 vs Manue 3体による東南戦500戦
  • 自AIの平均順位: 2.092±0.096*1


成績詳細(自AI)

*************************************************************
* Mjai Recoder Report (Mon 06 Sep 2021 12:30:01 PM UTC)
* Player
*************************************************************
Default footer is off.
 試合数 
--------
    500

 局数 
------
 5339

 和了率 
--------
  0.257

 自摸率 
--------
  0.399

 平均得点 
----------
     6597

 平均失点 
----------
     6629

 放銃率 
--------
  0.097

 立直率 
--------
  0.167

 副露率 
--------
  0.395

 順位 | 回数 
------+------
    1 |  201
    2 |  126
    3 |   99
    4 |   74

 平均順位 
----------
    2.092

 流局率 
--------
  0.240

 流局時聴牌率 
--------------
        0.413

 平均最終持点 
--------------
        30063

 起家 | 回数 
------+------
    0 |  118
    1 |  142
    2 |  111
    3 |  129


東南戦vs Akochan (1)

  • 自AI 1体 vs Akochan 1体 vs Manue 2体による東南戦500戦
  • Akochanのポイント配分: 90, 60, -60, -90 (デフォルト値)
  • 自AIの平均順位: 2.254±0.094
  • Akochanの平均順位: 2.316±0.098


成績詳細(自AI)

*************************************************************
* Mjai Recoder Report (Wed 08 Sep 2021 11:41:47 PM UTC)
* Player
*************************************************************
Default footer is off.
 試合数
--------
    500

 局数
------
 5300

 和了率
--------
  0.253

 自摸率
--------
  0.403

 平均得点
----------
     6382

 平均失点
----------
     6390

 放銃率
--------
  0.110

 立直率
--------
  0.174

 副露率
--------
  0.378

 順位 | 回数
------+------
    1 |  152
    2 |  153
    3 |  111
    4 |   84

 平均順位
----------
    2.254

 流局率
--------
  0.190

 流局時聴牌率
--------------
        0.424

 平均最終持点
--------------
        28280

 起家 | 回数
------+------
    0 |  127
    1 |  115
    2 |  140
    3 |  118


成績詳細(Akochan)

*************************************************************
* Mjai Recoder Report (Wed 08 Sep 2021 11:40:24 PM UTC)
* Akochan
*************************************************************
Default footer is off.
 試合数
--------
    500

 局数
------
 5300

 和了率
--------
  0.207

 自摸率
--------
  0.413

 平均得点
----------
     6878

 平均失点
----------
     6323

 放銃率
--------
  0.128

 立直率
--------
  0.187

 副露率
--------
  0.353

 順位 | 回数
------+------
    1 |  156
    2 |  132
    3 |  110
    4 |  102

 平均順位
----------
    2.316

 流局率
--------
  0.190

 流局時聴牌率
--------------
        0.368

 平均最終持点
--------------
        24838

 起家 | 回数
------+------
    0 |  129
    1 |  128
    2 |  119
    3 |  124


東南戦vs Akochan (2)

  • 自AI 3体 vs Akochan 1体による東南戦500戦
  • Akochanのポイント配分: 90, 45, 0, -135 (天鳳七段配分)
  • Akochanの平均順位: 2.552±0.096
  • Akochanの平均ポイント: -2.340


成績詳細(Akochan)

*************************************************************
* Mjai Recoder Report (Sat 04 Sep 2021 09:15:57 PM UTC)
* Akochan
*************************************************************
Default footer is off.
 試合数
--------
    500

 局数
------
 5409

 和了率
--------
  0.180

 自摸率
--------
  0.398

 平均得点
----------
     6805

 平均失点
----------
     5701

 放銃率
--------
  0.129

 立直率
--------
  0.173

 副露率
--------
  0.351

 順位 | 回数
------+------
    1 |  109
    2 |  131
    3 |  135
    4 |  125

 平均順位
----------
    2.552

 流局率
--------
  0.148

 流局時聴牌率
--------------
        0.331

 平均最終持点
--------------
        22933

 起家 | 回数
------+------
    0 |  124
    1 |  126
    2 |  125
    3 |  125


考察

  • 東南戦vs Manueでの平均順位の信頼区間の上限値が2.5を下回っているため、自AIがManueより強いことが明らかになりました。
  • 東南戦vs Akochan (1)の形式では自AIの平均順位はAkochanを下回っているものの、信頼区間が重なっているためAkochanより強いとは言えません。
  • 東南戦vs Akochan (2)の形式ではAkochanの平均順位は2.5を上回っているものの、信頼区間の下限値が2.5を下回っているため自AIがAkochanより強いとは言えません。
  • Akochanの成績詳細を見ると和了率と平均最終持点の割には平均順位が良いので持点ベースの押し引きが自AIより優れていると思います。
  • 牌譜を見るとAkochanは対立直と対副露の押し引きが微妙なので自AIはその2点でAkochanより優れていると思います。

おわりに

Manueとの評価はもう十分でしょう。Akochanとの評価ではどちらが強いかの結論が出ていませんが、すでに自AIの持ち点ベースの押し引きが弱いという課題が見つかっているのでこれを放置して評価を続けようとは思っていません。また、どちらが強いのか結論するには4000戦近く必要なこともあって評価は当分しないつもりです。それで持ち点ベースの押し引きですが、打牌選択モデルの入力に各プレイヤの持ち点をすでに取り入れているので特徴量エンジニアリングによる改善は難しそうです。改善案は現在検討中です。以前の記事でも触れましたが強化学習を使えば改善できるのでしょうか。あとAkochanは東南戦より東風戦のほうが強い可能性があります。今までのところ東風戦でAkochanに勝ち越すことはできていません。東風戦でAkochanに勝ち越すには東風用のモデルを作成することが必要不可欠で、その上で持ち点ベースの押し引きの改善が必要になるのかもしれません。手間を考えると東風戦での評価をやらずに次の段階の強化学習へ進みそうです。今回で麻雀AIの開発と評価に一区切りつけることにします。

*1:95%信頼区間を併記、他の平均順位も同様

一人麻雀における和了確率を書き下す(2)

はじめに

前回の記事で一人麻雀の和了確率を扱いました。当初2回目を書く予定はなかったのですが、行列を使った解き方のほうが見通しが良さそうなのでこの記事を書くことにしました。また前回は一向聴の手だったので今回は二向聴の手を扱うことにします。

二向聴形の和了確率

二向聴の手があって一向聴になるのに必要な牌の枚数を a_0枚、そこから聴牌するのに必要な牌の枚数を a_1枚、そこから和了するのに必要な牌の枚数を a_2枚とします。 S枚の牌があるとして、 t巡目に二向聴である確率を p^{(0)}_t一向聴である確率を p^{(1)}_t聴牌である確率を p^{(2)}_t和了である確率を p^{(3)}_tとするとこれらは以下の連立確率漸化式で表せます。なお前回と同様に捨てた牌を再び引けるという復元抽出を想定しています。


\left\{
\begin{aligned}
p^{(0)}_{t+1} &= \left( 1- \frac{a_0}{S} \right) p^{(0)}_t & p^{(0)}_0 &= 1 & (1) \\
p^{(1)}_{t+1} &= \left( 1- \frac{a_1}{S} \right) p^{(1)}_t + \frac{a_0}{S} p^{(0)}_t & p^{(1)}_0 &= 0 & (2) \\
p^{(2)}_{t+1} &= \left( 1- \frac{a_2}{S} \right) p^{(2)}_t + \frac{a_1}{S} p^{(1)}_t & p^{(2)}_0 &= 0 & (3) \\
p^{(3)}_{t+1} &= \frac{a_2}{S} p^{(2)}_t + p^{(3)}_t & p^{(3)}_0 &= 0 & (4)
\end{aligned}
\right.

ここで


\begin{aligned}
& q^{(0)}_t = \frac{a_0 a_1 a_2}{S^3} p^{(0)}_t,\ q^{(1)}_t = \frac{a_1 a_2}{S^2} p^{(1)}_t,\ q^{(2)}_t = \frac{a_2}{S} p^{(2)}_t \\
& \alpha_0 = 1-\frac{a_0}{S},\ \alpha_1 = 1-\frac{a_1}{S},\ \alpha_2 = 1-\frac{a_2}{S}
\end{aligned}

とすると、


\left\{
\begin{aligned}
q^{(0)}_{t+1} &= \alpha_0 q^{(0)}_t & q^{(0)}_0 &= (1-\alpha_0) (1-\alpha_1) (1-\alpha_2) & (5) \\
q^{(1)}_{t+1} &= \alpha_1 q^{(1)}_t + q^{(0)}_t & q^{(1)}_0 &= 0 & (6) \\
q^{(2)}_{t+1} &= \alpha_2 q^{(2)}_t + q^{(1)}_t & q^{(2)}_0 &= 0 & (7) \\
p^{(3)}_{t+1} &= q^{(2)}_t + p^{(3)}_t & p^{(3)}_0 &= 0 & (8)
\end{aligned}
\right.

となります。(8)式を形式的に解くと

 \displaystyle{
p^{(3)}_t = \sum_{u=0}^{t-1} q^{(2)}_u \qquad (t \ge 1) \tag{9}
}

となるので q^{(2)}_tを求めればよいです。(5)式から(7)式を以下のように行列で表します。


Q_{t+1} = A Q_t,\
Q = 
\begin{pmatrix}
q^{(0)}_t \\
q^{(1)}_t \\
q^{(2)}_t \\
\end{pmatrix},\
A =
\begin{pmatrix}
\alpha_0 & 0 & 0 \\
1 & \alpha_1 & 0 \\
0 & 1 & \alpha_2 \\
\end{pmatrix}
\tag{10}

(10)式より Q_t = A^t Q_0となります。ここで a_0, a_1, a_2はそれぞれ異なるので行列 Aは対角化可能であり固有値 \alpha_0, \alpha_1, \alpha_2です。正則行列 Xと対角行列 Bが存在して B = X^{-1} A Xが成り立つので A^t = X B^t X^{-1}となります。よって Q_t = X B^t X^{-1} Q_0が得られます。 B^t


B^t =
\begin{pmatrix}
\alpha_0^t & 0 & 0 \\
0 & \alpha_1^t & 0 \\
0 & 0 & \alpha_2^t \\
\end{pmatrix}

なので


q^{(2)}_t = c_0 \alpha_0^t + c_1 \alpha_1^t + c_2 \alpha_2^t \tag{11}

のように表せます。初期条件 q^{(2)}_0 = q^{(2)}_1 = 0,\ q^{(2)}_2 = q^{(0)}_0より各係数を決めると、

 
\begin{aligned}
c_0 &= \frac{q^{(2)}_0}{(\alpha_0-\alpha_1)(\alpha_0-\alpha_2)} \\
c_1 &= \frac{q^{(2)}_0}{(\alpha_1-\alpha_0)(\alpha_1-\alpha_2)} \\
c_2 &= \frac{q^{(2)}_0}{(\alpha_2-\alpha_0)(\alpha_2-\alpha_1)} \\
\end{aligned}

となります。よって q^{(2)}_t


\displaystyle{
q^{(2)}_t = (1-\alpha_0) (1-\alpha_1) (1-\alpha_2)
\left\{
\frac{\alpha_0^t}{(\alpha_0-\alpha_1)(\alpha_0-\alpha_2)} +
\frac{\alpha_1^t}{(\alpha_1-\alpha_0)(\alpha_1-\alpha_2)} +
\frac{\alpha_2^t}{(\alpha_2-\alpha_0)(\alpha_2-\alpha_1)}
\right\}
\tag{12}
}

これを(9)式に代入して計算すると p^{(3)}_t


\displaystyle{
p^{(3)}_t = (1-\alpha_0) (1-\alpha_1) (1-\alpha_2)
\left\{
\frac{1-\alpha_0^t}{(1-\alpha_0)(\alpha_0-\alpha_1)(\alpha_0-\alpha_2)} +
\frac{1-\alpha_1^t}{(1-\alpha_1)(\alpha_1-\alpha_0)(\alpha_1-\alpha_2)} +
\frac{1-\alpha_2^t}{(1-\alpha_2)(\alpha_2-\alpha_0)(\alpha_2-\alpha_1)}
\right\}
\tag{13}
}

となります。なお(13)式では p^{(3)}_0 = 0となるので tの範囲の制限を削除しました。以上が求める和了確率です。

余談

以上の議論から一般に n-1向聴の手の和了確率 p^{(n)}_tが以下であると予想できます。


\displaystyle{
p^{(n)}_t = \left\{ \prod_{i=0}^{n-1} (1-\alpha_i) \right\} \times \sum_{i=0}^{n-1} \frac{1-\alpha_i^t}{1-\alpha_i} \prod_{j \neq i} \frac{1}{\alpha_i-\alpha_j}
\tag{14}
}

実際に n=1, 2, 3, 4の場合で(14)式が正しいことを確認しています。 n > 4の場合で(14)式が正しいのかは不明です。もし正しいかどうか証明できた方がいましたらぜひ教えてください。

おわりに

今回は行列を使った解法を説明しました。(12)式が \{a_i\}についての対称式になっているのがわかりやすくていいですね。(14)式が正しいのかどうか気になるところですが、非復元抽出を想定した場合の和了確率もまた \{a_i\}についての対称式になることがわかっています。その対称性を前面に押し出した表式も気になります。

一人麻雀における和了確率を書き下す(1)

はじめに

ここでは一人麻雀における和了確率を扱います。このテーマでよく見かけるのは、聴牌している手があってその有効牌の枚数を a枚、壁牌の枚数を S枚としたときに t巡以内に和了する確率が \displaystyle{1-\frac{_{S-a}C_t}{_SC_t}}で表せるというものですね。では一向聴の手が和了する確率はどのように表せるでしょうか?これは総和と組合せを使えば表せますが単純な形ではありません。ちなみに数値的に解く方法についてはこちらを読んでください。

tomohxx.github.io

聴牌形の和了確率

なぜ単純な形にならないかと言うと自摸が非復元抽出だからです。逆に言えば復元抽出、あるいは巡目が壁牌の枚数に対して無視できるほど小さいという仮定を設定すれば和了確率を単純な形で書くことができます。まずは聴牌形の場合で和了確率がどのように表せるのか確認してみましょう。聴牌形で復元抽出を仮定すると和了確率は \displaystyle{1-\left( 1-\frac{a}{S} \right)^t}となります。非復元抽出の場合と比較して簡単になりましたね。

一向聴形の和了確率

次に本題の一向聴の手を扱います。一向聴の手があって聴牌するのに必要な牌の枚数を a枚、聴牌してから和了するのに必要な牌の枚数を b枚とします。例えば両面-両面一向聴牌の手では a=8, b=4となります。 t巡目に一向聴である確率を p^O_t聴牌である確率を p^A_t和了である確率を p^B_tとすると、これらは以下の連立確率漸化式で表せます。


\left\{
\begin{aligned}
p^O_{t+1} &= \left( 1- \frac{a}{S} \right) p^O_t & p^O_0 &= 1 & (1) \\
p^A_{t+1} &= \left( 1- \frac{b}{S} \right) p^A_t + \frac{a}{S} p^O_t & p^A_0 &= 0 & (2) \\
p^B_{t+1} &= \frac{b}{S} p^A_t + p^B_t & p^B_0 &= 0 & (3)
\end{aligned}
\right.

ここで \displaystyle{q^O_t = \frac{ab}{S^2} p^O_t, q^A_t = \frac{b}{S} p^A_t, \alpha = 1-\frac{a}{S}, \beta = 1-\frac{b}{S}}とすると、


\left\{
\begin{aligned}
q^O_{t+1} &= \alpha q^O_t & q^O_0 &= \frac{ab}{S^2} & (4) \\
q^A_{t+1} &= \beta q^A_t + q^O_t & q^A_0 &= 0 & (5) \\
p^B_{t+1} &= q^A_t + p^B_t & p^B_0 &= 0 & (6)
\end{aligned}
\right.

となります。(6)式を形式的に解くと

 \displaystyle{
p^B_t = \sum_{u=0}^{t-1} q^A_u \qquad (t \ge 1) \tag{7}
}

となるので q^A_tを求めることにします。(5)式より q^O_t = q^A_{t+1} - \beta q^A_tですがこれを(4)式に代入すると q^A_tについての隣接三項間漸化式が得られます。後は定石に沿って計算するだけです。なお \alpha \neq \betaの場合と \alpha = \betaの場合で分けて考えなければなりません。現実的に後者の場合はありえないのですが一応計算することにします。

 \alpha \neq \betaの場合

(4)式と(5)式より


\begin{eqnarray}
q^A_{t+2} - \beta q^A_{t+1} = \alpha (q^A_{t+1} - \beta q^A_t)   \tag{8} \\
q^A_{t+2} - \alpha q^A_{t+1} = \beta (q^A_{t+1} - \alpha q^A_t) \tag{9}
\end{eqnarray}

が得られます。これらを解くと


\begin{eqnarray}
q^A_{t+1} - \beta q^A_t = \alpha^t (q^A_1 - \beta q^A_0) = \alpha^t q^A_1 \tag{10} \\
q^A_{t+1} - \alpha q^A_t = \beta^t (q^A_1 - \alpha q^A_0) = \beta^t q^A_1 \tag{11}
\end{eqnarray}

となります。(10)式から(11)式を辺々引きます。


(\alpha - \beta) q^A_t = (\alpha^t - \beta^t) q^A_1 \tag{12}

整理して

 \displaystyle{
q^A_t = \frac{\alpha^t - \beta^t}{\alpha - \beta} q^A_1 \tag{13}
}

が得られます。これを(7)式に代入して計算すると

 \displaystyle{
p^B_t = \frac{q^A_1}{\alpha - \beta} \left( \frac{1-\alpha^t}{1-\alpha} - \frac{1-\beta^t}{1-\beta} \right) \tag{14}
}

となります。なお(14)式では p^B_0 = 0となるので tの範囲の制限を削除しました。

最後に q^A_1を計算します。

 \displaystyle{
q^A_1 = q^0_0 = \frac{ab}{S^2} = (\alpha - 1)(\beta - 1) \tag{15}
}

よって求める解は

 \displaystyle{
p^B_t = \frac{(\alpha - 1)(\beta - 1)}{\alpha - \beta} \left( \frac{1-\alpha^t}{1-\alpha} - \frac{1-\beta^t}{1-\beta} \right) \tag{16}
}

です。

 \alpha = \betaの場合

(4)式と(5)式より


q^A_{t+2} - \alpha q^A_{t+1} = \alpha (q^A_{t+1} - \alpha q^A_t)   \tag{17}

が得られます。これを解くと


q^A_{t+1} - \alpha q^A_t = \alpha^t (q^A_1 - \alpha q^A_0) = \alpha^t q^A_1 \tag{18}

となります。両辺を \alpha^{t+1}で割ります。

 \displaystyle{
\frac{q^A_{t+1}}{\alpha^{t+1}} - \frac{q^A_t}{\alpha^t} = \frac{q^A_1}{\alpha} \tag{19}
}

 \displaystyle{r_t = \frac{q^A_t}{\alpha^t}}とおくと

 \displaystyle{
r_{t+1} - r_t = \frac{q^A_1}{\alpha} \tag{20}
}

のように等差数列の形式に変形できます。これを解くと


\begin{aligned}
r_t &= r_0 + \sum_{u=0}^{t-1} \frac{q^A_1}{\alpha} \\
&= q^A_0 + \frac{q^A_1}{\alpha} t \\
&= \frac{q^A_1}{\alpha} t
\end{aligned}
\tag{21}

となります。 r_t q^A_tに戻します。


q^A_t = q^A_1 \alpha^{t-1} t = (\alpha-1)^2 \alpha^{t-1} t \tag{22}

これを(7)式に代入して計算すると


p^B_t = 1-\alpha^{t-1}-\alpha^{t-1} (1-\alpha) (t-1) \tag{23}

となります。なお(23)式では p^B_0 = 0となるので tの範囲の制限を削除しました。

まとめ

 q^B_t = f(t; a, b) = F(t; \alpha, \beta)とすると


F(t; \alpha, \beta) = \left\{
\begin{aligned}
& \frac{(\alpha - 1)(\beta - 1)}{\alpha - \beta} \left( \frac{1-\alpha^t}{1-\alpha} - \frac{1-\beta^t}{1-\beta} \right) & (\alpha \neq \beta) \\
& 1-\alpha^{t-1}-\alpha^{t-1} (1-\alpha) (t-1) & (\alpha = \beta)
\end{aligned}
\right.
\tag{24}

と表せます。

補足A: 対称性

 q^A_t p^B_t a, bの入れ替えても同じ値をとります。つまり


\begin{eqnarray}
f(t; a, b) &= f(t; b, a) \tag{25} \\
F(t; \alpha, \beta) &= F(t; \beta, \alpha) \tag{26}
\end{eqnarray}

が成り立ちます。これは q^A_0, q^A_1および(8)式が a, bについての対称式であるので数学的帰納法より証明できます。

補足B: 誤差

復元抽出を仮定した場合の和了確率を非復元抽出を仮定した場合の近似ととらえたときの誤差を図示しました。 S=123, a=8, b=4とした場合 t=18で約2%の誤差が出るようです。なお復元抽出の場合の和了確率は 1+0.9350^t-2 \cdot 0.9675^tです。

f:id:tomohxx:20210806215433p:plain
誤差

補足C: 分岐

有効牌の枚数の変化が一通りでないとき、例えば23m13pのような両面-嵌張一向聴の手の和了確率は以下のように表せます。

 \displaystyle{
\frac{2}{3} f(t; 12, 4) + \frac{1}{3} f(t; 12, 8) \tag{27}
}

この辺の説明については前述のページを見てください。

tomohxx.github.io

 f(t; 12, 8) > f(t; 12, 4)なので両面-嵌張は両面-両面よりも和了確率が小さいことを解析的に示せます。

おわりに

一人麻雀における和了確率を計算してみました。なかなか手順が多くて大変かもしれないですが、数値計算でなくて手計算できるということをアピールしておきたいです。

麻雀AI開発DL編(4)

はじめに

今回も引き続き麻雀AIの評価を行います。前回まででManue相手には勝ち越せることが明らかになっているので、今回は別のAI Akochanを対戦相手に選びました。

github.com

AkochanはManueと同じくMjaiクライアントの一つですが、おそらく最強のMjaiクライアントだと思われます。開発者のcritter氏によると天鳳の段位で七~九段相当の強さだそうです。

それで対戦のルールですがこちらの論文を参考にしました。

arxiv.org

試合の形式は東風戦で、参加者は私の開発したAI、Akochan、Manue 2体としました。また試合数はAkochanを使った初めての評価なので試しに500にしました。では、私の開発したAIとAkochanの成績を見ていきたいと思います。

成績

試合数が501になっていますが初回の試合で設定ミスがあり急遽やり直したためです。

私の開発したAI

項目 データ
試合数 501
局数 2811
和了 0.246
自摸 0.447
平均得点 6377
平均失点 5928
放銃率 0.113
立直率 0.157
副露率 0.432
1位率 0.277
2位率 0.279
3位率 0.251
4位率 0.178
平均順位 2.334
流局率 0.173
流局時聴牌 0.452

Akochan

項目 データ
試合数 501
局数 2811
和了 0.236
自摸 0.450
平均得点 6790
平均失点 6004
放銃率 0.121
立直率 0.206
副露率 0.362
1位率 0.337
2位率 0.257
3位率 0.174
4位率 0.218
平均順位 2.275
流局率 0.173
流局時聴牌 0.472

考察

平均順位では私の開発したAIが2.334なのに対してAkochanが2.275なのでAkochanの方が優れていると言えます。試合数が500なので信用できるのか怪しいですが……。

私の開発したAIとAkochanとの特徴的な違いは順位分布でしょう。私の開発したAIの順位分布が1位 = 2位 > 3位 > 4位なのに対して、Akochanは1位 > 2位 > 3位 < 4位となっています。困ったことにどちらの順位分布が良いのかは一概には言えません。天鳳では順位ごとにもらえるポイントがあって、そのポイント配分によって理想的な順位分布が決まります。私の開発したAIは天鳳鳳凰卓の牌譜を学習しているのですが、そこでのポイント配分は4位で失うポイントが1位で得られるポイントを上回っています。なので私の開発したAIのように極端に4位を避けるようなプレイスタイルは当然と言えるのかもしれません。次にAkochanと対戦するときはAkochanの設定ファイルを修正して鳳凰卓と同じポイント配分にしてみるべきなのかもしれません。ちなみに理想的な順位分布はSuphxのような1位 > 2位 > 3位 > 4位です。

あと気になる違いは平均得点です。Akochanの方が約400点高くなっています。Akochanの方が立直率が高く副露率が低いのでそれらの影響でしょう。この違いが順位分布に影響しているのかもしれません。

最後に、4位率が低くなるような打ち方、つまりラス回避は状況に応じて押し引きだったり立直判断だったりの基準を上手く変えられないとできないことです。これを実現するための手段が以前扱った期待最終順位なのですが、それを使わずしてラス回避ができていることに少し驚くとともに安心もしました。

tomohxx.hatenablog.com

特徴量に持ち点は入っているので期待最終順位を別に計算する必要はないのではないかとは思っていました。期待最終順位を計算しないのでよいのであれば簡単でいいですね。

おわりに

Akochan相手に善戦できているのでAI開発の終わりが見えてきたような状況です。もう少し調整できることや確認したいことがあるのでAIの評価は続きますが、そろそろ次にやることを考えたいです。ここで次にやることの案を挙げてみます。

  1. 特徴量エンジニアリング
  2. Transformer
  3. 強化学習

一つ目は特徴量エンジニアリングです。現状それなりに良さそうな組み合わせの特徴量を用意できていると思っていますが改善の余地はあると思います。

二つ目はTransformerです。画像認識の分野で従来のCNNではなくてTransformerが流行っているみたいです。Transformerを使うことで牌譜一致率を上げたり、学習にかかる時間を短縮したりできればいいなと思います。

三つ目は強化学習です。今回の評価でわかりましたが、AIのプレイスタイルは教師データの影響を強く受けます。麻雀は4人でやるゲームで対戦相手が3人いるわけですが、各相手の戦略によって自分がとるべき戦略は当然変わります。Manue相手の最適な戦略、Akochan相手の最適な戦略を求めるには教師あり学習ではなく、強化学習が適しているのではないかと思います。

余談ですがAIを公開するかどうかを現在検討しています。公開する際にはいい感じの名前を付けたいですね。