SCENE RESEARCH STATION  
with my everyday
thinking-and-doctrine

*2003.09.30

::MissionJ & MissonC

巡回する余裕が余りないけど更新したい時は,こういうストックしてあったネタを出してみる.
>オブジェクト指向プログラミングとJavaの専門用語をラップで聞いたり歌ったりすることにより、言葉に対する抵抗感をなくします。
それ以前にラップでJavaを覚える事に抵抗感というか嫌悪感を感じてしまいますが.むしろJavaを使ってラップの勉強の方が有り得そう.
(from #hetappi)

麻雀::自動打ちのアルゴリズム(200309xx)

comjong.comの人からリンクキター.不思議の白書が面白いです.こういうゲーム理論みたいなのは勉強した事ないので参考になります.
で,実は僕も自動打ちツールをこの前密かに作りました(そのうちアップするかも.雑魚だけど).起動するとネット麻雀の東風壮のラン卓でひたすら打ち続けます.一日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は自摸の回数) となるわけです(中高生レベルですが誰か検算よろしく).かなり計算めんどいし,高め安めがあるとさらに期待値計算は辛い.あと待ちがどれくらい山に残っているか推測するのもデジタルにやってては人間じゃ無理な気がする(<見えてる牌から他家の面子に組み込まれている期待値を計算するってこと).
てことでやっぱ正しいイメージと感覚で打つのが人間にとって最善であり,桜井章一は最強なんじゃないかと思いました.っていうかここまで来てそのオチは酷いな,流石に...(雀鬼の見すぎ)

oldlog 99-00 00-01 01 01-02 02
newlog 2002 2003 2004 2005 2006 2007
category scene | 2ch | 麻雀

Copyright (C) 2003-2004 mitsuman(mnishibe at ertl.jp) All Rights Reserved.

750k+