SCENE RESEARCH STATION  
with my everyday
thinking-and-doctrine

*2007.03.26

麻雀::超・入門 科学する麻雀

とつげき東北氏の本です。
年初に出てね、当然発売日買いですよね、と思ってたんですが、買ったのは1月末くらいで、
レビューするのが3月末って、どういう怠惰ぶりですか、自分。

それはともかく、前作科学する麻雀と比べて、かなりバカにも分かる作りになっておりまして、
とてもじゃないが万人にお勧めできない本となっております。
だって、これ読んだら雀暦1週間くらいの人でも相当強くなるから。
みんな読んじゃったら雀荘で勝ち組が居なくなる危惧大です。(そんなことないか)

麻雀は、まず牌効率というアクセルを覚えて、役作りというハンドルを握り、降りというブレーキを踏むゲームです。
しかし、個々の技術は一人でも練習できるし、本で学べるのですが、
そのアクセルとブレーキのバランスは多くの本は教えてくれませんでした。
何故なら場の状況というのは千差万別であり、その場になってみないと分からないと思われていたからです。

この本(前作も)の画期的なところは、殆どの場合において
「フルアクセルかフルブレーキだけを知っていればよく、その判断も明快」
である事を膨大なデータから実証したことです。

滅茶苦茶端折ると、以下のような感じ。

- 棒聴聴牌即立直 (手変わりは待たない。速度優先)
-- 愚形でも基本は即立直
- 立直がかかったら or 聴牌気配を感じたら(2鳴き以上,染め色が溢れ出した等)
-- 満貫好形一向聴以上だったら全ツ
-- 未満だったらベタ降り (現物→字牌→筋の順で切る。1枚も候補がないときは全ツも有)

あとは、純粋に牌効率とベタ降りさえできれば、一人前。
もちろん、終盤の駆け引きなどは抜けてますけど、南2までこの戦略で問題ないでしょう。

しかし、意外と牌効率ができていない。この本の牌効率の問題間違えまくったからなあ。
三色とかの受け入れを残したくなるけど、聴牌の受け入れを増やして、早く聴牌して立直して和了れる確率を高めた方が、
和了り率も高まるし、人に和了られるリスクも減るし、結局強いんだよね。


第一東風荘がデータ元なので、クイタン赤なしの東風戦ということで特殊ではあるのですが、
一般的な、クイタンあり赤ありご祝儀あり麻雀でも、殆ど変わらんでしょう。
全体に攻めやすく、打点が上がるので、その分パラメータの調整が必要ですけど、
祝儀ありでは結局立直麻雀が強いからね。


あと、面白いのが、膨大なデータから実力と相関の強い3つの要素を見付けだしたことです。
それが
- 立直率
- 門前非立直時の振込み率
- (これは読んでのお楽しみ)
なのだそうです。
強さの9割はこのパラメータで表現できるとなれば、上記のような戦略が正しいのは当たり前の帰結。


それにしても、これが麻雀の本質だとしたら、
確かにとんでもないクソゲーかもしれないですな麻雀は(笑)

*2005.01.08

麻雀::科学する麻雀

とつげき東北氏の本を先日買った.
僕みたいに麻雀を数理的に扱うことに興味のある人間には最高に面白い本です.
数理的に扱うというか,膨大な対局データ(約6万局)に基づいて様々な状況に対する最適と思われる手を紹介していくという感じです.麻雀の本はほとんど読んだことが無いので批評するのもなんですが,東大式麻雀とかに比べても論じる根拠が明確なので圧倒的に受け付けやすいでしょう,少なくとも理系の人間には.
ただ,麻雀というのは凄く複雑なので6万局のデータ(しかも東風荘.第1だとしたら喰いタンがないのでちょっと現実離れした設定である)とそんな大まかな状況分析で問題はないのか?という根元的な問いには答えていない.といっても強い奴は第一東風でもフリーでも強いわけだし,そんな細かい事は関係ないかも.
いずれにせよ,ここまで真面目に麻雀を論じた本はなかったわけで,買いであることは間違いないと思います.

しかし13789m34588p345sで手変わりを待たずに即リーってのは僕としては凄く違和感を感じてしまう.平和か三色付けるかツモのみかノーテン罰符狙いだよなあ,普通の感覚なら.結局,棒聴即リーorベタ降りに近いところに最適戦略は存在するのだろうか?

*2004.11.08

麻雀::インタビュー:小島 武夫

この前の近代麻雀ゴールドのおまけDVDから小島武夫の小手返しの時間を測った.
30fpsの動画で14フレームかかっていたので,0.47秒ということになる.
けど右端の牌をつまんで持ち上げてから隣の牌に触れるまでのモーションが大きく,7.5フレームほど使っているので実質的な小手返しは0.3秒を切る.というより入れ替えている最中は早すぎてコマ送りで見ても何が起きているのか分からない.
どうでもいいけど,雀鬼流は小手返し禁止(?)らしい.

*2004.10.28

麻雀::近代麻雀ゴールド

●最強・無敗のDVD付録!!第1弾!!
【いま蘇る!!最強無敗伝説!!伝説の第4・5回最強戦 雀鬼会連覇の軌跡!!】

雀鬼こと桜井章一の解説入り.というより実際の闘牌より章一の解説の方が長いくらいです.
今は亡き安藤満とかもでてきます.小島武夫の小手返しも見れます.章一の完全に意味不明なオカルト解説も聞けます.
佐々木秀樹氏の髪型も凄いし,これで450円は安すぎる!次号も買いだ!

しかしツモの良くなる生き方とか意味分からんし.
こういうの本気で読んでる人居るんですかね.

*2004.10.21

麻雀::欧米の麻雀

全然違うゲームになってるような.
向こうはトランプみたいな感覚なのかな?

麻雀::麻雀 for FX-602P/603P

たった0.5KBのポケコン用の麻雀ゲーム.
3面子0雀頭の変形ルールではあるけど,ここまでソースが短いとびっくりします.
何やってるか全然分からんし.何語よ,これ?
しかしステップ数とかポケコンとかもう死語だよね.
ポケコンジャーナルとか思い出して懐かしさのあまり涙が出そうになった.
ってこいつポケコンですらなく(プログラム)電卓じゃないか!

*2004.10.07

麻雀::麻雀AIの仕様と作成の手引き

まうじゃんという麻雀環境シミュレータ(?)の自動打ちプラグインの作り方 for Java.
Dummy K.I.というサンプルがある.
対戦してみると分かるのだが棒聴即リーという感じのルーチンだ.
軽くソースを見てみると,面子だと+18,両面だと+12,嵌張だと+4+残り枚数,辺張だと+4,1つ目の対子は+12,2つ目以降の対子は+6,さらに余り牌では(可視枚数が2未満の役牌なら1+ドラなら1+数牌なら1)*持っている枚数,と手牌に評価値を与えている.
さらに各手牌の危険度の評価値を,完全安牌なら+4(3人の共通安牌なら+12),数牌で筋なら+3,それ以外でも立直が無ければ+2,としている.
そして,一枚抜いた手牌の評価値とその抜いた牌の安全評価値の合計が最大になる牌を切るようになっている.
立直の判断は,まず待ちが生きていることを条件とし,残り枚数が61以上なら無条件に立直,役なし聴牌なら立直,となっている.

意外と降りも考慮していることが分かる.
が,あまりにも危険度に関する評価値が低いので殆ど全ツッパに近い印象を受ける.
Dummy K.I.を3人入れて対戦してみると分かるが,お互いが振り合うので自分が振らずチャンスで普通に和了れば2位以上は堅い.
が,面白いのはコンピュータのくせにバカヅキモードになったりすることだ.
なんせ,役なし嵌張立直を2連続一発自摸和とかやるからね.
こうなると手に負えない.

けどこうやってアルゴリズムを丸裸にしてしまうとかなり勝率は上がる気がする.
序盤以降の立直は役なしで愚形が多いとか分かるわけだし,役も狙わないので手は基本的に安いし.


では,何が最も強いアルゴリズムか?
と言えば公開されても対処法がない,つまり真似してフィフティーフィフティーに持っていくしか手がないものだろう.
例えば,じゃんけんで言えば1:1:1の比率で出すことだし,(繰り返しの)囚人のジレンマならしっぺ返し戦略だ.
では麻雀だと?
んなこと知るか!!
っていつもの話に逆戻りです.
とりあえず下のゲーム理論のサイトでも読もう.

麻雀::An Introduction to Game Theory

ゲーム理論についてかなり分かりやすく説明してある.
リスクプレミアムとか金融工学系の用語だと思ってたものもある.
そうか,ゲーム理論って金融と被ってるのか.
てことは麻雀理論を極めたら凄いデイトレードボットが作れるって事?やったー!
# 麻雀のコーナーもあります
参考 : 金融工学入門@甲南大学 これはよくできてる.
参考 : 賭けやギャンブルを分析する学問分野は?

*2004.09.24

麻雀::デジタル麻雀論 麻雀エンジン雀-X

コンピュータで最強の雀師を作ってやろうという企画.
アルゴリズムの話などがメルマガで読める.
塔子に分類して処理するので早そう.
自分の麻雀打ちソフトもバグ取りなどしようと思っているけど,スッキリ考えがまとまらない上にやる気がおきないので停滞中.

*2004.09.13

麻雀::model2-5 ver20040911

なんか知らない人のblogに,僕の自動打ちソフトの事が書いてあった.

ところで、上記の自動打ちプログラムは、ちょっとひどい。
まあ、自分でプログラムを作ったら、当初もっとひどいかもしれないが。
それでも、けっこう、先読みしたりしてるみたいだ。
基本的に、評価関数の設計が間違っていると思うのだが。
へんな孤立牌に固執して、両面ターツを落としていったり、へたすると、出来面子
を落としていったりする。牌の残り枚数が一定を切った次点で、オリモードになる
のかな、とも思うが、いわゆる牌効率がわるすぎて、ほとんど聴牌しないのに、
さらにオリてどうするのだろう。聴牌していて、役なしなのに、なかなかリーチ
をかけないのも解せない。そして、しばらくするとオリモードになるのか、手牌
はバラバラに。
そのくせ、見えてる牌から、牌の残り確率なんかを計算しているが。牌の残り
確率を後回しにしてでも、もっと牌効率をよくしないと、まず、テンパらない。
テンパらない麻雀は100%負ける。


ガガーン.確かによええけどよお.
てことで,verupしました.
ここからどうぞ.
作者からのコメント:
ムシャクシャしてついカッとなってやった.悪気はない.今は反省している.

相変わらず鳴けませんが,前回よりは強くなったはずです.というより前のは弱すぎた.

前がダメだったのは,ムダヅモを考慮しまくってたところ.それが一番大きいかなあ.
他にも細かい改良しまくったので,具体的にどこを直したとか覚えてません.

というよりほぼ一年ぶりにソースを弄ろうとしたら,model2-1(これが確か前回のもの)の他にmodel3とかmodel4があった.なんだろうこれは?と思い見てみたら他のアルゴリズムを試した書きかけだった.試しに打たせてみたら全部ツモ切り.やる気ねええええ.
解読してmodel4ベースにしようかと思ったけど,やっぱり大変そうなので諦めてmodel2ベースでやることにした.model2は切らずにどんどんツモっていって和了まで行ってから不要牌にその手の価値を分配させてやるアルゴリズム.ただ,最後に何をつもるかが確定しないので,普通にやると平和等の和了の形が正しく判定できない.model3は確か和了までじゃなく,聴牌までツモりまくる手法.こうすると待ちの形まで正確に評価できる.model4はツモ→打牌を純粋に繰り返すアルゴリズム.あっという間に組合せが発散するのでお勧めできない.
model3,4ともに超作りかけだったし,計算量的にmodel2が一番スマートなのでmodel2を改良していくことに落ち着いた.

計算量は重要である.
上のblogで「評価関数の設計が間違っているのではないか」と書いてあるが,その通りで評価関数を作るのが難しい(というよりそこしか問題はない).最も単純かつベストな評価関数は和了形の点数とそこまでに到達する可能性を使ったものだろう.これを使うと結局和了きるまでシミュレートしなくてはならないため,膨大な計算が必要になる.それこそmodel4の方法で(明らかな無駄ヅモを除いて)あらゆる可能性和了きるまで計算すると大変なことになる.例えば3向聴の場合,和了まで4牌ツモらなくてはならないが,model4ではmodel2と比べて4!(=24)倍の計算量が必要になる.聴牌形と和了形が重要なだけで,そこに到達するまではどんな順序でツモるか等関係ないのでmodel4は無駄な計算をしていることになる(他の要因も考えると厳密はそうでもないんだけど...).

といってもまだ重いんだよなあ.特に向聴数が大きい序盤がメチャ重い.向聴数が大きいときは枝狩りを厳しくするとかしないとだめかも.

麻雀::最終順位の期待値(2)


以前ここに載せた麻雀の最終順位の期待値ですが,実はバグがある.点数が接近すると順位の逆転現象が起きるのだ.なんで試しに得点期待値ベースではなく期待最終順位ベースで組もうと去年の式を入れたら見事におかしなことになった.

そうでなくても,正規分布なんて使わずもう実測データに基づいてもっと軽いもののにしようと考えた.期待最終順位は,局単位の点棒の移動の分布に依存するはずである.つまり1回の和了の特性を知る必要がある.

www.interq.or.jp/snake/totugeki/MJSIM0.htm
によると,得点分布は次のようになる.(赤が元データの1次補間,黒がスプライン補間)
<< Graphics`Spline`

pts = {{1000, 1037}, {2000, 1292}, {4000, 1242}, {8000, 736}, {12000,
244}, {16000, 40}, {32000, 6}};
Show[
Graphics[{
Hue[0], Line[pts], GrayLevel[0], Spline[pts, Cubic]
}],
PlotRange \[Rule] {{0, 32000}, {0, 1400}}, Frame \[Rule] True,
AxesLabel \[Rule] {"points", "samples"}, Axes \[Rule] True];

なかなか綺麗な分布である.これには流局時の点棒のやり取りがないが,できすぎ君によると流局率は15%程度なので(とつげき東北氏の成績),まあ,こんな感じ?と都合よく流局も含めたグラフを作ってみる.
pts = {{0, 2040}, {1000, 1037 + 700}, {4000, 1242}, {8000, 740}, {12000, 

244}, {16000, 40}, {32000, 6}};
Show[
Graphics[{
Hue[0], Line[pts], GrayLevel[0], Spline[pts, Cubic]
}],
PlotRange \[Rule] {{0, 32000}, {0, 2300}}, Frame \[Rule] True];
Plot[If[x < 14000, 2000 - 1900x/14000,
100 - 95(x - 14000)/(32000 - 14000)], {x, 0, 32000},
PlotRange \[Rule] {{0, 32000}, {0, 2300}}]

左がこんなもんだろうと作ってみたデータ,右がプログラム内で簡単に使えるように適当に作ったそれの1次近似*2である.
本当は失点分布も作りたいけど,データがないため得点分布と同じとしておこう(ツモられる事が多いので本当は横に縮んで縦方向に伸びる分布になるはずですが,まいいや).それで,この分布をベースに期待最終順位のようなものを出してみよう.
ExpectOrder[m_] := Module[{a, p, r, s},

updown[x_, p_] :=
If[m[[p]] \[Equal] m[[x]], 0, If[m[[x]] < m[[p]], 1, -1]];
RealOrder[p_] :=
2.5 + (updown[p, 1] + updown[p, 2] + updown[p, 3] + updown[p, 4])/2;
DisplayTogether[
ListPlot[
Table[{s,
For[p = 1; q = a = 0, p \[LessEqual] 4, p++,
d = Abs[s - m[[p]]];
d *= 1.0Exp[-0/10]*If[p \[Equal] 2, 0.7, 1];
↑残り局数や親番が残っているかで偏差を変える
r = If[d < 14000, 2000 - 1900d/14000,
100 - 95(d - 14000)/(32000 - 14000)];
r = If[r > 0, r, 0];
q += r;
a += RealOrder[p]*r;
];
a/q
}, {s, 0, 50000, 1000}
],
PlotJoined \[Rule] True],
ListPlot[
Table[{m[[p]], RealOrder[p]}, {p, 1, 4}],
PlotStyle -> {Hue[0], PointSize[.02]}
],
PlotRange \[Rule] {{0, 50000}, {1, 4}}, Frame \[Rule] True,
GridLines \[Rule] {m, Automatic},
AxesLabel \[Rule] {"points", "Order"}, Axes \[Rule] True
];
];
ExpectOrder[{35000, 32000, 18000, 12000}]

一応オーラス32000点持ちの2着が親という状況を想定.
各期待最終順位は順に 1.52986, 1.63943, 3.08817, 3.53771.

仮にここで3着が4着から跳満貫を和了っていると仮定すると,
ExpectOrder[{35000, 32000, 18000 +12000, 12000 - 12000}]

順位は 1.86527, 2.02736, 2.13788, 3.93874.
いい感じに三つ巴になっています.
順位の逆転が起きないしこれでよしとしよう.
(単調減少じゃないですが,青線上のデータしか使わないので関係ないはず.とはいえ気持ち悪いので直したいところ.もしかして有効桁数の問題か?)

といっても,オーラスは期待順位なんてものは計算にほぼ必要ないですが.

*2004.08.25

麻雀::麻雀牌フォント

これをインストールすればもう英数字は必要ありません!麻雀牌で意思疎通が可能になります!
ということで早速適当なチラシ(?)を作った.
学内掲示板に貼り付けておこうかと思ったけど,停学とかになると嫌なので止めました.

*2004.07.14

麻雀::3D麻雀

画面がキレイ.ただ,もっと人間らしい雑さがあれば良かったかも.

*2004.01.31

麻雀::ま〜じゃんのつぼ

裏芸ムービーが見れます.

*2004.01.26

麻雀::雀士養成所

モンテカルロ法で「広い一向聴とせまいテンパイ」のどちらが良いか,等を検証してます.
余裕ができたら,僕も理論を練り直して東風荘自動打ちソフトのverupをしたいところです.多分こういう(馬鹿な)事って学生のうちしかできないだろうし.
けど最近麻雀のモデル化について全く考えてなかったので,前考えてたこと完全に忘れた.

*2004.01.21

麻雀::感じろ!のススメ ゲスト:桜井章一

爆笑問題のススメに麻雀界の生きた伝説こと桜井章一が出ていたようだ.
うわああ,見逃しちゃったよ!
昔ニュースステーションに彼が出てた動画見てかなり笑えたんですが,今回はどうだったんでしょうか.

*2003.10.15

麻雀::麻雀における思考ルーチンについての考え方

麻雀悟空とか出してるその方面では有名なシャノアールのページにアルゴリズムの簡単な解説がありました

麻雀::電脳猫型ロボドラえもんβ

ガーン!まだ自動打ちソフトありました.
しかも強いらしい.R1500なんだと.けど説明を読んだ限りは100%自動ではなくて,大まかな判断(降りか攻めるか,染めるか棒聴か,みたいなの)は人間がやるのかな?
ていうか,試せよ>自分.

麻雀::ドラえもんの麻雀教室

本日3つ目の麻雀ネタ.
これで麻雀を覚えるのは超非効率的ですが,読み物としては面白いです.

*2003.10.08

麻雀::コピペ

ネタに困ってきた.麻雀はともかく研究をせねば,とか思いつつ今日の特別講義中もモデル化について考えてしまった.づがん.

麻雀業界日報さんでここの自動打ちが紹介されました.
>東風荘やらない人間としては見ているだけで楽しかった.
これからもエンターテイメント性を追求していきたいと思います.

ヤバイ。桜井ヤバイ。マジでヤバイよ、マジヤバイ。
桜井ヤバイ。
まず無敗。もう無敗なんてもんじゃない。超無敗。
無敗とかいっても
「裏の世界で20年間」
とか、もう、そういうレベル。
何しろ雀鬼。スゲェ!もう人間とかじゃ無いの。生物学とか進化論とかを超越してる。雀鬼だし超無敗。
しかも自称してるらしい。ヤバイよ、自称だよ。
だって普通は通り名とか自称しないじゃん。だって「雀鬼でお馴染み桜井です」とか自己紹介されても困るじゃん。だって自分の娘とかも困るじゃん。親の職業聞かれて「雀鬼です」とか答えるの泣くっしょ。
だから阿佐田哲也は「雀聖」とか自称しない。話のわかるヤツだ。
けど桜井はヤバイ。そんなの気にしない。自称しまくり。一般マスメディアに「雀鬼」で紹介されても喜んでるぐらい。ヤバすぎ。
無敗っていったけど、もしかしたら嘘かもしんない。でも嘘ってことにすると
「じゃあ桜井に勝ったって奴が出てこないのなんでよ?」
って事になるし、それは本人にしかわからない。ヤバイ。本人にしかわからないなんて怪しすぎる。
あと超速い。1打2秒以内。半荘で言うと30分以内。ヤバイ。速すぎ。タバコ吸う間もなく終わる。すごい。
それに超厳しい。第1打字牌切り禁止。テンパイまでドラ切り禁止。審判とか平気で出てくる。審判て。競技麻雀でもいらねぇよ、最近。
なんつっても桜井は麻雀が凄い。流れとか平気だし。
うちらなんて何切るとかたかだか牌効率が出てきただけで上手く扱えないから状況を設定したり、読者参加型企画にしてみたり、右手に近いほうから切ったりするのに、桜井は全然平気。流れを自在に操ってる。凄い。ヤバイ。
とにかく貴様ら、桜井のヤバさをもっと知るべきだと思います。
そんなヤバい桜井に楯突いた井出洋介とか超偉い。もっとがんばれ。超がんばれ。

*2003.10.07

麻雀::電脳代打『ろぼっち』

ショッキングな事に既に東風荘の代打ちソフトがありました!
しかも牌譜付き.やられた.

麻雀::見えている牌から他家の不要牌を予測

つまり,3sが4枚見えていたら全体的に1s2sは出易いだろうな,ということを計算したいのです.
これはもう前のversionでもやってたんだけど,今見たらかなりいい加減だったので修正してmathematicaで検証してみることにした.
といっても1-9の9種類の数牌に対してのみの検証.理論を確かめるならこれだけでも十分だと思うので.

In[]:= rest = {3, 3, 3, 3, 3, 3, 3, 3, 3}; ←1-9の残り枚数 この場合は各1枚ずつ見えている

Clear[a, b, c, i, j, k, e];
a = b = c = Table[0, {i, 1, 9}, {j, 1, 5}];
e = Table[If[rest[[i]] \[Equal] j - 1, 1, 0], {i, 1, 9}, {j, 1, 5}] // N;
janto = 1; ←作る雀頭の数
mentsu = 6; ←作る面子の数

(*雀頭を取り除く*)
For[k = 0, k < janto, k++,
t = 0;
For[i = 1, i \[LessEqual] 9, i++,
a[[i, 3]] = e[[i, 3]];
a[[i, 4]] = e[[i, 4]]*3;
a[[i, 5]] = e[[i, 5]]*6;
];
t = Tr[Flatten[a]];
For[i = 1, i \[LessEqual] 9, i++,
e[[i, 1]] += a[[i, 3]]/t;
e[[i, 2]] += a[[i, 4]]/t;
e[[i, 3]] -= a[[i, 3]]/t + a[[i, 5]]/t;
e[[i, 4]] -= a[[i, 4]]/t;
e[[i, 5]] -= a[[i, 5]]/t;
];
];

(*補助関数*)
n[x_] := x[[2]]*1 + x[[3]]*2 + x[[4]]*3 + x[[5]]*4;
dec[e_, d_] := Module[{t, h},
t = n[e]; h = e; If[d > 0,
h[[1]] += d*1*e[[2]]/t;
h[[2]] += d*2*e[[3]]/t - d*1*e[[2]]/t;
h[[3]] += d*3*e[[4]]/t - d*2*e[[3]]/t;
h[[4]] += d*4*e[[5]]/t - d*3*e[[4]]/t;
h[[5]] += - d*4*e[[5]]/t;
];
h];
dec3[e_, d_] := Module[{i, t, h},
t = e[[4]]*3 + e[[5]]*4; h = e; If[d > 0,
h[[1]] += d*3*e[[4]]/t;
h[[2]] += d*4*e[[5]]/t;
h[[4]] += -d*3*e[[4]]/t;
h[[5]] += -d*4*e[[5]]/t;
];
h];

(*面子を取り除く*)
a = b = Table[0, {i, 1, 9}, {j, 1, 5}];
For[k = 0, k < mentsu, k++,
t = 0;
For[i = 1, i \[LessEqual] 7, i++,
a[[i, 1]] = n[e[[i]]]*n[e[[i + 1]]]*n[e[[i + 2]]];
If[a[[i, 1]] > 0, t += a[[i, 1]]];
];
For[i = 1, i \[LessEqual] 9, i++,
b[[i, 4]] = 6*(e[[i, 4]]^3) + 24*(e[[i, 5]]^3);
If[b[[i, 4]] > 0, t += b[[i, 4]]];
];
If[t \[Equal] 0, Print[k + 1]; Break[]];
For[i = 1, i \[LessEqual] 7, i++,
e[[i]] = dec[e[[i]], a[[i, 1]]/t];
e[[i + 1]] = dec[e[[i + 1]], a[[i, 1]]/t];
e[[i + 2]] = dec[e[[i + 2]], a[[i, 1]]/t];
];
For[i = 1, i \[LessEqual] 9, i++,
e[[i]] = dec3[e[[i]], (b[[i, 4]])/t];
];
];

ListPlot[e2, PlotJoined \[Rule] True, PlotRange \[Rule] {{1, 9}, {0, 3}}]
Out[]=

なげー.
アルゴリズムは各牌の残っている枚数を基に,どれが面子として使われてそうか確率を出して,その分枚数を減らしていくという感じ.
9種類の牌に対して0,1,2,3,4枚残っている可能性を別々に管理してるんでちょっと冗長.けど単に残っている枚数の期待値だけで管理していくと特定の状況の時正しく計算できないので仕方ない.

で,この例だと1=9>2=8>>>5>4=6>3=7の順で不要度が高い,つまりこぼれる可能性が高いと出た.ひいいさんの統計分析と違う結果ですが,これは1回1回自摸るのではなく,ざくっと3*9枚の牌を与えて適当に面子を作るシミュレートに近いので仕方ないかも.実際だと序盤に端牌が切れていくので,それを考慮すると似た様な結果になるのではないかと.
456より37が重要というのは奇妙な感じがするけど,1289という端牌を使って順子を作ろうと思うと必ず37が必要になるので,こうなるのが正しい気がする.実際37は要の牌とか言われるし(?),麻雀放浪記かショーイチでも故意に対子場にするために37を固めて置くとかあった気がするし,やっぱ37が重要なんでしょう.46を握り潰すより37を握り潰した方が圧倒的に順子は作りにくくなるしね(前者では123,789の2通りの順子が作れるけど,後者は456しか作れない).
(どうでもいいけど,「二五八は鳴くな,三六四七を鳴け」という格言があるらしい.二五八は終盤出易い筋で三六四七は出にくい筋なんだそうな.出典は自己中心派なんでアテになりませんが)

ついでに壁のある場合を試してみよう.
In[]:= rest = {2, 3, 0, 4, 4, 4, 4, 3, 2}; ←3が全て切れた状態

Out[]=

12がかなりの確率でこぼれる事が分かる.また,4は4枚生きているけど,2.5枚しか使い切れなくて1.5枚程こぼれると出る.よさげじゃないかい?

ただまだバグがあったりする.作る面子の数をぎりぎりまで多くしたりすると枚数の期待値が微妙にマイナスになることがあるのだ.てことでどっか間違ってるのは確かなのだけど,どこがダメなのか全然わかりません.

*2003.10.05

麻雀::最終順位の期待値

麻雀ですけど,例えば
1m2m2m3m3m 1p2p3p 1s2s3s 9s9s
という状態(待ちは全て生きているものとする)の期待値を求める時はどうしたらよいか?
単純に
純全帯三色一盃口平和(12000) x P(1mで和了る確率) +
平和(1000) x P(4mで和了る確率)
じゃまずいわけですよね.これが期待値をそのまま足したらいけないみたいな理由.
正しくは1m,4mどっちでもあがってしまう場合と1m or 4mのみあがる場合を考えて,高い方を期待値としなければならない.で,例えば1m,4m両方あがる場合は
12000 * P(1m)*(1-P(4m)) + 1000 * P(4m)*(1-P(1m)) +
12000 * P(1m)*P(4m) * P(1m)/(P(1m)+P(4m)) + 1000 * P(1m)*P(4m) * P(4m)/(P(1m)+P(4m))
としなければマズい気がする(ちょっと怪しいけど最初よりは遥かにマシだろう).
同じような事があらゆる場面で利いて来るので,この前上げた自動打ちはかなり出鱈目な計算をしている事になる.

あと局単位の収支ではなく,最終順位の期待値を最大にする方法ですが,
(最終順位の期待値ベクトル) = f( 現在の点数ベクトル,残り局数,残っている親番の数 )
(ベクトルなのは4人分だから)
みたいな関数を考えて,得点を打牌の期待値として利用するのではなく,得点を得た後の点数状況をこの関数に突っ込んだものを利用するようにすればよい.けど,オーラス以外は正確に計算する事など無理なので(すくなくとも僕は考え付かない),適当にそれっぽい値が出る関数を作らねばならない.
まあ,こういう確率ってのは正規分布ぽくなるのが世の必然なので,適当にmathematicaで検討してみた.
In[1]:=

mP = {37000, 30000, 20000, 18000}; ←これが与える点数ベクトル
Table[
Clear[i, l, k, f, x, a];
updown[x_, p_] := If[p \[Equal] x, 0, If[x < p, 1, -1]];
f[x_] :=
Integrate[(1/ Sqrt[2 Pi])Exp[-(1/2)(z^2)], {z, Abs[x]/8000, Infinity}];

k = Table[{0, updown[i, p]}, {i, 1, 4}];
k = Distribute[
f[k[[1]], k[[2]], k[[3]], k[[4]]],
List
] /. {f \[Rule] Plus};

a = f[mP - {1, 1, 1, 1}*mP[[p]]] // N;
a[[p]] = 1;
a /= a /. {List \[Rule] Plus};
b = Distribute[f[{1, a[[1]]}, {1, a[[2]]}, {1, a[[3]]}, {1, a[[4]]}],
List] /. {f \[Rule] Times};
p - b.k,
{p, 1, 4}
]

Out[2]={1.22649, 1.99713, 3.27459, 3.46059} ←これが最終順位期待値ベクトル

分散の部分(これだと8000)を残り局数の関数にしてやればいけそう?問題点はこの関数が重すぎる点か.けど処理速度は気合で近似関数作ればいいだけの話なので問題なし.てことで「目指せ爆岡」を合言葉に牛の歩みの如く開発というか思考だけは続けて行きたいと思います.

*2003.09.30

麻雀::自動打ちのアルゴリズム(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は自摸の回数) となるわけです(中高生レベルですが誰か検算よろしく).かなり計算めんどいし,高め安めがあるとさらに期待値計算は辛い.あと待ちがどれくらい山に残っているか推測するのもデジタルにやってては人間じゃ無理な気がする(<見えてる牌から他家の面子に組み込まれている期待値を計算するってこと).
てことでやっぱ正しいイメージと感覚で打つのが人間にとって最善であり,桜井章一は最強なんじゃないかと思いました.っていうかここまで来てそのオチは酷いな,流石に...(雀鬼の見すぎ)

*2003.09.28

麻雀::日本健康麻雀協会

「賭けない飲まない吸わない」だそうです.
適度な量の酒は健康にいいのに.残念です.

*2003.09.18

麻雀::対戦麻雀の思考アルゴリズムの研究

名古屋文理大学だそうです.うーーん,アルゴリズムというか,麻雀の(数学的)モデル化が必要だと思うんですよね.

麻雀ていうのは1枚自摸って14枚のうちからどれを切るか選択するかという非常に単純なゲーム.一見すると毎回14回の選択を行うだけなので,将棋や碁と比べて簡単なアルゴリズムで済むのではないかと思われる.けど実際は,自摸が34種類の牌のうちどれが来るかが不定,3人居る相手の手の内も不定(これはある程度は推測可能だけど),という理由によって完全なモデル化は非常に難しい.いきなり「半荘でできるだけ多くの点棒を集める」という最終目的を目標にモデル化を進めると(考える方の頭が)破綻するので,例えば「点数を考えない最速聴牌」のモデル化→「得点期待値を最大にする」モデル化→「得失点期待値を最大にする」モデル化→「オカやウマを含めた最終得点を最大にする」モデル化,のような感じで段階を追って理論を構築していくと良いように思える.

んで,試しに最速聴牌のモデル化というか理論を考えてみたんだけど,これが意外にムズイ!麻雀解析さんの
www.comjong.com/old/bouten/ippan.htm
で,ある意味人間の棒聴打ち筋は真似できてるみたいですが,これだとそれ以上の発展が難しい気がする.人間のコピーアルゴリズムだと人間を越えるのは難しいのではないか.やはり数学的にモデル化して正確に期待値から計算していかないと納得いかない.
一番簡単なモデル化は全ての自摸と切り出しの可能性を全て探索して,全ての最終形/聴牌(和了)形を評価するって事だけど余りにも無理がある.ので,適当な枝刈りが必要になり,その為の評価関数が必要になる.・・・なんか普通だ.ていうか結局麻雀解析さんとあまり変わらない気がしてきた.うがー.
次回に続く.

参考:とつげき東北システマティック麻雀研究所 麻雀解析

*2003.09.16

麻雀::あなたは麻雀でいうとどの役?

mtmとかmitsumanとか試したけど1役のしか出てこなくて凹む.

*2003.01.23

麻雀::バイマンキン弟子育成日記

分かりやすいです.
こういう解説が見たかった.

*2003.01.19

麻雀::プロの手筋大研究

やっぱプロの打ち方は僕と全然違うみたいだ.理解できない打牌が多い.

禁・東風荘とかいってたけど,一試合だけワイ卓でぶってしまいました.
追っかけ立直平和純全帯三色一発自摸ウラ3の数え役満に一飜足らず(かな?)の三倍満貫を和了れて面白かった.というよりこんなところで運を使ってしまってはいけない気がした.
(from 東風狂の館(仮))

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+