麻雀ですけど,例えば
1m2m2m3m3m 1p2p3p 1s2s3s 9s9s
という状態(待ちは全て生きているものとする)の期待値を求める時はどうしたらよいか?
単純に
純全帯三色一盃口平和(12000) x P(1mで和了る確率) +
平和(1000) x P(4mで和了る確率)
じゃまずいわけですよね.これが期待値をそのまま足したらいけないみたいな理由.
正しくは1m,4mどっちでもあがってしまう場合と1m or 4mのみあがる場合を考えて,高い方を期待値としなければならない.で,例えば1m,4m両方あがる場合は
12000 * P(1m)*(1-P(4m)) + 1000 * P(4m)*(1-P(1m)) +
12000 * P(1m)*P(4m) * P(1m)/(P(1m)+P(4m)) + 1000 * P(1m)*P(4m) * P(4m)/(P(1m)+P(4m))
としなければマズい気がする(ちょっと怪しいけど最初よりは遥かにマシだろう).
同じような事があらゆる場面で利いて来るので,この前上げた自動打ちはかなり出鱈目な計算をしている事になる.
あと局単位の収支ではなく,最終順位の期待値を最大にする方法ですが,
(最終順位の期待値ベクトル) = f( 現在の点数ベクトル,残り局数,残っている親番の数 )
(ベクトルなのは4人分だから)
みたいな関数を考えて,得点を打牌の期待値として利用するのではなく,得点を得た後の点数状況をこの関数に突っ込んだものを利用するようにすればよい.けど,オーラス以外は正確に計算する事など無理なので(すくなくとも僕は考え付かない),適当にそれっぽい値が出る関数を作らねばならない.
まあ,こういう確率ってのは正規分布ぽくなるのが世の必然なので,適当にmathematicaで検討してみた.
In[1]:=
mP = {37000, 30000, 20000, 18000}; ←これが与える点数ベクトル
Table[
Clear[i, l, k, f, x, a];
updown[x_, p_] := If[p \[Equal] x, 0, If[x < p, 1, -1]];
f[x_] :=
Integrate[(1/ Sqrt[2 Pi])Exp[-(1/2)(z^2)], {z, Abs[x]/8000, Infinity}];
k = Table[{0, updown[i, p]}, {i, 1, 4}];
k = Distribute[
f[k[[1]], k[[2]], k[[3]], k[[4]]],
List
] /. {f \[Rule] Plus};
a = f[mP - {1, 1, 1, 1}*mP[[p]]] // N;
a[[p]] = 1;
a /= a /. {List \[Rule] Plus};
b = Distribute[f[{1, a[[1]]}, {1, a[[2]]}, {1, a[[3]]}, {1, a[[4]]}],
List] /. {f \[Rule] Times};
p - b.k,
{p, 1, 4}
]
Out[2]={1.22649, 1.99713, 3.27459, 3.46059} ←これが最終順位期待値ベクトル
分散の部分(これだと8000)を残り局数の関数にしてやればいけそう?問題点はこの関数が重すぎる点か.けど処理速度は気合で近似関数作ればいいだけの話なので問題なし.てことで「目指せ爆岡」を合言葉に牛の歩みの如く開発というか思考だけは続けて行きたいと思います.