*All archives* |  *Admin*

<<04  2009/05  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31  06>>
現状報告2
前回、頭で考えたことを文にしてみたわけだが・・・。改めて考えてみると「これは極めて死ねる企画だ」と気づいてしまった。

問題点
・順子の牌効率までしっかり考えてやると、鳴きの影響も無視できないし、先制リーチ者の牌姿がほんとは「テンパイ」してないという誤差も気になってしまう。
・鳴きとか順子の牌効率まで考えると思考ルーチンが麻雀ソフトが1本できるくらいの規模になりかねない。
・よってプログラミング初心者のあたしにとっては何年かかるかわからんぞ。

というわけでわずか数日で方針転換。代わりにうまい(?)と思われる改善策を思いついた。

最も難しいのは↑で書いたように「無条件時の牌効率」である。逆に先制リーチ後であれば、普通は全ツか降りのどっちかだから打牌の選択はずっと容易い。

よって「先制リーチの瞬間の場況」が定まれば、後は単純な思考ルーチンで打牌させ、多数回の擬似麻雀(擬似とはいえ従来と比べるとちゃんと牌1枚1枚を考えてる分、より実戦に近いのではないかと思われる。)を打たせて、状況判断の優劣を考えることが出来る。また、副産物としてリーチに対する他家の挙動も詳しく分かるであろう。

すると残る問題は「先制リーチの瞬間の場況」を定めることである。これについてはまだ詳しくは考えてないが、リーチ者(聴牌)の牌姿、自分(一向聴)の牌姿、他家の牌姿、捨て牌の4種類を順目ごとに実戦牌譜から傾向を読み取って、そこから確率的に場況を定める方針。とりあえず初めての試みで「無条件時の牌効率」ほどではないが、それなりに難しそうのでそれぞれの牌姿とかは独立として決めてしまうのだろう。改善は後でやればいい。

やや不安なのは今持ってる自分の牌譜が傾向を読み取れるほど十分な試合数なのか?ということ。特に4つの中では自分の牌姿、つまり先制リーチ時に一向聴となってる人の牌姿が一番限定的で問題だろうか。とりあえずやってみないとわからない。

いずれにしても牌譜から実際に麻雀を打たせるだとか、手牌をパーツに分けたりとかして聴牌とか一向聴とかを判定する関数を作るだとか(私にとっては)そこそこ難しそうな課題はあるので、何年とかはかからないにしても前みたいに1週間とかでほいほい結果を出したりとかいうことはできないだろう。分かったことがあれば小出しでも更新するつもりではあるが、読んでくれている方たちにはのんびりと待っていただきたいものです。
スポンサーサイト
現状報告
前回の更新からもう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順目がきたときはその判断に従わせる。)

自分や他家が降りる場合は手牌の中で(リーチ者の捨て牌から見た)最も安全な牌を切らせる。(これは現状ほぼ実装できてる)。
他家が降りないときの挙動、追っかけリーチの宣言牌の扱いはまだ決めてない。


とりあえず今考えていて、進めているのは上のようなこと。かなりやっかいなんでまだまだ結果が出るには時間がかかると思います。まだ現状ではこれでうまいこといくかどうかわからないので、うまい考え、またはご意見は歓迎します。
レポート1「一向聴時対リーチ押し引き」その15 改善結果編2
なんとか二人攻めVer.改造完了。ただやはりベタ降り可能性を考慮できてない分、不完全な感じがするのは否めないなぁ。まぁできる範囲でやるしかない。

というわけでグラフを書いてみよう↓(書いてない条件は基本条件で)rep01-53.png
やはりグラフの形が大きく変わって一人攻めとは全く別物ということを思わせる。
一人攻めのときはベタ降り不完全性で3~400点悪化するから大きく見積もっても800点しか悪化しない(というか前回は2倍までと書いたけど、リーチ者同士の振り合いなんかで決着が速くつくことも考えればそんな差がつかないかむしろ二人攻めのほうが悪化幅が小さくなるんじゃないか?とも思える。決着が早いなら現物枚数依存性はより強くなるだろう。)。
やはり3900一向聴でもよっぽど早い順目じゃない限りそうそう二人に無筋は切れないことが分かる。逆に二人攻めのときは順目依存性が強く早い順目だと一方に無筋なら切れるかも!?
どっちにしても一人攻めよりだいぶ条件が悪くなることは確実だろう。(少なくとも点数1ハン差以上相当の悪化は避けられないだろう)。

ただベタ降り可能性を考慮してないのもあるし、計算の基礎としているパラメータ(a_iとかp_iとか)がどうも感覚と違っててイマイチ信用できない感がぬぐえない。逆に一人攻めのところはかなり多くの要素を拾えたと思うのでそれなりに信用できるのではないか、と思うわけです。(ていうかもういい加減そう思いたいものだ。)

そのことも踏まえ全体のまとめとして一人攻めの場合においていくつかこのモデルにおいて攻めと降りが拮抗している状況を示し(即実戦に当てはまるかといわれると?なので注意)、そこから各種パラを変化させたときの期待値変化がどの程度か?を示していきます。+が攻めるのが有利な側、-が降りるのが有利な側です。

・状況1 子対子1ハン40符(役なし)一向聴、和了牌6枚、聴牌化和×2=12枚、現物2枚、今切る牌片無筋、宣言牌両無筋、先制リーチ直後 1~15順目くらいまで±0

和了点→2ハン30符+100、3ハン30符10順目まで+4~500それ以降+3~400
親子→自分親早順+200~遅順+50、リーチ者親早順-100~遅順-200
和了牌→-1枚につき-6~80、+1枚につき+100~130
聴牌化(和了牌枚数固定)→-1枚につき-2~30、+1枚につき+30~40
現物→-1枚につき-9~120、+1枚につき+70
先制リーチ順目→-1順につき-15~20
今切る牌→両無筋早い順目-150遅い順目ー250、スジ28早い順目+70遅い順目+100
宣言牌→スジ28+30~20

・状況2 子対子3ハン30符一向聴、和了牌3枚、聴牌化和×2=6枚、現物2枚、今切る牌片無筋、宣言牌両無筋、先制リーチ直後 1~11順目くらいまで±0、14順目で-50(ただし手変わり無視)

和了点→2ハン30符-50、4ハン30符8順目まで+100 11順目で+50
親子→自分親4順目+200 7順目+200 10順目+100
    リーチ者親早順-50~-100 11順目-150
和了牌→-2枚-120~150、-1枚-70~90、+1枚早い順目+200 11順目+150、+2枚+500~400
聴牌化(和了牌枚数固定)→-1枚につき-25~35、+1枚につき+50~40
現物→-1枚につき-9~120、+1枚につき+70
先制リーチ順目→-1順につき-20
今切る牌→両無筋7順目-150 12順目-200、スジ28早い順目+50遅い順目+100
宣言牌→スジ28+20~0

・状況3 子対子2ハン30符一向聴、和了牌3枚、聴牌化和×2=6枚、現物0枚、今切る牌片無筋、宣言牌スジ28、先制リーチ直後 1~14順目くらいまで±0(ただし手変わり無視)

和了点→1ハン40符-15~30、3ハン30符8順目まで+100 13順目で+50
      4ハン30符9順目まで+200 12順目+150 14順目+100
親子→自分親早い順目+100 10順目+50 14順目+0、リーチ者親早順-60~-150
和了牌→-2枚-100~150、-1枚-60~80、+1枚+130~150、+2枚+300~350
聴牌化(和了牌枚数固定)→-1枚につき-20~30、+1枚につき+30~40
現物→+1枚につき-9~120
先制リーチ順目→-1順につき-25~30
今切る牌→両無筋-100~200、スジ28早い順目+50遅い順目+100
宣言牌→両無筋-10~0


ずらずら~と書いていった中で思ったのは不利になってる条件を改善するほうがより有利になるというところかな。いずれにしてもどこまでこの数字が信頼できるかは?である(根拠のない私見であるが数百点クラスの差がついたら容易に埋まらないとは思うのだが・・・)。

どうもこのまま机上で期待値計算を続けていってもこの信頼性が解決される気がしないので、シミュレーションに手を出してみようかしら(大学のセンセから英語とプログラミングは早いうちにやっとけと言われたこともある。)エクセル計算よりは実戦に近くなるんじゃないかなぁと期待している。

頭の中でどういう風にするかはイメージはついているけれども、なにぶんプログラミング初心者のため完成までどれくらいかかるかは未知である。やや本業が忙しくなってきたこともあるし、次回の更新はちょっと時間がかかるかもしれない。ただその分ハイクオリティーな報告にしたいものだ。
プロフィール

Author:nisi5028
FC2ブログへようこそ!

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
FC2カウンター
フリーエリア
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード