« 2008年1月 | トップページ | 2008年3月 »

2008/02/24

デュプリケート麻雀実現の問題点

麻雀はやたら運に左右されるため実力を比較するためにはどうしても大量にゲームを行う必要があります。この問題を解決するために、ブリッジの大会などでつかわれている同一の手札で競技することで運の要素を軽減するデュプリケートルールを麻雀に採用できないか?という考えを持つ人は多いようです。

私もまったり麻雀にデュプリケート機能を実装することにより少ない試合数で実力を比較することができないだろうか考えたことがあります。

思うに、問題は3つあります。

1)鳴きによるツモのずれをどうするか
デュプリケートが良く採用されるブリッジの場合、運に左右される箇所は麻雀でいうところの配牌のみでツモがないのですが、麻雀にはツモがあるという問題があります。ツモは鳴きによって簡単にずれてしまいます。厳密にデータとったわけではありませんが、感覚的に、配牌による運不運より、ツモによる運不運のほうが成績に与える影響が大きいように思えます。

そのため、単に、乱数のシードだけ指定可能にすればデュプリケートを麻雀で実現したとは言えないと思います。さらに、何らかの工夫が必要でしょう。

例えば、対策として、ツモがずれないようにルールを変更すると言う手はあります。
つまり、通常の麻雀のようにツモ山の開門位置から全員が時計回りに取るのではなくて、皆自分の前に積まれている山からツモをとるような感じにするということです。
このことで、ツモが鳴きによってずれが生じないようにすることはできるかと思います。


2)連荘による局のずれをどうするか
1)の問題はツモの方法を変えることで解決するとしても問題になるのが、この連荘の扱いです。

「なまじ親で連荘したばっかりに、次の1本場で倍満ツモられて親かぶり食らった。」などのケースをどのように扱うのか。ツモのように連荘しても少なくとも0本場のときの配牌とツモは固定とするように扱うのか等考えなければいけない問題があります。

対策として、ゲーム開始の段階で東1局から南4局までの0本場から10本場までの配牌とツモを固定してしまうのが良いのかなと考えています。

3)成績の評価をどうするか
さらに問題なのが、デュプリケートを実装したとしてどのように成績を比較するか?です。
皆が同一条件の乱数値で打った成績を比較するようなネットのサイトを設けるのがベストかと思うのですが、この手のサイトを作るとどうしてもズルをする人や、他者がズルをしてると勘違いして、処罰を管理人に求める人などが現れるでしょう。このようなサイトを開設すると、ネット上のケンカの仲裁役をやるハメになりそうで考えただけでうんざりします。
もうひとつ、そもそも根本的な問題として、デュプリケートを実装してネットの成績比較サイトを立ち上げたとして、本当に人が集まるだろうかという問題もあります。
私が最近ブログで投票アンケートをとっているのも実はどの程度人が集まりそうかを計測してみたい思いがありました。見てのとおりでして1クリックするだけのアンケートですが、100人程度しか集まりません。
まして、まったり麻雀で、ある程度(100試合以上?)打って成績を他者と比較してみたい人なんて本当に集まるのか疑問です。

対策としてはCOMと比較してみるという手が考えられるとは思います。
最初にプレイヤーが打った後、COMが同一条件で打ってみて成績を比較してみるという手はありそうです。ただこれを実装したとしてもCOMより強いかどうか程度しか結局判別できないのであまり意味が無いかもしれません。

* * *
単に乱数値のシードを指定してゲームを開始するだけだと単なる「たら・れば」機能にしかならないのではないかと思います。

これら3つの問題にもっと良い解決策があるのならデュプリケート麻雀は実装してみたい機能ではあります。何か良い案があればぜひ教えてください。

ごちゃごちゃ言ってないで、まずは簡単に実現できる単に乱数シード指定だけやってみて、その上でさらに改良案を提示してもらうという手もありかもしれませんか……


| | コメント (9) | トラックバック (0)

2008/02/19

あなたは何%麻雀のことを分かっていますか?

いまさらですが、ハチワンダイバーを読みました。面白いです。

絵が自分の好みでは無いのと、題名だけ聞いて将棋の話だとは思えなかった(海にもぐるダイビングの話だと思った)のでいままでスルーしていたのが悔やまれました。

アマゾンの書評にもあるとおりで、短くて特徴的なセリフと過剰とも思える演出で動きの少ない将棋の話をうまく漫画化してると感じます。

麻雀劇画が好みの人なら割と性に合うのではないかと思います。

将棋に詳しくなくても十分、この漫画を楽しめるのですが、将棋を知っていると、(っていうか、将棋そのものよりも、プロ棋士のエピソードを知っていると)結構面白いです。

たとえば、題名にあるハチワンダイバーとは、将棋の盤面(9x9=81)に没頭してダイブするような感覚のことですが、これは羽生2冠も同様のことを言っています。
(羽生氏はインタビューなどで、集中したときは、水の中にもぐっている感覚に近い。そのときは、時間の概念が無くなるといっています。)


また、主人公対漫画家戦で、


主人公「あなたは将棋のことを何%理解していますか?」
中略
漫画家「5%くらいかな、残り95%は未知だ」
主人公「強いこのひと」

という会話があります。これに似た会話も実際あったそうです。

田中寅彦九段が書いたエッセイに、囲碁棋士と将棋棋士が同様の会話をしたエピソードがのっています。
そのとき、将棋棋士は8%、囲碁棋士は5%と答えたそうです。(今手元に本が無いので確認できません。もしかすると数字が少し違うかもしれません。)
囲碁棋士の答えを聞いた将棋棋士は自分の思い上がった考えが恥ずかしくなったそうです。

さて、雀士に同じ質問をしたらなんて答えるでしょう?あなたは何%麻雀のことを分かっていますか?

| | コメント (6) | トラックバック (0)

2008/02/18

根本が間違ってるのかも

まほ公さんから、高い手ねらいすぎるといわれて原因を考えている。

最初は単にリーチ和了のとき、ツモ和了の割合が多いから点数が高くなるだけと思っていた。これも確かに原因のひとつではある。その証拠に私自身が打ち方を東風荘と変えずにまったり麻雀で打っても、東風荘よりまったり麻雀のほうが平均和了点数が高くなる。

けれど、それだけではなくて、そもそも一人麻雀レベルで根本部分が間違ってるような気がしてきた。

高めで待ちが狭いテンパイと安めで待ちが広いテンパイのどちらが良いかは残り順目の多さによって変わってくる。
ところが、2向聴や1向聴からテンパイ形を先読みするとどちらのテンパイ形にとるかを到達順目ごとに変えなければいけないはずが、そうなっていないため。むやみに狭い高めにとっているのかもしれない。


しかし、やっぱり図にして考えるといろいろ分かってくる。一度大幅にプログラムを修正する必要があるな。

| | コメント (0) | トラックバック (0)

2008/02/17

ゲームの木と、鳴きへの変化を考慮した評価関数

まほ公さんの指摘のとおりで、現行のメインで利用している期待値型評価関数は評価点を算出するときに、鳴きへの移行を考慮していない。これを修正する方法については、実はすでに、プランがあることはあります。
どういう風な仕組みなのか、ゲームの木で将棋の場合も交えて紹介します。


将棋の場合
まず、将棋のような決定完全情報2人零和交互ゲームの場合のゲームの木ですが、以下の図のようになります。
Gt_shogi
ゲームAIの初歩の初歩、いわゆるMin-Max法ってやつです。
これだと、後手番は評価値が一番低い値、先手番は評価値が一番高い値をバックトラックで選択していくわけで、
選択したけっか、現在の局面の評価値を算出するためのノードのパスは終端まで1つのパスでつながり枝分かれがなくなりますし、局面の評価値は終端ノードの評価がそのまま使えることになります。

これだと、αβ法などのよく知られている方法で枝狩りがしやすいのですし、局面評価値も割りと雑でもなんとかなるのです。


麻雀の場合
ところが、不確定要素の入る麻雀の場合そういった手はつかえません。
以下は一人麻雀の評価値を出すためのゲームの木です。
Gt_nakinasi
Min-Max法ではなく、Max-Prob法(そんな呼び名無いと思いますが、今私が勝手に命名した)になるわけです。

つまり、「打牌」については最大値を選択することなるけれど、「ツモ」については、イメージてきには、Σ(各ノードの評価値x実現確率)になるわけです。(あくまでイメージです。実際は順目の概念が加わるのでもっと複雑です。)ですので、現在の局面から終端ノードまでは1つのパスにはならず枝分かれが生じることになり、枝狩りがやりにくいのです。さらに、現在の局面の評価値は終端ノードの評価値とはことなることになります。さらに終端ノード以外は評価値に掛け算が加わるので厄介なのです、たとえば精度90%の読みでも、4回程度、先読みするとほぼ、当てずっぽうになってしまうのと同じなのでどうしても精度が低くなります。

以前「うしうし掲示版」で最適制御理論と機械学習の手法で麻雀の局面評価関数を作成する論文について、疑問を提示したとき、評価値は、先読みするとき確率と親和性のある値でないとまずい。という意図の記述をしたのは、麻雀はこういったゲームの木になるためです。


まったり麻雀の4人ゲームも実は基本はこれの一人麻雀のゲームの木をベースにしています。4人ゲーム化の補正をするために、評価値x実現確率の部分に、牌譜からとった情報を元に、補正値を入れています。
つまりこんな感じの計算になります。Σ(評価値x実現確率+他家和了時評価点x他家和了確率)

ただ、この4人化のための補正が現在かなり大雑把なために、新アルゴリズムが四人ゲームにしたときに弱くなってしまってます。


さらに、まほ公さんから指摘のあったとおりで、これには、鳴きの考慮が入っていない。
現在は、評価値はツモ前提の評価で、鳴ける牌は別のアルゴリズムを使って、鳴いた牌が出たときに、評価をしているのが現状です。

麻雀に強い人ならば、ご存知のように、ポンチーするパイというのは、鳴いた牌が場に出てから考えているのでは遅いのです。もたもたしている間に次の人につもられてしまうし、ネットだと鳴きラグでばれてしまう。
打牌する前に鳴くことも考慮して打牌を決定するわけです。

まったり麻雀は鳴く牌が出てから考えているため、鳴きラグでCOMが鳴くかどうか迷ってる(?)とばれてしまわないように、鳴き判断の処理速度は極端に気をつかってプログラムをしています。そのため、結果的にあまり深く考えずに鳴いているというのが現状です。


鳴きの考慮は結構難しいので後回しにしていましたが、まったく考えていなかったわけではないのです。プランとしてはだいぶまえから暖めていて、いろいろな作業と絡めなければいけないのでブログで紹介していなかっただけ。先にプランだけ紹介すると、自分が作業する前にほかの人に作られちゃうから、隠したいという気持ちがあったのです。

鳴き考慮の場合

要するに意思を持って変化する局面と確率で変化する局面が交互にくるのが、麻雀の特徴。これでも厄介なのですが、何とかゲームの木にすることが、できますし、実際プログラムとしてまったり麻雀のメインアルゴリズムにつかっています。鳴きが入るとさらに厄介です。鳴き判断は、確率による推移と意思による推移が同時にやってきます。しかし、鳴きのイベントを意思による局面変化と確率による局面変化にわけて、ゲームの木にすることは可能です。

どういったゲームの木になるかというと、以下のようになります。

Gt_nakiari

このようにノードを分ければ、鳴き考慮を打牌の前に判断しておく評価関数が作成可能です。


(麻雀の他家挙動を含めたすべての事象をこのようなゲームの木で確率によって局面が推移するノードと意思によって局面が推移するノードにわけてゲームの木にすることが、麻雀の理想のアルゴリズム実現になるのではないかと思っています。)

* * * * *

ただし、実際これをゲームに組み込んで遊べる形で、実現するためには、どの程度の確率で鳴けるのかとか、手牌が短いときの放銃の確率だとかいろいろデータを取る必要があり、すっごく作業が面倒です。
そういった泥臭い部分を除いても、順目の概念と評価値を組み合わせるのも複雑になり、手順前後による同一局面を枝狩りすることも困難にあります。さらに、一向聴手替なしでさえ、6手先までの深さを読まなければいけないので速度の問題もまた出来る可能性はあります。
* * * * *
実は、前回の手替わり考慮版評価関数はあくまで「布石」にすぎません。それほど落胆しているわけでも、失敗したわけでもありません。ここで紹介した鳴きありの探索や、点数状況判断の考慮のためのベースアルゴリズムとして活用可能なので原理が確立でき、処理速度のめどが立てばそれでOKなのです。

可能であれば、点数状況判断や手替わりの判断の修正をいれるまえに、新アルゴリズムをメイン評価関数にすえて一度、ージョンアップして公開したかったのですが、それができなかったというだけです。布石として着手したことが根本的に失敗だったとは思っていません。

| | コメント (4) | トラックバック (0)

2008/02/14

被先制リーチ時収支

唐突だけど、私自身の押し引きの判断の巧拙が気になったので、
自分がリーチしていないときに他者が先にリーチした局の平均収支を東風荘のログをベースに集計してみた。
また、牌譜を提供してくれた第二超ランの一流雀士方々の分も集計。
ハンドル名さらしていいかわからないので仮名で。

M氏 -765(-93)
T氏 -748(-84)
K氏 -854(-113)
私 -911(-108)
(括弧内は流局時収支分)

この3名は私なんかよりはずっと格が上ですから当然だけど、やっぱ私がビリですな。

明日は、まったり麻雀の分も集計してみる予定。
どうも、現行のまったり麻雀の押し引きは守備側に傾いている気がする。
人間がリーチを掛けたとき3人とも降りて不聴罰科で+3000点ってことが多すぎる。
たぶん、あまり良い数字が出ないのではないかと予想している。

| | コメント (5) | トラックバック (0)

2008/02/13

いったん凍結

主力のアルゴリズムに使うためには、まだ練りこみが足りないので、次期バージョンの主力アルゴリズムには採用できないだろう。新アルゴリズムはいったん凍結する。

ただ、完全に没にする気は無い。今後復活させることも十分ありえる。
たとえば、大差をつけられた4位の場合などには今のままでも使えるだろし、また、評価値に補正値を掛ければ使えるようにはできると思う。
けれど、安易に補正値を入れるのは美しくないし、点数状況判断が必要なケースで使うにはほかに修正しなければいけない箇所が多数あるのですぐにはできない。

一人麻雀で有効でも四人麻雀でも有効とは限らないというケースが実際に見つかっただけでもやった価値はあった。
とりあえず、そう思うことにする。

| | コメント (2) | トラックバック (0)

2008/02/11

めちゃくちゃ面倒なことに……

旧アルゴリズムのような単刀直入タイプの打ち方の場合、他家挙動の読みが多少外れていてもたいした影響はないのだけれど、新アルゴリズムのように割と曲線的な打ち方をするとなると相当精密に他家挙動が読めてないとまずいことになるようだ。
確かにいまの期待値計算は相当雑に他家の挙動を扱っているので、そこを修正する必要がある。

まったり麻雀のアルゴリズムでは、期待値をdoubleやintのようなスカラー値の変数ではなくて、オブジェクトで扱っている。そうすることで、他家の挙動の変化や南場の点数状況判断などに対応できるように意図している。

新アルゴリズムを活用するためには、この期待値クラスを修正して精度を上げる必要あるようだけれど、ここは結構複雑な計算をしている。さらに、ちょっとしたずれで押し引き判断に影響してゲームの印象ががらりと変わる微妙な部分。

これをいじるとなると相当に面倒なことになる。しかも、成功する可能性は低い。
やるしかないか……つらいな。

| | コメント (2) | トラックバック (0)

2008/02/10

がっくし

うまくいかないもんだな。なんか疲れてきた。

| | コメント (0) | トラックバック (0)

2008/02/09

新旧対戦結果

対戦結果のできすぎ君データ。
新アルゴリズム1人目

先制リーチの差が効いているのか、同じアルゴリズムなのに放銃率にまで差がつく。
そして、和了素点に意外と差がつかない。結局遠回りして高い手を狙おうとしても上がれないってことかな。


New1
New12

新アルゴリズム2人目
New21_2

New22


旧アルゴリズム
1人目
Old11_2

Old12

旧アルゴリズム
2人目
Old21

Old22


| | コメント (0) | トラックバック (0)

2008/02/07

旧アルゴリズムの方が強い

まだ、もう少しデータとるつもりだけど、どうも4人麻雀では旧アルゴリズムの方が強そうだ。

今度はじっくり見直したけど、単純なバグだとは思えない。
おそらく他家挙動の見積もりが甘いのだろう。(これは思い当たる節がある。)


とりあえず、今の段階でいえるのは、一向聴でカンチャン+対子の複合形を崩し、浮き牌を残してことで、両面リーチを目指す打ち方は止めたほうがいいということ。安定Rにして50前後マイナスになりそう。

もうすこし、データを取った後、今度は、3人をツモギリ状態にした4人麻雀で局収支の違いを新旧のアルゴリズムで比較してみる予定。


| | コメント (2) | トラックバック (0)

2008/02/04

新旧アルゴリズム2vs2

バグを修正し、新旧のアルゴリズムで再度4人麻雀で対戦させている。1300試合くらいで、今のところ、新アルゴリムのほうが勝ってる。ただし、まだ収束してる感じではないのでもう少しデータを取る。

| | コメント (2) | トラックバック (0)

2008/02/02

バグ見つけた

新アルゴリズムの挙動不審の原因発見。
先読みのとき鬼のように多牌してた。なぜこんなにメモリ食うんだろうとおもってけど、
そりゃスゲー多牌してりゃ遅いよなあ。
修正して、旧アルゴリズムと同一配牌、同一ツモで、1万回比較した。

数値はすべて、旧アルゴリズムとの差分。
新アルゴリズムA(向聴数戻しなし)
平均和了点数+26.19
和了率-0.12%

新アルゴリズムB(向聴数戻しあり)
平均和了点数+62.88
和了率-0.32%

ここまで、違えばまずまずだろう。これで、4人麻雀化してみるよてい。


| | コメント (2) | トラックバック (1)

« 2008年1月 | トップページ | 2008年3月 »