1 :
デフォルトの名無しさん :
2007/01/24(水) 21:40:36
断る。
コンピュータは常に天和。まさに最強のAI。
>>3 それだと、コンピュータに親がまわってくるまでに、
プレイヤが勝ってしまう恐れがあるのではないだろうか。
ロンより証拠
どいツモこいツモ他人任せにしやがって
麻雀?くだらね
昔々の PC-8801 用の精彩麻雀は、コンピュータ側は最初に 上がった形を作っておいて、あとはランダムに上がるという ように作ってあったらしい。
定期的に立つなこのスレ
リバーシスレの1をこっちに閉じ込めて置いてくれないか?
>>10 今回は結構期間が空いていたな。
次に立つのは夏休み中ぐらいだろう。
亜樹タンの打ち方を研究してる俺が来ましたよ
まじめなことを聞いてみるけど、 配牌も同じプログラムで行うってことかな? それとも、配牌とサイコロはランダムなり、専用プログラムでおこなって、 4種のプログラムで対戦をおこなって最強を決めるということかな?
配牌も手動がいいな。 元緑積みができるとか。
コンピューターとプレイヤーの配牌方法を別にしたらいいじゃん。 コンピューターだけ揃いやすいように。
>>14 ときどきゲームでイカサマなし!ってうたってるのがあるけど、
そーいうの同士で、大会とかないのかね?
麻雀で強いアルゴリズムというのを知りたい。
麻雀板に似たようなスレあった気がする 俺には上がり判定すら作れそうにない。。。
19 :
デフォルトの名無しさん :2007/03/11(日) 14:33:32
age
全ツッパ、ラス確定アガリ上等のアガリマシーンなら作れそうだけど 防御的な思考や順位を考慮した思考を入れると面倒そうだ。
>>20 それでいいから、
トンプウソウとかに突撃してみてくれ。
いろんなアルゴリズムをバトルロワイヤルさせて自然淘汰の経過を見るとか面白いかもね
23 :
デフォルトの名無しさん :2007/03/12(月) 10:29:04
まず いろんなアルゴリズムソースで戦わせられる土台のプログラムを作ってください
え?俺が?
jarファイルなりdllファイルなりを4つD&Dすれば 何回か対戦を自動で行って成績を表示なんてどうよ。
定期的にこのスレたつけど 結論ありきだからおもしろくね
形式はソースが直接見れる形がいいかな
インタプリタ方式のマージャン思考ルーチン専用の新しい言語つくってほしいね
麻雀記述言語MJML(仮名)を開発しる?
マージャンソフトウェアキットMJSKでいいよ。
34 :
1 :2007/03/15(木) 10:52:42
みなさんレスありがとうございます。 麻雀の思考アルゴリズムについて意見を交換する場を設けようと思い、 このスレを立てたのですが、スレを見てると麻雀プログラムの対戦システムの方に 興味をお持ちの方が多いようで驚きました。
35 :
リバーシ1 :2007/03/15(木) 13:56:42
最強の麻雀アルゴリズムができた まず14枚をランダムで配る そして何を捨てるのがいいか調べるアルゴリズム もし、役が出来ていたらbreakする 残りごまの中から、一枚ランダムに加えて、どれか一枚を捨てたら 役が出来るなら、その駒が選ばれたとカウントする(もっとも得点が高くなる駒を選ぶ) 役が出来ていないならば、もう一枚加えて、どれか二枚を捨てたら 役が出来るなら、その駒が選ばれたと0.5ずつカウントする 終局までに、どんな役も揃わなかったら、カウントしない これを1万回くらい繰り返すと、役が揃いやすい捨て駒にカウントが集まる 敵からのリーチ、一発があるときは、手を変える事もあるがあとで ぽん、かん、ちーが出来るときは、するかどうか、1万回くらい試行して決める
「駒」とか言っている奴に麻雀を語る資格なし。
>>35 それじゃ自分の手しか見えないド素人の打ち方じゃないかw
他人の捨て牌も見ない、点数状況も参照しないじゃ
いくら牌効率が高い打ち方をしても勝てるのは初心者までだよ。
>もし、役が出来ていたらbreakする オーラスで接戦なのにドベ確定の平和で上がりそうだなw
相手のその局のデータ集めてもやらないと 完全にならないな 100万回くらいやらないと、そのロジックが強いかどうか判断できんのじゃないかな
しゃんてんすうのもとめかたおしえてくれ
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
可能な役をすべて記録しておいて 一致したら得点を渡すようにするか たとえば、ハッシュテーブルなんかに記録しておく すると、計算量はハッシュ関数の計算だけですむ
いや、だから自分の手と捨牌の枚数だけしか参照しないんじゃダメだろと。 それじゃ麻雀のルールしか知らないド素人じゃないか。 せめて自分の切ろうとしている牌がどれほど危険かどれほど安全か、 それを決めるための評価関数作らなくちゃ話にならない。
46 :
デフォルトの名無しさん :2007/03/17(土) 06:27:08
数字の1があったら、例えば6548231という数字を割り当てて 数字の2があったら、例えば154621という数字を割り当てて それぞれの、XORを取る するとハッシュ値がでる
47 :
デフォルトの名無しさん :2007/03/17(土) 06:29:46
>>45 リーチ以外は、感に頼るほかなく
敵があと何駒で上がるのかを予測することは不可能
リーチ、一発の時だけ手を変えるようにするのがいい
つまりリーチしない相手には最初から最後まで完全に無警戒、と
49 :
デフォルトの名無しさん :2007/03/17(土) 06:35:33
実現可能な、手駒の配置をすべて求めるルーチンと その得点とハッシュ関数を求めるルーチンを作ろうぜ
例えばピンズで染めてる裸単騎を前にしても「これは要らないから」と 堂々と生牌切ることになるよね
とりあえず平和を含む役だけで何通りあるんだろう? 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 となる 他の三名のうちいずれか一人が上がれる確率は、この三倍だ (親と子で分布が変わるかもしれないがここでは省略する) そして自分の上がれる確率がそれより低いなら手を変える
てか、ゴタクはいいんで、常にダマ、染めが大好きというヘボ雀士よりも そのアルゴリズムが強いと言える根拠はどこにあるか示してくれよ。 常に安牌があるわけじゃないし、どれが「比較的」安全な牌かを 評価する手段がなきゃどう考えたって強くはなれないだろ。
55 :
デフォルトの名無しさん :2007/03/17(土) 07:54:34
>>54 もっとも最近に捨てられた駒や、
もっとも多く表に出ている駒や、
北東南西や、
ドラでは無い駒が安全
相手のあがりから、捨て牌から、 相手のくせも読むようにもしないとな
57 :
デフォルトの名無しさん :2007/03/17(土) 07:56:01
>>55 特にリーチ後は、その人の捨て駒と、リーチ後の捨て駒が安全
染め手ならオタ風のシャボや単騎待ちなんて普通にあるじゃん。。 しかもそんな分かりやすい安牌が常に手元にあることの方が珍しいし、 本当に麻雀やってるのかどうかすら怪しい。 東風荘でもどこでもいいから、機械的にそういう打ち方をして どれだけ勝てるかちょっと実証実験してくるといいと思うよ。
59 :
デフォルトの名無しさん :2007/03/17(土) 08:12:15
わかり易い安牌が無いんだったらどれを捨ててもたいして変わらないって事だろ
どれを捨てても同じだっら
>>55 の選び方でも特に負けやすいことは無いはず
60 :
デフォルトの名無しさん :2007/03/17(土) 08:16:43
それでは、ある程度つよいプログラムでランダムに試行しておき なに待ちが多いか統計を取っておこう なにもわからなかったときこの統計を使う
>>59 はぁ?
つまりプロが、麻雀で飯を食ってるプロが、「捨牌を『読む』」という行為は
完全に無駄だと言いたいわけですね?
最も最近捨てられた牌、最も多く捨てられている牌、ドラではない牌を
ただ機械的に『見て』選んで捨てれば安全なんだから。
62 :
デフォルトの名無しさん :2007/03/17(土) 08:23:47
それでは、当たると多く点数を奪われるものを捨てないようにしよう 見えている駒から、どんな役がどのくらいの確率で揃うのかは計算できる そうすれば統計的に多く点を奪われる駒が判明する
63 :
デフォルトの名無しさん :2007/03/17(土) 08:26:18
>>61 あと一枚で上がりのとき以外は、捨牌を読んでも意味がないとおもうが
>>63 とりあえず君に麻雀を語る資格がないのはよく分かった。
一応聞いておくけど、麻雀を始めてから何年ぐらい?
ネット麻雀やってる? やってるとしたらどこで、レートはどれくらい?
65 :
デフォルトの名無しさん :2007/03/17(土) 08:30:10
>>64 リバーシの勝敗は判るが、
麻雀、囲碁の勝敗と得点は判らない
将棋はアマ三段の免状あり
66 :
デフォルトの名無しさん :2007/03/17(土) 08:34:08
>>64 見えていない相手の役を揃わせないようにするよりは
自駒を最短で揃えるようにした方がよいと思う
人間では何を捨てれば統計的に最善なのか判断出来ないはず
>>65 将棋はさっぱりだけど、俺もチェスはやる。
で、君は将棋みたいに決定論的なゲームと、
ランダムの要素が絡む麻雀とをごっちゃにしすぎ。
69 :
デフォルトの名無しさん :2007/03/17(土) 08:40:19
配られる駒がランダムなのだから、そのとき別の駒が配られていたとしたら 捨牌にも影響する どうしてもランダムの部分は予測できない 多く得点を取られる可能性を避ければよい
70 :
デフォルトの名無しさん :2007/03/17(土) 08:47:05
見えている駒以外を、ランダムに生成して 役が揃ったときには、その各駒に役の得点を加算する これを1万回くらい試行すると危険駒の得点が高くなる
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
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乗より大きくなってしまう いったい何通りあるのだろうか
高1か高2の期末試験に出てきそうな問題だなw
>>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
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);}}
ハッシュでやるなんて馬鹿げてないか? 役判定なんて速度はそれほど要求されないし。
チートイツと国士以外は一般的に判定できそうだしね。 しかし、モンテカルロ法とか使って上がれる確率、トップを取れる確率が 最大になる捨て牌を、とかなったら、少しでも高速で判定できるにこしたことはなさそう。
牌山のアルゴリズムは何処?
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
ルールを知らないんですけど、鳴きやリーチのときは同じ手牌でも、役が変わりますか? 鳴き、リーチ無しのときの役判定は、鳴きのときにも使えますか?
鳴くと役が下がったり、成立しない役がある(例:リーチは鳴くと出来ない) リーチは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
97 :
デフォルトの名無しさん :2007/03/17(土) 15:39:19
まだ50行しか書いてないのかよ
いやーーすごいじゃないか
100 :
デフォルトの名無しさん :2007/03/17(土) 16:38:08
101 :
デフォルトの名無しさん :2007/03/17(土) 16:41:15
あがり判定と点数が正しく求まれば 麻雀プログラムはほぼ出来上がったとみて良いと思うのだが ここが山だな
そうかな? 役つくりが一番難しいと昔思ったけど 配パイ時に欲しい牌を固定してしまえば楽かな
>>101 まあゲームとして必要な最低ラインだね
最強のものを作るんだから
どんなアルゴリズムにするとか
ここから話がはじまるのでは?
104 :
reverse_1 :2007/03/18(日) 16:48:53
作っているやついるの? だれもいないと作る気がしない あと4プログラムを対戦させるやつの開発は進んでるの? ハッシュはどうやらすべての役を記録するのは難しいかもしれない(かなりメモリを食う) 可能な役の数をざっと計算してみたら、26×10の20乗通りある ハッシュ長は25 bit必要になる
相手がツモ切りかどうかの判別は? プロなら分からないような指技使うがw
じゃあ、誰かが雀卓サーバ作って配牌、役計算。 他の奴はそれに接続して対戦って感じで競わせたらどうよ。 思考時間1秒以内で。 それ以上だと人間が打てちゃうしw 1秒って言っても順番回ってくる前に何が来たら何を切るぐらい考えられるし実際の思考時間結構長い。 切る1s→鳴き・和了待ち1s→切る1s→・・・って感じだと1週8秒 ツモ切りかどうかは鯖から情報貰えば良い。 ホスト側(役計算とか)の方の議論多いけど 役計算のプログラムってそこらに転がってないか? アルゴリズムだって決まってるだろうし。 俺作っても良いけど誰かやるんか?w
>>106 >俺作っても良いけど誰かやるんか?w
「俺作ったけど、誰かやるんか?」
だと説得力あるんだけどなぁ・・・
なんだ やっぱ既にあるのか
============== 終了 ==========================
いや、ここからが始まりだろ?
113 :
reverse_1 :2007/03/20(火) 07:44:52
お、面白そうだな。
とりあえず、徹夜で頭が働かなくてトイトイしかしないやつとか作ってみてるけど 上がるだけでもけっこう大変だな
何そのありがちな投げ遣り感
117 :
デフォルトの名無しさん :2007/03/25(日) 17:38:22
118 :
デフォルトの名無しさん :2007/03/29(木) 19:58:44
非効率的ですが、全ての事象(サイコロを振ったり、ポンしたりチーしたりなど)の オーラスまでの確率を全て求め、相手(3人)の行動と配牌やツモ配、ドラなどから 最終的にプラスになる可能性が高い牌を選んで捨てていけばいいと思います。 ただ、膨大なデータが必要でスーパーコンピュータでもできるかわかりませんが 最強ではないでしょうか?
119 :
デフォルトの名無しさん :2007/03/29(木) 20:23:04
構想はいらないから、実際にコードかけよ
>>118 考えが浅いです。
もうちょっと頑張りましょう。
121 :
デフォルトの名無しさん :2007/03/29(木) 22:04:09
そもそも
>>120 の意見だと、配牌時に1・9・字牌が無い
場合にも国士無双が上がれる確率まで求めちゃうの?
うわ、意味ねー
>>118 確率上の最強のプログラムができても、
そのプログラムに勝てるプログラムを作る事が可能。
結局はプログラムのいたちごっこになる。
そもそも麻雀における最強というものが存在しない。
ルールを知ってるだけだから机上の空論に陥りやすい。 戦略も経験や知識として知っていないと駄目。
>>121 ごめ、実はもっと意味ないんだけど
最初の親決めからオーラスまでの全ての事象のパターンをだして
最終的にプラスになる可能性が高い方の牌を選んでいくって事
そのうちに最強のじゃんけんスレが出来そうですね。
126 :
デフォルトの名無しさん :2007/03/29(木) 23:31:12
>>122-123 が無駄道に行くから、またプログラムが出来なくなる。
最初に、「確率上の最強のプログラム」を作れよ。
「机上の空論」から始めろよ。
何もできてないくせに、「戦略」とか「経験」とかプログラムを落としにくい
要素を議論しても、意味無いじゃん
将棋ソフトみたいに、共通のフリーのフロントエンドないかな。 ボナンザもバックエンド専用ソフトで、フロントエンドは誰かのを借りてるよね。
じゃあまずフロントエンド作りから
このプログラムの前提は麻雀の公式ルールにのっとって作ってるの? それともあらゆるルールに対応できるように?
>>108 にフロントエンドの紹介があるね。
Java版のほうは割と使いやすそうだ。
>>124 現実的にオーラスまでは無理だとしても
1巡先のあらゆるパターンを出してその中で最善のものを選ぶというのはどうだろう?
…といったもののそれでも膨大な量のパターンになってしまうが
だからさ、「画期的なアイデア」募集スレじゃないんだけど、ここ。
スレッド名が良くなかったかも。 「プログラム入門に最適(これも嘘だが)!麻雀プログラムを作ろう」とかしとけば、 妙な人間は寄って来なかったろう。
こないだボナンザとプロ棋士が将棋してたけど、 麻雀ではそういうのは無いの? 運の部分が大きいから、プロでも半荘くらいなら負けることもありそう。 強いのできたら、二階堂姉妹と対戦させて、脱がせたい。
確率が云々のプログラム以前に麻雀を勉強した方がいいんジャマイカ? 最強のプログラムを作るなら最強の定義を決めるのが先ジャマイカ?
とりあえず、鳴きだの何だのなしで、普通に上がりに向かうようにするアルゴリズムを考えてみないか?
>>127 >将棋ソフトみたいに、共通のフリーのフロントエンドないかな。
>ボナンザもバックエンド専用ソフトで、フロントエンドは誰かのを借りてるよね。
ちなみに、
>>113 の/console ディレクトリ以下には、
(本体と別に)標準入出力を使って1局打つための
サンプルプログラムがついている。
(何の説明も無いが・・・)
麻雀もWEB-APIの形で提供してくれればいいのにっ
とつげき東北が東風荘のデータを100万局分ほど解析したんだっけ? ボナンザは24の棋譜を何万局か使用して最善手を選ぶ局面評価関数の最適化をしたんだよね。 だから、そんなかんじで高レートの人の牌譜を使用したら結構強いものができるんじゃないだろうか。 ていうか麻雀はすぐ人より強いものが作れそうな気がする。 ていうのは、 ① その牌がツモ切りかどうか ② もっと詳しく、その牌は配パイからあったものか、それとも何番目にツモったものか ③ ①、②を含め、それまでの配譜の全手順を完全に記憶できる というあたりで、人間には不可能な解析ができるから。 まあここまで解析するのを許すかどうかはひとそれぞれだろうけど。 あ、ここでのすぐってのは、オセロやチェスよりも簡単だろうって意味で、もちろんだれでもすぐってわけにはいかんけどね。 おれもこれで食っていけるのなら作ってみたいが、ただの趣味でやるにはちょっとめんどくさいなー。
>>140 ポーカーだともっと単純に似たようなことができそうだな
>>140 あのー
麻雀の局面のパターン数なんてオセロやチェスと比較にならんくらい膨大だと思いますが
それとー
仮に同一局面が現れたとして、オセロやチェスと違って、麻雀は不確定要素が多すぎて
最善手なんて一意に決まらないと思いますが
総ての情報が詳らかになっているオセロやチェスの解析手法を麻雀やポーカーに応用するのは
無理があると思いますが
143 :
デフォルトの名無しさん :2007/04/06(金) 06:57:17
どうなのかなぁ。 絶対最強のアルゴリズムなんかないんだろうけど、 (多分、誰かが書き込していたじゃんけんのアナロジーが正解?) でも、実際にプログラミングすることを考えると 確率重視になってしまうんだろうな。 で、そうなったら、麻雀の面白みって無くなるんだろう(ry
人間がやるときだって、条件が変わらない場合は 待ち牌の数とか計算して少しでも多いほうを選ぶじゃん
147 :
142 :2007/04/06(金) 20:27:18
>>144 そういうことじゃなかったんだ!ありがとうございます!
で、どういうことなの?w
教えてあげないよーだwww
不確定要素があるゆえに、対人戦では相手の心理を読むことが重要になってくるはず コンピュータ同士の場合と対人の場合では有効な戦略は変わってきそう さらに対人の場合でも 相手がコンピュータであると知っているプレイヤーと 相手が人間だと嘘を教えられているプレイヤーとでは挙動が違いそう …と、また何の具体性もない机上の空論を振り回してみる
マージャンチューリングテストか。。
コンピュータ的には、他プレーヤーの癖とか傾向をどんどん蓄積していって分析するような機能は必須だな。 その上でコンピュータ自身はなるべく癖をださない。かといってイレギュラーさせることも必要だろう。 そういったプログラムを作ると、もう人間の手には負えないと思う。回数を重ねるほど勝てなくなる。 どういった分析をさせるかが、プログラマーの腕のみせどころになるんだろう。 そんで、そんなかんじで作ったコンピュータ同士を戦わせると、これは相性の問題になりそうな気がする。
このスレ恐ろしくレベルが低いなあ。 聴牌判定ルーチンを書ける奴すらいないんじゃね?
>聴牌判定ルーチンを書ける奴すらいないんじゃね? 自己紹介乙。
シャンテン数判定ルーチンは 丸々二日はもらわないと 書けない自信がある。
155 :
デフォルトの名無しさん :2007/04/08(日) 22:58:01
シャンテン位、3時間で書けよ。 いやさ、マージャンの「頭」はどんなに多くても、 「7つ」しかない。その「7パータン」を全部洗い出して、 一番近い「シャンテン」を出せばいいだけの話だろ。
>>155 そんなに簡単なら書いたものを公開してほしいな。
おれも
>>154 同様、あまり効率よく書ける自信がない。
確率を考慮するとシャンテン数判定自体は、
勝ちに行くコアのエンジンにそのままでは使えない。
むしろ、麻雀のルールの的確なインプリメントの例として出してほしい。
157 :
デフォルトの名無しさん :2007/04/08(日) 23:43:50
>>156 ちょwww
ここ、本当にプログラム板?
俺、本職じゃないけど、3時間で書けたぞ
アップローダあればいくらでもやるぞ?
>>157 アップローダぐらい、
なぜ見つけられないのか、
むしろそちらの方が不思議だ。
159 :
156 :2007/04/08(日) 23:55:01
>>157 むしろ、麻雀がよく分かってないんだと思う。
>マージャンの「頭」はどんなに多くても、 「7つ」しかない。
実際、この意味がわからない。
160 :
デフォルトの名無しさん :2007/04/08(日) 23:55:47
>>160 ま、言いたいことは色々あるけどさ・・・
とりあえず言っておかなくてはいけない事として、
一体全体そのソースの何処で
「シャンテン数を計算している」と
主張するつもりなんだ?
162 :
156 :2007/04/09(月) 01:26:02
>>157 ありがとう。
見たけど、見ただけじゃこれで評価ができてるってのがわからない。
適当に配牌を放り込んで結果を見てみることにするよ。
>>160 これを堂々と他人に晒せるあたり、大物を感じさせるな、がんばれw
シャンテン数チェックと聴牌チェックを勘違いしてるんだろうけど
聴牌チェックだとしても酷いw
眠いんで詳しくは見てないが
・七対子と国士無双を判定してないぞ
・麻雀にはカンツがあるぞ、鳴きも考慮しろよ
・同じ手牌でもあがり形は一つじゃないぞ
君のアルゴリズムだと111223344を孤立牌x1、順子x2、対子x1と判定する
直したらまたアップしろw
聴牌チェックはどうでもいいから、シャンテン数を出すやつ出してくれよ。 あと何手で聴牌するか、の何手かを出すんだぞ。
イーシャンテンかリャンシャンテンか、とかを判定するのか。 1ぐらいはしらみつぶしに探せばすぐわかりそうだけど、リャンシャンテンとかは ひょっとしたら探索しないとダメ? つか、最大のシャンテン数がそもそもわからん。6ぐらい?
七対手があるから、最大でも5かな?
めちゃくちゃ時間がかかってもいいなら、シャンテン数を出すプログラムは
おそらく
>>160 の聴牌判定ルーチンを使えば簡単に書けそう。
牌の種類は全部で34種類。 次のツモで得られる手牌は同じく34パターン。 この34パターンに対して、14枚の手牌のうち、一つだけ除いて聴牌判定ルーチンへ。 聴牌があるなら1シャンテン。 1シャンテンじゃなければ、34パターン × 14 = 476パターンに対して、次のツモで、、、(ry
>>168 もう少し賢くするなら捨ててある牌や手持ちの牌を見て得られる可能性のある手牌を絞る。
1シャンテンを調べるのに必要な手牌 34 * 14 = 476 2シャンテンを調べるのに必要な手牌 34 * 14 = 476 * 476 = 226576, 22万 3シャンテンを調べるのに必要な手牌 34 * 14 = 476 * 476 * 476 = 107850176, 1億 4シャンテンを調べるのに必要な手牌 34 * 14 = 476 * 476 * 476 * 476 = 51336683776, 513億 5シャンテンを調べるのに必要な手牌 34 * 14 = 24436261477376, 24兆 力技では3シャンテンを調べるのすら不可能っぽいです orz
十三不塔がないルールだと6シャンテンまであるんじゃない?
メンツ・ターツ・トイツを抜き出していくのが一番早そうだね。
問題はチートイ狙いながら四面子と一頭の形も狙うっていう時の三シャンテンぐらいのときじゃないか? 頭をどれにとる?って計算してたらシャンテン数計算するのも面倒っぽい
十三不塔は配牌のみだし関係なくね?
アンカンしてリンシャンツモ、とかは無視でいいのかな。
この場合、役は考慮しないだろうからカンしてもしなくても 聴牌の形は変わらないだろうし、リンシャンはツモの1つとしていいのでは
>>175 ハイパイ時よりシャンテン数下がるときって国士狙ってる時以外はなくないか?
180 :
デフォルトの名無しさん :2007/04/10(火) 01:42:48
tewt
181 :
デフォルトの名無しさん :2007/04/10(火) 01:45:41
役無しの判定が高速に行えれば全体が速くなる 全ペアの95%くらいが役無しだろう 役無し判定が5 clock 役判定が100 clock だとして初めに役がなければ、役判定しなくてすむ
182 :
デフォルトの名無しさん :2007/04/10(火) 02:21:32
総枚数と字牌と数字牌と○牌とⅠ牌の枚数であらかた判定できる
183 :
デフォルトの名無しさん :2007/04/10(火) 02:22:48
総枚数は14~16である 字牌が0枚、1枚、2枚、3枚、4枚などで分類する
個々のメンツのばらばら具合から、最低必要シャンテン数をあらかじめ求めておけば かなり高速にはなりそう。 例えば 147四六九 ならば147は後2枚、1~9が必要。 四六九は後一枚必要。 こうしてあらかじめ全てのパターンを計算しておけば表を引くだけですむ。 同じ数値牌がたくさんあるときは大変そうだけど。
185 :
デフォルトの名無しさん :2007/04/10(火) 02:30:27
土壌の話しようぜ
186 :
デフォルトの名無しさん :2007/04/10(火) 02:33:53
>>184 シャンテン数の求め方 決定版
ランダムに残り牌を配って、いずれか14枚選んだとき役が出来る最小数を求める(一万回くらい試行する)
これでほぼ正解になる
1111244667799 こんなチンイツなら2シャンテンか。 すべて同種の数牌だけの時で、3シャンテン以上になることってありうるのかな。
>>186 99.9%正解じゃなくて100%正解なのが知りたいな。
189 :
デフォルトの名無しさん :2007/04/10(火) 02:40:57
>>188 正確に求める必要がどこにある?説明せよ
190 :
デフォルトの名無しさん :2007/04/10(火) 03:40:06
a(1),a(2),・・・,a(14)が役ありなら0 残り牌からランダムにa(15)を追加 a(1),a(2),・・・,a(15)のうちいずれか一枚をのぞいて役ありなら1 残り牌からランダムにa(16)を追加 a(1),a(2),・・・,a(16)のうちいずれか2枚をのぞいて役ありなら2 ランダム生成を繰り返して求めた数字以下である
191 :
デフォルトの名無しさん :2007/04/10(火) 03:41:15
役無し判定と、役確定判定を高速に求めるんだ
>>184 >こうしてあらかじめ全てのパターンを計算しておけば表を引くだけですむ。
そのパターンが何通りあるか、数えたのか?
実現可能な程度の数で収まるのか?
>>189 >正確に求める必要がどこにある?説明せよ
それは最強じゃないから。スレタイ嫁。
仮にその話はおいておくとしても、そもそも
それで「ほぼ正解になる」という証拠が提出されていない。
実際に試したのか?
・・・何か、妄想ばかりだな。
メンツ分解型を再帰使って書けば100行程度で十分高速なもの
(Pen4 3G、1万回のランダム配牌で0.15~0.20秒)ができるよ。
牌追加型は、
>>171 が言うように、シャンテン数が増えると計算できなくなる。
194 :
デフォルトの名無しさん :2007/04/10(火) 08:48:47
メンツ分解型とは?
195 :
デフォルトの名無しさん :2007/04/10(火) 09:27:15
メンツ、ターツ、トイツを抜き出して、シャンテン数が最小となる抜き出しパターンを見つける方法のこと。 帰ったらソースをうpしてみる。
面子分解では、完全解は得られないんじゃない?
>>192 批判は簡単だから、どうやったらシャンテン数が高速で計算できるか書いてくれ。
198 :
デフォルトの名無しさん :2007/04/10(火) 10:38:06
シャンテン数の前に役判定作れよ これ出来なきゃ駄目だろ
シャンテン数計算で役があるかどうかは関係ないっしょ。 役判定はこのスレで出てたベースにサービス関数があるから それにわたせばいい。
200 :
デフォルトの名無しさん :2007/04/10(火) 11:01:44
202 :
デフォルトの名無しさん :2007/04/10(火) 14:53:13
>>201 windowsよくわからないから、配列渡せば役、得点返すやつ作ってクレー
思うんだけど、シャンテン数がわかるのってそんなに重要? 問題は必要な牌の数だと思うんだけど。 最強の戦術は棒テン即リー状況次第でベタオリだと思うんだけど。 それならシャンテン数よりは孤立したのを落とすだけでいいよね? お前らもマージャンしててシャンテン数がわかるのがそんなに役立つときってあるか? 俺はシャンテン数は2ぐらいまでしかわかんないけどそれでも結構勝ててるぞ。 状況ってのは、たとえば先制リーチなら降りるとかあっちが先だけどこっちは国士13面だから攻めるとか。 どっちかっていうと期待値のどこらかで降りるか降りないかの閾値を設けてそれで判断するってので。
204 :
デフォルトの名無しさん :2007/04/10(火) 16:59:14
重要ではないが一つの達成目標にはなる
互いにプログラムを闘わせられる、通信API(プロトコル)が公開された麻雀サーバってあるの? それとも東風って、API(プロトコル)公開されてる?
206 :
デフォルトの名無しさん :2007/04/10(火) 21:23:39
サーバじゃなくてWindowsDLL限定のP2P対戦? まあ通信処理とか書かなくて良いから良いか。
209 :
リバーシ1 :2007/04/10(火) 23:02:54
いますよ
考えたんだが、このスレで実際のプログラムがなかなか出てこない理由は、
各自の技術云々よりも、作成したプログラムの評価をするのが難しいからだと思う。
では、それを簡便に評価する方法として「何切る?」を使うというのはどうだろう?
例えば
void eval(char answer[3] /*選んだ捨牌候補を3枚設定*/, char te[14] /*手牌*/, char dora/*ドラ*/);
みたいな形の捨牌選択関数を各自実装して、
http://www.geocities.jp/mitsuruakuukan/nanikiru.html のサイトとかから拾ってきた問題を、以下のように実行して総得点を比較するとか。
int main(void)
{
char answer[3]; // 捨牌候補
int total = 0; // 総得点
// 0x01-09 万子, 0x11-19 筒子, 0x21-29 索子, 0x31-34 風牌, 0x41-43 三元牌
{ // 問題1.
eval(answer, "\x03\x04\x04\x05\x06\x06\x07\x09\x09\x17\x18\x18\x27\x29", 0x42);
for (char *p = "\x18\x04\x29\x09\x27"; *p; p++) // 正解の捨牌候補一覧と比較
if (strchr(answer, *p))
total++; // 正解なので 1点プラス
}
// 以下同様に52問まで解かせてみる
printf("総得点は%dです\n", total); // 最終結果出力
現在の手牌だけじゃなくて、結局、他家の捨て牌、点数状況、ラス前何局か、親か、 といった全体状況がないと分からないでしょ。 しかも正確な強さの評価が難しい。 結局、半チャンを1万回ぐらいやらせて平均順位を見る、といった方法しか ないと思う。しかも結果は、 1位:平均2.154位、 2位:平均2.188位、 とかのものすごい微差にしかならない。おそらく。 強い麻雀プログラムを作るよりは ・最大のシャンテン数はいくつか ・最も上がりにくい配牌はどういった形か。 ・リーのみ、の手に載りうる裏ドラは最大いくつか、 といった問題を解くほうが、数学的には面白いと思うのだが。
212 :
デフォルトの名無しさん :2007/04/11(水) 01:41:16
>>210 問題とかすより1000曲くらい対戦させろ
213 :
デフォルトの名無しさん :2007/04/11(水) 01:42:19
> 数学的には面白いと思うのだが。 つまらん
214 :
デフォルトの名無しさん :2007/04/11(水) 01:43:30
216 :
デフォルトの名無しさん :2007/04/11(水) 01:54:10
>>211 強さが同じなら、順位は2.5になる
これを下回ったら弱い
2を切れたら圧倒的な強さだろう
217 :
デフォルトの名無しさん :2007/04/11(水) 02:01:16
rateを導入するか、仮想の金を導入して稼げたやつが強いってしたらどうだ
218 :
デフォルトの名無しさん :2007/04/11(水) 02:04:27
麻雀マンガとかだと、平均順位よりは、総合得点で競ってるから、 その方がいいかもね。
220 :
デフォルトの名無しさん :2007/04/11(水) 02:08:53
>>219 僅差でも、勝った方が強い方とした方がいい
競馬でも、2位は駄目だ 勝てば官軍だ
221 :
デフォルトの名無しさん :2007/04/11(水) 02:21:32
一試合 = 東風戦だな rateは、例えば初期値1500(万円)持ってて 4位が、1位に2(万円)支払い、 3位が2位に1(万円)支払うでどうだ? 750回連続で負け続けると破産
222 :
デフォルトの名無しさん :2007/04/11(水) 02:22:50
共通の通貨が設定してあれば、新参者(プログラム)が参加しやすくなるというメリットがある
223 :
デフォルトの名無しさん :2007/04/11(水) 02:38:00
一試合 = 一局にしないか 親というルールを無くすんだ 誰もが平等にする すると試合回数が多くできる
224 :
デフォルトの名無しさん :2007/04/11(水) 02:39:52
短くするほど、敵より速く上がる事が大事になってしまうな 戦略性がなくなるな
公式なコンピュータ麻雀大会、が欲しいね。 囲碁や将棋はあるのに、なんで麻雀だけないのかな?
麻雀は下賎だから。
231 :
デフォルトの名無しさん :2007/04/11(水) 12:01:51
賞金10万が最低ラインとして 参加費2000円が限度だとして 50人集まれば運営可能
大会っていっても、半チャン6回戦の総合得点、とかで優勝を決めるわけ? それなら見てる分には面白そうだけど、運の要素が大きすぎ。 じゃ、1000局対戦させて平均順位で、つーのも、 見てる方は、3時間ぐらい待ってるだけ、という味気なさ。 せいぜい、平均順位が1分単位くらいに変動するのを見て一喜一憂するだけでしょ。
>>231 参加費を賞金に当てると賭博行為になるから注意しる
以前、それで潰された大会がある
一位に渡すのは換金チケットorトークン的な何かにしておいて、それそのものの価値は換金できる以外にないようにしておいて。 後日それを買い取るという名目で賞金を支払うor振り込むといいんじゃないかとおもった。
それなんてパチンコ?賭博行為にならなくてもヤーさんや北朝鮮に睨まれる方が怖いと思われ。
つか、仮に大会開いてもどうやって勝敗を見るんだろうね。 一応千回ぐらいは同じ同じ面子で打ち続けてってのを参加者分だけ繰り返すんだろうか? 一回二回じゃ強さは運に左右されちゃうから大変だよな。 画面を出力しないとしてもどれだけかかるんだろう・・・
237 :
デフォルトの名無しさん :2007/04/11(水) 21:23:40
サーバーに登録すると、ランダムに対戦者を選んで対戦してくれる 例えば、参加期間は7月1日からとかにして 元々1500 rate持ってて、2000 rateを初めて達成したものの勝ちとする 4位が1位に2 rate 、3位が2位に1 rate渡す その日の対戦成績をネットにアップ
238 :
デフォルトの名無しさん :2007/04/11(水) 21:25:39
すべて同じ強さだと、いつまでたっても終わらないかもしれないが 平均順位が2位くらいのプログラムがあれば500試合もすれば優勝者が決まる
プログラム組む前に議論する事か? 誰かがプログラム組んでから議論したら?
そうだね。じゃあ組んで。
自動的に何百試合もするのは結構だが、判定にバグが無いかは誰がチェックすんの?
>>241 ログを取っておいてあとで人間がチェックすればいいじゃん
リアルタイムにやるか後でやるかの問題じゃなくて、何百試合分人間がチェックするの?
基本的には判定ルーチンを信用して、 牌譜を公開しておけばいいと思うよ チェックするのは当事者の自由、ということで
245 :
デフォルトの名無しさん :2007/04/12(木) 18:23:15
サーバプログラムを後悔すればよい
なんだかんだ言っても、結局株ロボみたいになって盛り下がると思うよ。
競馬予想とかw
248 :
デフォルトの名無しさん :2007/05/07(月) 14:24:53
>>248 開発が止まっているのと、オートでぶんまわすような用途としては使いづらそうなのがネックなんだよな。
今perlでちょろっと向聴数判定から書いてみているのだが、これはこれで速度的に辛い気がしてきた。。。
250 :
デフォルトの名無しさん :2007/05/08(火) 04:46:19
シャンテン数計算ができたとしても、シャンテン数落として高め狙いにいく場合など 考えるともうキリがないな それこそシャンテン数計算が意味のないことになるかも 将棋みたく項目ごとにポイント割り振ってトータル点数の高い手を選択するようにすべきか
>>250 >それこそシャンテン数計算が意味のないことになるかも
それは最初から分かっている。
>>250 向聴数が分からないと、向聴数が落ちるのかどうかも分からないだろ。
向聴数は、七対と国士と一般的な和了り形の三つで独自に計算して最も小さい値を適用するようにすればいいんじゃね? 一気に調べるのは不可能だと思うな。
実戦じゃ国士やチートイを狙うかどうか決めてからじゃないとこれらの向聴数は 参考にならない気が
国士は配牌で行くかどうかの閾値を決めておけばいいだろう。 たとえば、点数が20000以下で配牌が九種九牌以上なら国士無双を狙うとかね。 七対については、普通の役を狙っていると、もしくは配牌から対子の数が四つ以上になったら狙うとかね。 もちろん、この基準はどうでもいいんだけど
ちぃ問いは普通の役と天秤にかけるから
>>254 それを決めるためにも向聴数が必要になるんだよ。
人間も配牌見た瞬間に(正確ではないにしろ)国士狙いなら6向聴、七対子なら4向聴で、メンツ手なら3向聴。だからメンツ手で進めていこうという流れで手の方向を考えるだろ?
判断を下す以前の基本情報として必要だろう。
何故、意味が無いとか参考にならないなどと思うのか。
>>257 >判断を下す以前の基本情報として必要だろう。
>
>何故、意味が無いとか参考にならないなどと思うのか。
向聴数を求めるためのコストと
向聴数というものが与えてくれる情報の価値とを
天秤にかけた場合、どうしてもコストの方が高すぎるから。
>>171 参照
>人間も配牌見た瞬間に(正確ではないにしろ)国士狙いなら6向聴、
>七対子なら4向聴で、メンツ手なら3向聴。
>だからメンツ手で進めていこうという流れで手の方向を考えるだろ?
それはいわゆる「決め打ち」だろ? 初心者の打ち筋だね。
>>171 って
それはいわゆる「総当り」だろ?初心者のアルゴリズムだね。
多少枝狩りしても、重いことには違いない。 麻雀では最悪5向聴までありえた筈だし。
>>258 決め打ちといえばナルミだな
23578リーチの3連荘はかっこよかったな
向聴数を求めるためのコストってそんなに高いか?
>>258 > 天秤にかけた場合、どうしてもコストの方が高すぎるから。
>
>>171 参照
これは無い。
メンツ、塔子を数えれば向聴数は分かる。
>>193 見れ。
普通に1ミリ秒以下で求まるよ。
> それはいわゆる「決め打ち」だろ? 初心者の打ち筋だね。
小島武夫に謝(ry
えー、人間は無意識のうちに、向聴数に基づいた判断をしてるでしょ。いい配牌だ、とかそんな感じで。
そういう人間が無意識にアバウトに行う判断を、コンピュータにやらせるためには、結局向聴数という形で計算してやる必要があるってこと。
もちろん他にも色々判断材料を用意する。
だけど、じゃあ向聴数は考えなくても良いかというと、そんなことにはならないだろうと考えてるんだよ。
>>263 いや、
>>193 の方法では完璧なシャンテンスウは求まらないよ。
揃っていないチンイツを正確に判断できないだろ?
>>264 手許で実験してみたけど、普通に出来たっぽい。
清一向聴数当てゲームとか勢いでこしらえてみたけど
超面白い。JavaScriptに今移植中。
perl -e 'print "ロン!\n";'
WScript.Echo("御無礼");
268 :
デフォルトの名無しさん :2007/05/09(水) 19:43:45
System.out.println("あ、すまん。少牌だこれ");
>>265 「実験した」って・・・?
だって、まだソースは上げられていないだろ?
ああ、失礼。
>>265 =
>>193 なのね・・・
で、1万局ランダムでテストパターンを作ったらしいけど、
それ、ちゃんと全て「正しい向聴数を求めている」事を確認したの?
>>270 193じゃないよ。
アイデアだけパクらせていただきました。
でも、たまに張ってもいないのにダブリーとか
勝手にしやがってたので今デバッグ中。
もうね、手段が目的になっちゃって楽しすぎ。
>> 271 だめじゃんw 面子多多の場合とかの処理が結構難しいんだよな。 良かったら、判定ミスった時の牌姿を張ってくれまいか? > もうね、手段が目的になっちゃって楽しすぎ。 激しく同意。
お、久しぶりにのぞいてみたらスレ活発じゃん。 鯖の枠組みだけ作ってあってクライアント作るのまんどくさくて放置してある奴見直してみようかな。
向聴数求めるの難しいよなぁ
俺も興味ある。清一の時に正しく求められないって例えばどういう状態?
>>275 多分
>>264 の話だと思うが、
そんなの実際にソースを出さないと
議論にならないだろ?
正直、シャンテン数なんか求めても仕方がなくて 「高得点で上がれる確率」 を求める方がより本質的。山に1枚しかないイーシャンテンより 山に16枚あるリャンシャンテンの方が価値があるし。 。。。でもシャンテン数は正確に求めてみたいんだよな。
>>277 シャンテン数を求めずにどうやってイーシャンテンやリャンシャンテンを知るんですか?
シャンテン数を求めずにどうやって有効牌を知るんですか?(有効牌=シャンテン数を下げる牌)
1シャンテンや2シャンテンなら力任せでも分かるし、 メンツ分解型の手抜きの方法でも十分な精度は出るでしょ。 それこそランダムにツモ、捨て、を繰り返して1万回ぐらい試行してみて 最高得点の捨て牌を選ぶだけでも正しい捨て牌はかなりの確率で得られる。 捨てるときに多少メンツを崩さないように考慮してやって。
>>279 =麻雀に限らず何のコードも書いたことないやつ
>それこそランダムにツモ、捨て、を繰り返して1万回ぐらい試行してみて
>最高得点の捨て牌を選ぶだけでも
これ今現在のパソコンでやっても将棋並の思考時間になるのかな?
>>279 試してくれ
>278 でもシャンテン数を下げない有効牌もあるよね(有効牌って言葉の正確な定義は知らないけどな!) 待ちの切り替えとか
>>282 どうやって向聴数が下がらないことがわかるんだ?
なんとなく向聴数数えられるようになった気がする。
バグが残っているかのテストが難しいな。
>>283 >どうやって向聴数が下がらないことがわかるんだ?
だからぁ、「有効牌=シャンテン数を下げる牌」とは限らないって話だよ。
プログラム上は、それが有効牌であることが分かればよい。
向聴数が下がる有効牌の定義が決めたいなら黙って定義をたくさん用意させてたくさんの試行をさせて統計学的正解を求めればいいじゃない。 それは枠ができてからの話でしょ?今は関係ないよ。
スタティックにその牌列で点数つけて評価、でいいじゃん 上がりやすさも評価点数に入るだろうから、シャンテン数も考慮されるだろうし
287 :
デフォルトの名無しさん :2007/05/28(月) 08:21:12
Perl読めないけど乙
パールで書かれてもな、せめてC言語かDelphiで頼むw
290 :
287 :2007/05/28(月) 08:57:15
Perlの勉強中だったのでPerlで書いた。後悔はしていない。 他の部分も書き始めてしまったので後戻りできないです。 Cが読めるなら大体分かると思うが。。。(´・ω・`)
291 :
287 :2007/05/28(月) 22:51:09
反応がなくて寂しいので、Cで書き直してる。。。 C鬼のように速えええええ
292 :
287 :2007/05/29(火) 22:01:56
http://gamdev.org/up/img/9535.zip Cで書き直した版。ソース汚いのは勘弁してくれ。コンパイルは自前でお願いします。
windowsではこんな感じでc++としてコンパイルしないと通らないみたい。
cl /TP shanten.c
vc++2005 express edition付属のcl.exeでコンパイル、動作確認済み。
反応全然ないなw
ま、しかし乙。
まず、拡張子がcppじゃないとVCでは通らないよ。
と思ったらすでに書いてあるのか。
メンツ分解?タイプなのかな。
一部再帰が入ってるけど何をやってるのかよくわからなかった。
>>187 のチンイツとかもちゃんと判定してるようだし
いくつか試したけど例外は見つけきれなかったな。
作った本人ならわかると思うけど、どういうケースで間違うの?
あとmeldって何の略?
294 :
287 :2007/05/30(水) 09:21:00
>>297 おお、見てくれた人がいた。トンクス
linuxではcとしてコンパイルできるのにな。拡張子変えてもらってももちろんOK。だとおもう。Cはよくわからんので。すまん。
再帰の中では、基本的に以下のような処理を、一つの数牌(1-9)のセットに対して行ってます。
この関数は、そのセットから最も効率よく面子、塔子を取り出せる組み合わせを見つけ出し、その組み合わせのスコアを返します。
スコアは、単に面子がたくさん取れたほうが良い、というレベルのもの。if文の数減らすために4桁の16進数の各桁に割り当てる形で一つの整数にまとめています。各桁は(面子の数)(対子含む塔子の数)(対子の数)(単独牌の数)です。
関数内の流れは
・ある牌を基準に、その牌を含む全ての牌の組み合わせ(嵌張、順子、等。単独牌も。)を取れるか判定
・・駄目なら、基準を変更
・その組み合わせをセットから取り除き、再帰
・帰ってきたスコアに、今回取り出した組み合わせのスコアを加算
・他の組み合わせを取り出した場合と比較して、より高いスコアを採用してreturn
repeater変数による処理の振り分けは、単に重複した取り出し方を行わないため。
えーと、必死にデバッグしたので、今のところ特に間違えるケースは無いと思う。
まあ、多分なにかあるとは思うけど。見つけたら教えてくれ。
meldは略じゃない、立派な英単語です。俺も初めて知ったけど、トランプ用語で得点になる組み合わせとかそんな。
>linuxではcとしてコンパイルできるのにな。拡張子変えてもらってももちろんOK。だとおもう。Cはよくわからんので。すまん。 gcc, icc, sunのccはc99だけど、VCはc89だからな。
meld[1, verb] transitive verb : to declare or announce (a card or combination of cards) for a score in a card game especially by placing face up on the table intransitive verb : to declare a card or combination of cards as a meld meld[2, noun] : a card or combination of cards that is or can be melded in a card game
>>294 一つ一つの牌姿を人間が確認するのは骨が折れるから、
benchmark関数の中身をいじって、平均シャンテン数を出すようにしたんだけど、
結果がおかしいよ。
ランダムは13枚のハイパイの平均シャンテン数は約3.79なのに、
このルーチンに食わせると3.415付近の値が出てくる。
benchmark関数をいじった部分は以下の通り。
int i; → int i, sum = 0;
shanten(tiles,res); → sum += shanten(tiles,res);
printf("average = %f\n", (double)sum / (double)repeat_times);を追加
>>297 その3.79はどっから持ち出した数字なの?
ランダムじゃなくて全通り出せばいいじゃん
303 :
287 :2007/05/30(水) 14:39:52
>>297 なるほど、それは良いテストですね。で、確かに理論値より良い数字が出る模様。
ただ、アルゴリズムの問題で悪い数字が出ることはあっても、良い数字が出るというのは考えにくい。
で見てみたところ
>>300 氏の疑念通り、ランダムの手牌の生成方法に問題があったようです。。。
今のバージョンだと、対子、刻子が作られやすくなっていました。
これを修正すれば、理論値にほぼ一致した解が得られることを確認しました。夜に修正版をアップします。
見てくれた方、特に
>>297 氏、
>>300 氏サンクスです。
ああ、そうか、シャンテン数の計算ルーチンにばかり気を取られて、
ランダムハイパイ生成ルーチンで34の余りを取っていることに全然気づかなかったwww
int deck[136]; // 全部の要素に1
for(i=0;i<13;){
int rnd = rand() % (opt_chin ? 36 : 136);
if(deck[rnd]){
buf[i] = rnd/4;
deck[rnd]--;
i++;
}
}
ってな感じに修正したらいいのかな?
それにしても素晴らしく速い方法だなあ。
>>1 のリンク先で説明されているルーチンより速いね。
あと、非常に細かいことなんだけど、ルーチンってloutineじゃなくてroutineだね。
306 :
デフォルトの名無しさん :2007/05/30(水) 15:30:38
場と牌牌を渡したら点数を計算するルーチン作って欲しい
307 :
287 :2007/05/30(水) 20:40:22
>>292 のソースにしらみつぶしに完全解を求めるルーチンを追加してみました。
テンパイ判定は流用させていただいてます。
http://gamdev.org/up/img/9542.lzh で、以下の配牌でシャンテン数=0、と間違うみたいです。
mj : 8c 8c 9c 9c 9c 9c 1d 1d 1d p p w g
--------
checking for 13 tiles...
sorted_tehai : 8c 8c 9c 9c 9c 9c 1d 1d 1d P P W G
best mentsu :
mentsu | tahtsu | toitsu : 3 | 2 | 2
float suit | dead suit : 0 | -2
float honor | dead honot : 2 | 0
each shanten:
mentsu | seventwins | kokushi : 0 | 3 | 7
shanten-suu : 0
"brute" とコマンドを打てば、シャンテン数2、までを10000回チェックするように
なってます。(705回目でエラーになります)
しかし、力任せはやっぱだめですね。シャンテン数3でほとんど使い物になりません...
完全解?
ブルートフォース
311 :
287 :2007/05/31(木) 10:47:24
>>308 理解した。
>>42 とか>171前後での話しを実装してみたということっすね。
和了りを見るルーチンも作って、きちんとやってみます。
で、バグ再現しましたー。9の槓子がある時に、隣の色の牌を見に行ってしまうケースがあったようです。
Perlの実装では配列のコピーを使ってたので、見なくて良かった部分なのですが、移植した際に紛れ込んだようです。
八九(1)でヒトメンツだよねってどこの初心者だ。
直しました。
・9の槓子がある場合のバグを修正
・和了りを見るようにした
・
>>308 さんのコードは、このままいただいてしまってよければ、これからマージします。
312 :
287 :2007/05/31(木) 10:56:17
313 :
308 :2007/05/31(木) 12:26:07
さっそくの修正、乙です。 マージしてもらえるならサンクスです。日本語コメントとか使ってるので 好きにいじちゃって下さい。
314 :
287 :2007/05/31(木) 19:04:31
通常の盤面ゲームと違って、 麻雀は確実に運が絡むゲームだから 牌効率と手役の得点の期待値をとって その中で優秀なものを選択していくということをベースにして、 その選択プロセスを状況によって適宜スイッチできる というのが、論理的に最強な麻雀プログラムということになるが 運が絡むので、半チャン10回や20回じゃとても最強かどうかの判定なんてできない。 最後に行き着く先が確率論なゲームのアルゴリズムに 学者が本気で取り組むわけがない
>最後に行き着く先が確率論なゲームのアルゴリズムに >学者が本気で取り組むわけがない 馬鹿すぎw
>>316 >>315 じゃないが、開発には賛成だけど学者が本気で云々は正しいと思うぞ・・・
それに、あくまでもゲームだからどっちにしろ学者が本気になって取り組むとはどうも思えない。
「学者が本気になって取り組む」とはどういうことか教えてください。
技術屋ならともかく、学者が本気で取り組んでるものの大半が世間的にはくだらないものだぞ かえるの目玉に寄生するウィルスの研究とかな あやまれ 確率論に本気で取り組んでる学者にあやまれ!w ゲーム理論に本気で取り組んでる学者にあやまれ!w
|v|/, 彡 r´ | ヽ ヽ .\ _,,,─-、、 _ \ `'>,´| ,, --ヽ > ´ `ヽ `- ,/' / ノ′ ,|/|/,., L, ./ / 人 ノ_ ' '´'二´ノ | | ./'| 丶- ´'′ .ミ′ .'i';' `i ,〃6 6ヽ| |\ .| ≡丶.,人,,ノ | ガクシャ、ゴメンナ .| \| ____ ,,,,-)ノ .\ '|_ >つ_;;;/ ~''
>>314 ちょっとテストしたので一応報告です。
2シャンテンを3シャンテンと間違うケース
sorted_tehai : 1c 3c 4c 4c 5c 7c 6d 7d 8d 3b 3b 6b P
sorted_tehai : 3d 4d 5d 2b 4b 5b 5b 6b 8b T T S W
3シャンテンを2シャンテンと間違うケース
sorted_tehai : 3c 4c 6c 8c 3d 5d 1b 3b 4b 6b N N N
3,4,5といった高いシャンテン数を正確に高速に求めるのは難しいような希ガス。
322 :
287 :2007/06/01(金) 07:06:33
>>321 確認しました。ありがとうございます!
・・・うあ。
下のは多分すぐ直る。
上のケースは・・・無理かも分からんね。
323 :
デフォルトの名無しさん :2007/06/01(金) 12:59:23
シャンテン数って、場に出ている牌を除外しないと実戦で使えないし使えないとおもうんだが・・・ 1万回、10万回とか試行して、あがりやすい捨て牌を選んだ方が良いと思うんだが・・・
思うだけかよ 具体的にどうやって試行するのかも書いてよ
325 :
デフォルトの名無しさん :2007/06/01(金) 13:35:52
>>324 ポン、カン、チー、場に対応した得点を計算するルーチンがあればCのソース作れるんだけど・・・
>>319 確率論に本気で取り組んでる優秀な学者はいっぱいいるよ。
そういう話じゃない。
「最強じゃんけんソフト」を作るようなバカなことに
賢い人は挑まないということ。
じゃんけんは完全に確率だが麻雀は違うだろ…
>>321-322 上のケースは、1c 3c 4c 4c 5c 7c を1メンツ(と単独牌3つ)とみるか、2ターツ+1トイツとみるか、ですね。
このプログラムではメンツ優先のために前者と見てるんでしょう。
この辺りを解消するよいアルゴリズムが見つかるかどうかですね。
>>323 1行目については仰る趣旨は解りますが、それはシャンテン数を数えた後でもよい話ですね。
シャンテン数だけで捨て牌は決められませんが捨て牌決定の重要なパラメータであるのは間違いないし。
モンテカルロは一つのアルゴリズムではあるけど、麻雀の場合は数学的に解いたほうが効率が良い気がする。
>>325 そういうルーチンがある、として書いてみれば?
面白そうなら誰か作ってくれるかもしれん。
まあ残り牌は決まってるんだから、しらみつぶしでいいと思う 枝刈りとかはいるだろうけど
331 :
287 :2007/06/03(日) 19:35:42
現実逃避して、wikiに麻雀牌表示するプラグイン書いてた。
>>329 麻雀の牌の組み合わせは、雀頭が絡むときにややこしくなるので、あらかじめ雀頭候補を抽出して場合分けすれば上手く行くとは思います。
>>331 がんがれw
さらに追い討ちをかけるようにバグ報告です。
3シャンテンを4シャンテンと間違うケース
sorted_tehai : 3c 3c 5c 1d 2d 4d 3b 5b 6b 6b 7b 9b P
sorted_tehai : 5c 1d 3d 4d 4d 5d 7d 1b 2b 6b 7b W R
>>321 の上と同じパターン?かな。
334 :
287 :2007/06/03(日) 20:34:50
>>335 このスレ的にはタイムリーでいいね。
丁寧に書いてあってわかりやすそうだし。
これ書いてるのは女性なのか。
337 :
デフォルトの名無しさん :2007/06/06(水) 16:36:23
役の一覧ということ? そういや晒すと1飜落ちるやつとか 書いてないみたいだしな
340 :
287 :2007/06/07(木) 01:11:05
>>339 超乙!!
自分のあのノーコメントなソースからここまで・・・
かなり感動してます。
あまりの変わりように理解し切れて無いですが、順子と雀頭の組み合わせ系については上手く取れるようになってるみたいです。すげえ。
先に字牌をカウントして、その後数牌については一気にやって、取りきった段階で雀頭のあるなしを考慮しつつ比較を行っている、という感じでしょうか。
ただ、dead何とかをつかってやってた四枚目関係の処理部分が抜け落ちちゃってるので、例えば次のような牌姿が正しく判定できなくなっているみたいです。実際は三向聴の以下の手牌
mj : ttttnnnnssssp
--------
checking for 13 tiles...
sorted_tehai : T T T T N N N N S S S S P
best mentsu :
mentsu | tahtsu | toitsu : 3 | 0 | 0
float suit | dead suit : 0 | 0
float honor | dead honot : 1 | 3
each shanten:
mentsu | seventwins | kokushi : 2 | 6 | 8
shanten-suu : 2
#自分は仕事が佳境に入って時間があまり無いのですが、役判定のルーチンをちびちび書いているので、そのうちupします
>>340 deadあたりが抜けていますね。失敗しました
それで
>>314 のソースを見ていて気づいたんですが、
1c1c1c1cttttnnnns のような形で間違えますね。
343 :
287 :2007/06/09(土) 21:58:07
>>342 おお。直ってるっぽい。
クリアするべき牌姿、問題がおきうる形がよく分からなくなってきたので、
>>342 をベースにテストを追加してみます。
しかし、随分コードがすっきりしたなあ;-)
おお? しばらく見てなかった間に具体的な話になってきているね
345 :
デフォルトの名無しさん :2007/07/04(水) 08:11:06
>おお? >しばらく見てなかった間に具体的な話になってきているね からカキコミなし
ワロタ
347 :
デフォルトの名無しさん :2007/07/20(金) 00:17:29
役判定が出来れば期待値計算も出来るぞ 使用に耐えうる速度が出るかは疑問だけど(妥協が必要)
数年前に、この板と同じような名前のスレで実際に数人が麻雀AIを作製し 「麻雀シミュレータ MJSim」(以後MJSimと略す)と言うAI同士が対戦するプログラムが有り、 何万回も戦いを行い、その結果も公表されていました。御存知でしょうか? もし、AIを実際に戦わせたいのであれば、「MJSim」を作られた方に 再度公開してもらえれば良いかもしれません。 「MJSim」はC言語でソースごと公開されたいました。 「MJSim」は各AIをDLLの形で読み込み必要な回数自動で対戦をします。 出力は東風の雀譜形式でテキストに出され、Toolを使い試合の動きを目で見ることもでき。 また、各種の強力な分析Toolで分析も出来ました。 そのとき作られたAIは MJAI_NON MJAI-253 MJAI-003 MJAI-283 MJAI-302 MJAI-395 Ryoko252 モンテカルロ 七対子のみ 西家 等々でした。
351 :
349 :2007/07/20(金) 21:40:01
昔そのAIを作った一人です。もう参加するつもりも無かったのだけど、書いてしまったので。
多少なりとも、参考になればと過去の経験を書いてみます。もし多数がウザイと思ったら
終了します。
>>349 の公開された物は総て持っています。
>>350 の物は持っていません。
その1
>>349 >役判定が出来れば期待値計算も出来る
について。
1.麻雀に勝つということは自己の手だけ_見て、最良の手を行ってもあまり強くは無
いと思っています。順目・立風・風・自風・順位・自己及び他者の点数・他者の聴牌状況
(リーチ等)・河の状況・ドラの状況・他者の泣き状況、等を考慮した期待値が計算
ができればいいのですが非常に困難な物です。
これらを多少考慮したAIを作りましたが、パラメーターが膨大となりとても最適化
できない状況に至りました。
2.自己の手だけ見た期待値計算でも、リャンシャンテンぐらいなら有意の時間内で
可能かもしれないが、サンシャンテン以上は時間的に難しいかもしれません。
問題はサンシャンテン以上の時、いかに最適捨て稗を求めるかでしょう。
352 :
349 :2007/07/20(金) 22:04:37
その2、相手の手を読むについて
麻雀の本にステ稗から、相手の手を読む方法等がありますが、それをプログラム的に
解析しても、その状況における危険稗の重み付けがどのような物か想像が出来ません。
これも、その1で示したように、単なる計算で得られる内容より、その他の状況による
関連の影響が多いであろうと思います。
では、読む必要が無いのか? と言えばそうではなく。河から有る程度の稗の危険率が
計算できます。私は主に「とつげき東北HP」を参考に組み込んでみました。
これが良かったのかどうかは、定量的判断が出来ず、解析するに至りませんでした。
しかし、より前向きに危険率を計算できると思っています。それは、相手の手をモンテカルロ
方により可能な手をCPUパワーで計算する方法。これで、手の高さなりパイの危険率なりが
計算可能ではないかと思っています。アイデアだけで実装には至りませんでした。
>>349 の「モンテカルロ」と言うAIが棄て稗の判断にモンテカルロ法を使っています。
残念な事に一番弱い方法のようでした。これには理由がありますがここでは省きます。
しかし、相手の手を想像する方法としては良いのではないかと考えています。
353 :
349 :2007/07/20(金) 22:49:39
その3 麻雀シミュレータ MJSim、東風のようなネット麻雀、リアル麻雀の違い。 この3つは、多数の勝負をした場合、根源的な性質が表面化すると考えています。 それは、山の並びに現われてきます。前2者の山の並びはコンピュータのランダム 関数によって作られます。ランダム関数の性質をプログラマーなら御存知だと思います。 性能のいい乱数ほど、小さい範囲を切り取っても比較的ランダムになっています。 これは一様乱数と表現しています。いわゆる、コンピューターの宿命として一様乱数で 作られた山は、一様にバラバラになっているのです。バラバラ差に偏りが少ないのです。 MJSimで数多くの試合をしました。 ふと、上記点に思いつき、一様ランダムな山牌に完全固定ロジックのAIが4人・・・ 何千回何万回をやって・・・・・・この結果に意味があるのだろうか? 東風のようなネット麻雀 山は一様ランダムだが4人は人間であり固定処理は出来ない。しかし、「とつげき東北HP」 を代表とするネット麻雀の解析データーは一様ランダムな山を元に解析されている。 その解析結果は一様ランダムなコンピューターの性質を引き継いでいる。(影響されている) リアル麻雀 詰れた山も人も、けっこう偏っている・・・・・ この疑問に気がついたとき、AI作製の定量的判断に疑問をもちAI作製が終わりました。 補足、MJSimの場合最も強いのは、自己の手だけを見て、最も速く上がる可能性を選ぶ AIが一番強いのではないかと、私は感じてしまいました。これを戦術とするならば。 場全体を評価する戦略にどんな意味があるのだろうかと・・・・・まったく意味が無いとは 思いませんが、結果的に強さにあまり差が無い事を見た私は・・・・・落胆が・・・・ これは、誰かに理論的に否定してもらいたいと思います・・・・
最後に、その後の私。
麻雀板では、麻雀は運か実力か、が激しく議論されています。
その後、私は運派に変わりました。なぜかって?・・・・(板違い。
実力派に変わるような議論を皆様に期待します。
>>354 ごめ、他人のソースを晒す事は私にはできません。
>>355 昔のプロが一発・裏ドラをなくせば初心者との差がなくなる
と言ってましたね。ルールをかえればよいと思う。人気もなくなるけど。
357 :
デフォルトの名無しさん :2007/07/21(土) 16:47:19
乱数を付け替えられるように設計すればいい DLLの形で渡せばいっぱい対戦できるやつをつくろう
>>355 麻雀が運に左右されるのは当たり前、でもそれは人間同士の場合でコンピューターなら話が違う
コンピューターなら対戦相手全員の手牌をある程度確率的にはじき出せるし、確率的にもっとも最善の手を打つことも可能。
高度な確率統計の数学とゲームの理論、さらに麻雀の定石を駆使できればトータルで言えば無敵になれるはず。
(リバーシでは人間はコンピューターに勝てなくなったそうだ)
リバーシにはランダム性が全く無いから比較はできないと思うよ。 何回も言われていた内容である気はするが… 唯一の最善アルゴリズムが存在する事は自明ではない。 (存在しない事も自明ではないと思うが、だぶん存在しないだろう) 仮に「最善」のアルゴリズムが存在するとして、それをAとする 相手が常にAに従うを使うことを知っていて、かつAの内容を全て把握していれば それがA使用者の手を確率的にはじき出すための情報源になり、情報が多いぶんA使用者よりも有利になれる 適当過ぎて証明になっていないが、こんなイメージで。
将来、麻雀のパラメータを完全に解けてしまったらジャンケンの予想プログラムになるだけだもんな。 競馬予想も似たようなものだろう。 趣向とか体調とか心理状態とかそういうものに大きく左右される。
361 :
349 :2007/07/21(土) 23:21:29
>>357 >>乱数を付け替えられるように設計すればいい
50個ぐらいの計算式が違う乱数計算式を使って、1つずつの出た値を使えば、50個内は
偏った乱数が出るかもしれませんね。コンピューターの乱数の歴史は、いかに綺麗に
散らばった乱数を作るかで発達したような物。乱数評価は偏りを見つけ無くすように発達。
その結果、綺麗な一様にバラバラな乱数が・・・・
なぜMJSimで最短上がりを目指すAIが強いのか。
1.山が確率に近いように綺麗な乱数だから、AIが予測する一番可能性の高い(確率の高い)
予測結果に素直に山が答えている。偏った山なら、予測より外れる可能性が高くなる。
AIと山の親和性が高い。
2.4人に配られた手が、一様にバラバラな手配なので、似たようなシャンテン数や手配構造
が似やすくなる。 とても良さそうな手、とても悪そうな手になるバランスが多少少ない。
手配の均一化・・・
3.2.と同じようですが、ツモ牌の進み方も一様乱数で似たような雰囲気になりやすい。
これは、うがった見方だと思われるかもしれませんが、少ない試合ならまず表面化しないでしょう。
数千数万回の試合を定量化した場合、無視出来ないと考えています。
PS.上の50個の乱数の案では、予測できない偏りが発生する可能性があります。
>>361 ふーん、やっぱり最短で上がりをめざすのが強いのか。
とつげき東北さんが書いた本では
「好形なら迷わずリーチ」「手代わりを待つな」
と、棒テン即リーを推奨してたのだけど、本当なんやね。
1.牌自身の評価関数(一つの牌の価値、面子構成としての価値など)
2.向聴UPの為の有効牌数
これだけで結構捨てる牌の候補は立つ
>>353 デジタルとしての麻雀の理論の完成としては確率→期待値計算だろう
どの上がり点を目指しても期待値が同じ事はないから(特殊な計算方法だから)
もし上がり点よりも上がり早さの方が期待値に効果があるとするなら早上がり有利だと思う
自分の妄想では上がり点3900辺り(かそれ以下)が最善解な気がする
局平均1000点位になるから、そうすると最速=最強の可能性もw
(4人リーチ麻雀、赤含まず、ドラ裏ドラ含む)
365 :
349 :2007/07/21(土) 23:59:53
上のほうで、シャンテン数を計算するプログラムが有るけど。下記と方法が違うかな? 手配構造=「頭の有無、面子の数、対子の数」 手配に存在する手配構造を総て抜き出す。 手配構造から簡単な計算式でシャンテン数を計算。 一番小さいシャンテン数をその手配のシャンテン数とする。 上記方法の利点は、手配を分析した手配構造から、数ステップでシャンテン数が出ます。 よろしければ参考にしてください。
366 :
デフォルトの名無しさん :2007/07/22(日) 00:22:31
乱数系を固定しておいて、勝率を出してみて 独立した別の乱数系でも、同じ勝率ならばそのプログラムは実戦でも使える可能性が高い ちょんぼをしなければ、人間が混ぜるのも、機械が混ぜるのも、 疑似乱数を使うのも違わないだろう?? (ただし、一回限定に限る) 回数を重ねれば、疑似乱数ではそれにフィットしたプログラムが強くなる
367 :
デフォルトの名無しさん :2007/07/22(日) 00:25:57
捨て牌と、鳴き牌など見えている牌から、どの役で上がれそうかは確率が出せる 一番上がりやすい役と、その得点を掛けた、期待値の高い手を指せばよい
>>367 言うだけなら誰でもできる。
>>367 はプログラマーじゃなくて営業ですか?
そうでなければ、可能なロジックを出してくれw
特に下記の点をよろしく!
>どの役で上がれそうかは確率が出せる
369 :
デフォルトの名無しさん :2007/07/22(日) 02:03:45
乱数を自前で用意して、必ず天和 or 地和 でアガれる配牌にすればよい。
人和もお忘れなく
371 :
デフォルトの名無しさん :2007/07/22(日) 02:09:07
>>368 まず14枚をランダムで配る
もし、役が出来ていたらbreakする
残り牌の中から、一枚ランダムに加えて、どれか一枚を捨てたら
役が出来るなら、その駒に役の得点を加算する
役が出来ていないならば、もう一枚加えて、どれか二枚を捨てたら
役が出来るなら、その駒たちに、役の得点/2を加算する
これを1万回くらい繰り返すと、役が揃いやすい捨て牌に得点が集まる
同様にして、相手のリーチなどがあったときは、自牌と見えている牌を
除いたものからランダムに14枚選び、役が揃うならその牌に得点を加算する
すると危険牌に得点が集まる
372 :
デフォルトの名無しさん :2007/07/22(日) 02:12:08
捨て牌と、危険牌の求め方を書いたぞ 確率的には最善だと思うが どうか
373 :
349 :2007/07/22(日) 02:19:42
正直
>>367 ような人がいるからデスマーチがなくならないと思われ。
ちなみに計算してみる。手配が配られた状態の親の開始。
牌の種類=34
牌の数=34*4=136
見えている牌=手配13+どら1=14
見えない牌=136-14=122
ツモ予測 = 34種類(確率付き)
棄て牌 = 最大14種類
1回のツモ棄てのパターン=34*14=476
全部違う牌でもないし枝狩りをしたとして、棄てるのが3種類あったとしよう。
うーーん、3種類まで落とす枝狩りは、けっこう大変なのだが、
>>367 さんには
出来るとして。
1回のツモ棄てのパターン=34*3=102種類の手パターン (けっこう減ったな)
もちろん此れでは上がり役がわからないので次のツモを = 102*102 = 10404
10404回、余裕で計算可能。
10回積もってもまだ総てのパターンが見えないな・・・104の10乗=とても多い数
見えない牌の種類は34種類だけど同じ牌をツモるのも想定しないと。
適当に70回ツモをすれば良いかも。
(注意:他家のツモがあると言う人がいるかもしれないが、見えない牌での総ての
上がりパターンを読むと言う命題において、残りの122を使用した計算が必要である)
104の70乗・・・計算できない・・・100の70乗だと 1000・・・000 (0が140個)
うむ、ちょっと無理かな。
きっと
>>367 はツモ棄てなんか要らないと言うかもしれない。
でも、モンテカルロ法が最弱なのを理解していたら、そんなことは絶対に言わないと信じている。
374 :
デフォルトの名無しさん :2007/07/22(日) 02:21:13
数牌11112255777を、 4 2 0 0 2 3 0 0 と表して これを5進数に対応させると、数牌は、0から5の9乗で表せる あらかじめ、役があるかないかを記憶しておけば計算が速い 244Kバイト程度あればすべての場合を登録できる
375 :
349 :2007/07/22(日) 02:24:38
>>371 おお~~既に回答が出ている。
しかしだ、まあ、方法は違えど
>これを1万回くらい繰り返すと、役が揃いやすい捨て牌に得点が集まる
まったく計算がおお甘すぎる。
正確に計算してみて。
376 :
デフォルトの名無しさん :2007/07/22(日) 02:24:56
>>373 モンテカルロが最強だ
プログラムしたやつが弱いだけだ
>>371 のようにやれば良い
基幹システムを作ってくれれば、プログラムするぞ
377 :
デフォルトの名無しさん :2007/07/22(日) 02:28:11
>>375 回数のことか?
例えば思考時間6秒で出来るだけ繰り返せばよい
高速化することが重要だ
378 :
349 :2007/07/22(日) 02:28:52
>>371 あ、その方法最弱のモンテカルロ法でした。
最弱である事が既に証明されています。
お疲れ様
麻雀は相手が居るんだからそれを無視して自分の上がりの期待値を最大化 してもダメだろ しかも相手が上がる(自分が振り込む/自模られる)事も考えるためには相手のモデル(早上がりを目指してるとか高い手を目指してるとか)を仮定する ことも必要になるだろうし そこまで考えたら普通の確率による期待値計算は余り有効じゃないと思う
>>367 了解しました。MJSim持っていますので。
そのインターフェースを公開します。 (そのぐらい良いと思われ)
それで、AIを作ってくださいな。
ちなみに、そのモンテカルロ法のAI作った人。MJSimを作った人なので、
技術力、理解力、行動力等、十分に信頼の置ける良い人ですよ。
381 :
デフォルトの名無しさん :2007/07/22(日) 02:34:15
>>379 一手進むごとに、見えている牌が増えるから再計算するんだ
そのときに見えている牌以上のことはわからない
相手の癖というものがあればいいが、わからなければ意味がない
駆け引きが有るからな。 他家の手も見なきゃいけないし、 可能なら他家のアルゴリズムや癖を見抜く のが、確率計算なんかより有効だったりする。 株ロボ大会なんてそれに近付いてる感じ。
383 :
349 :2007/07/22(日) 02:49:19
誰かUPローダ教えてください。 MJSim についてるサンプルAI(ツモって棄てるだけのAI)をUPします。 これを元に作りました。
ishでおk
385 :
349 :2007/07/22(日) 03:03:04
ish・・・・・ツールが無い。
386 :
349 :2007/07/22(日) 03:35:03
387 :
デフォルトの名無しさん :2007/07/22(日) 03:43:13
112233345のとき 123 123 345とそろうけど、始めに333を取り出すとそろわない
388 :
デフォルトの名無しさん :2007/07/22(日) 03:44:21
逆の場合もあるのかな?? 始めに345を取り出すと駄目な場合
389 :
デフォルトの名無しさん :2007/07/22(日) 03:47:00
>>386 開いてみたけど、windows プログラムとかわからないし開発無理そう
適当に作るから誰かコンバートして欲しい
390 :
349 :2007/07/22(日) 03:51:54
>>387 その場合、色々なパターンの手配構造データーを作ります
112233345
↓
構造1 構造2 ・・・・・・ 構造N
そして各構造を評価して最良を選びます。
もちろん33が頭の構造も作ります。
22が頭の構造も、意味が有るか無いかわ、評価によって変わります。
いわゆる枝がりです。
391 :
デフォルトの名無しさん :2007/07/22(日) 03:53:46
必要な情報は、ドラ指定牌、 親と子の、捨て牌と(見えている)ポンカンチー 自牌と、親子の情報と、場の情報 だけだろ???これに基づいて作ればコンバート出来るか???
392 :
349 :2007/07/22(日) 03:55:43
>>389 MJSimはDOS画面で動きます。Win関係が無いです。
DLLの構造定義はそのままで、DOSと思って作れば大丈夫です。
393 :
デフォルトの名無しさん :2007/07/22(日) 03:56:23
>>390 >>374 の様にして、枚数で頭を含む場合とそうでない場合を分けて
役が揃う可能性があるかどうかをあらかじめ判定しておこうと思うんだが
そろう可能性があれば厳密に求める
394 :
デフォルトの名無しさん :2007/07/22(日) 03:58:16
395 :
349 :2007/07/22(日) 04:05:45
>>391 う~~ん、難しいように見えますが。
DLLに関係するのはごく一部で、殆どが麻雀のためのデーターです。
MJSimAI.cpp内のCASE:部分を書くだけです。
麻雀に必要なデーターは思った以上に多く複雑なんです。
特にMJSimは東風をそのままシミュレートしたもので、
総てのパターンに対応していると言ってもいいほど素晴らしいです。
case MJMSG_TSUMO:
がツモった時の処理。
case MJMSG_REACTION:
が他家が棄てた時の処理
自分が南家の時。
親が棄てたら case MJMSG_REACTION: が呼ばれ。
ツモが来たら case MJMSG_TSUMO: が呼ばれ
西が棄てたら case MJMSG_REACTION: が呼ばれ。
北が棄てたら case MJMSG_REACTION: が呼ばれ。
この繰り返しです。
case MJMSG_GAMESTART:break; //東風戦開始時
case MJMSG_GAMEEND:break;
case MJMSG_KYOKUSTART:break; //局開始時
case MJMSG_KYOKUEND:break;
は試合の開始や終りです。
396 :
349 :2007/07/22(日) 04:11:08
いま、元のREADOMI読みました。 何となく良さそうなので、MJSim.EXEとサンプルによる試合が出来るものをUPします。 ちょっと時間をください。 多分明日には。
397 :
デフォルトの名無しさん :2007/07/22(日) 06:35:51
おまいら、数牌限定で、役が成立する可能性があるペアを求めようぜ 今作ってる
398 :
デフォルトの名無しさん :2007/07/22(日) 07:06:13
399 :
デフォルトの名無しさん :2007/07/22(日) 07:09:15
ソースコードの説明 まず、頭を含まない場合(牌数が3で割り切れる)に役が揃うか調べて その結果を使って頭を含む場合を求めて、最後に出力する
400 :
デフォルトの名無しさん :2007/07/22(日) 07:11:30
これを使えば、役が有無がすぐに判別できる
>>398 #define N 1953125
は5の9乗という意味なのか・・・・・・・間違っている。
数牌だけで考えるなら。
組み合わせ (27、3) = 2925 (これで3牌)
これが4セットで 2925の4乗 = 73198719140625 (これで12牌)
これに頭の2牌を追加するのだが、計算めんどいので
73198719140625 * 27 = 1976365416796875
頭の分が少しだけ余分に計算されるので少し引いて
#define N 1953125 これが間違い ↓ の回数ぐらい。
約 1、800、000、000、000、000 パターンぐらいあると思われ
ついでに全種類の牌を入れた場合の手のパターン数は。 組み合わせ (34、3) = 5984 (これで3牌) これが4セットで 5984の4乗 = 1282231197761536 (これで12牌) これに頭の2牌を追加するのだが、計算めんどいので 1282231197761536 * 34 = 43595860723892224 頭の分が少しだけ余分に計算されるので少し引いて 約 40、000、000、000、000、000 パターンぐらいあると思われ
>>398 このソース見るとリバーシスレの1を思い出す。
相変わらず成長してないな
wikiによると天和の確率は約1/33万だそうで。 それを考えると4.7%どころではないのでは? あと、全組み合わせは134C14じゃないの?
407 :
デフォルトの名無しさん :2007/07/22(日) 11:27:50
そんなことより聞いてくれよ
>>1 よ。
スレとあんまり関係ないけどさ。
この間、近所の吉野家行ったんです。吉野家。
そしたらなんか人がいっぱいで入れないんです。
で、よく見たらなんか垂れ幕下がってて、150円引き、とか書いてあるんです。
もうね、アホかと。馬鹿かと。
お前らな、150円引き如きで普段来てない吉野家に来てんじゃねーよ、ボケが。
150円だよ、150円。
なんか親子連れとかもいるし。一家4人で吉野家か。おめでてーな。
よーしパパ特盛頼んじゃうぞー、とか言ってるの。もう見てらんない。
お前らな、150円やるからその席空けろと。
吉野家ってのはな、もっと殺伐としてるべきなんだよ。
Uの字テーブルの向かいに座った奴といつ喧嘩が始まってもおかしくない、
刺すか刺されるか、そんな雰囲気がいいんじゃねーか。女子供は、すっこんでろ。
で、やっと座れたかと思ったら、隣の奴が、大盛つゆだくで、とか言ってるんです。
そこでまたぶち切れですよ。
あのな、つゆだくなんてきょうび流行んねーんだよ。ボケが。
得意げな顔して何が、つゆだくで、だ。
お前は本当につゆだくを食いたいのかと問いたい。問い詰めたい。小1時間問い詰めたい。
お前、つゆだくって言いたいだけちゃうんかと。
吉野家通の俺から言わせてもらえば今、吉野家通の間での最新流行はやっぱり、
ねぎだく、これだね。
ねぎだくってのはねぎが多めに入ってる。そん代わり肉が少なめ。これ。
で、それに大盛りギョク(玉子)。これ、最強。
しかしこれを頼むと次から店員にマークされるという危険も伴う、諸刃の剣。
素人にはお薦め出来ない。
まあお前は、牛鮭定食でも食ってなさいってこった。
>>406 うお、 失礼それが正しいです。
数牌だけの手のパターン数
全組み合わせは106C14 = 105710363656182610
総ての牌の手のパターン数
全組み合わせは134C14 = 3417374882384597500
失礼しました。
>>406 wikipediaをソースに使うのはよくない、あれは信用性まったく無いから。
あと誰もが基本的に雀頭+4面子を集めることが分かてるんだから、麻雀の場合手牌の全パターンを考えるのはあまり意味無いと思う、
どちらかといえばUNOとか大富豪の思考パターンに似ているかも。
410 :
398 :2007/07/22(日) 12:32:13
数牌の意味が違うんだ 3種ではなくて、1種の数牌だけを求めるんだ 一つでも役無しと判定されれば全体でも役無しと使う
411 :
デフォルトの名無しさん :2007/07/22(日) 12:33:43
一種の数牌のみの場合、
>>398 であってるのか??
412 :
デフォルトの名無しさん :2007/07/22(日) 12:42:14
数牌のもっとも個数が多いものを、11112222334444888だとすると・・・
これに
>>398 を使えばテーブルを参照するだけで、全体で役があるか無いか判別できる
有りとなったら、次に個数が多いものをチェック
3種ありとなったら、字牌と頭の個数のチェックをしてそれもクリアしたら厳密に求める
ここまで来るのは少ない為かなりの高速化が出来る
413 :
デフォルトの名無しさん :2007/07/22(日) 12:51:53
まず、個数だけで判別するのがいいな 三種の数牌の個数と,字牌の個数に対して いずれか3つが3で割り切りれ、一つが3で割ると2余る これを満たさなければ役は無い
聴牌チェックは簡単な方法があるから、それは不要だ。
>>413 約が有る無しの表現は辞めた方がいい。
役があっても上がれない場合もあれば、役が消える場合もある。
416 :
デフォルトの名無しさん :2007/07/22(日) 13:52:34
>>415 役がつく可能性だけを素速く求めたいってことなんですよ
役が付かないことが判れば直ちに調査する必要が無くなります
>>416 だから、役と言わずに、聴牌(テンパイ)とか和了(ホウラ)や上がり等の用語を使おう。
役の意味が違いすぎ。
419 :
デフォルトの名無しさん :2007/07/22(日) 14:04:46
麻雀知らないから、役を厳密に調べることが難しいだが・・・ 麻雀の標準的なルールが書いてあるところって無いですか?? ルールが違えば役の得点も変わってしまいます・・・
ロン!ドラ4
422 :
デフォルトの名無しさん :2007/07/22(日) 14:12:32
>>421 もっとシンプルに役が書いてあるところはないですか??
一番メジャーなやつで
424 :
デフォルトの名無しさん :2007/07/22(日) 14:57:43
425 :
349 :2007/07/22(日) 16:50:45
皆さんにお聞きしたいです。
MJSimのサンプルAIを見て作ってみたいと言う方はいますか?
本当に作ってみたい方がいればMJSimの動作環境をUPします。
麻雀AIはには大きく分けて2種類有ります。
1.手の内容を理解せず、純粋に待ちが一番高いと思われるのを選ぶAI
このAIは、とても単純で強いです。しかし、その他の事はあまり出来ません。
自分の手を理解して動いてはいないため、いろいろな操作が出来ません。
でも強いんです。
2.手を分析し、最良を見つけようとするAI。作るのはとても困難です。
>>349 でこの手法をしたのは私のAIだけでした。
正直完成させるのはとても大変な作業です。
しかし、役の分析や性格付け、泣きの対応、場の状況による戦略の組み立て、
降り牌の分析。等々が組み込めました。最適化する前に作製は終わりました。
1のAIプログラムは探せば見つかり簡単に作れるし、それなりに強いです。しかし、
そこから先があまりないのです。そのとても短いプログラムに込められたノウハウや
最適化には、尊敬の思いを強く感じます。メモリーの無い時代に作られた先人達の
凝集された知能の素晴らしさ。とても単純では有るが素晴らしき性能。
これを元にこの方向を超えるには、先人達の苦労を超える努力が必要です。
正直お勧めできないし、過去の環境で完成された高い技術は。一つの山です。
後は下るのか登るのかは分かりません。
つづく
426 :
349 :2007/07/22(日) 17:09:25
1の公開された技術を、1っぽ延長した、AIに私は苦しめられました。
今こそ明かしましょう。そのAIを分析し、機械語からアセンブラへ。
そして、コンパイラにより高度に最適化されたアセンブラから、
完全なC++ソースを作ってしまいました。これは研究のために行ったので
ソースやノウハウは公開されないし、それにも勝るAIを自身で作っているので
純粋に研究です。
その結果、皆さんに言えることは、今の環境での新しい技術を考えて欲しい。
2の手法で目を見張る物があるのは、下記のHPです。
デジタル麻雀論の次世代麻雀エンジン「雀-X」
↓
ttp://www.jan-x.jp/ これは、ほぼ私の方向と同じで、より完成された物だと思います。
私のAIは「雀-X」と似たような機能を持っています。
この方向で、AIとして麻雀を分析し、「とつげき東北」を越える、麻雀の
分析者となる事も夢ではないでしょう。
427 :
デフォルトの名無しさん :2007/07/22(日) 17:32:53
モンテカルロが最強なことは間違いがない
囲碁だとモンテカルロは9路板だとプロと互角らしい
囲碁は、最大指し手が80手ほどあってかなり大変だが
麻雀では指し手は14手しかない
その上、
>>371 の様にやれば、指し手ごとに勝率を求める訳では無いから
実質、指し手は一手のみと考えられる
モンテカルロが最強だ
モンテカルロ最強ふいた
430 :
デフォルトの名無しさん :2007/07/22(日) 19:07:00
あのー積み符300点の場合、外から点が追加されるんでしょうか?? それとも子が100点ずつ支払うんでしょうか??
モンテカルロ最強とかほざいてないで ちゃんとソースだせよ
433 :
デフォルトの名無しさん :2007/07/22(日) 21:30:07
>>432 まずルールが確定しないとソースが出来ない・・・
430はどこから300点出るのか教えてくれ・・・
>>427 モンテカルロ最強が間違いないと言いつつ、その理由は滅茶苦茶なあたり
やはりリバーシスレの1の匂いがする。
ageてるのも共通。
435 :
デフォルトの名無しさん :2007/07/22(日) 21:33:27
>>433 振ったやつから、積もれば全員からもらうだろ
436 :
役はこれでいいか?? :2007/07/22(日) 21:36:17
*付きは鳴くと1飜下がる ●一翻役 *リーチ *門前自摸 *平和 タンヤオ 海底撈月 河底撈魚 嶺上開花 搶槓(他の人がポンした牌を付け足してカンしたときその牌であがること) *一盃口 翻牌 三元牌、場風牌、自風牌のコーツ、カンツ一組ごとに一役とする ●二翻役 ダブルリーチ 対々和 三暗刻 三槓子 三色同刻 *三色同順 混老頭 小三元 *チャンタ *一気通貫 連風牌 コーツ、カンツ一組に対して二翻とする チートイツ 二十五符二翻で計算 ●三翻役 リャンペーコー メンゼンに限る *混一色 *純チャン
437 :
デフォルトの名無しさん :2007/07/22(日) 21:37:06
●六翻役 *清一色 ●満貫 7飜以下で基本点が2000点以上、40符6翻、人和のとき 2000点 ●ハネ満 8~9飜のとき 3000点 ●倍満 10~12飜のとき 4000点 ●三倍満 13飜以上のとき 6000点 ●役満(四倍満 8000点) 天和、地和、大三元、四暗刻、清老頭、大四喜、小四喜、字一色 緑一色 發を含まなければならない 国士無双 暗カンでもチャンカン可 九連宝燈 和了形が九連宝燈なら可 四槓子 雀頭の完成をもって和了とする
438 :
デフォルトの名無しさん :2007/07/22(日) 21:40:02
>>437 どっからコピーしたんだw
バンバンつけて数える人は今はもう年配にしかいないぞ
チューレンは和了形OKは役満だけど、ジュンチューはダブルでは?
440 :
デフォルトの名無しさん :2007/07/22(日) 21:44:35
>>438 ルールを確定させなければ、強いプログラムは作れないのだが・・・
日本プロ麻雀連盟競技ルールに基づくものなのだが 駄目なのか??
441 :
デフォルトの名無しさん :2007/07/22(日) 21:48:50
ダブル役満や、裏ドラ、槓ドラ、槓裏ドラは認めない方向でいこうと思うんだが・・ 運の要素に関わる部分は排除した方が強さが判る (日本プロ麻雀連盟競技ルールに基づく)
日本プロ麻雀連盟競技ルールってことは、一応公式ルールとして認められるってことか。 それ以外にも、~連盟とか、~協会みたいなのが存在するのかな?
ルールがほぼ確定したので、
>>427 が最強の
プログラムを作ってくれます
445 :
デフォルトの名無しさん :2007/07/22(日) 21:56:02
まずは、ルールを定めた文書をうpするので、それで問題があれば 修正していって統一ルールを決めようぜ!!!
>>441 そういうモードをつける、という方向なら構わないけど・・・
そもそも、その程度の運なんて全体の運からみたら
大した問題ではないんだよね。
なにしろ、配牌、自摸に関しては全てが運なのに。
あと、運を排除するよりも 運をも計算する 方がいい。
裏ドラ、赤5までじっくり考慮しての一打ってのは
戦略戦術に深みが出るよね
>>441 が言うとおり、運の部分はできる限り排除の方向でおk?
>>446 面白そうだし、牌の巡りが運だってのもそのとおりなんだが、裏ドラまで計算に入れるのってツラクネ?
人間同士でもそこまで考えてるやつもそうそう多くないように思うし。
最終的には、そこまで目指さないと最強とは言えないだろうが。
基本的なロジックが固まるまでは競技ルール遵守でいいと思う。 ある程度出来た段階で一般化(この場合裏アリ一発アリ)への 対応をしていかないと最強もクソも無いけど
今から人間に勝つためには、人間に出来ることと同レベルのことを やっていては追いつけないなわけで、プログラムにしか出来ないことを 軸に戦術(アルゴリズム)を立てることが重要だと思う。
>>450 そのとおりなんだけどさ。けど、
>>449 も言っているけど、現状基本的ロジックが固まっていないから、そこからビルドアップしていくほうが早くね?
そこからバージョンアップしていくほうがいいと思うんだけどなぁ
いや、人間を真似る事を基本にして、 各所でコンピュータの得意な事を取り入れるのが重要だと思う。
453 :
デフォルトの名無しさん :2007/07/22(日) 22:23:18
ルールの貼り付けとかウザいから 麻雀のルールくらい知ってる そろそろおまえらも何かプログラム出してみろよw
455 :
デフォルトの名無しさん :2007/07/22(日) 22:28:33
知ってても、細かい部分でローカルルールがあるだろ??? それをなくすためだ ルールを知ってるなら、ローカルルールに依存する部分だけ抽出してくれ
アルゴリズム追求という観点から見た、気をつけるべきローカルルールは ・喰いタン先ヅケの有り無し ・ウマ、トップ賞、箱下 ・一発、裏、赤、チップ ・連荘の条件、二翻しばりの有無と条件 ・半荘か東風か。 あと西入(南入)の有り無し、条件 ・あがりやめの有無 ・パオの有り無し、条件 競技ルールこそがローカルルール とも言えるので そこは十分注意した方がいい。 あと、役判定はどの役もON/OFFできるようにすべし。
それと、せっかく骨組みが出来たなら そこからサンマについての考察に分岐するのも 面白いので、136牌を固定値としない工夫も あったらいいかもしれない
458 :
デフォルトの名無しさん :2007/07/22(日) 23:17:26
ルールを決めないと勝負が出来ないだろ・・・可変ルールは難しい せっかくだからプロ(人間)と対戦可能なルールがいいだろ???
459 :
デフォルトの名無しさん :2007/07/22(日) 23:22:29
とりあえず、一種の数牌のみであがる可能性があるかを調べるルーチンを作ろう
>>398 にあるが・・あってるのか???
あと、
>>436 >>437 >>453 に基づいて、役の点数を出すルーチンを作ろう
二人が一致すればokだろう(簡単のためまず東場で親を仮定することにする)
>>458 プログラム上可変にしておいて
固定で研究すればいいだろ
461 :
デフォルトの名無しさん :2007/07/22(日) 23:35:00
>>460 そうしたいやつはそうすればいいけど・・・しかしルールは決定しなければ対戦できない
赤は別として一発、裏、槓裏ドラ、ダブルトリプル役満が無い麻雀なんてそもそも麻雀じゃないと思うんですが?
そのへん麻雀をやってる人間ならそれぐらい分かると思うんですよ、日本プロ麻雀連盟競技ルールなんかはっきり言って意味無い。
あと麻雀もローカルルールが無いようで雀荘ごとに違うようなものだから
>>456 に一般的なものを付け加えるなら
・大車輪、流し役満、十三不塔などの一般的でない役の扱い
・九種九牌を認めるか?
・国士無双のカン上がりは有りか?
・焼き鳥、割れ目を認めるか?
・食い換えを認めるか?
等々すごく有る、普通は「ありあり」で全部認めちゃうけど。
とりあえず競技ルールはまったく一般的ではないから考えるだけ無駄だと思う、
俺が理想だと思う最強の形は玄人の打ち筋+コンピュターの頭脳。
463 :
560 :2007/07/22(日) 23:46:58
昔作ったものは手牌から面子構成のデータにして役判定してて、 {刻子34+順子21種(+2枚組み:それぞれ34,24,21種)}^5通りくらい、を役判定に突っ込ませる これが普通だと思ってるんだけど。 で、字牌の対子とか、塔子を持つ三色(1枚足らずとか)を点数つけてやれば評価関数が出来る気が ・・・問題は面子構成が数十種類はできることなんだけど
464 :
デフォルトの名無しさん :2007/07/22(日) 23:49:38
・ウマ、トップ賞、箱下 ・一発、裏、赤、チップ 一発、裏、槓裏ドラ、ダブルトリプル役満 焼き鳥、割れ目 などは入れては駄目だろ??? 最強の雀士は、運が味方をするはずだという発想があるだろ??? 運とか、技とかはなるべく排除して対戦したものが最強だろう
>>462 上三つは普通にありなんじゃね?
焼き鳥・割れ目は微妙。
食いかえはどうなんだろ?ロジック組む上で、認めちゃうと結構ツラくなっちゃうような希ガス
466 :
デフォルトの名無しさん :2007/07/22(日) 23:57:32
配られた牌から、いかに役をそろえるかが大事だろう それには、運任せの一発逆転はなるべく排除した方がいいんだ 異常に得点が動くのは望ましくない 賭麻雀とかならば楽しみがあるんだろうけど・・・
花牌も入れたほうがいいですかね?ちょっとした遊び心で。。
>>462 九種九牌はリセット扱いで場の変動が柴棒のみなのでどうでもいいと思った。
十三不塔は アルゴリズムに無関係なので無視した。
役については、ON/OFFすればいいので書かなかった。
焼き鳥割れ目の考慮は さすがに一番最後でいいと思った。
食い換えと 国士の暗カンあがりは忘れてた。ごめんなさい
>>466 期待値の計算には一発は普通に入ってくる。
一発で積もれる確率は 上がり牌÷残り牌 だから
特に難しく考えなくても計算に組み入れることは加納。
裏ドラも同様に非常に簡単な式なので除外するのは
もったいない。
最初のうちは無視しててもいいけどさ、いずれは考えないとね。
470 :
デフォルトの名無しさん :2007/07/23(月) 00:08:57
>>469 追加することが簡単かどうかじゃないんだ
一発はまあいいとして、普通に考えて裏ドラが予測出来る可能性はほぼない
運が味方をするとか、ツキに見放されたとかいう要素は、強さ以外の部分であり無い方がいいだろ
>>466 ゲームの性格上、得点を手に入れる回数(局数)に限りがあるので
逆転するだけの得点および役 が要求される場面は結構多いと思う。
あと、終盤でのリーチでは 当然一発ツモの確率も上がるので
(相手に上がり牌を消化されてることを考慮しても、計算上は上がる)
それを戦術に組み入れることは強さの条件になる。
472 :
560 :2007/07/23(月) 00:11:02
何がドラか予測は出来なくてもドラの期待値は計算できます
裏ドラ乗せると中のみドラ16数え役満なんつぅものが出てくるからな。 ↑ 昔、哲也であったネタww
>>467 花牌は無視したほうがいい、使い方知らない人のほうが多い。
>>466 もう君はいいから、麻雀の基本を何も分かってない人間が何を発言しても無駄、
ぐだぐだ言ってないで自分の考える最強アルゴリズムを作れば良いだろ、
あと、ウマ、トップ賞、箱下、チップ、焼き鳥、割れ目は運とは関係ない実力が物を言うルールなんだけど。
475 :
デフォルトの名無しさん :2007/07/23(月) 00:15:43
>>471 だからその逆転は、強さではなくて運にかなり依存してしまうだろ???
打つ人の力ではなく、たまたま逆転出来たっていうのは、伝説の雀士とかならありだけど・・
それはたまたまの可能性が強まる
476 :
デフォルトの名無しさん :2007/07/23(月) 00:20:04
ルールを決定しなければ最強のやつは作れない 統一ルールを決定する事が重要だ
>>470 裏ドラの予測はできるよ。
たとえば、一通が出来ていれば裏ドラの乗る確率は
一通の色で見えてる数牌をXとすると (36-X)/(見えない牌-X)
残り8順とかなら見えない牌数は相手の手牌13×3+8×4+11とちょっと。
一通の数牌は20枚程度見えてるとして 16/90=17%
確定マンガン手に 裏を期待(=跳ね満)したときに 17%はデカイでしょう。
まあ実際にはもうちっと減って10%くらいだけどそれでもデカイ
>>475 逆転ってのは、きちんと狙ってやるんだよ。
いいから雀荘行ってきたら?
やっぱり麻雀はトップを競ってナンボだと思う。
細かいルールは何でもいいから、評価は順位点のみ、トップ1点、他0点にしようぜ。
479 :
デフォルトの名無しさん :2007/07/23(月) 00:22:16
あと、ルールは少ない方がプログラムが簡単になるんだけど・・・ 外すなら、運依存のルールからだと思うな
>>475 運と確率論をごっちゃに考えてませんか?
確率以上のことが起きることを 運 というんです。
481 :
デフォルトの名無しさん :2007/07/23(月) 00:25:47
>>477 裏ドラの付く確率は出せても、どんなあがりに対してもほぼ平等でしょ??
だからこれは運任せと言うんだ
確率を追求するということは、運という考え・信仰から遠ざかることなんだよね
>>481 だから、そこまで計算して、はじめて
・逆転する可能性が20%あるならリーチで攻める
・ないならもう1ハンつけるまで手を育てる
なんていうアルゴリズムが産まれる余地が出来るわけでしょ。
牌効率追求だけならこんなスレはいらないし、全部電卓で出来ちゃうよ。
484 :
デフォルトの名無しさん :2007/07/23(月) 00:30:19
>>480 指し手の実力に依存が少ない要素は削るべきなんですよ(簡略化と一発逆転を無くす為)
初心者が、天和だして後は適当で一位になっても実力は不明でしょ??
裏ドラが沢山付いて一位になっても実力は不明でしょ??
>>484 天和の確率は1/30万と言われている。(実際に計算したときはもう少し小さかったけど)
ただ、それは全員に平等に割り振られる期待値なので
計算上は省いてもいいし、逆転の要素にはならない。
しかも期待値としては32000/30万=0.1以下なので 誤差です。
486 :
デフォルトの名無しさん :2007/07/23(月) 00:36:47
>>485 だから、全員に平等に割り振られる要素は、はじめから入れない方がいいんですよ
初心者でも、上級者でも、その平等な要素があることで、初心者が上級者を
打ち負かすということが起こるわけです
487 :
デフォルトの名無しさん :2007/07/23(月) 00:39:33
はじめから、考慮する価値が低い(または平等に訪れる)要素は、 実現確率の有無とは関係なしに、減らした方が 簡略化と実力を計る為にいいんです
>>486 天和とかぷーtぅとかは無視してもいいんじゃない?
一発と裏はかなり影響力が大きいので無視できないけど
489 :
デフォルトの名無しさん :2007/07/23(月) 00:43:50
影響力の大きさでは無いんですよ 裏ドラは、初心者でも上級者でもほぼ予測不可能で、高得点がついてしまうんですよ
>>489 裏ドラは十分に予測可能で、勝敗に影響する得点の変動をもたらし
かつその発生条件をプレイヤーが選択できる
という話なんだけどなぁ。
491 :
デフォルトの名無しさん :2007/07/23(月) 00:51:08
どうやって見えていないドラ表示牌を予測するんだよ??? どう考えても誰にでも平等に起こるだろ???
492 :
デフォルトの名無しさん :2007/07/23(月) 00:53:56
かなり終局なら、見えている部分から確率は出せるだろうが そのときには、手牌を変更していく事は難しいだろ?? 変更可能だととしてもそれはたまたまだろう
>>491 見えてない牌 の種類と枚数がわかる。
次に、自分の牌を見て、裏ドラとなりうる牌の種類と枚数がわかる。
これらから、裏ドラが乗る確率がわかる。
494 :
デフォルトの名無しさん :2007/07/23(月) 01:00:31
裏ドラがつく確率が求まるかどうかではないんだよ 例えば3通りの指し手であがりに近づけるとする このとき、どう指しても裏ドラがつく確率はほぼ変化が無いだろ??? あがりなら初心者でも上級者でも裏ドラがつく確率は同じようなものだろ???
>>494 ダマで行くか、降りるか、リーチをかけるか
そういう選択をするときに必要になる。
何切る?で裏ドラを考慮する必要はほとんどないが
他に問題が無ければ 裏ドラ枚数が多い方の選択を
すべきだしね。
496 :
デフォルトの名無しさん :2007/07/23(月) 01:53:06
では裏ドラは入れましょう ほかに戦略性があって誰にでも平等でないルールはありますか?
鳴きは保留の方向で? 順子系は入手割合が2倍、刻子系は入手割合が4倍
当然鳴きも考慮しなきゃだけど こればっかしは状態が半端無いから面倒だよな・・・ 最強の面前戦士という設定でいいんじゃないかw
せっかく作ってくれてるところ悪いが、 麻雀のこともよくわかってないのに他人のアドバイスを聞こうともしないDQNに見えるな。age厨だし。 だいたい裏ドラ入れるかどうかなんてフラグ一つで切り替えられるだろうに。
まあそうだな。 でもまあ、競技麻雀としてはインフレルールはなるべく外せる形が望ましい。
競技麻雀としての最強を狙うのか、ゲームとしての最強を目指すのか。 それによって、ルールも変わってくるんだろうね。 >戦略性があって誰にでも平等でないルール そんなもんナンボでもあるだろう?ダブ東だって親しか狙えないって意味では、平等じゃねーぞ。
504 :
デフォルトの名無しさん :2007/07/23(月) 10:29:33
競技者の実力が反映しにくい要素は無くしたルールで最強ならば 通常ルールでも最強なんですよ 時々運で負ける事があっても統計的には最強です という訳で、実力を計る為には、簡略化したものでやれば十分なんです あと、フラグで入れるとかではなくルールとして採用するかどうかなんです 統一ルールを決めない事には最強のプログラムが決定できません
>>504 >フラグで入れるとかではなくルールとして採用するかどうかなんです
?
506 :
デフォルトの名無しさん :2007/07/23(月) 10:35:20
思考の開発者が、フラグを設定してもいいけど、 ルールを設定しなければ最強のプログラムは作れないんですよ 例えば、役満の得点は1000点、平和の得点は8000点だとしますと、 平和をねらっていくような思考ルーチンにしなければなりません
>役満の得点は1000点、平和の得点は8000点 そんな例えをするDQNに用事はない
>>506 そんなの評価関数の重みのひとつに過ぎないんだから
対応できない思考ルーチンはうんこだろ
>統一ルールを決めない事には最強のプログラムが決定できません 弱小プロレスラーみたいでワラタ
どうせリバーシ1だろ
評価関数f(1):手牌 評価関数f(2):面子 評価関数f(3):裏ドラ 評価関数f(k):色々 結果F=Σa(n)・f(n)だろうな(a(i):それぞれの重み係数)
裏ドラはリーチをかけるかどうか、への影響しかないのでは
513 :
デフォルトの名無しさん :2007/07/23(月) 13:58:28
リーチ掛けてあとは運任せという、要素が強まりますから やはり裏ドラは無くしましょう
とりあえず夏なので馬鹿が沸いてますが無視の方針で、 今日たまたまよくわかる量子コンピュータなる本を立ち読みして仕入れた知ったか知識なのですが、 麻雀は奥深い気がします、チェスは完全情報ゲームなので量子コンピュータを使えば完全解析可能だと思われます、 将棋は取った駒を再利用できるのでチェスよりも複雑ですがこれも完全情報ゲームなのでいつか解かれるかも知れません。 でも麻雀の場合は極端な話山を積んで初めの配牌の時点でコンピュターですらやはり運に支配されてしまうので全局無敵は不可能でしょう、 それに誰かのポン・チーでツモ順も変わってしまうしこれもやはり運に作用されてしまう要素が大きいでしょう、 最強を目指すなら何万局単位で最強ということになるでしょうね。
515 :
デフォルトの名無しさん :2007/07/23(月) 14:02:28
リーチ一発や、リーチ裏ドラは、やはり運任せですな 一発は、他人からは避ける事は出来ますが、するとツモでやるしか無くなるわけですが これは運ですな
>>515 一発を計算しないんだったら
高め安めも計算しないってことだね
何言ってんだキミ
初期状態での判明牌数:14(手牌、ドラ) 中盤(6巡)での判明牌数:38(手牌、捨て牌、ドラ) 終盤(12巡)での判明牌数:64(↑と同様) 確定している牌はそれぞれ全体の1割、3割、5割程度。 中盤以降なら十分意味あるだろうな。鳴きや字牌、壁など使えば更に増えるし
えーと、何に対して意味があるの? 予測した裏ドラにあわせて残す牌を決めて上がりにくくなるリーチをかけるわけ?
520 :
デフォルトの名無しさん :2007/07/23(月) 14:43:57
裏ドラは、手牌の14枚に可能性があるんだぞ 運任せとしかいえないだろ 一発は、ある程度確率が求まるだろうが一巡目という制約によりほぼ運任せだろ
そうだな、結局考慮するケースがほとんど無いのに、 結果の点数だけが上下するということになるのなら、 無いほうがいい気がする。
「最強」って一局だけで判定するの? 何百、何千と対局して決めるなら、裏ドラを考慮した方が 強いような気がするけど。 もしそうなら単に「運」とは言えないよね? ところで「はったり」「ひっかけ」とかも考慮の内?
>>521 リーチをかけなければ裏が乗らないんだから
リーチするかしないかの判定にはいるじゃん?
524 :
デフォルトの名無しさん :2007/07/23(月) 14:57:54
>>522 このルールで
東南戦半荘を一回戦とする。持ち点は各自三万点とする。
全局を一翻しばりとし、常に場に二翻つくゾロ場とする。
順位点
三万点を基準とし、三万点以上の者をプラス、三万点未満の者をマイナスとしそれぞれに順位を加える。
一人プラスのときの順位点は、それぞれ+12 、-1 、-3 、-8とする。
二人プラスのときの順位点は、それぞれ +8 、+4 、-4 、-8 とする。
三人プラスのときの順位点は、それぞれ +8 、+3 、+1 、-12 とする。
四人マイナスのときの順位点は、それぞれ +8 、+4 、-4 、-8 とする。
525 :
デフォルトの名無しさん :2007/07/23(月) 14:59:35
リーチ一発裏ドラは運任せだから、リーチのみ一翻だけにした方がいいよ・・・
526 :
デフォルトの名無しさん :2007/07/23(月) 14:59:25
何言ってんだよ 一発裏ドラを考慮したアルゴリズム と 考慮しないアルゴリズムを 戦わせればいいじゃんか。 そのための規格だろ?
527 :
デフォルトの名無しさん :2007/07/23(月) 15:01:10
最低限あがれる手は排除しないで、運任せの特典は排除の方向がいいと思うんだ
>>523 いや、、、状況によって裏ドラ期待でリーチするのかどうか、でしょ。
一定の率でリーチの率が上がるだけだったら無くても一緒じゃん。
529 :
デフォルトの名無しさん :2007/07/23(月) 15:03:21
>>526 ほぼ予測が不可能なんだって
裏ドラが乗ったり、一発になる確率はどんな局面に対してもほぼ平等だろう(運任せだろ)
>>524 それを何局繰り返すの?
要は多数繰り返したときで「裏ドラ有り無しで差がつくか」が問題かと。
>>529 裏ドラ乗っても点数は変わらないの?
トップ取れるかどうかの瀬戸際で影響しない?
勝負手はありえない?
531 :
デフォルトの名無しさん :2007/07/23(月) 15:18:48
裏ドラがほぼ運任せだとすれば、有り無しで順位に差は出にくいはずだ
>>529 そう思うなら、双方ともまったく互角の戦いをするんじゃないの?
そういう結果が出たらそれで十分じゃないか。
口だけ
むしろ、全然考慮して無いプログラムでも乗るケースが多いのが問題。
裏ドラ考えるアルゴリズムと裏ドラを考慮しないアルゴリズムとを 何万回か戦わせれば 統計取れるんじゃないの? ちょっとかっこいいんだけど
538 :
デフォルトの名無しさん :2007/07/23(月) 16:07:47
>>537 そりゃ最終的には裏ドラ有りプログラムのほうが強いんじゃね?
539 :
デフォルトの名無しさん :2007/07/23(月) 16:41:00
540 :
デフォルトの名無しさん :2007/07/23(月) 16:44:59
ルールに基づいて同じ牌が来たとき、 東場、親、一局目で役の得点を計算するルーチンを作ろうぜ 二人が一致すればルールにおかしなところは無い事になるとおもう
541 :
540 :2007/07/23(月) 16:55:16
すまん 14枚の牌に対して基本点(または符、飜数)を求めればいいんだ
542 :
デフォルトの名無しさん :2007/07/23(月) 16:58:26
そのまえに、あがっているかどうかを判定し、その組み合わせを返すルーチンが必要だ まずここを作ろうぜ
終盤の逆転にもう1役(2役)欲しい場合とかなんてのは裏ドラ期待か手役を考えるか。 こういう条件も簡単に浮かぶし(裏ドラのる率なんて簡単に出せるんだから)、 それ位入れないと逆転に対して極端に弱くなりそう
544 :
デフォルトの名無しさん :2007/07/23(月) 17:16:35
class TEHAI { int maisu[38]; public: }; //ここを開発するんだ!! void hantei(TEHAI h, int buf[] ){ buf[0]=1; //役の組み合わせの数 buf[1]=3;buf[2]=5;buf[3]=7;buf[4]=10; //コーツ、カンツの駒番号 } main(){ TEHAI h;int buf[100]; hantei(h,buf);
545 :
デフォルトの名無しさん :2007/07/23(月) 17:30:18
駒番号 0~8:マンズ 9~16:ピンズ 17~24:ソーズ 25~31:白発中東南西北 32は駒が存在しない事を表す あがりの種類は役満、国士、チートイなどを除けばコーツ(カンツ)のペアを 決定すれば一意に求まるはずである 1123456789白白白ならば、hantei(h,buf);を呼ぶと、 buf[0]=1 buf[1]=32 buf[2]=32 buf[3]=32 buf[4]=32 とセットする 種類が2とおり以上あれば、配列4つを追加してコーツの駒番号を記述する
546 :
デフォルトの名無しさん :2007/07/23(月) 17:52:19
>>543 最終局で裏ドラが出る確率よりも
そこまでに裏ドラ出されて点取られる確率の方が50倍(適当)以上ありそうなんですが
相手は3人で、そこまでの対局数がある為
547 :
デフォルトの名無しさん :2007/07/23(月) 17:55:43
裏ドラ、一発があるとな るべく速くあがった方がいいような感じになって 手作りの工夫が減ると思うんですけど・・・ 運に依存しない上手な試合運びが出来て最強だと思うんですが
550 :
デフォルトの名無しさん :2007/07/23(月) 18:06:19
>>398 の一種の数牌のみであがれる形になっているか判定するルーチンは
あってるのか誰か別ルーチンをつくって調べてくれ・・
>>544 よく分からん、とりあえずあら探しで0から始まるなら終了は33でNullは34じゃないのか
でbufには何が入るん?(あと、コーツ、カンツ?コーツ、シュンツじゃなくて?ってかメンツ)
552 :
デフォルトの名無しさん :2007/07/23(月) 19:26:10
>>551 すまん
牌番号間違えた 下が正解
0~8:マンズ
9~17:ピンズ
18~26:ソーズ
27~33:白発中東南西北
34は駒が存在しない事を表す
553 :
デフォルトの名無しさん :2007/07/23(月) 19:30:53
たとえば 111222333 のときは、 buf[0]=2で、次の4つはNULL,NULL,NULL,NULLで次の4つ0,1,2,NULLだよ NULL=34とする
554 :
デフォルトの名無しさん :2007/07/23(月) 19:32:11
コーツ(カンツ)の組み合わせさえ決定してしまえば、残りは別の組み合わせには成りえない
555 :
デフォルトの名無しさん :2007/07/23(月) 19:41:10
あらかじめ、明カン、暗カンなど鳴きがあれば、それは除いて関数 hanteiに渡すんだ あがりの可能性があれば、その個数と組み合わせが返る
556 :
551 :2007/07/23(月) 19:42:07
>>554 ひとつだけ確認させて。hanteiは何の判定?メンツ構成?
557 :
デフォルトの名無しさん :2007/07/23(月) 19:43:54
>>556 そうだけど・・・そしたら状況(鳴きとかリーチとか)に応じて役がつくか判定する
ルーチンへ渡す
558 :
551 :2007/07/23(月) 19:46:37
これを役判定に回すんなら、メンツ構成そのものを返した方が楽だと思うんだけど ※面子手のみなら5要素の配列(頭、メンツ、メンツ、メンツ、メンツ)
>>552 いや、普通に考えるなら数牌は数字を合わせた方が楽だぞ。
あと、せっかく同じ牌は4つあるんだから
役判定ではビットに埋めちゃえば
数牌の列が36ビット5バイトで済むから、
シフトと反転を使えばテーブルにしてしまう
ことだってできる
560 :
デフォルトの名無しさん :2007/07/23(月) 19:50:10
>>558 そうすると渡すと容量食うんです・・・
すべての組み合わせを求める手間に比べれば、
コーツが決定している状況から求める手間は無いようなものです
561 :
551 :2007/07/23(月) 19:52:09
>>559 ビットを考えると、何故32種じゃなく34種なんだ~。勿体無いじゃないか
とか思ったことありません?
562 :
デフォルトの名無しさん :2007/07/23(月) 19:56:13
11122233344だと一意では無かったよ すまん コーツは無しにしても2種類あった・・・ 11 123 234 234 123 123 123 44
>>561 10進だからしかたないぴょん
あと、1から9を使うメリットはもうひとつある
もしも判定ルーチンを 真正面から作るなら
「0,10,20は存在しない」というのが とても便利
564 :
551 :2007/07/23(月) 20:01:30
>>560 hantei{刻子の抽出}→hantei2{順子その他の抽出}→yaku{役判定}
ってことでOKですか?
それともhantei{刻子の抽出}→yaku{他の面子取り出し+役判定}ってこと?
565 :
デフォルトの名無しさん :2007/07/23(月) 20:04:22
よし、こうしよう! int型でペアになるビットを立てて4つ持てばいいんだ 数牌だけなら32個ですむからな これなら一意だな たとえば 111222333 のときは、 buf[0]=2で、次の4つは1,2,4,NULLで次の4つ7,7,7,NULLだ
566 :
デフォルトの名無しさん :2007/07/23(月) 20:08:37
>>564 コーツの決定だけでは一意では無い事がわかったため変更しました
111 は、32ビット列で (1000・・・・)
別の111は(000・・・10000)
234は(011100・・・)
とします
567 :
551 :2007/07/23(月) 20:13:14
>>565 サンプルはもちろん九連で。(もしくは4連刻)
どう取るか一意に考えるのが面倒だから、自分の場合は刻子・順子の組み合わせを
出してたな(役まで含んで考えると一意に求まらないかも)
569 :
デフォルトの名無しさん :2007/07/23(月) 20:14:39
コーツ(カンツ)判定に1ビット、ジュンツの中央かコーツの種類に4ビット使えば 5ビット×4=20ビットですみますね
570 :
デフォルトの名無しさん :2007/07/23(月) 20:25:49
コーツ(カンツ)判定に1ビット、ジュンツの中央(2-8)もしくは コーツの種類に3ビット使えば 4×4=16ビットですみますね これならshort int型に入ります コーツビットが1で、コーツ種類があり得ないものならば数字の9とすれば3ビットですみます
571 :
デフォルトの名無しさん :2007/07/23(月) 20:28:27
>>569 >>570 は失敗しました 数字が27種類あることを忘れました
コーツ(カンツ)判定に1ビット、数字の種類に2ビット、数字に3ビット必要でした
6×4ビット=24ビットで平気です
572 :
551 :2007/07/23(月) 20:31:03
>>569 ビットでもつなら色々とアイデアが
メンツ構成を刻子→順子で作り出して、今度は刻子を一つ開放させてその次の牌から刻子→順子を作り出す
で、・・刻子がなくなるまでやる(刻子・順子の和が最大のものだけ採用)
これじゃメンツ判定できない?(遅いか)
11122233→111,222,33→×111,33→×222,33→123,123,12
で渡す時は手牌で渡して3つずつ取り出せるように並べ替える(11122233か12312312)
573 :
551 :2007/07/23(月) 20:35:10
ビットで考えたものはメンツ構成(単騎~槓子:7種:3bit)*牌種(34種:6bit)*5 で45bit分。 単騎とか入っているのは役計算時に符計算も行うから。
574 :
これならどうか :2007/07/23(月) 20:35:55
class TEHAI { int maisu[34]; public: }; class KUMI { char cotubit : 1; char syorui : 2; char bango : 3; }; //組み合わせ数を返す、KUMI kに組み合わせを入れる int hantei(TEHAI h, KUMI k[] ){ return 1; } main(){ TEHAI h; KUMI k[10]; hantei(h,k); }
575 :
デフォルトの名無しさん :2007/07/23(月) 20:48:09
class KUMI { char cotubit : 1; //コーツかジュンツか char bango : 7; //駒の番号をいれる }; にしておいて、すべてのコーツ、ジュンツを登録した方が一般性がありますね
576 :
デフォルトの名無しさん :2007/07/23(月) 20:54:20
111222333ならば次のようにします int hantei(TEHAI h, KUMI k[] ){ k[0].cotubit =1 ; k[0].bango = 1; k[1].cotubit =1 ; k[1].bango = 2; k[2].cotubit =1 ; k[1].bango = 3; k[3].cotubit =0 ; k[1].bango = NULL; (NULL=0や34など) k[0].cotubit =0 ; k[0].bango = 2; k[1].cotubit =0 ; k[1].bango = 2; k[2].cotubit =0 ; k[1].bango = 2; k[3].cotubit =0 ; k[1].bango = NULL; return 2; }
>>514 麻雀ごときに「量子コンピューター」を持ち出してるお前が
一番馬鹿だとおもうが?
あのさ、「1・9字牌」が一枚も無い状態で、国士無双を
求める気なのか、お前はwww
578 :
デフォルトの名無しさん :2007/07/23(月) 20:55:52
間違えた int hantei(TEHAI h, KUMI k[] ){ k[0].cotubit =1 ; k[0].bango = 1; k[1].cotubit =1 ; k[1].bango = 2; k[2].cotubit =1 ; k[2].bango = 3; k[3].cotubit =0 ; k[3].bango = NULL; //(NULL=0や34など) k[4].cotubit =0 ; k[4].bango = 2; k[5].cotubit =0 ; k[5].bango = 2; k[6].cotubit =0 ; k[6].bango = 2; k[7].cotubit =0 ; k[7].bango = NULL; return 2; }
カスな断片的なプログラムはいいから、 ある程度、形になってからアップロードしてね
580 :
デフォルトの名無しさん :2007/07/23(月) 21:01:00
>>579 共通仕様を書いておいて、別の人が作っても同じ結果になるかどうかが大事なんです
仕様とサンプルをのせているだけですよ
581 :
551 :2007/07/23(月) 21:04:29
>>578 順子は普通に頭の数字を渡せばいいと思うが
あと、そのやり方だと役計算の時にまた手間がかかるのがイヤな感じがする
役計算はその結果を使ってテーブルで手を抜きたい所
仕様を同じだってwwww 実践でこなれてない思いつき仕様を 断片的に出されても、カスはカスですよ
583 :
組み合わせを求めるルーチンを作ろうぜ :2007/07/23(月) 21:06:58
class TEHAI { public: int maisu[37]; //1~9マンズ 11~19ピンズ 21~29ソーズ 30~36:白発中東南西北 0駒が存在しない }; class KUMI { public: char cotubit : 1; char bango : 7; }; //組み合わせ数を返す、KUMI kに組み合わせを入れる int hantei(TEHAI h, KUMI k[] ){ return 1; } main(){ TEHAI h; KUMI k[10]; hantei(h,k); }
584 :
デフォルトの名無しさん :2007/07/23(月) 21:13:10
>>581 なるべく変数と容量は削っておいた方がいいとおもうんですよ
例えばデータを保存する必要が出てきたときなど
順子は最初の数字でいいです(途中ビットを削ろうとした名残です・・・)
585 :
551 :2007/07/23(月) 21:30:35
>>584 自分で作った経験からだけど
試行数が多いものはデータのサイズより速度を考えた方が良いです。
データは大して大きくならないし。
(自分の方法の場合でも3*5+6*5bit→6byte。10万通りで600kBまあ平気じゃない?)
関係ないけど、TEHAIとかhanteiとか、一瞬hentaiと見間違う。 変数名がローマ字ってかっこ悪い気が・・・
587 :
デフォルトの名無しさん :2007/07/23(月) 21:44:54
わかりました 次のように変更します そしてKUMI k[] は、5個ずつ格納していきます class KUMI { public: char cotubit : 2; //0~3単騎、ジュンツ、コーツ、カンツ char bango : 6; //駒番号 };
588 :
デフォルトの名無しさん :2007/07/23(月) 21:47:57
>>573 メンツ構成で、7種類必要なのはなぜでしょうか??
鳴き牌は、判定する際に外しておけばいいですよね
589 :
551 :2007/07/23(月) 22:02:41
>>588 上にも書いたけど、役判定時に符計算もする為
1,12,13,11,123,111,111の4つ(単騎,辺塔子,間塔子,対子,順子,刻子,槓子(3枚のメンツ扱い))
これとは別に上がり牌と鳴き用のフラグも渡す。(上がり牌の符は別に用意しても良いけど)
上がり形だけなら対子順子刻子(槓子)だけで十分だけど評価させる為には入れておきたい
590 :
551 :2007/07/23(月) 22:05:33
>>586 hentaiって海外でのアダルトアニメの事だったか?
pornはチェスのポーンだと思っていた自分がいるw
七対子と流し満貫ことも思い出してあげてください。
592 :
デフォルトの名無しさん :2007/07/23(月) 22:17:06
代入する部分を作ろうぜ #include <string> using namespace std; class TEHAI { public: int maisu[37]; TEHAI & operator =(string s){ return *this;} }; main(){ TEHAI h="123456789x1y1abcd"; //1~9マンズ x1~x9ピンズ y1~y9ソーズ a~g:白発中東南西北 }
593 :
551 :2007/07/23(月) 22:24:37
>>591 そんなモン知らんw。シイサンも知らんwコクシも知らんw
いや、それは別に用意した方が早いだろうから(七対子は楽、国士はテーブルでOK)
シイサンはホントに知らない、というかローカルルールになりつつあるから排除w
m129p129s129j127の方が良いと思う →m112234p235s2j112
595 :
デフォルトの名無しさん :2007/07/23(月) 22:40:30
内部では、マンズやピンズの番号は連結させておいた方がいい気がする・・・ #include <string> #include <iostream> #define fore(i,j) for(i=0;i<j;i++) using namespace std; class TEHAI { public: int maisu[37]; TEHAI & operator =(string s){ int i,m;fore(i,37)maisu[i]=0;i=0; while(i<s.size()){ m=s[i]-'0'; if(m>=1 && m<=9)maisu[m]++; else if(m>48 && m<56) maisu[m-19]++; else if(m==72){i++;m=s[i]-'0'+10;maisu[m]++;} else if(m==73){i++;m=s[i]-'0'+20;maisu[m]++;} else {fore(i,37)maisu[i]=0;break;} i++;}return *this;} }; main(){ int i; TEHAI h; h="123456789x1y1abcd"; //1~9マンズ x1~x9ピンズ y1~y9ソーズ a~g:白発中東南西北 fore(i,36)cout<<h.maisu[i+1]<<" "; }
またここから始まるのか。
これがプログラム板のレベルか?
598 :
デフォルトの名無しさん :2007/07/24(火) 00:28:58
夏休みですから
599 :
デフォルトの名無しさん :2007/07/24(火) 00:31:36
main(){ tehai[14]; } から作る ↓ 役判定はおろか、テンパイ判定すら作れない。 ↓ 途中で投げる。 ↓ 別の人間が main(){ tehai[14] } から作る。 ↓ 以下、繰り返し
俺は聞きたい。 学生プログラマーとプロのプログラマーの間に有るのは。 プロのプログラマー>>>(越えられない教育の壁)>>>学生プログラマー プロのプログラマー>>>(越えられない才能の壁)>>>学生プログラマー 最近、下のような気がしてならない。
越えられないのは経験の壁だろ。
経験をつめば誰でもプロのプログラマーになれるのか? おれは、才能が有ればプロ並みのプログラム_かく学生を知っている。
603 :
デフォルトの名無しさん :2007/07/24(火) 00:39:18
カスなプログラムを書き並べてる時点で、 経験とか、才能以前に、「頭が幼稚」なんだろ
604 :
デフォルトの名無しさん :2007/07/24(火) 00:45:04
とりあえず同一数字牌のみで何通りあがりの可能性があるのか計算しようぜ!!
プロ>>>>(超えてきた苦汁の数)>>>学生プログラマ
606 :
デフォルトの名無しさん :2007/07/24(火) 00:51:24
あがる可能性のあるペアは、 順子,刻子,槓子のペア、もしくはそれに対子を加えたもの 一種の数牌のみだといくつあるんだよ???
C(136,14)=>幾つ?で、一つの判定にどれくらい時間掛かる? で、何分くらいで解けそう?
>>606 一種の数牌=チンイツ手:これは結果が出てるはず。大して手間もかからん
609 :
デフォルトの名無しさん :2007/07/24(火) 00:53:52
ただし、鳴いている牌は除外する(すでにメンツが固定されているからはじめから入れない)
その何通りみたいな話もうんざり。 あんたが高校生以下なら、受験時に少しは役に立つかもしれんから、勝手にやってくれ。 そうじゃないなら、まったくの不勉強。もしくは宝くじ必勝プログラム並みのトンデモさん。
611 :
デフォルトの名無しさん :2007/07/24(火) 00:56:44
意味が、ちがう チンイツ手とは違う 今の場合、14枚無くてもいいんだ 例えば、11555は、あがれる可能性有りと判定し、11255は可能性無しとするんだ
612 :
デフォルトの名無しさん :2007/07/24(火) 00:58:52
>>610 何通りあるのか正しく求まらなければ、組み合わせを正しく判定出来ていない事になる
点数も正常でなくなるんだよ
どこかのページに書いてあったけど、売られている複数の麻雀ゲームが正しく
役判定出来ないらしい
613 :
デフォルトの名無しさん :2007/07/24(火) 01:00:44
マンズ、ソーズ、ピンズごとにあがれる可能性と、その組み合わせを出さなければ ならない まずは、一種限定にして求めるのがいいやり方なんだよ
614 :
デフォルトの名無しさん :2007/07/24(火) 01:00:47
>>612 何で、「組み合わせ」と「点数計算」が関係あるんだよ
高校生が糞みたいなこと書いてんじゃねーよwww
616 :
デフォルトの名無しさん :2007/07/24(火) 01:02:10
>マンズ、ソーズ、ピンズごとにあがれる可能性。 「マンズ」も、「ソーズ」も、「ピンズ」も上がれる確率は一緒だろ。 小学生は書くな
617 :
デフォルトの名無しさん :2007/07/24(火) 01:03:08
1、2、・・・の枚数を0~4 、0~4 、・・・としたとき、 いつあがれる可能性があって、そのときのその組み合わせを求めたいんだ 麻雀ゲームをつくる上で必然の部分だろうが
//やる気が無いプロの見本だゴラァーーー int Tehai[14]; //適当なデーターをセットしやがれ! main(){ } if(MentsCut(1)) cout "うひょーー上がってるぜゴラァーーーー!!"; cout "これが上がってるだって? ふざけるなゴラァーーーー!! 100万べん顔を洗って出直してきな!"; } bool MentsCut(int i) { Tehai[46] = 0; bool result = false; for(; !Tehai[i]; i++){ if(i >= 46) { return true;} } if(i <= 30) { if(Tehai[i + 1] && Tehai[i + 2]) { Tehai[i]--; Tehai[i + 1]--; Tehai[i + 2]--; result = MentsCut(i); Tehai[i]++; Tehai[i + 1]++; Tehai[i + 2]++; } } if(T_Tehai[i] == 3) { Tehai[i] -= 3; result = MentsCut(i); Tehai[i] += 3; } if(result)return true; return false; }
×int Tehai[14]; //適当なデーターをセットしやがれ! ○int Tehai[50]; //適当なデーターをセットしやがれ!
620 :
デフォルトの名無しさん :2007/07/24(火) 01:04:42
>>616 どれも同じだから、同一視して、一種類のみ限定にして
あがりの可能性があるかを判定したいんだよ!
621 :
デフォルトの名無しさん :2007/07/24(火) 01:07:36
>>617 wwwwwww
なんだよそのカス思考はwwwww
>いつあがれる可能性があって、そのときのその組み合わせを求めたいんだ
だから、なんでここで一々組み合わせを求めるんだよ。
無駄だろ
622 :
デフォルトの名無しさん :2007/07/24(火) 01:09:06
数牌一種だと 0から (4,4,4,4,4,4,4,4,4) 5進数 までに対応するだろ そのうち、順子,刻子,槓子もしくはそれに対子がそろっているものはいくつあるんだよ 二人の値が一致すればそのプログラムは正常だといえるだろ
がはははははははは、さすがやる気なし、else忘れたぜゴラーーー コンパイル通して無いぜ、後は知らん。
624 :
デフォルトの名無しさん :2007/07/24(火) 01:13:08
下のようにやりたいわけ 100000000 × 200000000 ○ 300000000 ○ 400000000 ○ 010000000 × 110000000 × 210000000 × 310000000 × 410000000 × 020000000 ○
メンツを考える上でそれぞれの数牌は必ず別になるので分けて考える必要は・・
626 :
デフォルトの名無しさん :2007/07/24(火) 01:17:04
すれば? でもそれは「トイツ」「アンコ」である判定は必要でも、 わざわざ「何通りがあるか?」を求める必要ないことは 理解できるよね?
>>622 麻雀暦大体あわせて6年弱の若輩者ですが何を言いたいのかまったく分かりません。
それとも私の雀力では解読できない暗号なのでしょうか?
628 :
625 :2007/07/24(火) 01:18:11
フルハウス見るから暫くいるぞw
>>624 上がれる条件がイマイチ分からない。それならメンツn個+トイツで考えた方がいいんじゃない?
121000000←こんな場合はどうするの?
629 :
デフォルトの名無しさん :2007/07/24(火) 01:18:43
例えば、白が2枚あったとして マンズのみ組み合わせが2通り、ソーズのみの組み合わせが2通りと出れば 計4通りに役がつく可能性があるわけだ だから個別 (一種のみの数牌) で調べておくといいわけだ
630 :
デフォルトの名無しさん :2007/07/24(火) 01:21:23
>マンズのみ組み合わせが2通り、ソーズのみの組み合わせが2通りと出れば >計4通りに役がつく可能性があるわけだ ('A`) ここから、どーやってプログラムに落とし込む気なのか 全然理解不能
>>627 大丈夫、俺もよく分からん。
しかしだ、5進数の暗号は解読できた。どうやら同じ牌の数らしい、0枚1枚・・4枚とねw
632 :
デフォルトの名無しさん :2007/07/24(火) 01:22:19
>>628 12100000はあがれる可能性は無いだろ
順子はひとつあるが、余りが出るからあがれる形ではない
633 :
625 :2007/07/24(火) 01:25:22
普通に手牌分解した方が良いって、わざわざ分けなくても 昔の記憶だけど3シャンテンでも、可能性は100種くらい行くぞ そこからシャンテン落としたものまで含めると桁が違うし、メンツ構成にそんな 手間はかけてられない
634 :
デフォルトの名無しさん :2007/07/24(火) 01:25:25
5進 あがりの可能性 数牌表示 410000000 × 11112 020000000 ○ 22 120000000 × 122 220000000 × 1122 320000000 ○ 11122 420000000 ○ 111122 030000000 ○ 222
635 :
デフォルトの名無しさん :2007/07/24(火) 01:27:30
ちょっと待てよ、シャンテンとも関係がない 今現在の手牌があがっている(可能性がある)のか、どうかを調べたいだけなんだよ
急に物凄い勢いで進み始めたな
解説君その1 この場合数杯とは マンズの1-9だけのようだ。 ポンジャン?
638 :
625 :2007/07/24(火) 01:28:36
>>632 例にそれを出したのは、他の構成にトイツがあれば13,15の組み合わせが可能性を持つ
ということ。ワザワザ分けるとこういう事に対処する必要が出てくる
639 :
デフォルトの名無しさん :2007/07/24(火) 01:28:58
このスレの住人は、「モンテカルロ法・ヒャホオー」って言ってる 奴らばかりだから。 手牌に1枚も「ヤオチュー牌」が無くても、「量子コンピュター」使って 「国士無双」が上がれる確率を求めないと気がすまないんだろ?
640 :
625 :2007/07/24(火) 01:29:20
641 :
デフォルトの名無しさん :2007/07/24(火) 01:29:28
次のようなことだ 020000000 ○ 22 頭としてあがる可能性有り 320000000 ○ 11122 頭とコーツであがる可能性有り 420000000 ○ 111122 頭とカンツであがる可能性有り 030000000 ○ 222 コーツであがる可能性有り
420000000 ○ 111122 はカンなのか! そうなんだな!
643 :
デフォルトの名無しさん :2007/07/24(火) 01:31:43
>現在の手牌があがっている(可能性がある)のか ('A`) どっちなんだよ? 「手牌があがっている」だけなら、ものの30分で作れるだろ。 「手牌があがれる可能性」を求めるなら、シャンテン計算は 重要な要素だろ。
世の麻雀をやっている人とプログラマーが頭緒抱えています。
645 :
625 :2007/07/24(火) 01:32:01
>>641 そんな事を牌種それぞれで考えるのが無駄になる
646 :
デフォルトの名無しさん :2007/07/24(火) 01:32:53
>>642 名前が違うのか??黙って手牌に4つ牌があるときはカンツと言わないのか??
647 :
デフォルトの名無しさん :2007/07/24(火) 01:34:37
>>643 あがれる可能性といってるのは、他の牌も調べなければわからないためだ
一種のみで、あがりの形になっていなければ、全体でもあがりではないとわかる
いまさら用語なんか気にするな
649 :
デフォルトの名無しさん :2007/07/24(火) 01:36:06
>>645 配列に計算結果を格納しておけば、一瞬であがれない事が判別できるんだよ
モンテカルロなど回数をこなす場合にかなり有効なんだ
650 :
デフォルトの名無しさん :2007/07/24(火) 01:36:24
このスレ住人は、4枚あったら、「2枚+2枚」と見る、「3枚+1枚」と見る、 「カンした状態の3枚」と見ると「場合分け」ができないのか? 意味不明なところで場合わけして、肝心なところで場合わけが出来ない
君の頭の中にある妄想が少しだけ理解できた。 その考えなら字牌のテーブルも簡単
652 :
625 :2007/07/24(火) 01:36:35
>>647 ちょっと待て。「上がり」を求めたいのか?
らしいww
654 :
デフォルトの名無しさん :2007/07/24(火) 01:38:44
>>650 111122の場合、
111 1 22や11 11 22と分けたらあがり形にはならないだろが
655 :
デフォルトの名無しさん :2007/07/24(火) 01:38:47
>>641 ('A`)
>420000000 ○ 111122
>頭とカンツであがる可能性有り
「111」(アンコ)+「12」(ペンチャン)の可能性は無視
「チャンタ」という概念が無いのですか?
656 :
625 :2007/07/24(火) 01:40:17
それならテーブルを使って出すのが高速だけど。 その後どうすんの?(ってかそこまで持っていくのはどうすんの?)
ポンジャンにチイトイは無いのです
658 :
デフォルトの名無しさん :2007/07/24(火) 01:41:15
>>652 そうだよ
あがっいる(形になっている)かどうかを調べたいんだ
一種の数牌のみだと何通りあるんだ?それが二人一致すれば正しいプログラムだろ
659 :
625 :2007/07/24(火) 01:41:39
シミュレータには良いかも知れんが主旨とは違うだろ、流石に
いや、正しくない
661 :
デフォルトの名無しさん :2007/07/24(火) 01:42:53
>>655 いま現在があがれる形になっているか(加えてその組み合わせ)を知りたいんだよ
マンズ、ソーズ、ピンズで頭3と言う可能性が有るじゃないか。
663 :
625 :2007/07/24(火) 01:43:13
1種14枚のものはあるが、そんなものはわざわざ作る気になれないなぁ、正直な所
664 :
デフォルトの名無しさん :2007/07/24(火) 01:44:36
>>654 お前は、どーやってプログラムを作りたいのか
こっちは全然理解できない前提で書くが、
俺は
・現在の手配で上がっている…(1)
↓
・1枚切ればテンパイである…(2)
↓
・一番テンパイに近い切り方をする…(3)
というプログラムの流れなると思う。
(1), (2)は1日あれば直ぐできるだろ。(今はシャンテン落としはなしの前提)
で、今一番議論してるの(3)のところだろ。
お前は何がしたいんだ?
665 :
デフォルトの名無しさん :2007/07/24(火) 01:47:45
>>664 任意に14枚牌が与えられたら、それがあがりの形になっているのか調べたいんだよ
そのために、まず一種の数牌に限定して、あがりの形になっているか調べるんだ
なっていなければ、そこで終わる なっていれば、次の数牌を調べる
テーブルに格納しておけば判定は一瞬
666 :
625 :2007/07/24(火) 01:49:07
どちらにしろその考えだと,2,3,5,6,8,9,10,12,14枚で考えればいい でもそれぞれ(4種)について考えるとでかすぎるし、一つの事にしか使えない (私信:ビーチボーイズいいな)
こ、これが噂の宇宙マージャンってやつか、俺達のような普通の麻雀打ちには到底理解できないぜ。
668 :
デフォルトの名無しさん :2007/07/24(火) 01:49:40
>それがあがりの形になっているのか調べたいんだよ wwww つか、それくらい1日でつくちゃえよwwww
669 :
デフォルトの名無しさん :2007/07/24(火) 01:49:43
思考ルーチンの話をしている訳では無いんだよ 今は、役がつく可能性があるペアを求めてから、 その最大の得点を計算したいっていうところだ
解説君 役がつく=上がれる形
671 :
625 :2007/07/24(火) 01:52:09
>>668 同意。テーブル作るの嫌だなあw
>>669 テーブルで上がりを高速に求める→点数を求めて期待値?を出したい、でOK?
>>669 すみませんが参考にあなたの雀暦を教えてください、我々には高度すぎて宇宙言語並に理解できません。
673 :
デフォルトの名無しさん :2007/07/24(火) 01:54:06
>>666 そういうことなんですけど・・・全部でなんとおりあるのか知りたい訳なんですよ
プログラムの正当性を調べるため
>>671 ちょっと待て!、 現在のPCで点数もあるテーブルは不可能
675 :
デフォルトの名無しさん :2007/07/24(火) 01:55:17
>>672 麻雀はルールをよく知らない トンプウ荘なら一応出来るが、現実世界では手順が不明
676 :
デフォルトの名無しさん :2007/07/24(火) 01:55:32
多分「雀歴」って書くと思う
677 :
デフォルトの名無しさん :2007/07/24(火) 01:56:42
>>675 「麻雀のルール」知らないなら来なくていいよ。
「雀荘」で1年打ってきてから、このスレにきてくれ
678 :
625 :2007/07/24(火) 01:56:48
自分なりに理解した範囲で 例:111222333 上がり形だけど、テーブルにした場合にそれしか分からない。←どういう構成かが分からない 123で鳴いている、2のポン、3アンコ、ピンフ+ジュンチャン+イペコ、等々 つまり、上がり点を求められない。←求めるにはもう一度分解する必要が出る
いま、ようやくルールにこだわった理由を理解した。 宇宙麻雀に近づいた?
680 :
デフォルトの名無しさん :2007/07/24(火) 01:59:31
>>678 すでにメンツが決定しているものは、判定ルーチンに渡すまえに外しておくんです
何通りか組み合わせがありそうな部分のみ判定するんです
その個数と、組み合わせを登録しておけば、役判定までがかなり速くなります
681 :
デフォルトの名無しさん :2007/07/24(火) 02:00:19
ここ2、3日は、「宇宙麻雀」で盛り上がったな。 「麻雀のルール」知らないのに、「「麻雀プログラム」をつくろうとかwww まず、麻荘でも、ゲーセンでもいいから、ルール覚えてから 来いって感じだよな
682 :
625 :2007/07/24(火) 02:01:17
>>678 の理由があるから、どうせテーブルを作るなら上がり点を求める部分で
メンツ構成として渡してやった方がいい、という話なんだな
現実的に上がり点まで含めて総当りは無理があるんだよ・・・(見積もりだけで断念w)
>>690 君は大きな間違えをしている。君のアイデアの方が遅い。
684 :
デフォルトの名無しさん :2007/07/24(火) 02:03:40
>>680 「宇宙麻雀」の極意が少し読めてきた!!!
つまり、「上がり牌の全ての組み合わせ」を求めて、
それを「テーブル」としてプログラム内に格納して、
それで上がりを判定するんだwwwww
すげぇ「王様プログラム」だし、そんなののために、
一体どれだけ、リソース消費すんだよwww
685 :
デフォルトの名無しさん :2007/07/24(火) 02:04:22
>>683 それなら基本点を求める速いアイデアっていうもの書いてくれ
686 :
625 :2007/07/24(火) 02:06:03
まずは用語を覚えてきて欲しいな。余計な誤解と無駄が省ける
>>684 出来た時点で、コード走らす必要が無くなるなw
下手な反論だね。言っても理解できないだろうから、君には言うつもりなし。
>>686 いやちょっと待て!、そのリソースにアクセスするための仕組みが遅い。とてつもなく
689 :
625 :2007/07/24(火) 02:08:23
>>685 自分がこのスレである程度言ってるぞ。
速いアイデア→一手5秒未満として、2シャンテン位落としたものまで計算できれば
理想かな?
690 :
デフォルトの名無しさん :2007/07/24(火) 02:09:11
「宇宙麻雀」への道のり ・1種類で全ての「上がり手牌のとおり」を求めてテーブル格納 ↓ ・1種類+字牌の全ての「上がり手牌のとおり」を求めてテーブル格納 ↓ ・マンズ、ピンズ、ソース+字牌の全て(略 ↓ ・全て上がり手牌の通りに対して、「ハン数+符」を求める どんだけメモリ使う気だよwww
691 :
625 :2007/07/24(火) 02:11:09
>>688 是非書いてくれw
で、結果だけクレwソースもテーブルもいらんからw(俺のパソに入らないw)
692 :
デフォルトの名無しさん :2007/07/24(火) 02:11:40
実際に、14枚の牌を生成してすべて正しく点数が計算できて 10万回ほど試行したとき何秒かかるのかっていう事だ
693 :
デフォルトの名無しさん :2007/07/24(火) 02:12:40
つか、「トンプウ荘」はこーいう仕組みで 動いてるとでも思ってるのかww
694 :
625 :2007/07/24(火) 02:13:10
昔やった思考実験では1000/msの生成でも俺死んでたハズ
695 :
デフォルトの名無しさん :2007/07/24(火) 02:14:03
>>690 テーブルにするのは一種のみですよ
判定だけなら5の9乗ビットあればいいんです
高々238Kバイト使うだけですよ
>>691 うん 何か誤解_与えたかな? 688をどの様に受け取った?
697 :
625 :2007/07/24(火) 02:15:07
698 :
デフォルトの名無しさん :2007/07/24(火) 02:15:55
一種のみでも、その組み合わせをルーチンで調べるとなると 100msとかかからないですか? テーブルに記録してあれば10倍以上は速いと思うんでけど・・・
700 :
625 :2007/07/24(火) 02:17:02
ギャグをギャグですよ、って言うのはとても恥ずかしい事なのに言わせる気?
この物体は飛べるものかと調べる時に、エンジンが有るから飛べると結論するような物
>>695 そんなにたくさんはいらないだろ
同一色の登場数の上限は手牌の数だって忘れたか?
>>698 その考えそのものは正しいが、100msはかかりすぎ
>>698 判定処理を適当にライブラリ化しておいて
遅かったら高速版こしらえて差し替えるだけだろ
つか、高速化なんざ、後でも出来るんだから
基本設計だけちゃんと作って あとはがむしゃらに
作りこめよ
706 :
デフォルトの名無しさん :2007/07/24(火) 02:20:23
>>695 まぁ、頑張ってくれ。止めはしない。
死ぬほどある「手牌の組み合わせ」を求めくれ。
万が一、ソースが出来たらあげてくれ。
しかし、無駄だらけの「上がりテーブル」だよな。
任意の手配が、その「上がりテーブル」に含まれているか
を探すだけでも、凄いコストになりそうだがwww
>>618 のプログラムを改良すれば、瞬殺で終わる仕事を
無駄に時間掛けてどーする気だよ
つーか、「夏休み」だよなぁwwww
707 :
デフォルトの名無しさん :2007/07/24(火) 02:20:34
>>702 5進数で、000000000~000002444 は必要ですよ
うまくやればかなり減らせるかと思いますが、単純に変換すると
約5の9乗ビット必要ですよ
708 :
デフォルトの名無しさん :2007/07/24(火) 02:21:58
>>705 高速化のほかに、プログラムの正当性を調べるために
一種のみのあがりの形の数を求めたいんですよ
709 :
625 :2007/07/24(火) 02:23:46
>>707 役(ピンフ、タンヤオなど)判定でテーブルを使った方が有効だと思わない?
いいから作りたきゃ作れ
711 :
デフォルトの名無しさん :2007/07/24(火) 02:23:52
大事な事は、正しい役判定、得点計算が出来る事なんですよ 間違っていたら、その後の調整にも影響が出てきます
712 :
デフォルトの名無しさん :2007/07/24(火) 02:24:59
>>709 全種の牌を渡す事は無理だと思うのですが・・・
713 :
デフォルトの名無しさん :2007/07/24(火) 02:27:25
>>710 一人であっていると思って作って、あっていなければ意味が無いじゃないですか
だから簡単な部分から検証したい訳なんですよ
そのため誰か同じルーチンを作ってくれないかと思うわけです
714 :
625 :2007/07/24(火) 02:27:29
>>708 とりあえず可能性のあるメンツ構成を数え上げるだけのプログラム書いてご覧
一種で6枚の時と8枚の時の二つ。
で使い道を考えると、多分使用するのに必要なデータが足りてないのが分かると思う。
715 :
625 :2007/07/24(火) 02:29:11
>>712 いや、牌の情報を渡すんでなく面子の情報を渡すのよ
作ってから検証役募集すれば
717 :
デフォルトの名無しさん :2007/07/24(火) 02:29:57
>>711 小学生は早く寝て、宿題でもすればwww
「上がり判定」が確定した時点で、「2+3+3+3+3」
ができて、あとはそこから「ハン数」と「府計算」するだけだから、
別段、得点計算も「瞬殺」。ものの1秒も掛からない。
いくつかの麻雀プログラムで得点計算が間違える理由は、
「2」の頭の部分が複数ある場合、得点が高くなる場合がある。
そこの作りが甘いだけの話。
つか、
>>711 が作るテーブル自体、「最初から得点計算が
間違えだらけ」ということじゃねwwww
718 :
デフォルトの名無しさん :2007/07/24(火) 02:30:34
>>398 で一応作ったのですが、多分正しくないです
まず、上限が14というのを無視してます 最大36まで計算しちゃってます
719 :
デフォルトの名無しさん :2007/07/24(火) 02:30:59
>>713 お前の糞仕様のプログラムなんか、誰も賛同
なんかしねーよwww
720 :
625 :2007/07/24(火) 02:31:58
>>716 そうだよなぁ
条件と結果を書けば誰か追試してくれるだろ?
その為にはまず自分で結果を出さないとな
>>713 作れなかった実績がある奴の考えなんか採用する者はおらんけどな
722 :
デフォルトの名無しさん :2007/07/24(火) 02:40:29
>>717 > 得点計算も「瞬殺」。ものの1秒も掛からない。
たとえば一回500msかかれば1000回試行すれば50秒もかかるんですよ
それでは遅すぎます 一回50msでも一万回試行すけば50秒かかります
一回平均5ms以内で点が計算出来れば実用的だと思うんですが・・・
>>718 その方法論は、プログラムがそれなりによく書ける誰が見ても
現実的でないと判断すると思う。そう思って見ない?
725 :
625 :2007/07/24(火) 02:43:51
一種14枚のものなら見つけた(向聴数-1~) 面子手:000033CB,00016411,000037DA,0000005A,00000000,00000000,00000000,00000000,00000000,00000000, トイツ手(7対子):00000024,00000DC8,000087D8,0000F324,000045E4,00000144,00000000,00000000, (全通り数?):0001D010 昔のデータなんで、どの数字が対応しているかあやふやだが多分これでいいはず
726 :
デフォルトの名無しさん :2007/07/24(火) 02:44:29
たとえば、ランダムに指したとすれば、役無しが殆どをしめるわけです 役無しを高速に求められれば全体での平均判定時間は縮まります
開始時点で、上がれない状態を判定したとして何になる? 上がりが知りたいんじゃない、なにを棄てたら一番いいか知りたいのです
728 :
デフォルトの名無しさん :2007/07/24(火) 02:48:20
>>722 お前、麻雀もカスなら、プログラム能力もカス以下だな。。。
麻雀の役って、20種類程度しかないだろ。
すげぇ下等に全ての役判定個別に
関数化して、一個ずつ調べても、なんで50秒もかかるんだ?
「トンプウ荘」が、役判定に50秒も掛けてるのかよ。
729 :
デフォルトの名無しさん :2007/07/24(火) 02:49:00
>>727 それは、
>>371 をみてください
あがりが高速に判定できれば、なにを捨てればいいのか求められます
モンテカルロ法弱い、宇宙麻雀は別かもしれないがw
731 :
デフォルトの名無しさん :2007/07/24(火) 02:52:05
>>728 ちゃんとよめ 一回の判定は500msとか、50msとか、5msとかと言っている
モンテカルロ法が何故弱いのか説明したとして、理解できるだろうか?
733 :
デフォルトの名無しさん :2007/07/24(火) 02:53:41
main(){ pinfu(); tanyao(); ipeko(); } pinfu(){ピンフ判定ルーチン} tanyao(){タンヤオ判定ルーチン} ipeko(){イーペーコー判定ルーチン} こんな下等ルーチンでも、50秒掛けられる なら、それは別の意味で才能があるwww
734 :
デフォルトの名無しさん :2007/07/24(火) 02:54:20
>>371 に基づけば、高速な得点判定が出来れば、
思考ルーチンも同時に完成した様なものなんです
735 :
625 :2007/07/24(火) 02:55:37
>>あがりが高速に判定できれば、なにを捨てればいいのか求められます 今までの中身だとそれは難しいぞ。 3シャン→2シャンに上げるのにどう使えるの?
736 :
デフォルトの名無しさん :2007/07/24(火) 02:56:59
>>731 >一回500msかかれば1000回試行
のイミフな前提を馬鹿にしてるだけ、
「500msを1000回試行」て、
「お前は何をしてるんだ?」と笑っただけの話
737 :
デフォルトの名無しさん :2007/07/24(火) 02:57:16
>>733 そういうやり方だと鈍いと思いますよ
すべての判定ルーチンを一回は呼ばないといけないですから・・・
多分50ms~200msはかかるんじゃないでしょうか??
>>727 まぁ、 何切る というのは実際には「結果」だよね
重要なのは 現在の牌勢から何が足りないか を
適切に評価し、その結果 あぶれた牌を切る
そこまでのことが
>>713 に出来るとは思えないけどね
その具体的な数字はどこから出てくるのかね。
早くモノを見せて納得させてくれよ
741 :
デフォルトの名無しさん :2007/07/24(火) 02:59:45
>そういうやり方だと鈍いと思いますよ wwwwww お前の宇宙麻雀では、この鈍いやり方でも 劣るプログラム(しかも、点計算は間違い だらけ)しか出来ない。
742 :
625 :2007/07/24(火) 03:00:21
議論が戻りそうだけど、そこにメンツ構成として渡せばテーブルを使えるので それこそ時間は掛からない。
625さんの考えるテーブルの仕様教えて
>>742 時間がかかってもあとで高速化すればいいんだから
こと速度に関してはどうでもいいことだと思うよ。
745 :
デフォルトの名無しさん :2007/07/24(火) 03:03:40
>>735 つもったとして14枚の牌を調べ、役が出来ていたらbreakする
役が出来ていないなら、見えていない牌の中から、ランダムに一枚加えて
どれか一枚を捨てたら、役が出来るならその駒に役の得点を加算する
さらに、もう一枚ランダムに加えて、どれか二枚を捨てたら
役が出来るなら、その駒たちに役の得点/2を加算する
これを終局までの牌数ぶん試行する
最後まで行ったらはじめからやり直して得点の加算を続ける
ある程度、試行すると、役が揃いやすい捨て牌に得点が集まる
役判定がこういう風にしか作れないので、こういう思考ルーチンにしました なんて思想じゃあいつまで経っても最強には届かないと思うが どうか
747 :
625 :2007/07/24(火) 03:05:44
>>743 上に書いてあるんだが
上がり点が知りたい場合、頭とメンツ*4で求める。
で、それぞれの役(タンヤオ、ピンフなど)に対応するテーブルを用意。
実際は可能性の低い役はチマチマ計算した方がメモリ食わなくていいと思うけど
748 :
デフォルトの名無しさん :2007/07/24(火) 03:07:11
>>772 結局、
>>664 に話が戻るけど、このスレの議論の
的は、任意の手牌から、どうすれば高く早く上がれる
プログラムを作るのかにあんだけど、この「宇宙麻雀野郎」は
まず、上がり判定すら全く出来ていない
>>747 そのテーブルがどれだけとんでもない物か想像できますか?
>>747 あえてその方法に賛同するとしたら
現在の手牌からテーブルを見て
もっとも理想的で距離が近いレコードに
近づくように捨て牌を選ぶ
なんて思考ルーチンになるんだろうな。
751 :
デフォルトの名無しさん :2007/07/24(火) 03:08:26
>>745 のようにすれば、終局まで高い得点であがれる可能性が
高い捨て牌が選べます
3シャン→2シャンにするような手もその中に出てくる可能性が高いです
752 :
デフォルトの名無しさん :2007/07/24(火) 03:11:20
>>750 でも、冷静に考える判るけど、
「もっとも理想的で距離が近いレコード」なんて、
いちいちテーブル化したところから比較しなくても、
今ある手配で大体推測できると思うんだけどな
>>749 いうほど巨大なテーブルにはならないと思われ。
鏡像もあるし、数値をシフトさせればレコード数は
大幅に抑えられる。
まるっきり不可能な話ではない。
サルがシェイクスピアを書くよりは現実的。
754 :
625 :2007/07/24(火) 03:13:55
>>749 ん~aa*bbb*ccc*ddd*eee=16^5bit:最大限に取った無駄のあるテーブル
そんなに大きいか?
その魔法のテーブルが、リアルに想像できなければ。 625さんと751さんは、根本が同じと思う。
756 :
デフォルトの名無しさん :2007/07/24(火) 03:15:38
順子は、21通り コーツは、34通り(カンツもここだとして・・・) トイツは、34通り 34通り * 68C4 通り 2バイトで得点を表せば、53Mバイトでいけますね
757 :
625 :2007/07/24(火) 03:16:33
>>750 元々得点計算に使うものを流用するだけなんで。
結果をどう使うかは、思考側で選べば良いし(それが個性)
758 :
デフォルトの名無しさん :2007/07/24(火) 03:18:12
>>753 まず第一に
「その巨大なテーブルに何の意味を持たない」
最も理想的な手牌は、結局
今配られている手牌からしか推測
出来ないから。
次に、
「それでも全ての手配を求めれば膨大」
その膨大なテーブルを一々メモリに入れておくわけか?
無駄情報のために、数百MB以上は必要だぞwww
759 :
756 :2007/07/24(火) 03:18:20
というのは嘘でした もっと激しく必要ですね でも、重複した場合を無視すれば、ハッシュ値に変換すれば100M以下でいけそうな気はします・・・
>>755 まあ、実際に頭の中では、魔法のテーブルを参照してるよね
特に清一のときの上がり形の基本パターンセットは
脳に叩き込んであるから 数字をシフト、反転させて
マッチするパターンを探し出し 必要牌と不要牌を切り分けてるな。
761 :
デフォルトの名無しさん :2007/07/24(火) 03:19:57
>>756 お前の思考と一緒で、「頭」が存在してないなwwww
762 :
デフォルトの名無しさん :2007/07/24(火) 03:20:53
>数字をシフト、反転させてマッチするパターンを探し出し 無駄コストだな。そんなことしてると、50秒かかちゃうぞwww
牌のマトリクス表って みんな作ったよね? 銀玉親方の理論とかでブームになった頃に。 あれで手牌を1次元配列じゃなく2次元配列として 捉えるようになったのがオレおブレークスルーだったな・・・ なつかしい
765 :
625 :2007/07/24(火) 03:23:39
単純に上がりのみ考えて(対子、順子、刻子、槓子)*(全牌種)→2*6bit 12bit*5(面子と対子数)=60bit 多いか?
625は思い違いをしていたw
767 :
デフォルトの名無しさん :2007/07/24(火) 03:26:15
25ビット長のハッシュ値を使って、2バイトで点数を表せば64Mバイト確保すればよいです 例えば、トイツに6ビット( 64通り )割り当てて、順子とコーツの各55通りに 0から2の19乗の数字を割り当てて、存在する順子、コーツのXORを計算すれば 25ビットのハッシュ値が求まります
768 :
625 :2007/07/24(火) 03:27:11
これ考えるの面倒でチマチマ書いたんだよなぁw思い出したわ
>>767 それおいうなら 64メガ通り でしょ
それをキーとしてその後の方策を引っ張り出そうというのだから
前の計算式が疑問だが、 その60Bitの表せるメモリー領域を10進で出してくれ
771 :
625 :2007/07/24(火) 03:30:40
で、チマチマ書いても十分な速度採れるんでそのままにしてあったりするw
書いてる間に、また変な式が、夢見る魔法のテーブル万歳で言いや。 疲れた。
773 :
デフォルトの名無しさん :2007/07/24(火) 03:31:54
ハッシュ値に変換すれば100Mバイト以下の確保で十分実用的に使えると思う 一種の数牌テーブルと両方使う方向で行こうと思う・・
俺は、675は、お仲間と判定、宇宙麻雀を語らいあってくれ
775 :
625 :2007/07/24(火) 03:33:09
>>762 だいたい8枚以上から妖しくなってくるから
8~13枚使いのときのパターンしか覚えてないな。
待ち(=聴牌)はさすがに清一でもすぐ判るし。
16進の桁数出されたってな、10進出してくれよ。 その空間がリアルに想像できない時点でおワットる。
778 :
デフォルトの名無しさん :2007/07/24(火) 03:37:05
123 234 345 567・・・(順子) 111 222 ・・・白白白 (コーツ) にそれそれランダムな数字を割り当てるんだ 発発発をもっていたら、2進で(1001110110111011)が割り当てられるとする 123をもっていたら、2進で(00111101111111011)が割り当てられるとする これらのXORを取れば、ある数字が求まるんだ これをハッシュ値にするんだ
>>777 横槍ですまないけど、プログラマが16進で
リアルに想像できなくてどうするのよ
>>779 俺はは本人のために言ってるんだが。君も同類なのか?
781 :
625 :2007/07/24(火) 03:40:24
ちょっと修正.3*60=20桁だね もう少し減らせても5桁は減らせそうに無いなぁ
おいおい、数学も出来ないのか?
783 :
625 :2007/07/24(火) 03:44:39
ん?俺宛?
前錦が間違っていたな、まあいい、16進15桁の空間が想像できないらしい。 あきれ果ててもう寝るわ
785 :
デフォルトの名無しさん :2007/07/24(火) 03:47:35
トイツ34通り、順子とコーツで55通り 34 * 55 * 55 * 55 * 55 通り 2バイトで得点を表すと、必要な領域は、74Mバイトになりました 全部登録出来るじゃないですか
テーブル方式は面白いと思うけどね 現実的なところに落とし込むには広い意味での正規化が必要だな 数牌が3以上離れたとき それぞれを別グループと扱えば パターン数を大幅にカットできる また、明確に面子が出来ているとき(3の倍数または3の倍数+2枚) とそうでないときとでパターンはまた切り分ける むしろ、データベースを想定するよりも 正規表現的な考え方に持っていったほうが いいのかもしれないし よくないのかもしれない
787 :
デフォルトの名無しさん :2007/07/24(火) 03:52:20
カンツは無し(14枚のみ)、鳴きは考慮したいとして基本点を求めるデータベースを作りませんか? 74Mで出来ます
>>789 正規表現の分析をするぐらいなら、そのまま手配構造を分析した方が早いと思わないか?
俺はそのほうが速いと思うぞ
790 :
625 :2007/07/24(火) 03:54:46
いや、実際はチマチマ書いたんで十分実用だからワザワザ用意しなくなったんだ 500通りくらい通せればとりあえず戦略にはなるだろうから
>>786 揃っている手配の手配構造分析は、簡単なんだが。理解してる?
792 :
デフォルトの名無しさん :2007/07/24(火) 03:59:41
そろっているかどうかとその個数は300Kバイト程度の配列で判定して メンツが分解出来たら、74M程度の配列で点を出せばいいんです 一度完成させれば、それを流用すれば、誰でも点数計算で間違える事は無くなりますよ 結果が一致するか調べるため一緒に作りましょう
793 :
625 :2007/07/24(火) 04:01:29
>>784 16進15桁だけど10進18桁だぞ、10進言うから概算だしたのに
>>791 理解してるよ
完成形をもとに 現在の(不完成な)形に近いパターンを探す
という思考をするのであれば 面白いかな と思っただけ。
まあ実際には現在の形に9通りないし81通りの不足牌を加えて
完成形を求めればいいので テーブルはいらないわけだが
795 :
625 :2007/07/24(火) 04:03:15
>>792 その配列いらないんだわ。チマチマやっても十分な速度取れるのは実証済みだから
796 :
デフォルトの名無しさん :2007/07/24(火) 04:06:19
点数の正確なデータベースを作成しておけば、麻雀プログラム初心者にも 優しいですよ テーブルを読み込んでおいて参照するだけで正確な点が求まるんですから そしてそれは大半のルールも含むものになる
>>794 >完成形をもとに 現在の(不完成な)形に近いパターンを探す
>という思考をするのであれば 面白いかな と思っただけ。
何おもって完成形にするか? 夢見る完成形じゃないのか?
説明求む
>まあ実際には現在の形に9通りないし81通りの不足牌を加えて
>完成形を求めればいいので テーブルはいらないわけだが
意味不明、説明求む
798 :
デフォルトの名無しさん :2007/07/24(火) 04:08:54
>>796 どの牌であがるか、で点数が変わるのでもう10倍くらいは必要では?
でも、ルールの変化に弱いし、カンツなし鳴き無しではほとんど意味がない。
799 :
デフォルトの名無しさん :2007/07/24(火) 04:11:31
>>798 それを忘れていた・・・これはかなりまずい・・・
軽くみても100倍は増えそうです・・・データベースは無理だ・・・
>>797 ここで言った完成形ってのは
数牌の組合わせで 面子または面子+頭 が出来ている状態のことね
801 :
デフォルトの名無しさん :2007/07/24(火) 04:17:18
>>539 のルールによると符の条件だけでこれだけあってさらに役の条件も加わる
門前の状態でロンにより和了した場合には10符が与えられる。
リンシャンカイホウおよびピンフツモを除くツモのとき2符加算する。
辺張待ち、嵌張待ちのとき和了時に2符加算する。
数牌、客風牌の単騎待ちでは2符加算する。
自風牌、場風牌、三元牌の単騎待ちでは4符加算する。
連風牌の単騎待ちでは6符加算する。
中張牌の明刻子には2符が与えられる。
幺九牌の刻子は、中張牌の刻子の2倍、暗刻子は明刻子に比べて2倍、槓子は刻子に比べて4倍の符が得られる。順子には符はない。
雀頭となった牌が、三元牌のときは2符加算、場風・自風の場合に4符加算される。
>>800 まあ、夢見る正規表現に魅力を感じているようだが、型だけなら、ロジックで解いた方が速い。
作れば分かる
符自体は計算でただ出るけど 役と符を考える場合、面子対子以外に鳴きと待ちを加える必要がある。 前に組んだやつはそれを与えてたはず
805 :
デフォルトの名無しさん :2007/07/24(火) 04:30:21
鳴きを考慮して、翻数だけを求めるとすれば、 トイツ34通り、順子とコーツで55通り*2 34 * 110 * 110 * 110 * 110 通り 翻数は4ビットで表せるから、8900Mバイト程度必要です・・・
806 :
デフォルトの名無しさん :2007/07/24(火) 04:31:35
翻数だけでも何とかしてデータベースに登録するいい方法はないですかね??
>>802 そりゃそうだ
いくらロマンを感じてたって 実際に作るとなれば
まずは計算で求めるルーチン作りが先だろう
ロマン実現のためのテーブル作りにだって必要になるし
>>806 普通正規化するだろ
バカみたいに広いテーブル作ってどうすんだよ
809 :
デフォルトの名無しさん :2007/07/24(火) 04:38:12
正規化とは、 4つコーツがあれば番号の小さい順にするとか、 コーツより順子の方を始めにもってくるとかですか???
810 :
デフォルトの名無しさん :2007/07/24(火) 04:41:35
実現する可能性の高いメンツの情報量を下げて、実現する可能性の低いメンツの情報量を あげるなどすれば、 34 * 110 * 110 * 110 * 110 通り の部分で 110が一つ削れる位に出来るかもしれないですね
カンツも考慮してください。これでやっぱり10倍くらいかな。
812 :
デフォルトの名無しさん :2007/07/24(火) 05:21:56
トイツ34通り、順子27通り * 2(鳴き)=54 コーツで34通り * 2(鳴き) * 2(カンツ)=136 34 * 190 * 190 * 190 * 190 = 44 309 140 000 通り 正規化してから、頻繁に出現する番号をはじめの方に集めたとして( ここのやり方は不明 ) はじめの1/100だけを登録するならば、21Mバイトですみます
813 :
デフォルトの名無しさん :2007/07/24(火) 05:29:40
順子27通り * 2(鳴き)=54 、コーツで34通り * 2(鳴き) * 2(カンツ)=136 の190個のうち、頻繁現れるものに小さい番号を割り当てて 番号の小さい順に、並べて191進数 ( a b c d)を作る すると2進でみると上位ビットのいくつかは0が続きやすくなる 数字のでかい部分は、出現しにくいため、はじめから役無しで計算してしまう
814 :
812 :2007/07/24(火) 05:41:08
一桁間違えた 1/200にしても100M使うんだ そして1/200にするには191進数の上位が1以下で無ければならない これは殆ど無理 もっと圧縮する必要がある
815 :
デフォルトの名無しさん :2007/07/24(火) 05:53:48
鳴きを無しにして登録するのは合計翻数と、 鳴きがあったときの翻数を登録すれば1バイトかかる このとき、トイツ34通り、順子27通り 、コーツで34通り * 2(カンツ) 34 * 95 * 95 * 95 * 95 通り 1/50にすれば130Mバイト必要 これでも、上位は2以下くらいの値しかとれない・・・
816 :
デフォルトの名無しさん :2007/07/24(火) 06:02:30
ルール上、カンツとコーツが区別されるのは三槓子と四槓子のみだからカンツは除外しよう すると、トイツ34通り、順子27通り、コーツで34通りで、 34 * 61 * 61 * 61 * 61 通り これならすべてを登録しても、448Mバイトですむ 正規化などして上位一ビット削れれば224M程度で実用的だ
817 :
デフォルトの名無しさん :2007/07/24(火) 06:30:35
特殊な場合を除けば、数字19、2~8、白発中、東南西北のコーツやトイツは同一視出来そうだ この場合では、トイツ 2*3(数字の種類)+2=8通り、 順子 21通り、コーツ8通りで 8 * 29 * 29 * 29 * 29 通りで全部登録しても5Mバイトしか食わない 一気に減った
818 :
デフォルトの名無しさん :2007/07/24(火) 06:56:23
819 :
デフォルトの名無しさん :2007/07/24(火) 07:16:13
結論 数字19、2~8、白発中、東南西北のコーツトイツは同一視し トイツ 8通り、 順子 21通り、コーツ8通りで 全部登録しても5Mバイトしか食わない 国士無双、緑一色、四槓子の判定をまずやって、 三槓子、チートイツ、三色同刻、場自風の加算を求めてから データベースを引けばいいんだ
820 :
287 :2007/07/24(火) 09:10:40
しばらく来ないうちに凄いことになってるな。。。 向聴数計算や聴牌判定でボトルネックになるのは、清一のような一種類の数牌が大量にある場合なので、テーブル参照は結構有効かもしれんね。 普通に作っていって、実際に遅くてどうしようもなくなった場合の最後の手段としてなら考えてみても良いのでは?
ああ、同一種の組み合わせ4枚以上14枚までの順子、刻子の組み合わせだけ持たせるか
822 :
デフォルトの名無しさん :2007/07/24(火) 12:03:42
そこで、同一数字のみであがりの可能性がある個数はいつくあるんだ? 全種の個数と、あがりの形数を求めて書き込もうぜ!
だっ誰かこの「宇宙麻雀」を理解するための麻雀一般相対性理論を先に作ってください、 テンソル、テンソル!!
824 :
287 :2007/07/24(火) 12:19:49
>>822 数字が同じなら、対子と刻子の2個でok
825 :
デフォルトの名無しさん :2007/07/24(火) 12:27:38
ルール ( 決めておけば個数や組み合わせが正しいかチェックできる) 5進数で (下位bit) 000000000 (上位bit)から、000002444までを順に調べていく その値をxとする。 N=5の9乗 AGARI ah[N]; // 3バイト * N = 約6Mバイト とし、xがあがりの形ならば、ah[x].kosuに個数をいれて ah[x].adressに次のKUMI型配列の空き領域の先頭番号を入れる KUMI km[十分大]; あがりの種類が、2とおりあるならば、トイツ、ジュンツ(コーツ、カンツ) * 4を2つ分登録する 1とおりのあがりならば5つ使う class KUMI { public: char mentu : 2; //0~3単騎、ジュンツ、コーツ、カンツ char bango : 6; //駒番号 }; class AGARI { public: char kosu; unsigned short int adress; }:
826 :
デフォルトの名無しさん :2007/07/24(火) 12:33:30
>>824 トイツと、コーツの組み合わせを決定したら一意ってこと?
827 :
デフォルトの名無しさん :2007/07/24(火) 12:38:13
class KUMI { public char koma[5]; // トイツ、コーツ、コーツ、コーツ、コーツの駒番号を登録、0は存在しない事を表す }; にすればいいか
>>822 数牌の面子の種類を求めるだけなら出来るかな
順子の数を n, 刻子の数を m としたとき
組合わせ数は C(9,n)×H(7,m) になるよね。
あ、ここから5枚以上使った場合を引くんだけど
大雑把には求まる
久々にのぞいてみたら、トンプーしかやったことねーって香具師が語ってんのかよ…
超ランなら許容範囲じゃね?
14枚のものは書いてあるけど、それだけでも一致してるか確かめた?
>>825 麻雀は駒じゃなくて牌(はい)なんだけど。
833 :
デフォルトの名無しさん :2007/07/24(火) 23:14:32
まだ、糞テーブル仕様考えてるのかよ。 糞仕様の議論はいらないから、ソースあげろよ
834 :
デフォルトの名無しさん :2007/07/24(火) 23:24:40
>>825 なんだよ。この糞仕様。
こんなの採用する奴のアプリは
絶対に使わない
835 :
デフォルトの名無しさん :2007/07/24(火) 23:25:50
>>819 コイツの思考がウンコなところは、
麻雀は4枚あるんだよ。
その考慮が全く無い
小学生は2度と書き込むなよ
宇宙麻雀は理解できないけど俺実現すればかなり強いであろうアイデアなら思いついたよ、 何年かしてニュースになったら俺だから覚えといてね~
837 :
一種の数牌のみ12の個数はこれでいいですか??? :2007/07/24(火) 23:45:20
#include <iostream> #include <bitset> #define fore(i,j) for(i=0;i<j;i++) #define N 4 using namespace std; class mentu{public:int p;int b;}; int hai[34],m[5],n[5],k,renban[2][34]; mentu mt[4],btm[55]; void del_c(int l){hai[l]-=3;m[k]++;k--;mt[k].p=1;mt[k].b=l;} void del_j(int l){hai[l]--;hai[l-1]--;hai[l-2]--;m[k]++;k--;mt[k].p=0;mt[k].b=l;} int cot(int l){if(hai[l]>2)return 1; return 0;} int jut(int l){if(l%9>1)if(hai[l]>0 && hai[l-1]>0 && hai[l-2]>0)return 1; return 0;} void remov(void){int l=mt[k].b;if(mt[k].p)hai[l]+=3; else {hai[l]++;hai[l-1]++;hai[l-2]++;}k++;} main(){ fore(k,5)m[k]=n[k]=-1; fore(k,34)hai[k]=0;fore(k,9)hai[k]=4; int s=0; fore(k,27)if(k%9>1){btm[s].p=0;btm[s].b=k;renban[0][k]=s;s++;} fore(k,34){btm[s].p=1;btm[s].b=k;renban[1][k]=s;s++;} k=N;s=0; start: if(!k){remov();s++;} while(m[k]<34){m[k]++;if(cot(m[k])){del_c(m[k]);goto start;}} while(n[k]<27){n[k]++;if(jut(n[k])){del_j(n[k]);goto start;}} if(k<N){m[k]=n[k]=-1;remov();goto start;} cout<<s;}
838 :
デフォルトの名無しさん :2007/07/24(火) 23:47:32
N=1のときは、一種の数牌3枚のみなんですけどすでに値が間違えてました・・・
839 :
デフォルトの名無しさん :2007/07/24(火) 23:49:29
N=1なら、コーツ9個と、順子7個のはずですよね・・・
検算用データ:1種の数牌2~14枚、上がる可能性のある個数と面子リスト のデータ。282kB程度のテキスト形式 いるならアプロダ指定してくれ ※やっつけなんで合ってるかは知らんw
山ほど有るのに、何故選好みする?
844 :
842 :2007/07/25(水) 00:22:15
845 :
842 :2007/07/25(水) 00:24:36
>>841 すいませんでした
大きいサイズのアプロダしかないと思ってしまいました
846 :
842 :2007/07/25(水) 01:06:08
848 :
デフォルトの名無しさん :2007/07/25(水) 07:22:43
>>837 だから、このスレは貴様のウンコプログラムを
デバッグするところじゃねえぞ
やるなら他でやれ
849 :
287 :2007/07/25(水) 10:56:42
>>846 やってみたけど、微妙に結果が違うな。なんだろ。
面子の組み合わせは保持してないが、こういう結果になった。
a) 一種類の数牌で、ルール上出現する(各4枚以下、計14枚以下)組み合わせの数
405350
b) aの中で、複数の面子で構成されていて余剰牌が無い場合の数 / 枚数合計が3の倍数の場合の数
2868/92617
c) aの中で、複数の面子+一つの対子で構成されていて余剰牌がない場合の数 / 枚数が3n+2の場合の数
18874/180342
850 :
837 :2007/07/25(水) 12:04:32
もうちょっとで出来る 最低二人は数字が一致しなければ駄目だからな 正しい点数が求められないことになる
851 :
846 :2007/07/25(水) 13:14:09
面子組み合わせを出力して、差異のある部分を抽出して検算してくれ。 自分じゃやる気になれない
852 :
287 :2007/07/25(水) 15:01:35
>>851 比較してみた。なんとなく分かった。
846さんのは、同じ牌姿で雀頭が振り替えできる形を、両方カウントしてるっぽい。
例えば、「11223344」のような形。
実際にリスト中に以下両方があった。
100201201
103200200
それでもまだ数が合わない気がするが、多分同じような理由と思われ。
853 :
デフォルトの名無しさん :2007/07/25(水) 15:06:58
11 234 234 と、44 123 123 は分けなきゃだけだろ 得点に影響するでしょ
854 :
デフォルトの名無しさん :2007/07/25(水) 15:08:28
すまん あがれる個数には関係なかった
855 :
846 :2007/07/25(水) 15:33:32
上がれる個数には関係有る気がするが・・ あとは111222333を刻子の組と順子の組に分けているぞ、俺のは
856 :
287 :2007/07/25(水) 15:58:31
>>855 ん?関係ないでしょ?
メモにあるような、2966/92617みたいな算出をするなら。
三連刻の形を考慮すると、今度は俺のほうが672個候補が多くなった。
なんか、頭無しの一盃口が無いよ。112233とか。(リストで言うと200200)。
857 :
846 :2007/07/25(水) 18:20:18
>>856 修正したものを出したんだけどそっち使ってる?
前のはそれを取るのを忘れてたやつ
858 :
287 :2007/07/25(水) 18:36:52
取るのを忘れた「それ」って、一盃口の形をカウントするってこと? 26142.zipと26144.zip両方手元にあるが、どちらのリストにも「200200」は含まれてないな。
859 :
846 :2007/07/25(水) 18:37:25
あぅ、出力し忘れてる・・・しばしお待ちを
860 :
デフォルトの名無しさん :2007/07/25(水) 18:50:22
メンツ分解の保持は、16bitあればいいことがわかった なぜなら、順子7通り、コーツ9通りで16通りで4bitで表せる 次のように番号を決めて、4桁の16進数が最小になるように並べ替えてそれを保持するんだ 123・・・0 234・・・1 999・・・15
861 :
846 :2007/07/25(水) 19:06:41
でも総数はあってるぞ。今出力結果を眺めている所
通りがかりで、話の流れがよく判ってないけど(
>>846 は何故かうまく解凍できない)
計算してみたんで、良かったら検算用にどうぞ。
*手牌14牌から1種類の数牌のみ取り出した時、和了形の一部になる組合せ数*
左から、枚数 全組合せ数 和了形組合せ数
0 1 1
1 9 0
2 45 9
3 165 16
4 495 0
5 1278 135
6 2922 127
7 6030 0
8 11385 996
9 19855 627
10 32211 0
11 48879 4475
12 69675 2098
13 93600 0
14 118800 13259
計 405350 21743
863 :
846 :2007/07/25(水) 19:35:17
864 :
287 :2007/07/25(水) 19:48:12
>>863 ゴメン。さっき作った比較用スクリプトをまた書き直すのはめんどいのでパス。元の形式でくれたら比較してみます。
>>862 さんのは自分と一致しているので、数字的にはこれで正解かなと。
865 :
デフォルトの名無しさん :2007/07/25(水) 19:51:28
よはや、小学生のプログラム教室と化してるなここ
866 :
デフォルトの名無しさん :2007/07/25(水) 19:54:24
867 :
デフォルトの名無しさん :2007/07/25(水) 19:59:44
メンツ構成数は21743で、あがりの手牌数18874が正解って事??
>>864 その考え方自体が変な気がする、だってテンパイの形に出来ればリーチ掛けて一飜役になるしそれだけで膨大な組み合わせになる。
それに数牌無しで出来る和了形は役満だけだけど考えられるのは天和、地和、字一色、四暗刻、小四喜和、大四喜和、四槓子で
これらの組み合わせだけでもかなりの数になると思うんだけどこれは考慮されてないの?
869 :
デフォルトの名無しさん :2007/07/25(水) 20:06:14
>>868 一種の数牌が完成すれば、三種の数牌の組み合わせも求まるし
すべての牌の組み合わせも求まるじゃないか
一種が基礎なんだよ
870 :
デフォルトの名無しさん :2007/07/25(水) 20:11:25
>>835 4枚あったとしても、2~8のコーツとトイツを同一視しても問題ない
例えば、222 333 444 これらを コーツを表す文字 a で
表せば a a aになるが、これらすべて異なる数字のコーツである事がわかるからだ
また、あがり形にはトイツは一つしかないからこれも平気だ
871 :
デフォルトの名無しさん :2007/07/25(水) 20:11:45
>>869 基礎なら早く作れよ。
うっとしい反論はいらない
872 :
デフォルトの名無しさん :2007/07/25(水) 20:18:39
一種が出来れば、全種の分解はすぐ出来るから、
そしたらルール(
>>539 )に基づいて飜数を計算しようぜ!
数字19、2~8、白発中、東南西北のコーツとトイツを同一視して
計算すれば5Mバイトでデータベースが出来る
例外として、
国士無双、緑一色、四槓子の役満と、
三槓子、チートイツ、三色同刻、場自風があるが個別に判定すればいい
873 :
287 :2007/07/25(水) 20:19:00
875 :
846 :2007/07/25(水) 20:26:58
876 :
デフォルトの名無しさん :2007/07/25(水) 20:29:50
>>874 字牌は、枚数からトイツ、コーツはわかる、する、あとは数牌のみだ
3種あったとして、それぞれ1種の分解数が、2、2、1ならば
全体のメンツ構成数は4である
877 :
876 :2007/07/25(水) 20:32:14
一行目がバグったが・・・ 結局、メンツ構成数については、他の数牌との関係は考えなくていいということだ 個別に求めれば、個数はそれらの積になる
878 :
287 :2007/07/25(水) 20:43:30
879 :
デフォルトの名無しさん :2007/07/25(水) 20:43:50
牌譜を食わせて学習させるシステム作ったら 面白いかも名
881 :
846 :2007/07/25(水) 20:50:43
>>878 手間取らせて申し訳ない
でもテーブルは作る気しないからよろしく。
1対1対応してない(牌のテーブルに対して複数の構成)から上手く組まないと効果が出なそう
882 :
デフォルトの名無しさん :2007/07/25(水) 20:51:50
ルールが限定されていても学習させれるなら、それだけで十分価値があると思うけどね。
884 :
デフォルトの名無しさん :2007/07/25(水) 20:56:26
>>881 2バイト( unsigned int型 または同量のクラス)に、メンツ構成は入れられる
1から5の9乗の配列に、メンツ構成数と、メンツ構成が記録してある最初のアドレス
を指定しておけばよい
例えば、メンツ構成1、メンツ構成2、メンツ構成3と登録されていれば
次のを登録するときに4番目というデータを保持しておく
885 :
287 :2007/07/25(水) 20:57:39
>>881 いえいえどうもどうも。乙です。
まあ、このリスト自体は、実際には役に立たない気はするけども。
凄い暇が出来たら、和了り判定に組み込んでベンチでも取ってみます。
あとは作成中の約一名が同じ結果を出すのを待つのみ・・・か。
887 :
デフォルトの名無しさん :2007/07/25(水) 21:02:36
メンツ構成数が3万だとして、一つ2バイト食うから、60Kバイト使う アドレス(2バイト)とメンツ数(1バイト)を保持する、5の9乗個の配列を確保するのに 5.8Mバイト食う 後半を減らす方法ある???
888 :
デフォルトの名無しさん :2007/07/25(水) 21:22:24
一種の数牌を、5進数に対応させるよりも圧縮できる対応は無いですか? 1/5くらいに出来ればメモリの消費も少なくていいんですけど
889 :
デフォルトの名無しさん :2007/07/25(水) 21:24:51
約、5の9乗 = 2の21乗です 16bitくらいに縮まればいいんですけど
>>889 対子が特殊だから、対子を取り除いたテーブルを作るのは?
891 :
デフォルトの名無しさん :2007/07/25(水) 21:35:09
>>849 によると、1から14枚のすべての組み合わせを表すのに18bitは必要みたいだ
21bitで表せれば十分か 最大36枚記録できる点が無駄に思えるがそうでもないのか
354なのですが、帰省していて話に乗り遅れました。 本気で開発したいです。 MJSimをだれか再うpしてもらえませんでしょうか。
893 :
デフォルトの名無しさん :2007/07/25(水) 21:37:14
>>890 14枚あったときどれかトイツになるのか不明なんですよ
そして、12枚になったとしても、5進数表示より圧縮できる方法ありますか
894 :
デフォルトの名無しさん :2007/07/25(水) 21:39:33
訂正
>>849 によると、1から14枚のすべての組み合わせを表すのに19bitは必要みたいだ
f(5^9≒2e6)=2Byte*5変な書き方・・・
プロデューサーさんが殺してしまったところを閣下は見ていた。 そのあと、やよいが隠した死体を見つけのを閣下が見てて プロデューサーさんの罪が発覚することを恐れた閣下が やよいを口封じのため殺害。 カメラはそのときのもの。
897 :
892 :2007/07/26(木) 00:22:18
いやー土曜日から帰省していたのですが、一気に500レス以上進んでてびびったよ。
今全レス読み終わったとこです。時間を無駄にした・・・。
で、もっぺんお願いしたいのですが、
>>349 =
>>425 さん頼むのでupしてもらえないでしょうか。
あと、
>>425 の最後のほうに書いていた「1のAIプログラム」が探しても見つかりません。
どんなとこにあるのでしょうか?
898 :
デフォルトの名無しさん :2007/07/26(木) 01:35:44
>>897 おまいがつくるかあるやつつかったらいいよ
899 :
846 :2007/07/26(木) 02:46:41
結局作ってしまったw1種14枚までのテンプレート30M(29.8)・・・ まだ組み込んでないけど、遅い上にこのサイズじゃ死ねるなw
900 :
デフォルトの名無しさん :2007/07/26(木) 16:52:48
総当り法ってこれでOK? テンパイ→期待値計算 1シャンテンのメンツ構成を選ぶ→シャンテン数が向上する適当な1枚を加える=テンパイ→期待値計算 nシャンテンのメンツ構成を選ぶ→シャンテン数が向上する適当な一枚を加える(繰り返す)→期待値計算
手変わりを含まない、シャンテン数向上だけの期待値計算では、だめっぽ
初めてこのスレ着てみた。この板自体初めてだけど 最強にはならないだろうけど、適当に組んでみてソース貼ったら読んでもらえるかな? ちょっと時間はかかると思うけど
読む人もいるんじゃないかな? まじめに作る人がいれば、麻雀シミュレーターもきっと出てくるよ。
そか、じゃあ作ってみる 正直、大会系プログラミングばっかりやってたから、こういうある程度大規模になりそうな プログラミングをするのは初めてだからあんまりうまくいく気してないけどorz
いろいろな方法論が有るけど、疑問が有ったら聞けば答えてくれる人がいるかもしれない。
906 :
655 :2007/07/26(木) 18:51:12
手変わり含まないと、面白味がないか。 結局全ての牌34種での期待値を求めていく事になるのか。 4シャンテン位から出したいけど、3シャンテンでも辛そうだなぁ
場合によってはシャンテン数落とした方が上がりやすい場合もあり。 シャンテン数=最速上がり、最良上がりでない場合もあると思われ。
908 :
デフォルトの名無しさん :2007/07/26(木) 19:11:41
一種の数牌のメンツ分解、翻数計算、符数計算は、
基礎だからみんなで使える共通ソースをうpしようぜ!!!
>>539 にルールが乗っている
909 :
デフォルトの名無しさん :2007/07/26(木) 19:14:53
シャンテン数は駄目だよ
なぜなら例えば、一手後にピンプのみがあるけど
3手後に役満があればピンプを選ぶからだ
>>745 の様にやれば高くて近い手を選ぶ様になる
910 :
デフォルトの名無しさん :2007/07/26(木) 19:24:46
テーブル(メモリ)を使うか、CPUを使うかは、両方用意しておいて CPUの方が速度が速ければメモリを消去すればいいとおもうよ
911 :
906 :2007/07/26(木) 19:50:43
≠655です。間違えた
>>909 期待値計算した上でピンフが正着になればそれでいいのでは?(つまらないけど)
>>745 の方法は戦術の一つだけど、最強を考えるとちょっと不満だな。
昔考えた方法は[45]などのターツがメンツになる確率を出して置いて評価関数を重ねて
いく方法。これなら手変わりもシャンテンアップも含めてやれるかな、と
ピン「プ」って何なんだよおい… それとも今までピン「フ」だと思ってた俺が悪いのか・・・?
913 :
349 :2007/07/26(木) 22:37:53
MJSimの実行環境とMJAIのツモ捨てサンプルソース及び私の作ったダミーAI、
それなりに強くて動作が速いやつです。作ったAIの対戦相手に使ってください。
以上をUPしました。
↓
ttp://uproda11.2ch-library.com/src/1117739.zip.shtml MJSimを実行すると、永遠に実行するのでCtrl-Cで止めるか終了してください。
対戦結果はMJSimScore.txtの出力されます。
対戦内容を視覚的に見たい時は。雀譜と言うツールを使ってください。
統計は東風用の各種ツールを使ってください。
914 :
349 :2007/07/26(木) 22:40:12
ダウンロードパスワードは MJSimEXE です。
915 :
349 :2007/07/26(木) 22:42:40
>>904 さん、作るならこの形式がいいです。
何千回の対戦も出来るし、統計やデーター取りも充実しています。
参考までにどうぞ。
916 :
デフォルトの名無しさん :2007/07/26(木) 23:07:21
917 :
892 :2007/07/26(木) 23:15:36
>>913 ありがとう。プログラム組むのは久しぶりですが頑張ります。
ところで
>>1 の「まったりプログラミング日誌」のアプリ強いです。
こんな強いのあったんですね。
ここのブログの開発日記を参考にしてみます。
点数計算は不明、対戦してログから見て。 下に今のバグあり。 AIの作り方の注意事項TXTが有りそれをUPする。 ■既知のバグ ・MJStatで、流局時の局が認識されないことがある。 ・雀友で、得点したのに失点と判定されることがある。 ・リーチ後の待ちの変わる暗カンをしてもチョンボにならない。 ・ツモ上がりしたときの点数計算が正確でない。 ・リーチ直後のロンでリーチがとられてしまう。 ・七対子の時、25符になってない ・天和、地和の判定がない ・4人リーチで流れない。 ・三家和で流れない。 ・九種九牌で流せない。 ・国士の場合、アンカンのチャンカンができない。 ・東風荘に合わせるなら、役牌の役名を(自風、場風、白、発、中)に分けたほうがいい
919 :
349 :2007/07/26(木) 23:21:28
920 :
デフォルトの名無しさん :2007/07/26(木) 23:24:31
点数が戦略に影響するんだが・・・ まずは間違いのない正確な点数が計算できないと作れないだろ・・・ 昔はどうやってAI作ったんだよ?? たまたま作ったやつが、たまたまMJSimで計ったら強かっただけかよ???
921 :
デフォルトの名無しさん :2007/07/26(木) 23:29:05
自分(のアルゴリズム)で把握しているあがり得点とMJSimの得点が ずれていたら一位になれるところを間違えたりするだろ・・・
922 :
349 :2007/07/26(木) 23:30:29
昔の事で、忘れたんだよ、使うな。
923 :
デフォルトの名無しさん :2007/07/26(木) 23:35:29
正確な点数さえ計算できれば、シミュレータは簡単に作れそうなんだが・・・ ここで最初からつくっちゃた方が良くないか?
924 :
デフォルトの名無しさん :2007/07/26(木) 23:38:11
シミュレータ部分に尋ねると、メンツ分解や、得点も教えてくれるようにすればいいんだ 作る側が楽になる
925 :
349 :2007/07/26(木) 23:42:32
頑張ってくれ、では私は消えます。
926 :
デフォルトの名無しさん :2007/07/26(木) 23:47:16
>>925 ソースをもってるんだから作る上の必要な情報を書いてくれよ
927 :
904 :2007/07/27(金) 00:01:56
使ってみたいけど、使い方がいまいちわかんないや
928 :
デフォルトの名無しさん :2007/07/27(金) 00:08:02
メンツ分解のときのように、正確な出力しているかを 複数人で作って比較して作るのがいいんだ 結局、プログラムする上で点数計算はしなければいけない部分なんだ ちゃんと一致するか調べながら進めたらいい
Not Foundなんだけど もう消した?
前に誰かが言っていたメンツ構成をテンプレートにするってのを作ったんだが zip圧縮すれば300kB程になる。圧縮したまま読み込めるやつがいたら計測してくれないか? VBでやってたからその手が使えない・・・
931 :
デフォルトの名無しさん :2007/07/27(金) 01:19:22
932 :
デフォルトの名無しさん :2007/07/27(金) 02:01:38
933 :
デフォルトの名無しさん :2007/07/27(金) 02:19:53
作り方 メンツ分解 → 飜数(役)計算 → ルールに基づいて動かせるようにする → 符計算 符計算は基本部分が完成してからだ データの受け渡し方法が確定しないからな
934 :
メンツ分解1 :2007/07/27(金) 06:30:38
#include <iostream> #define fore(i,j) for(i=0;i<j;i++) using namespace std; int hai[9],m[5],n[5],k,kosu=0,toitu,*msu; class MT{ public: char y[5]; MT(){y[0]=y[1]=y[2]=y[3]=y[4]=y[5]=-1;} int operator ==(MT& z){return (y[0]==z.y[0] && y[1]==z.y[1] && y[2]==z.y[2] && y[3]==z.y[3] );} void sort(){int i,j;char s; fore(i,3)for(j=i+1;j<4;j++)if(y[i]>y[j]){s=y[i];y[i]=y[j];y[j]=s;}} MT& operator = (MT& z){int i;fore(i,5)y[i]=z.y[i];return *this;} void hyoji(){cout<<"mentubunkai "; int i,n;fore(i,4){n=y[i]; if(n>=0){if(n<9)cout<<(n+1)<<(n+1)<<(n+1)<<" "; else {n-=9;cout<<(n+1)<<(n+2)<<(n+3)<<" ";}}} if(y[4]>=0)cout<<(y[4]+1)<<(y[4]+1);cout<<endl;} } **x, mentu; void del_c(int n){hai[n]-=3;k--;mentu.y[k]=(char)n;} void del_j(int n){hai[n]--;hai[n+1]--;hai[n+2]--;k--;mentu.y[k]=(char)(n+9);} int cot(int n){if(hai[n]>2)return 1; return 0;} int jut(int n){if(hai[n]>0 && hai[n+1]>0 && hai[n+2]>0)return 1; return 0;} void remov(void){int n=mentu.y[k];mentu.y[k]=-1;if(n<9)hai[n]+=3; else {n-=9;hai[n]++;hai[n+1]++;hai[n+2]++;}k++;} void touroku(void){ int i,t=0,n,sum[9];MT a; a=mentu;a.sort(); fore(i,9)sum[i]=0; fore(i,4){n=a.y[i];if(n>=0){ if(n<9)sum[n]+=3; else {n-=9;sum[n]++;sum[n+1]++;sum[n+2]++;}}} if(toitu>=0){sum[toitu]+=2;a.y[4]=(char)toitu;} n=1;fore(i,9){t+=sum[i]*n;n*=5;} fore(i,msu[t])if(x[i][t]==a)return; msu[t]++;x[i][t]=a;kosu++;}
935 :
メンツ分解2 :2007/07/27(金) 06:31:47
配列に格納できたよ!試してくれ main(){ int s,p,N=1953125;x= new MT* [4]; fore(k,4)x[k]=new MT [N]; msu = new int [N];fore(s,N)msu[s]=0; fore(N,5)for(toitu=-1;toitu<9;toitu++){ fore(k,5)m[k]=n[k]=-1;fore(k,9)hai[k]=4; if(toitu>=0)hai[toitu]-=2;k=N; start: if(!k){touroku();remov();} while(m[k]<9){p=(++m[k]);if(cot(p)){del_c(p);goto start;}} while(n[k]<6){p=(++n[k]);if(jut(p)){del_j(p);goto start;}} if(k<N){m[k]=n[k]=-1;remov();goto start;}} cout<<"goukei mentu bunkaisu "<<kosu<<"\n\n"; N=1953125;int sum=0,i; unsigned int *adress= new unsigned int [N]; MT ment[23600]; for(k=1;k<N;k++){ p=msu[k];if(p==0)adress[k]=0; else{adress[k]=sum;fore(i,p)ment[sum+i]=x[i][k];sum+=p;}} fore(k,4)delete [] x[k];delete x; /* ************* ここまででデータ生成完了!! ************** */ char a[]="111222333"; fore(k,9)hai[k]=0; for(k=0;a[k]!=0;k++)hai[a[k]-'1']++; p=1;sum=0;fore(k,9){sum+=hai[k]*p;p*=5;} cout<< a<<" no mentu bunkaisu "<<msu[sum]<<endl; p=adress[sum];fore(k,msu[sum])ment[p+k].hyoji();}
このスレも変なやつに目をつけられたなあ
937 :
デフォルトの名無しさん :2007/07/27(金) 08:28:32
938 :
デフォルトの名無しさん :2007/07/27(金) 09:30:14
>>936 麻雀でもやって最強アルゴリズムを考えましょう。
940 :
デフォルトの名無しさん :2007/07/27(金) 13:35:32
そろそろ1000いくからルールだけでも定めない?
>>932 でいい?
最強=どのルールでも強い、じゃ無謀だし実現不可だし。
上がり点、翻、符は従来のままで、役は必ず含まれる基本役だけでも確定させておく
位しないと、組むのが出来ない(期待値とか出しにくい)
>>940 ・大三元・四喜和の鳴きは認めないのか?
・清一はバカチンと面前に差はないのか?
ザッと読んだだけだが、この辺り疑問。ほかにもいっぱい疑問が出てきそう
ローカルルールがあるのなら、その場で提出して決めて書き加えていけばいいのでは 少なくともオレは、 >大三元・四喜和の鳴きは認めないのか? こんなルールがあったことも知らない >清一はバカチンと面前に差はないのか? これは書いてある
943 :
940 :2007/07/27(金) 14:36:14
そうなんだよね、役の辺りに疑問が多い。 自分なりに、 鳴き無効:イーペーコ、リャンペーコ、ピンフ、(タンヤオ←これもなぁ) 食い下がり:三色(同順、同刻)、チャンタ系全部、染め手系全部 役満:九連(鳴き無効)、四暗刻(鳴き無効)、他は有効 人和は取り入れて無い所結構あるから、無くていいと思う(鳴きが入ったら無効だとか揉めるから)
>>932 をちゃんと読んでないのか、書いてあってもあえて書いてるのかわからんが
食い下がりの件は2人も見落としてるみたいだから、*付きは~とかかずに
別にちゃんと書いたほうがいいみたいだね。
とりあえず自分は東風荘ルールで組んでみてる 変更はそんなに面倒じゃないけどしっかり決めないとね
946 :
941 :2007/07/27(金) 15:13:17
>>944 正直ちゃんと読んでなかったお( ´∀`)
混老頭にチャンタがつかないって一般的なのか? 俺のとこでは面前混老は混老2+対々2+チャンタ2+三暗刻2で倍満 喰い老は混老2+対々2+チャンタ1で5飜 に、してるんだか。
それは聞いたこと無いかなあ。 混老は4で対々つかず、という書きかたしてるのを最近見たな、このスレのリンク先だった気が。
純チャンにチャンタが付かないように、混老頭にもチャンタが付かないのが普通 混老頭はチャンタを含めた役数になってる。対々も付けないで含めてしまうのが いいと思う
950 :
デフォルトの名無しさん :2007/07/27(金) 16:27:38
ルールですが、 個人の資質によってかえられる戦略(食いタンとか流局に持ち込む方法)は入れて、 運によって点数が変化する要素(裏ドラや一発やダブルリーチ)は排除してあります 日本プロ麻雀連盟競技ルールに基づきます 東風荘はパオ無しルールだった事を知り、計算の簡略化のためパオ無しを取り入れました
951 :
940 :2007/07/27(金) 16:42:08
>日本プロ麻雀連盟競技ルールに基づきます それだな。淋しいルールだけど後付けで加える形でいいか・・
おいおい、いつからどっかの宇宙麻雀が決めた糞ルールが標準になったんだ?
>>950 >運によって点数が変化する要素(裏ドラや一発やダブルリーチ)は排除してあります
上で何度も言われてると思うが、ダブルリーチはともかく裏ドラと一発は運だけじゃない。
例えば「テンパったとき三四五六から三か六を切ってリーチするとき場に二が見えてなくて
五が4枚見えていれば六が裏ドラの可能性は無いから六を切る」なんてことは普通に考えるぞ。
それに一発はリーチ側ではなくて守り側で何を切るか考える時に影響する。
こういったことさえ考えないAIでは最強なんて言えないだろ。
考えるやつより考えないやつに点数がつくのが問題なんだって
金も掛けないのにインフレルールを 志向する人ってなんなんだろうね。
まあとりあえず、ルールの叩き台として使えばいいので、 今後変更削除付加するルールを話し合って決めていけばいいかと。 いきなりけんか腰になるから、まとまるもんもまとまらなくなる。
957 :
953 :2007/07/27(金) 18:33:22
>>954 多数回試行した時に考えたAIと考えないAIで差が付くなら問題ないと思うが。
>>955 別にインフレルールを志向してるわけじゃない。
現在一般的に行われてるルールを無視するのが俺には変に感じるだけ。
インフレルールだから(ルールから)外すのなら役満を外したほうが戦略的になって面白いかもしれん。
しかしそうすると麻雀とは呼べなくなる。
役満というルールを外さないのと裏ドラ等を外さないのは俺的には似たような感覚。
>>956 けんか腰のつもりはないけどね。
俺も出てきた叩き台のルールに対して意見を述べただけ。
それでも裏ドラ不要の意見が多ければそれはそれでかまわないんだが。
なかなか同意です。 赤五はともかく裏ドラはデファクトスタンダードだろ。 運、運というが何万回もやった結果の平均で一番強いプログラム決めればいいじゃん。 どうせどんなルールでもそうやって決めるんだろし。
959 :
デフォルトの名無しさん :2007/07/27(金) 19:51:37
>>957 ルールーでは役満だけが特別に点数が高くなっていませんよ
ダブル役満やトリプルなどの付加もありません
次のように分けて役満だけが特別にならないようにします
○満貫 2000点 7飜以下基本点2000点以上、40符6翻以上、人和
○ハネ満 8~9飜のとき 3000点
○倍満 10~12飜のとき 4000点
○三倍満 13飜以上のとき 6000点
○役満(四倍満) 8000点
960 :
デフォルトの名無しさん :2007/07/27(金) 19:56:11
(殆どの)役満は狙わないと出せないですけど、 裏ドラは狙わなくても14枚あるうちに勝手に付いちゃうじゃないですか 個人の資質、強さを測りにくくする要素なんですよ それに早い段階リーチして裏ドラを狙う事で 手作り(工夫)の余地を減らす要素なんです
裏ドラは、有れば有るなりに、無ければ無いなりに、それぞれ「戦略」があるはず。 >手作り(工夫)の余地を減らす要素なんです これも一つの戦略にすぎないのでは? 「最強」を決めるのに、個人の思い込み(?)で、 他の人のやる気/参加意思をなくす方が問題だと思う。 「無」がいいという人、何人いるの? 私は、裏ドラ「有」に一票!
962 :
デフォルトの名無しさん :2007/07/27(金) 20:27:24
>>961 裏ドラ無しに一票
あがったときに運まかせで得点が2倍、4倍となるのはおかしい・・・
一人が手作り無しを考えずに最短リーチばかりかけると、他の三人も手作りが出来にくくなる
そして全員が最短リーチを目指せば、運まかせの要素が高まる
飜数を上げ役満を狙ってこそ楽しみ、工夫があるんだよ
こいつってリアルではどんなやつなんだろう。 こんだけ粘着するのは、おれなら金もらっても無理。
ありに1票 現実に近いルールでいいかと 運要素が増えたところで施行数増やせば問題ない ないほうが組みやすいし多分自分は最初は考慮しないけど、それでもリアルに近いルールでやりたい
> ないほうが組みやすいし多分自分は最初は考慮しないけど、それでもリアルに近いルールでやりたい そうそう。 どうせ作るなら、普段自分が遊んで楽しいやつがいい。
966 :
最初の牌パイが国士無双 :2007/07/27(金) 20:49:25
#define アカギシゲル 最強
967 :
デフォルトの名無しさん :2007/07/27(金) 20:51:12
入れるなら入れてもいいですけど・・・ 明確にルールを決めなければ、思考プログラムが作れませんよ 一人一人が個別のルールで作っていたら最強が決まりません 最終的なルールはどうなるんですか?
「最強」ってなんだっけ? 人間も含めて? ポーカーでも人間に勝てない・・・
>入れるなら入れてもいいですけど・・・ お前何様だ。 競馬だって距離がいろいろあるだろ。その条件ごとに最強がいる。それでいいじゃねーか。 まあお前のレス見てる限りじゃ、お前の頭じゃどっちにしても最強のは作れないよ。
970 :
デフォルトの名無しさん :2007/07/27(金) 21:01:05
wikiより抽出しました 付加ルールです どれを加えてどれを入れないんですか? アリアリとナシナシ ピンフとツモの複合 裏ドラ・槓ドラ・槓裏 赤牌・花牌 フリテン立直 ダブロンと三家和 上家どり オカ ウマ 順位ウマ 差しウマ 総ウマ 沈みウマ 外ウマ ワレメ 焼き鳥 責任払い ブー麻雀 アルシーアル麻雀 インフレ麻雀 永田町ルール アリス 雀鬼流
>>968 いずれは人間も入れての最強がいいだろうけど
まだ含めなくていい
972 :
デフォルトの名無しさん :2007/07/27(金) 21:02:38
>>969 条件ごとの最強を決めたいんですが・・・
条件を決めなければ、条件ごとの最強が決まりません・・・
>>972 ほんとにアホだな。じゃあ決めてやる。まうじゃん標準(デフォルト)ルールで作れ。DLL対戦もできるしそれでいけ。
条件決めたぞ。これで作れ以後質問禁止
976 :
デフォルトの名無しさん :2007/07/27(金) 21:18:49
まうじゃんは駄目なんですよ 動かしてみましたけど動作が普通の人間と同速度なんです DLL作ったらそれを動かすホスト部分を誰かが作らなければ・・・ それにプラグイン仕様書から、実際に動くやつを作るところまでがかなり遠いです・・・
はあ?ルール決めたら決めたでホスト部分を誰かが作らなきゃだ? そんなんどんなルールにしてもおんなじことだろが。 気に入らないんだったらお前が作れよ
>>976 >まうじゃん標準(デフォルト)ルールで作れ
↑の意味分からないの?DLL対戦もできるうんぬんはオマケだろ。
お前が条件がどうたらいちいちうるさいから、ルールだけでもまうじゃん準拠で行けばいいじゃんっ手だけの話だろ。
あと、sageれば?お前一人だけageてるみたいだけど。
どうにでもなる文句ばっか言って足引っ張ってんじゃねえよ
980 :
デフォルトの名無しさん :2007/07/27(金) 21:26:46
順序としては、ルールに基づいて 役計算と動作する部分が出来てから、思考ルーチンを作るべきなんです まうじゃんDLLを動かせる部分が出来ていないのに 思考ルーチンを作っても無駄になるんですよ・・・
結局作るから無駄にはならないんですよ
982 :
デフォルトの名無しさん :2007/07/27(金) 21:29:47
>>978 まうじゃん準拠はある個人の意見なんですよ
全体の意見の一致ではありません
全員がそれで最強を目指すっていうなら、ホスト部分も出来上がるでしょうけど・・・
おれもまうじゃん準拠でいいよ
>>982 はぁ?今更そんなこと言い出してんの?
こんなルール問題ごときでなんでそこまでもめなきゃならんのだ。
とりあえずまうじゃん準拠で作ればいいじゃん。
細かい修正はそのあとだろ。
とりあえず、思考ルーチン作って検証していくべきだと思うがな。
お前も電波度だけなら最強だったのにな。
全体の意見が一致しないから条件ごとのって話になったんだろが。
自分の書いた
>>972 を100回読んでみろ。
まあ全体の意見が一致しないってのも99%はお前の固執にあるんだがな。
お前1人以外の全体の意見なら一致するかもなw
てか
>>982 は結局どんなルールにしたいんだよ。
お前が提案したルールに疑問が提示されて、その結果としてまうじゃんルールで行こうって代案が出てるのに、お前一人で反対してるから、まとまらないだけじゃん。
そこまで、条件が条件がとか、全員一致がとかぬかすなら、それなりのもん持って来いよ。
987 :
デフォルトの名無しさん :2007/07/27(金) 21:39:30
このスレとしては、まうじゃんルールで決定ということでいいですか?? そしたらルールに従って役計算と動作する部分をつくりますか まうじゃん本体は、得点などを教えてくれるようですけど・・・ 実際の動作は鈍すぎなのでまずは役計算作らないと
誰か次スレ立ててくれ… 必要ならだけどww
準拠するサーバプログラムがあって、そいつのルールが一意ならそのルールで良いよ。 ほしいのは、対戦が可能になる基盤なんだから。
>>976 > まうじゃんは駄目なんですよ
> 動かしてみましたけど動作が普通の人間と同速度なんです
「ノーウェイト」のモードあるじゃん。
一局数秒で終わる。
もともと一手の思考時間を何秒とするつもりだった?
992 :
デフォルトの名無しさん :2007/07/27(金) 22:13:28
windows版には思考時間を設定するところはないよ
993 :
デフォルトの名無しさん :2007/07/27(金) 22:19:11
>>992 > 動かしてみましたけど動作が普通の人間と同速度なんです
が問題になるんですか?という意味。
#COMが一手一秒程度で手を決めるなら、問題ないように思うのだが。
それと、最大思考時間を設定しないと有利不利がでると思うんだけど
決まってたかの確認。
#一手5分でも良いの?
995 :
デフォルトの名無しさん :2007/07/27(金) 22:26:36
>>994 GUI表示で一局にかかる時間が多すぎるんですよ
一手一秒だとしても画面で動かして終局まで1分程度かかります
1000局の統計を取ろうとしたら、17時間かかるんです
そろそろ1000取りでも始めようか…
997 :
デフォルトの名無しさん :2007/07/27(金) 22:28:56
>>994 (新たに作った)メイン側で
思考時間や正しい手を指すか
チェックする部分をいれたらいいと思います
998
1000
1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。