*All archives* |  *Admin*

<<06  2017/07  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  08>>
麻雀AI開発その41・グラフィックの作成その3
麻雀AIの続きです。
昨日、今日と、わりとがんばったので、グラフィックがかなり進展しました。

他家の手牌と捨て牌部分を自分と同じように作って、中央に局情報(局・本場・供託・残り山・ドラ表示牌)と各人の情報(風・得点・名前)を置きました。
卓のサイズはやっぱりほぼ正方形のでかいサイズが必要になったので、メインフォームのサイズをでかくして、いらないテキストボックスとかを横によけておきました。
挙動が安定したら手牌とか捨て牌のテキストボックスはリストラできるでしょう。
また、1順前の捨て牌について、手出し牌は牌の下に水色線を引きました。(1順回ってきて捨て牌の画像が更新されるタイミングで、水色線の手出し情報は見えなくなる。)
170725-01.png
やっぱり実際の牌の画像を使うと麻雀をやってる感が出てとても良いです。

従前のように切ることができる牌をリスト化したコンボボックスから1牌選択して「切る」ボタンを押すのが手間なので、
自分の手牌の画像を直接クリックして切ることができるようにしました。
また、グラフィック化したので、他家の切った牌と自分のツモ牌の情報をメッセージボックスで逐一出していたのをやめました。
(鳴きとリーチについては従前通り、メッセージボックスを出す。)
ちょっと対局がさくさく進む…かもしれないです。ただ、肝心のAI本体の計算時間がかなりかかるので、全体としてはそんなにスピードアップはしてないかもしれないですが。

また、鳴き無しボタン、自動和了ボタン、リーチ後ツモ切りボタンといった細かいオプションも用意。
170725-02.png
この局は手が悪かったので回し気味に聴牌取りにいってたら、なんか知らないけど、上がりまで拾えた。
170725-03.png
東3局、自分の親番で満貫被ツモ親かぶり。ダマ愚形5200をしっかりダマにしてくるAIちゃん。
170725-04.png
オーラスもドラポンと親リーチに囲まれて無筋をたくさん引かされて大変だったけど、無事に上がって2着。
牌譜の出力も成功。
170725-05.png

挙動が安定するまでしばらくテストは必要になるだろうけれど、とりあえず牌譜検討ソフトとして、AIとの対戦機能・牌譜の再生機能・AIの評価値を表示する機能の骨組みはこれでできたことになります。
画像処理とかでもっと手間取るかと思ってましたが、ものすごく順調に進んでいます。

それで、検討ソフトの骨組みを作る作業と並行して細かい押し引きを決めるための基礎データ集めをやっているのですが、こっちの方はなかなか進まないです。1日に300試合くらいしか進まなくて、今のところもうちょっとで目標の半分である5000試合が見えてくるというところです。
(グラフィックのコード作りとテストの試合をがりがりやってたせいか、今日は特に進みが遅いです。今晩は天鳳できなさそう。)
ずっと何もせずに待ってるだけというのも退屈なので、目の前に見えてる5000試合でいったん妥協してcsvファイルの振り分けとエクセルソルバーにがんばってもらうのをやろうか。それで使えそうなデータだったら詳細押し引きを組み込むと。
ダメそうならもうちょっと試合数を追加すると。

その次は序盤(2シャンテン以上)の手組をどうするかを考えたいです。3シャンテンのほぼ受け入れ枚数だけのてきとうな打牌選択とか、2シャンテン手替わりなし再帰計算の全数探索でかなり時間を食うのがストレスなので、そこをうまいこと改善したいです。今のところ考えているのは、牌の種類とかその牌を切ることによる一次有効牌の減少数とかまわりの牌の有無とかで、実測値からスコア化して、そのスコアが一番いいものを打牌として選ぶみたいな。それだけだと手役(特に三色・一通・チャンタあたりの鳴ける手役)がおろそかになりそうなので、そこも多少は考えつつ。(まぁ、これは後で付け足しとかでもいいかな。)
まだ数学的にちゃんとできる目途は立ってないですが。
こっちは理論さえうまいこといければ実測牌譜を再帰計算するみたいな超時間がかかるようなことにはならないはず。
通常の牌譜解析と同レベル、でできればいいなぁ。

検討ソフトの骨組みの方はテストで試合を重ねて挙動を安定させるのとか、まだ考慮できてないルール作り(途中流局とか、パオとか)を作るところとかです。
後は他家がカンすることを考慮してないのもなんとかしないといけないか。

とはいえ、まだ粗いですけど、まぁひとまずはうまくいってよかったよかった。
スポンサーサイト
麻雀AI開発その40・グラフィックの作成その2
麻雀AI開発の続きです。
今回は副露部分手牌と自分捨て牌のグラフィックを作りました。

捨て牌はこんな感じ。
リーチ宣言牌(宣言牌が鳴かれたら次の捨て牌)を時計回り90度回転して、鳴かれた牌は捨て牌の見た目から消しています。
また、リーチ宣言牌が鳴かれて、次のツモ番が回ってくるまで横に曲がってる牌がなくてリーチ状態かどうか判別できないのは困るので、捨て牌1段目のすぐ上にリー棒を置くスペースを作っておきました。
170724-01.png

副露手牌はこんな感じ。

横幅が一番多く必要になるケースは4つ大明槓で晒してかつ、自分のツモ番(手の内の牌は2枚)のケース。
最大横幅に合わせてあるので、普通にポンとかチーの仕掛けだけだとかなりスペースが空いてスカスカに見える。

また、縦幅が一番大きくなるのは加カンが入ったケース(横向き牌2個分)なので、ちょっと上側にもスペースが空いてます。
170724-02.png

始点のx座標y座標が(27,10)で、牌の縦幅と横幅が何ピクセルで…、的な計算が地味にめんどくさいですが、まぁ順調に行ってる感じです。
今の調子で他家の捨て牌とか手牌を作っていくとスペースが足りない可能性が高いので、邪魔になるテキストボックスとかを消したりどっかに移すとかしたり、元フォームのサイズをでかくするとかの工夫が必要になりそうです。
麻雀AI開発その39・牌譜再生機能(評価値の表示その2とグラフィック作成のはじめ)
麻雀AI開発の続きです。牌譜再生機能の続きで、AIの思考関数をかなり作り変えました。

○やったこと
・シャンテンを維持できる全部の打牌候補を計算する
・再帰パートでの結果がいいものから優先して計算して、計算済みのものから順次途中経過を表示する。
・計算の途中キャンセル機能を付ける
・計算した内容をテキストファイルに書き込む機能を付けた。
・現在のツモ番の人を赤文字にして、切った直後の状態(鳴きの考慮中)を青文字にした。

いやー、だいぶがんばったですよ。

天鳳で自分が打った牌譜をテキストに保存して貼り付けた。
牌譜がたくさんあるとなんとなくうれしくなる。
170723-02.png
見た目はそんなに変わってないけど、中ではいろいろ苦労というか改善してます。
この例では2シャンテンで全部の打牌候補を計算。計算の途中キャンセルも可能。
170723-03.png
書き込みボタンを押したら、ここに載ってる情報がそのままテキストファイルに出力される。
170723-04.png
今のところはおかしな挙動は出てなくて、だいじょうぶそうです。もうちょっとテストした方がいいですけど。

続いてグラフィックの作成に移ろうかと思います。
さすがにテキストボックスでの文字列の羅列では麻雀するのにしんどいので。

牌画はこちら(http://majandofu.com/mahjong-images)のものをお借りしました。

画像処理は初めてなので、四苦八苦しながらなんとか自分手牌(副露部分以外)を表示させることに成功しました。
170723-05.png
わーいわーい。
これで、他の部分も技術的になんとかなりそうな目途が立ちました。
後は1個1個個別に作っていけばそれっぽいのができそうです。
麻雀AI開発その38・牌譜再生機能(評価値の表示その1)
麻雀AI開発の続きです。牌譜再生機能の続きで、前回までで牌譜をそのままなぞるところまでできたので、
今回は場面ごとの評価値を表示する機能を作ります。

牌譜再生モードで、直前の行動がツモorチーorポンのときに評価値を計算して別のフォームに計算内容を表示します。
(もともとのフォームの中央部分は後々グラフィックの作成のために空けておきました。)
170721-01.png
とりあえずそれっぽくはなってる。
170721-02.png
呼び出す関数は対局機能のときのAIの思考関数をそのまま流用しているので、今のところシミュレーションパートは上位2つの打牌候補のみしか出てこないです。これだと第三の選択との比較がしづらいので、牌譜再生モード内では全部の打牌候補を計算するようにしようか。
ついでに再帰パートでの結果がいいものから優先して計算するとか、計算できたものから順次表示するとか、計算の途中キャンセル機能を付けるとか、まだ改良の余地がありそうです。

とりあえず技術的なところはなんとかなりそうでなにより。後は地道な改善の作業をしていきましょうか。
1軒リーチに対するチートイ聴牌の挙動
今回は他家リーチが入ってる時に不意にチートイのみ聴牌が入った時の対処を考えてみたいと思います。

次の3つの対処法を考えてみます。

・即リーチ
そのまま。説明は不要かと。

・攻めダマ
この1巡はダマ。次に引いてきた牌がより上がりやすい牌(具体的には(1順当たりツモ率)+3×(1順当たりロン率)の値が今の待ち牌より上がる時)のとき、待ちを変える。
また、ある程度いい手替わり((1順当たりツモ率)+3×(1順当たりロン率)の値が6%以上)である場合はそこでリーチする。
ドラ単騎になった場合も待ち変えしてリーチする。
降りは考慮しない。

・守りダマ
この1巡はダマ。次に引いてきた牌と今の待ち牌を比べて、先制リーチ者に対する危険度が低い方を切る。
切るべき牌の危険度が5%を超える場合はテンパイを崩して降りる。
ドラ単騎になった場合は待ち変えしてリーチする(ただし、切る牌の危険度が5%を超える場合は降りる条件は適用される。)

最初の待ち牌は2枚見え字牌、生牌無筋19、生牌無筋456の3種類で調べてみようと思います。
初手は完全安牌で固定します。

まずは2枚見え字牌単騎の場合。
170720-01.png
ほぼ全ての状況で即リーチするのが有利になっています。

もともと最高レベルに上がりやすい牌なので、(攻める)ダマにしても有効な手替わりはほとんどなく(ドラ単騎くらい)、それなら最初からリーチした方がいいと。

また、守りのダマにするにしても、今の待ち牌(2枚見え字牌)は安全度が高いので、1回までは待ち変えで聴牌維持が効くものの、その後が続かず結局降りに回らされることが多いです。
なので、即ベタ降りよりはちょっとマシ、というくらいの局収支にしかならず、リーチチートイ字牌待ちで十分なプラスがある局収支に比べて大きく劣る、というような感じです。


続いて、無筋19単騎。
170720-02.png
まだ即リーチがいいようですが、かなり攻めダマも接近してきています。

自分の捨て牌にもよりますが、仮に攻めダマにして待ちにできる字牌を引ければ(1順当たり約10%くらい)、無筋19をぶった切って勝負になると。

守りダマに関しては中盤以降は降り移行条件に引っかかって無筋19すら切れなくなる(6巡目で大きな断層があるのはこのため)ので、次に危険牌を引くまでの、この瞬間しか上がりがないので、ベタ降りよりわずかにマシというくらいで、かなり苦しいです。


最後に無筋456待ち。
170720-03.png
序盤は攻めダマ有利、中盤はどちらでも、終盤は即リーチが有利です。

序盤については手替わり牌がかなり多くあり、リーチに行けるくらいいい待ちになる手替わりもそこそこあります。
また、攻めの手替わりのためには無筋456を切る必要がありますが、序盤なら1枚の無筋456の危険度も控えめなので押しやすい、ということも大きいです。

終盤についてはフリテンだったり、場に多く見えてたりして手替わりの質・量が序盤より落ちますし、なにより、危険度が高い無筋456を押さないといけないというのがきついです。それならもう真ん中の単騎でもリーチしちゃった方が逆に安全というところまであります。

守りダマについてはだいたい無筋19と同じで、この瞬間でしか上がりがなく(しかも両脇からはほぼでない待ち)、次に危険牌を引いたら終了なので、やっぱり3200(4800)の愚形即リーチよりは見劣りします。
(ただ、字牌待ちとかと比べるとだいぶ差が縮まってきているので、愚形2600聴牌を追っかけない派の人なら守りダマをするのも一考かと思います。)

対親リーチの場合を追記
そこまで大きくは変化はないです。

170720-04.png
プロフィール

nisi5028

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

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

この人とブロともになる

QRコード
QRコード