1 名前:デフォルトの名無しさん [2007/01/24(水) 21:40:36 ] 将棋・リバーシに関してはスレがありますが、 麻雀に関するスレがなかったので、立ててみました。 <参考サイト> とつげき東北HP www.interq.or.jp/snake/totugeki/ まったりプログラミング日誌 kmo2.cocolog-nifty.com/prog/ あらのHP www8.plala.or.jp/ara3/ デジタル麻雀論 www.jan-x.jp/
2 名前:デフォルトの名無しさん mailto:sage [2007/01/24(水) 21:44:09 ] 断る。
3 名前:デフォルトの名無しさん mailto:sage [2007/01/24(水) 21:45:12 ] コンピュータは常に天和。まさに最強のAI。
4 名前:デフォルトの名無しさん mailto:sage [2007/01/24(水) 21:58:23 ] >>3 それだと、コンピュータに親がまわってくるまでに、 プレイヤが勝ってしまう恐れがあるのではないだろうか。
5 名前:デフォルトの名無しさん mailto:sage [2007/01/24(水) 21:59:36 ] ロンより証拠
6 名前:デフォルトの名無しさん mailto:sage [2007/01/24(水) 22:03:35 ] どいツモこいツモ他人任せにしやがって
7 名前:デフォルトの名無しさん mailto:sage [2007/01/24(水) 22:43:19 ] >>1 つ「スーパーリアル麻雀P2」
8 名前:デフォルトの名無しさん mailto:sage [2007/01/25(木) 05:23:25 ] 麻雀?くだらね
9 名前:デフォルトの名無しさん mailto:sage [2007/01/25(木) 15:20:54 ] 昔々の PC-8801 用の精彩麻雀は、コンピュータ側は最初に 上がった形を作っておいて、あとはランダムに上がるという ように作ってあったらしい。
10 名前:デフォルトの名無しさん mailto:sage [2007/01/25(木) 23:02:59 ] 定期的に立つなこのスレ
11 名前:デフォルトの名無しさん mailto:sage [2007/01/26(金) 00:08:19 ] リバーシスレの1をこっちに閉じ込めて置いてくれないか?
12 名前:デフォルトの名無しさん mailto:sage [2007/01/26(金) 07:01:42 ] >>10 今回は結構期間が空いていたな。 次に立つのは夏休み中ぐらいだろう。
13 名前:デフォルトの名無しさん mailto:sage [2007/01/27(土) 19:31:45 ] 亜樹タンの打ち方を研究してる俺が来ましたよ
14 名前:デフォルトの名無しさん mailto:sage [2007/01/28(日) 21:09:50 ] まじめなことを聞いてみるけど、 配牌も同じプログラムで行うってことかな? それとも、配牌とサイコロはランダムなり、専用プログラムでおこなって、 4種のプログラムで対戦をおこなって最強を決めるということかな?
15 名前:デフォルトの名無しさん mailto:sage [2007/01/28(日) 23:49:47 ] 配牌も手動がいいな。 元緑積みができるとか。
16 名前:デフォルトの名無しさん mailto:sage [2007/02/01(木) 19:58:52 ] コンピューターとプレイヤーの配牌方法を別にしたらいいじゃん。 コンピューターだけ揃いやすいように。
17 名前:デフォルトの名無しさん mailto:sage [2007/02/02(金) 03:43:11 ] >>14 ときどきゲームでイカサマなし!ってうたってるのがあるけど、 そーいうの同士で、大会とかないのかね? 麻雀で強いアルゴリズムというのを知りたい。
18 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 12:33:08 ] 麻雀板に似たようなスレあった気がする 俺には上がり判定すら作れそうにない。。。
19 名前:デフォルトの名無しさん [2007/03/11(日) 14:33:32 ] age
20 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 15:03:28 ] 全ツッパ、ラス確定アガリ上等のアガリマシーンなら作れそうだけど 防御的な思考や順位を考慮した思考を入れると面倒そうだ。
21 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 21:01:44 ] >>20 それでいいから、 トンプウソウとかに突撃してみてくれ。
22 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 21:31:58 ] いろんなアルゴリズムをバトルロワイヤルさせて自然淘汰の経過を見るとか面白いかもね
23 名前:デフォルトの名無しさん [2007/03/12(月) 10:29:04 ] まず いろんなアルゴリズムソースで戦わせられる土台のプログラムを作ってください
24 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 11:27:18 ] え?俺が?
25 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 12:31:44 ] >>23 東風荘でいいんじゃね?
26 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 19:43:55 ] jarファイルなりdllファイルなりを4つD&Dすれば 何回か対戦を自動で行って成績を表示なんてどうよ。
27 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 11:01:00 ] 定期的にこのスレたつけど 結論ありきだからおもしろくね
28 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 11:49:19 ] >>26 仕様として決めていくといいかもね
29 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 12:01:24 ] 形式はソースが直接見れる形がいいかな
30 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 13:35:28 ] インタプリタ方式のマージャン思考ルーチン専用の新しい言語つくってほしいね
31 名前:デフォルトの名無しさん mailto:sage [2007/03/14(水) 03:10:53 ] >>27 で、結局結論は?
32 名前:デフォルトの名無しさん mailto:sage [2007/03/14(水) 23:27:30 ] 麻雀記述言語MJML(仮名)を開発しる?
33 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 10:20:38 ] マージャンソフトウェアキットMJSKでいいよ。
34 名前:1 mailto:sage [2007/03/15(木) 10:52:42 ] みなさんレスありがとうございます。 麻雀の思考アルゴリズムについて意見を交換する場を設けようと思い、 このスレを立てたのですが、スレを見てると麻雀プログラムの対戦システムの方に 興味をお持ちの方が多いようで驚きました。
35 名前:リバーシ1 [2007/03/15(木) 13:56:42 ] 最強の麻雀アルゴリズムができた まず14枚をランダムで配る そして何を捨てるのがいいか調べるアルゴリズム もし、役が出来ていたらbreakする 残りごまの中から、一枚ランダムに加えて、どれか一枚を捨てたら 役が出来るなら、その駒が選ばれたとカウントする(もっとも得点が高くなる駒を選ぶ) 役が出来ていないならば、もう一枚加えて、どれか二枚を捨てたら 役が出来るなら、その駒が選ばれたと0.5ずつカウントする 終局までに、どんな役も揃わなかったら、カウントしない これを1万回くらい繰り返すと、役が揃いやすい捨て駒にカウントが集まる 敵からのリーチ、一発があるときは、手を変える事もあるがあとで ぽん、かん、ちーが出来るときは、するかどうか、1万回くらい試行して決める
36 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 14:09:53 ] >>34 ネタがなければ話題は転がらないよ。
37 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 19:32:00 ] 「駒」とか言っている奴に麻雀を語る資格なし。
38 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 06:04:46 ] >>35 それじゃ自分の手しか見えないド素人の打ち方じゃないかw 他人の捨て牌も見ない、点数状況も参照しないじゃ いくら牌効率が高い打ち方をしても勝てるのは初心者までだよ。
39 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 11:07:30 ] >もし、役が出来ていたらbreakする オーラスで接戦なのにドベ確定の平和で上がりそうだなw
40 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 18:40:00 ] 相手のその局のデータ集めてもやらないと 完全にならないな 100万回くらいやらないと、そのロジックが強いかどうか判断できんのじゃないかな
41 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 22:12:45 ] しゃんてんすうのもとめかたおしえてくれ
42 名前:リバーシ1 [2007/03/17(土) 03:54:29 ] >>41 1万回くらい試行してみて最短の手数をみれば良い
43 名前:リバーシ1 [2007/03/17(土) 03:57:33 ] いかに速く、役が出来ているか、点数はいくつかを計算するアルゴリズムを 作ることが重要だ ここが出来れば、麻雀プログラムはほぼ完成したといえるだろう
44 名前:デフォルトの名無しさん [2007/03/17(土) 06:22:57 ] 可能な役をすべて記録しておいて 一致したら得点を渡すようにするか たとえば、ハッシュテーブルなんかに記録しておく すると、計算量はハッシュ関数の計算だけですむ
45 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 06:26:03 ] いや、だから自分の手と捨牌の枚数だけしか参照しないんじゃダメだろと。 それじゃ麻雀のルールしか知らないド素人じゃないか。 せめて自分の切ろうとしている牌がどれほど危険かどれほど安全か、 それを決めるための評価関数作らなくちゃ話にならない。
46 名前:デフォルトの名無しさん [2007/03/17(土) 06:27:08 ] 数字の1があったら、例えば6548231という数字を割り当てて 数字の2があったら、例えば154621という数字を割り当てて それぞれの、XORを取る するとハッシュ値がでる
47 名前:デフォルトの名無しさん [2007/03/17(土) 06:29:46 ] >>45 リーチ以外は、感に頼るほかなく 敵があと何駒で上がるのかを予測することは不可能 リーチ、一発の時だけ手を変えるようにするのがいい
48 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 06:34:37 ] つまりリーチしない相手には最初から最後まで完全に無警戒、と
49 名前:デフォルトの名無しさん [2007/03/17(土) 06:35:33 ] 実現可能な、手駒の配置をすべて求めるルーチンと その得点とハッシュ関数を求めるルーチンを作ろうぜ
50 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 06:36:48 ] 例えばピンズで染めてる裸単騎を前にしても「これは要らないから」と 堂々と生牌切ることになるよね
51 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 06:38:00 ] とりあえず平和を含む役だけで何通りあるんだろう? CPU/HDDリソースなんて有り余ってるから たいしたことにはならないと思うけど。
52 名前:デフォルトの名無しさん [2007/03/17(土) 06:39:53 ] のこりの配られる駒の数によって、上がれる確率は統計的にわかる 自分の上がれる確率が、一般的なものよりも低いならば 降りる(敵の捨て駒を捨てれ)ばよい
53 名前:デフォルトの名無しさん [2007/03/17(土) 07:37:17 ] プロが、1000局対戦したとする その四人の、最終局面で上がった回数が10回 1手前のとき20回、2手前15回だとしたら 標準的に、 最終局面の上れる確率は、10/4000 1手前の上れる確率は、30/4000 2手前の上れる確率は、45/4000 となる 他の三名のうちいずれか一人が上がれる確率は、この三倍だ (親と子で分布が変わるかもしれないがここでは省略する) そして自分の上がれる確率がそれより低いなら手を変える
54 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 07:48:43 ] てか、ゴタクはいいんで、常にダマ、染めが大好きというヘボ雀士よりも そのアルゴリズムが強いと言える根拠はどこにあるか示してくれよ。 常に安牌があるわけじゃないし、どれが「比較的」安全な牌かを 評価する手段がなきゃどう考えたって強くはなれないだろ。
55 名前:デフォルトの名無しさん [2007/03/17(土) 07:54:34 ] >>54 もっとも最近に捨てられた駒や、 もっとも多く表に出ている駒や、 北東南西や、 ドラでは無い駒が安全
56 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 07:55:26 ] 相手のあがりから、捨て牌から、 相手のくせも読むようにもしないとな
57 名前:デフォルトの名無しさん [2007/03/17(土) 07:56:01 ] >>55 特にリーチ後は、その人の捨て駒と、リーチ後の捨て駒が安全
58 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 08:01:07 ] 染め手ならオタ風のシャボや単騎待ちなんて普通にあるじゃん。。 しかもそんな分かりやすい安牌が常に手元にあることの方が珍しいし、 本当に麻雀やってるのかどうかすら怪しい。 東風荘でもどこでもいいから、機械的にそういう打ち方をして どれだけ勝てるかちょっと実証実験してくるといいと思うよ。
59 名前:デフォルトの名無しさん [2007/03/17(土) 08:12:15 ] わかり易い安牌が無いんだったらどれを捨ててもたいして変わらないって事だろ どれを捨てても同じだっら>>55 の選び方でも特に負けやすいことは無いはず
60 名前:デフォルトの名無しさん [2007/03/17(土) 08:16:43 ] それでは、ある程度つよいプログラムでランダムに試行しておき なに待ちが多いか統計を取っておこう なにもわからなかったときこの統計を使う
61 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 08:22:11 ] >>59 はぁ? つまりプロが、麻雀で飯を食ってるプロが、「捨牌を『読む』」という行為は 完全に無駄だと言いたいわけですね? 最も最近捨てられた牌、最も多く捨てられている牌、ドラではない牌を ただ機械的に『見て』選んで捨てれば安全なんだから。
62 名前:デフォルトの名無しさん [2007/03/17(土) 08:23:47 ] それでは、当たると多く点数を奪われるものを捨てないようにしよう 見えている駒から、どんな役がどのくらいの確率で揃うのかは計算できる そうすれば統計的に多く点を奪われる駒が判明する
63 名前:デフォルトの名無しさん [2007/03/17(土) 08:26:18 ] >>61 あと一枚で上がりのとき以外は、捨牌を読んでも意味がないとおもうが
64 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 08:28:07 ] >>63 とりあえず君に麻雀を語る資格がないのはよく分かった。 一応聞いておくけど、麻雀を始めてから何年ぐらい? ネット麻雀やってる? やってるとしたらどこで、レートはどれくらい?
65 名前:デフォルトの名無しさん [2007/03/17(土) 08:30:10 ] >>64 リバーシの勝敗は判るが、 麻雀、囲碁の勝敗と得点は判らない 将棋はアマ三段の免状あり
66 名前:デフォルトの名無しさん [2007/03/17(土) 08:34:08 ] >>64 見えていない相手の役を揃わせないようにするよりは 自駒を最短で揃えるようにした方がよいと思う 人間では何を捨てれば統計的に最善なのか判断出来ないはず
67 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 08:35:49 ] >>65 将棋はさっぱりだけど、俺もチェスはやる。 で、君は将棋みたいに決定論的なゲームと、 ランダムの要素が絡む麻雀とをごっちゃにしすぎ。
68 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 08:36:10 ] あと>>63 はありえないから。マジで。
69 名前:デフォルトの名無しさん [2007/03/17(土) 08:40:19 ] 配られる駒がランダムなのだから、そのとき別の駒が配られていたとしたら 捨牌にも影響する どうしてもランダムの部分は予測できない 多く得点を取られる可能性を避ければよい
70 名前:デフォルトの名無しさん [2007/03/17(土) 08:47:05 ] 見えている駒以外を、ランダムに生成して 役が揃ったときには、その各駒に役の得点を加算する これを1万回くらい試行すると危険駒の得点が高くなる
71 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 08:47:10 ] >>69 >>61
72 名前:デフォルトの名無しさん [2007/03/17(土) 08:50:36 ] 捨牌の読みや、各人の癖の読みは、人間だから少しは出来るのであって コンピュータには難しい 経験のないコンピュータのとれる手段は確率的に有利な手を選ぶことだ
73 名前:デフォルトの名無しさん [2007/03/17(土) 08:56:26 ] 攻めアルゴリズムは>>35 守りアルゴリズムは>>70 です 役判定とハッシュは>>44 >>46 です まともらプログラムがなかなか出来ないので代わりに作って確かめてもらえないですか
74 名前:デフォルトの名無しさん [2007/03/17(土) 09:48:32 ] ハッシュ値と、実際の手持ち駒に、一対一対応があれば 自局面は、int型の変数一つで表現できる >>70 で点数が0のままならば、どんな組み合わせに対しても 役が揃わないということなので確実に安全 自分の捨牌を考えなければならないので、 自他問わないポン、チー、捨牌、ドラ以外の駒 + 重複を無くした自駒 のなかからランダムに選ぶ必要がある
75 名前:デフォルトの名無しさん [2007/03/17(土) 10:09:43 ] 駒番号について 0〜33までを次のように割り振る 萬子、索子、筒子、東、南、西、北、白、発、中 34番からは、もう一巡する ハッシュ値について 0〜143番までに、0から2の20乗くらいの数字をランダムにつける 手持ちが、0番と10番と30番ならば、上でつけた数字のxorを取る それをハッシュ値とする
76 名前:デフォルトの名無しさん [2007/03/17(土) 10:28:43 ] 役判定について www5f.biglobe.ne.jp/~kenmo/program/majang/yaku/yaku.html
77 名前:デフォルトの名無しさん [2007/03/17(土) 10:33:05 ] だれか、0から143までの数字14コと、ポン、チー情報と、ドラと場、リーチ一発情報 渡したら、役(点数)を返すルーチン作ってくれないですか
78 名前:デフォルトの名無しさん [2007/03/17(土) 12:00:11 ] unsigned int 型を5つ用意して、手持ちの番号のbitを立てれば局面が表現できるな まずは同一型を初めの方の番号に変換することだ そしてそれをソートすればすべての局面が求まる それを順にディスクに保存しよう そのデータを使って次に役になっている局面を抽出だ
79 名前:デフォルトの名無しさん [2007/03/17(土) 12:04:30 ] 単純に、144C14 (144コから14コ選ぶ数) を計算すると2の32乗より大きくなってしまう いったい何通りあるのだろうか
80 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 12:13:59 ] 高1か高2の期末試験に出てきそうな問題だなw
81 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 13:13:26 ] >>79 余分8枚は花牌とかなの? それとも(プログラム処理上の)仮想牌?
82 名前:デフォルトの名無しさん [2007/03/17(土) 13:22:36 ] 間違えたよ 萬子9、索子9、筒子9、東1、南1、西1、北1、白1、発1、中1 = 34枚 ×4 =136枚だった
83 名前:デフォルトの名無しさん [2007/03/17(土) 13:29:21 ] 間違いなく136 bit (int型5コ)あればポン、チーをのぞいて自局面は表せる これを標準型に直してからハッシュ値を求めれば32 bitでいけるか? ほとんどの組み合わせは役無しだろうから、そのときはハッシュ値は衝突してもよいが 役ありのときは衝突しないようにしたい もっとも短いビットはいくつだろうか ハッシュ値の速度も大事だ
84 名前:デフォルトの名無しさん [2007/03/17(土) 13:32:55 ] 点数を2バイトで表すと ハッシュ値が20ビットだとハッシュテーブルは2Mバイト必要 24bitだと32Mバイト必要 確保できるのはせいぜいこのくらいまでだろう 24bit以下のハッシュ関数を作れるか?
85 名前:デフォルトの名無しさん [2007/03/17(土) 13:52:52 ] 乱数を生成するルーチンを作った これで環境によらず同じ結果が得られるよ #include <stdio.h> unsigned short int rnd(int x){ int y=x/681; y=x-681*y; y=1664525*y+1013904223; return y&65535; } main(){ int x=7,i; for(i=0;i<30;i++){ x=rnd(x); printf("%d\n",x);}}
86 名前:デフォルトの名無しさん [2007/03/17(土) 13:54:31 ] すまん 乱数になってなかった ループしてる ここを参考にしたのだが hp.vector.co.jp/authors/VA004808/random1.html
87 名前:デフォルトの名無しさん [2007/03/17(土) 14:00:32 ] 今度こそいけると思うぞ #include <stdio.h> unsigned short int rnd(int x){ int y; y=(int)((1664525*(double)x+1013904223)/10); return y&65535; } main(){ int x=7,i; for(i=0;i<60;i++){ x=rnd(x); printf("%d\n",x);}}
88 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 14:09:14 ] ハッシュでやるなんて馬鹿げてないか? 役判定なんて速度はそれほど要求されないし。
89 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 14:18:32 ] チートイツと国士以外は一般的に判定できそうだしね。 しかし、モンテカルロ法とか使って上がれる確率、トップを取れる確率が 最大になる捨て牌を、とかなったら、少しでも高速で判定できるにこしたことはなさそう。
90 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 14:23:07 ] 牌山のアルゴリズムは何処?
91 名前:デフォルトの名無しさん [2007/03/17(土) 14:34:55 ] 固まるんですけど、どこか判りますか? #include <stdio.h> #define fore(i,N) for(i=0;i<N;i++) //乱数生成ルーチン unsigned int ransuusyokiti=1; unsigned short int rnd(){ int ransuusyokiti=(int)(1664525*(double)ransuusyokiti+1013904223)&2147483647; return ransuusyokiti&65535;} //自局面のデータ class JIHAI { unsigned int bitboard[5]; public: JIHAI(); }; //自局面初期化 JIHAI::JIHAI(){ bitboard[0]=bitboard[1]=bitboard[2]=bitboard[3]=bitboard[4]=0; int temp[14],n=1,i; temp[0]=rnd()%136; while(n<14){ temp[n]=rnd()%136; fore(i,n)if(temp[n]==temp[i])break; if(i>=n)n++; } fore(i,14)bitboard[temp[i]>>5 ] |= 1<<(temp[i]&31); } main(){ JIHAI hai; }
92 名前:91 [2007/03/17(土) 14:52:17 ] 先に進めなくなったからリバーシへ戻るとするか....
93 名前:91 [2007/03/17(土) 14:55:25 ] ルールを知らないんですけど、鳴きやリーチのときは同じ手牌でも、役が変わりますか? 鳴き、リーチ無しのときの役判定は、鳴きのときにも使えますか?
94 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 15:03:02 ] 鳴くと役が下がったり、成立しない役がある(例:リーチは鳴くと出来ない) リーチは1役、ダブルリーチは2役上がる 使える。 てかルール調べた方が早くね?
95 名前:91 [2007/03/17(土) 15:10:11 ] 判りました unsigned short int rnd(){ int ransuusyokiti = ↓ unsigned short int rnd(){ ransuusyokiti = でした
96 名前:デフォルトの名無しさん [2007/03/17(土) 15:17:38 ] >>94 そうですかわかりました
97 名前:デフォルトの名無しさん [2007/03/17(土) 15:39:19 ] 順調に進んできたよ 牌をセットして標準化して表示するところまで来た up2moe.moe.hm/img/q921.txt
98 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 16:12:56 ] まだ50行しか書いてないのかよ
99 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 16:24:50 ] いやーーすごいじゃないか
100 名前:デフォルトの名無しさん [2007/03/17(土) 16:38:08 ] あがり判定つけたけどあっているのか不明 確認してくれ up2moe.moe.hm/img/q923.txt ここを参考にした www5f.biglobe.ne.jp/~kenmo/program/majang/agari/agari.html
101 名前:デフォルトの名無しさん [2007/03/17(土) 16:41:15 ] あがり判定と点数が正しく求まれば 麻雀プログラムはほぼ出来上がったとみて良いと思うのだが ここが山だな