東風荘自動打ちソフト 200309xx版 design and codeing by Scene Research Station Mitsuru Nishibe(mitsuman) mtm@kmkz.jp http://kmkz.jp/mtm/ ------------------------------------------------------------- 使用法 第1東風荘に繋ぎます.下ランに行きます. mahjong.exeを実行します. 卓を予約します. しばらくすると勝手に打ち始めます. あなたは悠長に観戦しつつチャットにでも興じていてください. 注意:MJexeIO.DLLの仕様上常に東風荘の画面が前面に出ている必要があります. あなたのRが下がりまくっても責任は取りません.あくまで所詮CPUなんて馬鹿だよなー, ていうかmitsumanあほすぎ,くらいの感じで楽しんでください. ちなみにこの自動打ちソフト用に作ったIDはR1000切ってます. 第2でも打てますが,南場が全てオーラス扱いで内部計算します. といっても殆ど局単位の期待値を上げる事に専念しているのでかわらんかも. あんまりチェックしてないので落ちるかも. 開発環境はWindowsXPです. ------------------------------------------------------------- 謝辞 とつげき東北 氏 泣く子も黙るシスマの人. 麻雀を理論的に,工学的に解明しようとしている. と同時に,MJexeIO.DLL,できすぎ君といった非常に有益なツールを製作している一面もある. MJexeIO.DLLにはお世話になっています.けど,winsockあたりをhookして画面が隠れても画面情報を取得できるように してほしいです.(言うのはタダ) http://www.interq.or.jp/snake/totugeki/ FUKUMOTO Norihiro 氏 麻雀に関する様々なアルゴリズム,理論,それに基づいたシミュレーション等を分かりやすく見やすく説明している. いろいろお世話になってます〜. http://comjong.com/ 政宗,aad <テストプレイ付き合ってくれてありがとう. ------------------------------------------------------------- 事の発端 (前略) で,実は僕も自動打ちツールをこの前密かに作りました(そのうちアップするかも.雑魚だけど).起動するとネット麻雀の東風壮のラン卓でひたすら打ち続けます.一日100回位は東風戦をこなします.大抵回線落ちしてるけど... 今のところR1000弱.いくらか改良しているので正味は安定R1200くらいあると思いたいのですが(改良してから50試合やったら安定R1200強),実のところかなり弱い.手作りとか打ちまわしはそこそこ良いと思うのだけど,どうも勝負に気弱すぎてトップ率が低い.2,3着ばっか. アルゴリズムは詳しく説明すると長くなりますが, ・見えてる牌をカウントして,各牌のつもる確率を計算. ・残り牌から面子の構成確率を計算し,場全体の各牌の不要度を計算.(これをロンすると仮定した時の和了確率として使う) ・上とは独立に,残り牌から待ちになる確率を計算.具体的には全ての単騎,シャボ,両面/ペンチャン,カンチャンの確率を調べ,各牌が待ちになっている確率を計算.これと非常に適当な関数(順目と誰が立直してるか,何副露しているか,ドラがどれだけ見えてるか)から各牌を切った時の失点期待値を計算. ・各牌を切った時の得点期待値を計算.簡単に説明すると4面子1雀頭になるまでどんどん多牌していく.和了になったら不要牌を計算し,(和了の得点-不要牌の失点期待値)×そこまでつもる確率をそのときの不要牌に対して均等に分け与える. ・得点期待値−失点期待値が最大になる牌を切る.この時点で聴牌でかつ,立直した方が得点期待値が高いようなら立直(立直するとロン和了は殆どないものとして計算する.つまりツモ和了の可能性が高ければ立直する). ・フリ聴でなければ安めだろうがロン.ツモは無条件に和了. ・鳴きは一切なし.ドラ飜牌対子でも鳴きません.七対子も無視. てな感じ.(実際はこれじゃあ遅すぎるので枝狩りをかなりしてますが) 全て明確に数学的なモデルだけを使って切る牌を決定しています.できるだけ両面待ちに持っていくように作ればいいやん?とか思うかもしれませんが,数学的に検証できないものを実装しても,それが有効であるが判断するのにコストが掛かりすぎるのでやる気無し.人間臭いパラメータや条件分岐が沢山含まれたアルゴリズムを想像してみましょう.それをちょっと変更したとき,100半荘打ってもその変更が正しかったのか判断できるか怪しいものです(ここがオセロや将棋,囲碁と違って麻雀の辛いところか).つまり調整するには膨大な時間と努力と勘が必要になってきます.てことでやりたくない.そもそも僕が弱すぎなので勘で作ったら大変な事になる. で,モデル化なんですが,とりあえず現時点のものをダメ出しすると, ・局単位の収支の期待値を最大にするのじゃなくて,(とりあえず東風向けに)最終順位の期待値を最高にするべき. ・得点期待値や失点期待値を単純加算してるのは多分おかしいので直す ・失点も三家独立に扱わないと最終順位の期待値にうまく結びつかない ・他家の手の高さ/聴牌率の推測が全くないのでなんとかする ・ロン牌の期待値計算などがいい加減なので上記と絡めてどうにかする 等等が挙げられる. しかしねー,これ真面目に考えてると麻雀ってイメージで打つしかない気がするのね.だって,今のプログラムだって1手打つ度に何千という薄い可能性の最終和了形と振込みをシミュレートして期待値を計算しているのです.これってイメージに他ならないと思う.最初はうまくモデル化できれば自分の打ち方も良くなると思ったんですが,完璧なモデルが出来たとしても,どのみち人間じゃそんな計算は無理で結局(正しい)イメージを掴んで打つしかないんだよな. あと,こういうこと考えるといわゆるデジタルって意味ねーとか思った.(オカルトは論外ですが) だって人間が計算するといっても高々1,2手分くらいで,最終形の判断も和了点と待ち枚数くらいじゃないですか. 例えば,平場で2000点で両面47待ち(残り8枚)と4000点で間5待ち(残り4枚),という選択をする時でも単純に自摸れる確率は2:1なわけなくて,ロンを考えなければ1-(1-8/N)^T:1-(1-4/N)^T (Nは確定していない牌の数,Tは自摸の回数) となるわけです(中高生レベルですが誰か検算よろしく).かなり計算めんどいし,高め安めがあるとさらに期待値計算は辛い.あと待ちがどれくらい山に残っているか推測するのもデジタルにやってては人間じゃ無理な気がする(<見えてる牌から他家の面子に組み込まれている期待値を計算するってこと). てことでやっぱ正しいイメージと感覚で打つのが人間にとって最善であり,桜井章一は最強なんじゃないかと思いました.っていうかここまで来てそのオチは酷いな,流石に...(雀鬼の見すぎ) ------------------------------------------------------------- 補足 得点期待値計算の部分で,どんどん多牌していくとありますが,最大ツモ8回分までのあらゆるツモを計算します.つまり8順先のあらゆる可能性を読みきります. と言いたいところですが,それでは遅すぎるのでかなり向聴数が全然伸びないツモは激しく枝狩りしてるんで,実際は読みきってないです. 問題点はそれよりも,全ての可能性の期待値の総和が最善手とは限らないという事ですね.中途半端な打牌になって余計にだめかも. 事の発端verでは牌を切った時の失点期待値が2重に加算されてた気がするので,そこを少し修正しました.もうちっとは突っ張るようになったかも.