現状報告
2009-05-26(Tue)
前回の更新からもう3~4週間経つのか・・・
時間の割にあまり研究進んでないなぁ。
まだ次のテーマは全く報告できる形になってないのですが、前回最後に書いたことと、今考えていることが微妙に変わりつつあるので(そしてこれからもまだブレるかもしれない)、現状を報告することにします。
・今やろうとしていること。
前回までただの机上計算(まぁ、実際はエクセル使ってるわけですが)で求めた結果がどこまで妥当なものか、実戦orシミュレーションで検証したい。
・そのための手法
とりあえず乱数を使ってコンピューターに多数回麻雀を打たせる(つまりシミュレーション)。今回は先制リーチに対する対応を考えたいので先制リーチ順目t1(と自分、先制リーチ者の風)を固定させて、先制リーチ前と後のパートに分けて考える。
・先制リーチ前のパートの詳細
全員が自分だけの都合で打牌する。打牌の基準として人間が考えるような牌効率をコンピューターにさせる(というか自分で命令を打ち込む)のは現状として私の能力をはるかに超えているので(でも麻雀ソフト開発してる人はそういうことやってるんだよね・・・)、決定論的手法and確率論的手法でできるだけ人間に近づけたい。
現状は、ほぼ確率論的手法のみで、対子アンコに関する修正、一回捨てた牌(高確率で不要牌)に対する
修正のみを加えた後、前に述べた捨てられやすさ指数k_iで重みをつけてランダムに切る牌を選ぶ。順子関連の牌効率無視で現実にはほど遠い・・・。努力はしつつ適当に折り合いをつけたいところ。なお、修正に使ってる数値(例えば今現在「対子2組あるときの対子」が切られる確率は通常の1/10と設定している)は完全に直感で、これは実戦牌譜から情報を得て実戦に近い値にとりたい。
・先制リーチについて
上記の(エセ)牌効率によって打牌していき、t1順目の先制リーチ者の番がきたらリーチさせるわけですけど、ランダム打牌なのでもちろんその手牌は「テンパイ」してない。そこで待ちについても一定の方法で決めて、待ち牌が打牌されるorリーチ者がツモるときリーチ者の和了としてその局を終える。待ちの決め方は現状では下のようにしている。
まず待ちの種類を次の10区分、両面、数数シャボ、数字シャボ、字字シャボ、カンチャン(28、37、456)、ペンチャン、数単騎、字単騎に分け、実戦での発生率からどの待ちになるかを確率的に決める。
その後それぞれの待ちの区分の中でとりうる待ちの中から等確率でひとつ選び出す。
まずいずれの待ちの場合も現物とリーチ者から見て待ち牌が残り0枚のものはとりうる待ちから除外する。
シャボの場合、該当する対子2組以上ある場合にその中から決めるが、対子2組ないことがけっこうある(特に字字の対子2組あることはまれ)なので、そこら辺も考慮して実戦確率に近づけるように調整する。つまり対子2組ないときは待ちになる確率は0だが対子2組以上存在するときは実戦確率より高確率にして全体で実戦確率になるようにする。これは他の待ちでも同様。
単騎の場合、手牌にある単独牌を取りうる待ちとする。
残り順子系の待ちについては現状はほぼ無条件(待ちを構成する牌が4枚切られてない場合のみ)だが、今後順子系の牌効率を取り入れたとき、シャボのときと同様のことを考えるかも。
なおこのことは自分の追っかけリーチ、一向聴のときの聴牌化牌にも応用できる(はず)。
・先制リーチ後
リーチ者はツモ切り。自分も攻める限りツモ切り。攻めるかどうかの判断は現在順目を最終順目から始めて、攻めた場合と降りた場合のシナリオを多数回やらせてどちらが有利になるか判断、判断できたら現在順目をひとつ早めて同様のことをする。(例えば17,18順目の判断が分かってるときは現在順目を16にして攻める場合と降りる場合のシナリオを多数回やらせる。攻める場合は次順17順目がきたときはその判断に従わせる。)
自分や他家が降りる場合は手牌の中で(リーチ者の捨て牌から見た)最も安全な牌を切らせる。(これは現状ほぼ実装できてる)。
他家が降りないときの挙動、追っかけリーチの宣言牌の扱いはまだ決めてない。
とりあえず今考えていて、進めているのは上のようなこと。かなりやっかいなんでまだまだ結果が出るには時間がかかると思います。まだ現状ではこれでうまいこといくかどうかわからないので、うまい考え、またはご意見は歓迎します。
時間の割にあまり研究進んでないなぁ。
まだ次のテーマは全く報告できる形になってないのですが、前回最後に書いたことと、今考えていることが微妙に変わりつつあるので(そしてこれからもまだブレるかもしれない)、現状を報告することにします。
・今やろうとしていること。
前回までただの机上計算(まぁ、実際はエクセル使ってるわけですが)で求めた結果がどこまで妥当なものか、実戦orシミュレーションで検証したい。
・そのための手法
とりあえず乱数を使ってコンピューターに多数回麻雀を打たせる(つまりシミュレーション)。今回は先制リーチに対する対応を考えたいので先制リーチ順目t1(と自分、先制リーチ者の風)を固定させて、先制リーチ前と後のパートに分けて考える。
・先制リーチ前のパートの詳細
全員が自分だけの都合で打牌する。打牌の基準として人間が考えるような牌効率をコンピューターにさせる(というか自分で命令を打ち込む)のは現状として私の能力をはるかに超えているので(でも麻雀ソフト開発してる人はそういうことやってるんだよね・・・)、決定論的手法and確率論的手法でできるだけ人間に近づけたい。
現状は、ほぼ確率論的手法のみで、対子アンコに関する修正、一回捨てた牌(高確率で不要牌)に対する
修正のみを加えた後、前に述べた捨てられやすさ指数k_iで重みをつけてランダムに切る牌を選ぶ。順子関連の牌効率無視で現実にはほど遠い・・・。努力はしつつ適当に折り合いをつけたいところ。なお、修正に使ってる数値(例えば今現在「対子2組あるときの対子」が切られる確率は通常の1/10と設定している)は完全に直感で、これは実戦牌譜から情報を得て実戦に近い値にとりたい。
・先制リーチについて
上記の(エセ)牌効率によって打牌していき、t1順目の先制リーチ者の番がきたらリーチさせるわけですけど、ランダム打牌なのでもちろんその手牌は「テンパイ」してない。そこで待ちについても一定の方法で決めて、待ち牌が打牌されるorリーチ者がツモるときリーチ者の和了としてその局を終える。待ちの決め方は現状では下のようにしている。
まず待ちの種類を次の10区分、両面、数数シャボ、数字シャボ、字字シャボ、カンチャン(28、37、456)、ペンチャン、数単騎、字単騎に分け、実戦での発生率からどの待ちになるかを確率的に決める。
その後それぞれの待ちの区分の中でとりうる待ちの中から等確率でひとつ選び出す。
まずいずれの待ちの場合も現物とリーチ者から見て待ち牌が残り0枚のものはとりうる待ちから除外する。
シャボの場合、該当する対子2組以上ある場合にその中から決めるが、対子2組ないことがけっこうある(特に字字の対子2組あることはまれ)なので、そこら辺も考慮して実戦確率に近づけるように調整する。つまり対子2組ないときは待ちになる確率は0だが対子2組以上存在するときは実戦確率より高確率にして全体で実戦確率になるようにする。これは他の待ちでも同様。
単騎の場合、手牌にある単独牌を取りうる待ちとする。
残り順子系の待ちについては現状はほぼ無条件(待ちを構成する牌が4枚切られてない場合のみ)だが、今後順子系の牌効率を取り入れたとき、シャボのときと同様のことを考えるかも。
なおこのことは自分の追っかけリーチ、一向聴のときの聴牌化牌にも応用できる(はず)。
・先制リーチ後
リーチ者はツモ切り。自分も攻める限りツモ切り。攻めるかどうかの判断は現在順目を最終順目から始めて、攻めた場合と降りた場合のシナリオを多数回やらせてどちらが有利になるか判断、判断できたら現在順目をひとつ早めて同様のことをする。(例えば17,18順目の判断が分かってるときは現在順目を16にして攻める場合と降りる場合のシナリオを多数回やらせる。攻める場合は次順17順目がきたときはその判断に従わせる。)
自分や他家が降りる場合は手牌の中で(リーチ者の捨て牌から見た)最も安全な牌を切らせる。(これは現状ほぼ実装できてる)。
他家が降りないときの挙動、追っかけリーチの宣言牌の扱いはまだ決めてない。
とりあえず今考えていて、進めているのは上のようなこと。かなりやっかいなんでまだまだ結果が出るには時間がかかると思います。まだ現状ではこれでうまいこといくかどうかわからないので、うまい考え、またはご意見は歓迎します。
スポンサーサイト