« 2008年2月 | トップページ | 2008年4月 »

2008/03/30

地味に作業中

デュプリケート機能の実装中。
とりあえず、seed指定、連荘無しモード、ツモずれ抑止のツモ山機能まで作った。

後作らなければいけないのは、人間が打った後COMが打つ部分。まあ、これは簡単。

問題は、人間とCOMの成績比較をどのように表示するかだけど、まずはあまり凝った物にしないて、単純に、リストビューで局ごとの収支を並べて表示する予定。

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

2008/03/25

過去の自分と比較する手があるな

羽生2冠が1000勝を達成したとき、将棋雑誌のインタビューに以下のような感じのやり取りがあった。

Q:「1000勝分の棋譜を覚えていますか?」
A:「さすがに全部は覚えていません。初手から完全に覚えているのは300位ですね。」
完全に覚えてるのが300もあるってもすごいと思う。それ以外もポイントとなる部分は覚えているってことでしょうし。

ただ、羽生2冠に言わせれば、将棋の棋譜ってのは歌を覚えるのに近くて、ある程度流れというものがあるので、慣れれば結構覚えやすいのだそうだ。

確かに歌なら100曲以上普通に歌える人は多いでしょう。

幸か不幸か、麻雀の場合、そこまで覚えやすくない。配牌が完全にランダムな状態から始まるし、ツモも意思とは関係ないデタラメなので流れで覚えるというわけにはいかない。

ただ、牌譜をすぐ忘れるってことも悪いことばかりではなくて、デュプリケートの場合、結構プラスに作用するのかもしれない。
デュプリケートの結果で、どうやって成績を比較するかが今後の課題のひとつなんだけれど、自分自身で1週間とか1ヶ月とか期間を開けた後にもう一度打ってみるという手がありそう。

いま実装をテストしながら自分自身で打っているけれど、私の打ち方は結構バラけるようだ。(デバッグ目的のため、かなり適当に打ってるという要因ももちろんあるけど)まだまだ、自分の中で麻雀の打ち方が固まってなくて迷っているということなんだろうと思う。

麻雀打っていてスランプに落ち込んだとき、自分自身の打ち方が狂ってしまっているのか、それとも単なる運なのか分からなくなってしまうことが私にはよくあるけれど、まったり麻雀のデュプリケート機能が自分自身の麻雀のフォームが安定しているかどうかを検証するために、使えるような気がしてきた。

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

2008/03/23

UNICODEに麻雀牌が割り当てられる予定

なにか使える麻雀素材は無いものかといろいろ検索してたら驚きの発見。
もしかするととっくに知っている人も居るかもしれませんが、なんと、UNICODE(文字コードです)に麻雀牌が割り当てられる予定があるようです。

ISO/IEC JTC1/SC2/WG2 N3147 Proposal to encode Mahjong, Domino, and Draughts symbols in the UCS(PDFファイル)

Roadmap to UNICODE

wikipedia日本語版のUNICODEページ
Mahjong_ucicode

Proposalが出たのは2006年なんですな。花牌も入るっぽいけど、赤ドラは無いみたい。

コード順が、索子->ピンズ->萬子なのはまだ許容範囲だけど、白発中が中発白の順にコードが割り当てられるのがいやな感じ。


索子=バンブー、ピンズ=サークル、萬子=キャラクターズってのは知ってましたし、白発中がそれぞれ、ホワイトドラゴン、グリーンドラゴン、レッドドラゴンなのも分かりますが、コード0x1F02Aに割り当てられるジョーカーって何だろ?


もしかすると将来的にはWindowsの標準フォントに牌画が組み込まれることになり、素材に悩まずにすむようになるのかも!?

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

2008/03/20

超々上級者のアドバイス

さいきん、私的に将棋がブーム。

ただし、いまさら将棋が大幅に上達するとも思っていないので、あまり本気で自分が強くなりたいという感じではない。
もっと、メタに構えて、棋士たちの対局とか、定跡の進化とか、棋士たちの言葉に注目している。最近気になったのが、駒がぶつかり合ったらどうすかということに関する棋士たちの言葉。

中原永世名人曰く
「駒がぶつかったら、取るのが基本で、とれないようでは作戦負け。」
佐藤2冠曰く
「同歩、同歩と取って勝てる人が一番強い」

しかし、へたくそが単純に言葉を信じて、マネすると却って弱くなる。

よほど、下手クソな相手でも、同歩と取られることを前提に先読みして良いと思っているからこそ、駒をぶつけてきているのだから、同歩ととるのは、相手のペースに乗りやすいわけです。

同歩と取って勝てるのは、戦い前の駒組みの段階で作戦勝ちしているか、読みが相手を上回っているってこと。
だからこそ、タイトルホルダークラスの超上級者は上記のような言葉になるんですな。
「同歩、同歩と取って勝てる人が一番強い」ってのは、同歩と取って勝つのは「一番強い」人クラスでないと難しいという意味で捉えるのが正解なのだろう。

超上級者レベルの言葉を初級レベルの人がそのまま信じてうわべだけマネしても却ってうまくいかないってことがあるということなんだろう。

麻雀でも同じようなことがあるのではないのかなと思う。
たとえば、鳴きを多めにしろとかリーチを多めにしろとかのアドバイスも単純にリーチ率などの数値が高ければ高いほど良いというものでもなくて、その人にあったバランスの最適値ってものがあるんじゃないのかと思うけどどうなんだろう。

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

こんな感じで

とりあえずこんな感じのダイアログでシード値指定できるようにする予定。

Dupdlg

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

2008/03/18

東風荘成績ぼろぼろ

東風荘の成績は近頃ボロボロ、最初は単なる不運だったのだろうけれど、つまらないミスの重なってここ数年で最低Rを更新中。

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

2008/03/16

まずはデュプリケートを最優先で

まずは、デュプリケートを最優先で作業することにする。そのほうが自分自身が楽になりそう。

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

2008/03/12

UCTを利用したモンテカルロ法とミスに着目したゲームの特性

コンピュータ将棋協会のブログで知ったのですが、ゲームプログラミングの学会GPW2007の話題の中心はボナンザタイプの機械学習による評価関数のデザインと、UCTらしい。

機械学習については、以前調べて、大体のどんな感じのものかおぼろげに理解したけれど、UCTってなんなのか、まったく言葉すら知らなかったのでちょっと調べてみた。

ついでにプログラムを組んでみた。


UCTって何か?

これは、モンテカルロ囲碁で最近流行の手法で、UCB1を使ってゲームの木のノードを下ってからモンテカルロシミュレーションする手法のことらしい。

UCB1ってなにか?

ぶっちゃた言い方をすると、パチンコの台選びを想像するのが理解しやすいかも。
釘が読めない前提でパチンコで台を選ぶとき、それぞれの台を試し打ちして、スタートチャッカーへの入賞率が高い台(いわゆる良く回る台)を探す。

そのとき、「そこそこ回るパチンコ台を見つけたけど、まだもっと回る台があるかもしれない。まだ試してない台を打ってみるか?」とか、「この台は異常に良く回るけどまだ試し打ちの回数が少ないので回転ムラで回ってるだけかもしれない、さっき打ったあっちの台はたくさん試し打ちしてそこそこ良く回ったのであっちのほうが本当は良い台なのかも?」とか案外迷うことがある。すべての台を十分な回数試し打ち出来れば良いけれど、そんなことしていたらけっこう金を損してしまう。UCB1ってのはそこらへんの立ち回りをゲーム理論的に数式化したものと思っていいらしい。

UCTやUCB1については以下の日本語訳してくれた論文を読むのがわかりやすそう。
http://www.geocities.jp/hideki_katoh/RR-6062-v3-jp.pdf

論文読んでみたけれど、数式の導出過程など理論的に深いところまで追求しないで、単純にアルゴリズムを使うだけなら割りと簡単っぽい感じ。

実際最強を目指して強くするためには色々工夫が必要だろうけれど、そこそこ遊べればで良いのであれば、単純に、
1)この局面から次にさせる手をリストアップする
2)ゲームの終了を認識して勝ち負けを判定する。

この2つさえ書けばあとは、あとは、定型的な処理でいろんなゲームの思考AIが出来るみたい。

ほんとにこんなお手軽な方法で強くなるのか!?と思って試しに作ってみた。

選んだゲームは私の地方では「753」って呼んでいた線消しゲーム。

紙に以下のような3本,5本,7本の線を描いて2人で交互に線を消して行き、最後に残った線を消したほうが負け。

753
こんな風に連続した線を消すのはありだけれど、


753ng
このように、消した線をまたいだり、斜めに消すのはダメというルール。

ソースコードはこちらからどうぞ。
(Cに限りなく近いC++。Visual Studio2005でコンパイルして動作確認している)
(ゲームの局面数が少ないんで考えうる局面は全部配列に持ってるし、ノードの下り方なども、もっと工夫がいると思う。)

初手の最善手を100万回の試験数で試してみた結果が以下。
753result

どうやら、このゲームは先手必勝で、初手は5本の線の端1本を消すことがベストの模様。

しかし、これ、あまり、このUCTの効用を示すのには良くなかった。
というのは、753ゲームの場合、100万回のシミュレートってのは結局のところ、全数探索をしてしまっていてることになっているから。

これが、全数探索するまでには至らない0万回程度のシミュレート結果だと、どの選択でもほぼ5割に近い数字になってしまって差がつかなかった。

どうしてこうなってしまうのか、ちょっと考えてみた。

* * * * *

これは、753というゲームの特性がUCTに向いていないために起きてしまうのだろう。
ここでいうゲームの特性とは、ミスと勝敗の関係についてのこと。
ゲームにはミスが付き物で、ミスが勝敗を分ける要因になるのだけど、実はこれには3つのタイプがあると私は思う。

タイプA)ミスした回数が多いほうが負けるゲーム
ゲーム中に着実にポイントを稼いでいったほうが勝つタイプのゲーム。
例:囲碁、はさみ将棋、タクティカルウォーゲーム

タイプB)最初にミスしたほうが負けるゲーム
タイプB-1)
最初にリードしたほうが小さなミスをしても逆転されにくいタイプ
タイプB-2)
最初に築いたアドバンテージにより、その後お互いが無難に
行動していてもドンドン差がついていってしまうタイプ
例: 競艇などのレース(B-1)、ポーカーの大会(B-2)、格差社会

タイプC)最後にミスしたほうが負けるゲーム
いくら途中まで有利に局面を進めていても一度の小さなミスで形勢が逆転してしまうタイプ。
例:753ゲーム、石取りゲーム、将棋(プロレベル)


もちろん、完全に3つに区別できるわけではない。
はさみ将棋などはタイプBの要素もあるし、素人レベルの将棋は、ABCのどれにも当てはまる。
マージャンは基本的にはタイプAだけれど、タイプBの要素も含んでいる。
ただ、753は典型的なタイプC。

そして、UCTは以下のように、ゲームの木を途中まではまじめに下っていくが、そこから先はモンテカルロでシミュレートする。(図は先ほど紹介した論文から引用)
Ucttree

だから、途中で築いた形勢有利な局面が、モンテカルロのランダムさで無意味になってしまうので、タイプCのゲームとはすこぶる相性が悪いということなのだろう。

ほかにもUCT+モンテカルロとの相性に関連するゲームの特性があると思う。

合うタイプは以下のようなタイプではないかな。

1) ランダムに打っていても一定の手数でゲームの決着が付くタイプ
○囲碁、オセロ ×将棋、マージャン

2) 途中の局面での静的な評価関数を作るのが困難なタイプ
○囲碁、△マージャン、オセロ、将棋

3) (仮に前方枝狩りをしたとしても)着手数が多くて探索が困難なタイプ
○囲碁 △将棋 ×マージャン、オセロ

こう見てみると、囲碁は実に相性が良い感じがするけれど、将棋は相性が悪いのではないかと思う。
マージャンの場合は、前方枝狩りを入れれば使えないことは無いけれど、枝狩り前提ならそもそも着手数が少ないのと、マージャンでは、許される思考時間が短いため、どちらかといえば相性が悪い部類になるだろうと思う。


追記:
似て非なる将棋と囲碁のゲームの特性の違いについては、毎日コミュニケーションの週間将棋のコラムが結構面白いです。おすすめ。

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

2008/03/01

買った本

最近、というか大分前からだけれど、異常に本を買う癖がついてしまった。
読むスピードが追いつかないんでやめなきゃいけないと思いつつやめられずにいる。サイドの表示スペースにおいてあるのはほんの一部実際はもっと買ってる。
サイドバーだと数がたまると消えちゃうのもなんかもったいなく感じるし、なんか記録に残したいの時々ブログ記事に書いておくことにする。(これでもまだ全部ではないけど)



ニューラルネットの応用事例多し、ニューラルネットの原理を学ぶには「学習とニューラルネットワーク 」のほうがいろいろな面でよかった。


★★★
私のレベルにはあってる。通勤時の暇つぶしには最適。
上達のコツが書いてあってよいんだけど、ヒントが強烈すぎる気がする。


★★
辞書的な使い方をするCookbook的な本。対象とするVisualStudioのバージョンが違うだけで内容がかぶるのかと思ってたけれど違った。それぞれに扱っている範囲が異なる。まったり麻雀V0.8.xはCodeGearのTurboC++で作ってるけれど、V0.9以降はVC++かC#にするかもしれない。



★★★
定番本。JavaScriptって割と雑な解説本が多いのである程度しっかりしたものを手元においておきたかった。ただ、今すぐJavaScriptで何か作る予定は無くなった。最初、牌譜再生アプリでも作ろうと思ってたけど、すでに作ってくれた人が居るので、読むの中止。


★★★★★
ド定番本。Perlやるなら持っておくべき本でしょう。「はじめての…」はオライリー本では相当に分かりやすい部類。



★★★★
微妙。取り上げている内容や本編は割りと納得がいく。けれど、サブタイトルと記事の結論が納得いかない。
モンティホールのジレンマを取り上げておくのは良いけど、それの結論が「デジタルの思考は間違えやすい」にしてしまうのはどうかと思う。もう一歩踏み込んでほしかった。私のように麻雀をプログラム的にとらえているのではなく、普通に打つのならそれほど違和感は感じないのかもしれないし。私の読む力のほうが一歩踏み込みが足りないだけかもれない。


★★★★
これ以外にも古代史本は結構大量に買ってる。その中で比較的納得しやすい内容だった。


★★
わりと使える例題が多し。ただし「使える」はサンプルプログラムがツールとしてつかえるという意味。
プログラマが参考にするには単にWEBの情報で十分。悪くないけど、値段と読む時間欠ける価値があるとは思えない。


★★★★★
大分まえに話題になった本。どうせタイトルだけのつり本だろうと思ってパスしてたけど、良書だった。
商品の値段のつけ方について、具体例を交えて解説した本。お勧め。


★★★★★
4冊目購入。結構ボロボロになるまで読んでるので。最初はむづかしくて分からなかったけど今ではほぼ全部理解できる。


★★★★★
羽生の考えを、人工知能と認知科学の観点で解説した本。人工知能はわりと知ってる内容が多くて詰まんなかったけど、認知科学については新鮮だった。麻雀のように、ほどほどの難しさの問題を短時間で回答しなければいけないゲームの場合認知科学的なアプローチで何か学習の効率を上げられるかもしれないと感じた。
超お勧め、っていうか私のような趣味の人間には必読書。


★★★
これも、認知科学的視点でゲームを捕らえた本。表紙はそれっぽくないけど、中身はやっぱりオライリー本的な文体。割と面白かったんだけど、読み終わる前にどこかに紛失してしまった。どこいったんだろう。

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

« 2008年2月 | トップページ | 2008年4月 »