できたら、インド洋やるから。
1001
1002
1003
5 :
デフォルトの名無しさん:03/03/22 11:39
それより最弱の脱衣マージャンつくってくれ
6 :
デフォルトの名無しさん:03/03/22 11:50
母「おい、おまいら!!夕食ができますた。リビングに集合しる!」
父「詳細キボーヌ」
母「今日はカレーですが、何か?」
兄「カレーキターーーーーーーーー」
妹「キターーーーーーーーーー」
姉「カレーごときで騒ぐ奴は逝ってヨシ」
母「オマエモナー」
父 --------終了-------
兄 --------再開-------
妹「再開すなDQNが!それより肉うpキボンヌ」
母「ジャガイモうp」
姉「↑誤爆?」
兄「タマネギage」
父「ほらよ肉>家族」
妹「神降臨!!」
兄「タマネギage」
母「糞タマネギageんな!sageろ」
兄「タマネギage」
姉「タマネギage厨uzeeeeeeeeeeee!!」
母「ageって言ってればあがると思ってるヤシはDQN」
セールスマン「イタイ家族がいるのはこの家ですか?」
母「氏ね」
父「むしろゐ`」
兄「タマネギage」
妹「兄 、 必 死 だ な ( 藁 」
7 :
デフォルトの名無しさん:03/03/22 17:09
作ったらどこへアップしよう・・・
すごいデジャブがあるんだが・・・気のせいか?
>>5 あなたがCPUに負けたら脱ぎます。もちろん引き分けじゃ脱ぎません。
<血液型A型の一般的な特徴>(見せかけのもっともらしさ(偽善)に騙されるな!!)
●とにかく神経質で気が小さい、了見が狭い(臆病、二言目には「世間」(「世間」と言っても、一部のA型を中心とした一部の人間の動向に過ぎない))
●他人に異常に干渉して自分たちのシキタリを押し付け、それから少しでも外れる奴に対しては好戦的でファイト満々な態度をとり、かなりキモイ(自己中心、硬直的でデリカシーがない)
●妙に気位が高く、自分が馬鹿にされるとカッと怒るくせに平気で他人を馬鹿にしようとする(ただし、相手を表面的・形式的にしか判断できず(早合点・誤解の名人)、実際にはたいてい、内面的・実質的に負けていることが多い)
●権力・強者には平身低頭だが、弱者に対しては八つ当たり等していじめる(強い者にはへつらい、弱い者に対してはいじめる)
●あら探しだけは名人級でウザく、とにかく否定的(例え10の長所があっても褒めることをせず、たった1つの短所を見つけては貶す)
●基本的に悲観主義でマイナス思考に支配されているため性格が鬱陶しい(根暗)
●何でも「右へ習え」で、単独では何もできない(群れでしか行動できないヘタレ)
●少数派の異質・異文化を理解しようとせず、あるいは理解を示さず、排斥する(差別主義者、狭量、視野が狭い、多数派=正しい と信じて疑わない)
●集団によるいじめのリーダーとなり皆を先導する(陰湿かつ陰険で狡猾)
●他人の悪口・陰口を好むと同時に、自分は他人からどう見られているか、人の目を異常に気にする(自分がそうだから容易に他人を信用できない、ポーズだけで中身を伴っていない、世間体命)
●自分の感情をうまく表現できず、コミュニケーション能力に乏しい(同じことをレコードの再生のように何度も言って変)
●たとえ友達が多い奴でも、いずれも浅い付き合いでしかなく、心の友達はおらず孤独(心の感度が低く、包容力がなく、冷酷だから)
●頭が硬く融通が利かないためストレスを溜め込みやすく、また短気で、地雷持ちが多い(不合理な馬鹿)
●たとえ後で自分の誤りに気づいても、素直に謝れず強引に筋を通し、こじつけの言い訳ばかりする(もう腹を切るしかない!)
●男は、女々しいあるいは女の腐ったみたいな考えのやつが多い(例:「俺のほうが男前やのに、なんでや!(あの野郎の足を引っ張ってやる!!)」)
11 :
デフォルトの名無しさん:03/03/22 23:06
たまねぎage
保守
14 :
デフォルトの名無しさん:03/03/23 11:02
前スレなんていらないよ。
どうせ堂堂巡りなんだから…。
それよりも、つくっている人がいるのか?
15 :
デフォルトの名無しさん:03/03/23 19:57
たまねぎage
ここはVBで麻雀つくるスレですね〜
17 :
デフォルトの名無しさん:03/03/24 10:57
18 :
デフォルトの名無しさん:03/03/24 11:44
JAVAで作ってるんだけど、なかなか時間がとれなくて
結局、前スレではソースは出たの?
URLきぼん
どうせ荒れるんだからゲ作板でやれよ
おまえがな
2 0 逝 っ て よ し
たまねぎage
なんだ、この程度しか釣れないのか
河岸を変えてみるか
で,完成したのか?
26 :
デフォルトの名無しさん:03/03/26 03:15
たまねぎage
前すれで作ってたやしはもう開発止めちゃったの?
>>27 いろいろ考えすぎて、今何故か東風荘のスコア集計ツール作ってる。
もう高機能集計ツールあるから作らないくていいよ
正確には牌譜読み込み、再生ツールだな。
これでmjscoreを使った待ち牌当てゲームをつくって、
AIに解かせてみようかと。
牌譜読み込み、再生ツールは既に使えるやつがあるよね
32 :
デフォルトの名無しさん:03/03/27 17:08
age
33 :
デフォルトの名無しさん:03/03/27 21:17
package kernel.game;
public class Game {
private YamaHai yamaHai;
private Player[] player;
private int numberOfPlayer;
private HaiOfPlayer[] haiOfPlayer;
public void run(){
setup();
int count=0;
while(true){
int playerPointer=count%numberOfPlayer;
Hai pick=yamaHai.getNext();
haiOfPlayer[playerPointer].add(pick);
Hai drop=player[playerPointer].tumo();
haiOfPlayer[playerPointer].remove(drop);
count++;
}
}
private void setup(){
}
}
ここまで作って停滞中
34 :
デフォルトの名無しさん:03/03/27 22:01
常にcomが起家になり、いきなり「天和・字一色・大三元・四暗刻」
を上がる。これこそ最強の麻雀ソフト。しかもプログラミングは簡単。
やってみれば?
でも、ちゃんと全部の役判定と思考ルーチンもかかなきゃ麻雀ゲームではないな
37 :
デフォルトの名無しさん:03/03/28 11:06
age
配牌 白白白發發發中中11223九
九切ってダブリー 0点
白切って七対狙い 0点+気持ち2点
40 :
デフォルトの名無しさん:03/03/29 11:56
>>38 九きってダブりーしないだろw
大三元四暗刻狙え!!
ってか点数の意味がわからんぞ…
42 :
デフォルトの名無しさん:03/03/29 13:50
>>41 なるほど、
ダブりーするプログラム・白をきるプログラムは組むなってことか…
それにしても、気持ち2点の意味がわからん…
つーか、当たり前すぎて・・・
九を切る場合がないわけではない。
・オーラスで自分が親でない
・自分が現在トップまたはこれであがれば逆転可能
小三元(2)・ホンイツ(3)・イーペー(1)・ハク(1)・ハツ(1)・ダブリー(2)
ロンなら10翻―16000、ツモで11翻−12000の6000(計算違ってたらすまん)
金をかけてたら、死に物狂いでチュンを鳴(ry
>>44
一行目と反して、9切ってる結果じゃん
cout << 汗() << 恥() << 涙() ;
47 :
デフォルトの名無しさん:03/03/30 13:02
そう言うのなら、少しだけ。
13はある人の意思に従い死んでくれと書いた。
が、それは既に過去のこと。
あれから俺は改心し頭も使う様になった。
その証拠にこれを残そう。
死んでくれ。
そう書いたときにお前は俺がうそ?と思うと思った。
だからマジで(wと書いた。
俺はお前が思っているような人間じゃない。
もし気が触れていたのなら悪かった。
謝ろう。
それじゃぁ。
あ、そかそか。チャンタもあったね(汗
えーっと、チャンタ(2)があれば、ロンで3倍満、ツモで数え役満、でいいのかな?
50 :
デフォルトの名無しさん:03/03/30 13:59
>>44 >九を切る場合がないわけではない。
>・オーラスで自分が親でない
これはどーいう意味?
天和積みこみ(終)
52 :
デフォルトの名無しさん:03/03/30 14:58
>>1 ぎゃはははははははぎゃはははははははぎゃはははははははぎゃはははははははぎゃはははははははぎゃはははははははぎゃはははははははぎゃはははははははぎゃはははははははぎゃはははははははぎゃははははははは
>九を切る場合がないわけではない。
>・オーラスで自分が親でない
もうしわけない。こういうことを言いたかったのだが。
配牌 白白白發發發中中11223九
必ずしも、大三元ねらいである必要はない。ダブリーでもいいのではないか。
☆大三元でなくともよい条件:
・自分が現在トップまたはこれであがれば逆転可能。
・オーラスで自分が子であり、上がればその場でゲームが終了する。
でもなぁ、これも考え様かなぁ……
九、1、2と落としてもっと上がりやすい牌で待ったほうがいいのかも。
56 :
デフォルトの名無しさん:03/03/30 21:57
age
>>54 BrainFuckって文字変えればいくらでも変なものができる気がするよな
58 :
デフォルトの名無しさん:03/03/31 23:08
age
59 :
デフォルトの名無しさん:03/04/01 15:11
age
ageるだけじゃなくて完成品をうpれよ
2chで何か共同で物を作る、というのはありえない幻想なんだよな。
Winnyみたいに誰かパワーがあるヤシが頑張ってくれないと。
というわけでお前らがんがれ。期待してまつ。
>>1のインド洋がまずいんだよ。
やっぱりNASAのが欲しいし。
63 :
デフォルトの名無しさん:03/04/02 14:11
神降臨しないかなぁ
> 2chで何か共同で物を作る、というのはありえない幻想なんだよな。
でも、ちゃんとしたテンプレートがあってそれで競うのであれば……という気もするが。
配牌だけでもするサーバとクライアントのテンプレートを希望。
>いろいろ考えすぎて、今何故か東風荘のスコア集計ツール作ってる。
サーバーに求める機能
・点数計算
・配牌
クライアントに求める機能
・(点数計算?)
・(とりあえず)ツモ切り
だけでいいっす。
残りの牌が何枚だとか、そういう処理は個々人がやればいいのでは?
66 :
デフォルトの名無しさん:03/04/02 21:56
個々人でやるさ
67 :
デフォルトの名無しさん:03/04/02 21:57
いきなりCPUが役満できるように
プログラム組んだらいいだけやん
>>67 過去自身満々でそんなことを言った奴が何人居たことか…
あぁ、次のスレたつかどうかしらんが、そのときには>1に
「いきなりCPUが役満できるように
プログラム組んだらいいだけやん」
とかほざかないように、注意書きが欲しいな……
71 :
デフォルトの名無しさん:03/04/03 14:55
結局堂々巡りだな
ドンジャラにかえよう!
2ちゃんねるのドンじゃら作ろうよ・・・ってどこかにスレあったな。
74 :
デフォルトの名無しさん:03/04/04 00:05
ドンジャラはクソ
>>55 さすがにそれでダブリーかけてたら負け組かと思う
メンタンピンドラドラドラカッコイイ
>>2ちゃんねるのドンジャラ
2ぢゃんねるっていうのが既にある
78 :
デフォルトの名無しさん:03/04/04 23:57
>>76 メンチンピンの方がカッコイイですが何か?
男どものチンコをゆぴでピン。略して
メンタンピンドラドラドラのほうが
「チリも積もって」って感じでよい。
そんなこといったらトリプルヤクマンが一番カッコイイもんな
麻雀関連って名前のセンス悪すぎ。
ノンタンドナドナドナとかトリプルタフマンとか。プププって感じ。
82 :
デフォルトの名無しさん:03/04/05 00:26
ワンタンメンドラドラ
83 :
デフォルトの名無しさん:03/04/05 16:52
トラトラトラは好きですが何か?
84 :
デフォルトの名無しさん:03/04/07 16:00
神よ早くVBで創れ
あほなプログラムもかけない厨房
>>1の
晒しage
史上最強って?
どうせ、絶対あがれないように
プログラム組んだらいいだけだ
役満以外全部チョンボみたいにして
CPU側しか役満出ないように汁
ガイシュツです
やばい・・・弱いよオレ
今自分で作ったAIと対戦してるんだけど全然勝てない。
あたりまえだろ、そんな天和しか出してこないAI
なんでスレタイにPART2とかつけなかった?
>>69に同意。
前スレのときは結構ROMってたのになあ。
とりあえず、「麻雀プログラム作れたら一流プログラマ」ってことで釣っていこう
(^^)
93 :
デフォルトの名無しさん:03/04/18 09:26
アゲ
白一色みたいに
白が何枚もCPU側に出るようにしとけ
というか、「CPUもプレイヤーと同じ条件」という前提じゃねーの?
あたりまえです。
∧_∧
( ^^ )< ぬるぽ(^^)
98 :
デフォルトの名無しさん:03/04/23 06:34
おまえら、はやく作れ
その前に麻雀強くなれ。
で、その思考過程を再現すればええ。
いちばん難しいのは面前のダマテンの警戒かも。
あ、面前→門前。。。
>>1よおまえがこんなスレ立てる前に
考えることがあるだろ
最強ってどういうことを最強っていうんだ
ハンディキャップがあっても勝てるのか?え?こら
まずきちんと内容かけや
>>101 必死だな。そんなにインド洋が欲しいのか。
最強の麻雀思考はあるのですが
相手に0.5秒しか時間をあげないプログラムでいいのでは?
CPU側は無制限で
>>102 インド洋は欲しくないが
西インド洋は欲しい
>>103 それがわかりゃ苦労しないと思うが・・・。
・基本は手なり
・不要牌の順は孤立している数牌>オタ風>残りの字牌>普通の数牌>ドラ側>ドラ
・状況によって優先順位を変更(読まれないように時々はランダムに変更)
例えば、他家の聴牌を予想したら安全牌を中心に切るように変更
・見える牌(捨て牌、晒し牌、他家が確実に持っていそうな牌)から
残りの牌を割り出し、壁や手役などの読みに常用する
・上家が牌を捨てた後のプレーヤの鳴き反応(ツモまでのタイムラグ)をチェックして手役を予測
書いてて飽きてきた。
さぁーてと、暇つぶしに書き始めたのだが、いきなり詰まった。
4人の持っている牌の管理はサーバに一任したほうがいいのかな、やっぱり。
でもそうすると今度は他のプレイヤーの牌を覗く方法が見つかる可能性も。
むうがーー
>>108 何でサーバ側にあるデータを他のプレイヤーが覗けちゃうの?
110 :
デフォルトの名無しさん:03/04/25 20:21
麻雀で強いかどうか以前に
イーシャンテンを判定するだけでも結構難しい
↑お馬鹿さま。
112 :
デフォルトの名無しさん:03/04/25 23:12
>>108 クライアントサーバ型にすると、対戦できて楽しそうだね。
その場合は、プロトコルだけ決めて、クライアントは各自勝手に作るということでいいかも。
ズルのほうは気にしなていいんじゃないのかな。
もう一つの方向は、場の状況を食わせると、結果(「何もしない」「なく」「捨てる」etc.)を返す
子プログラムを束ねる親プログラムを作るというやりかたかな。
前者だと手動参加も可能になるんで個人的にはこっちでやってほしいなあ。
開発者が自分のプログラムをサーバにアップする。
サーバは配牌などの制御を行い、自動対戦させる。
運の要素を出来るだけ排除するため、常に対戦させつづけ
途中経過という形でweb上に結果を自動で発表する。
使用言語はperlで統一。
あーー、ごめんなさい、Javaをこのためだけに始めました(;;)perlじゃないです。
>何でサーバ側にあるデータを他のプレイヤーが覗けちゃうの?
自分を他のプレイヤーと偽ることができれば牌の情報を取得できるかも……という不安が。
とりあえず、牌につけるマジックナンバーは、これでいいかい?
ソウズ 11-19
ピンズ 21-29
マンズ 31-39
東南西北 41,43,45,47
白発中 51,53,55
赤5 ソウズ・ピンズ・マンズで+64 判定時に>64な牌があったら1翻つけて-64
判定のやりやすさを考えて字牌は2飛びにしておく。
赤5はソウズなら15+64=79、ピンズ25+64=89、マンズ35+64=99
>>115 ゲーム中はセッション張りっぱなし専用にして
セッションで識別すれば、途中で他人が偽ることなんてできないでしょ。
切断復帰とか、長期的記録するなら認証すればいいだけだし
マジックナンバーはまあなんでもいいんだけど
十進数にしてるのは人間が視認しやすいためかと思ったら赤では64足すのか。
漏れなら0-8, 9-17, ...みたいに詰めるけど、まあ別に大したことではないか。
ところで字牌だけど、1つおきだとどう判定がやりやすくなるの?
字牌かどうか意識しないでまとめて連続した数字だと塔子にする、とか考えてるなら
カンチャン待ちを考慮したときにひっかかるよ。
それに字牌かどうかは数字の範囲でわかるので、そんな細工しなくていいと思う。
#牌の識別考えるなら、漏れは同一牌表記4枚それぞれに別のIDが振られるシステムにして
#赤はルールのほうで一意に特定IDに属性が付くようにしたいなあ。
#牌の追跡もしやすいし。(というか昔そういうの作った)
>ゲーム中はセッション張りっぱなし専用にして
そうやねー、じゃ、そうする方向で。
>カンチャン待ちを考慮したときにひっかかるよ。
ぐはぁ!そういえば・・・・・・あんまり意味ないなぁー
じゃあ字牌はつめて、と。
>漏れなら0-8, 9-17, ...みたいに詰めるけど、まあ別に大したことではないか
とりあえず、テストはコンソール上でやりたいので、見た目が簡単なほうで。
m=n+1;
switch(m){
case 20: m = 11; break;
case 30: m = 21; break;
case 40: m = 31; break;
}
>牌の追跡
点数計算を考えると、計算するときには
同種の牌を全部同じ識別子にしたほうが楽だから・・・・・・
ソウズ 11-19
ピンズ 21-29
マンズ 31-39
東南西北 41,42,43,44
白発中 51,52,53
1枚目 +100 2枚目 +200 3枚目 +300 4枚目(赤) +400
例えば、白4枚なら、151,251,351,451
これを得点計算の時は% 100 すれば 51,51,51,51
あ、消し忘れた。
m=n+1;
switch(m){
case 20: m = 11; break;
case 30: m = 21; break;
case 40: m = 31; break;
}
はドラ表示牌をnとしたときドラ牌mはどれかのチェック、こんな方法でもいっかなぁー?
がんば
連続がんば from 麻雀ソフト作家
馬鹿なんだろうけど、やっぱりイーシャンチェックは結構難しいよ
アガれるときの14枚の牌から
メンツのすべての組み合わせを列挙することはでけた。
たとえば111222333は123 123 123とも111 222 333とも考えられる
後は再帰で聴牌だろうがイーシャンテンだろうがでけるけど
聴牌チェックにしても
37種の牌ですべて再帰すると純粋に37倍時間がかかるので
結構奥が深いね
あ、37種ではないや
もう少しいいアルゴリズムはないかと思案中
>馬鹿なんだろうけど、やっぱりイーシャンチェックは結構難しいよ
CPUがバカでいいなら一向聴を判定する必要はない。
判定するなら、完成したメンツor対子をすべて抽出してから、
一向聴の余剰牌パターン(例:孤立牌2個(くっつき待ち))に
マッチするかどうかチェックすればよい。
当然、七対子や国士は別判定。
>たとえば111222333は123 123 123とも111 222 333とも考えられる
面子の抽出を順子と刻子どっちから始めるか2通りあるよね。
>37種の牌ですべて再帰すると純粋に37倍時間がかかるので
全牌で調べる必要なんて無し。
待ちのパターンによって必要な判定はかなり減る。
いきなり役満するようにしたらいいじゃん。
「俺って天才?」って思いながら書いた124に哀れみを感じながら。
イーシャンテンは次のようなチェックで簡単に出来そう。
持っている牌の前、自分自身、後ろの牌
(ピンズの5なら、4、5、6)をチェックする牌リストに追加。
で、精々15枚の牌を順次足しながら聴牌チェックすればいい。
そのとき余った牌が捨てた牌にあるようならばショボーンと。
15枚じゃないじゃん、ショボーンと。
でも、O(n)ならぜんぜん問題ないと思われ。
>たとえば111222333は123 123 123とも111 222 333とも考えられる
馬鹿?
聴牌チェックは、その2通りのどちらであろうが関係ない
面子が3つ出来てるということだけが必要
>>127 バカは馬鹿だけど、それはそれで重要。
面子の分解パターンを把握しておくことは
思考ルーチンの負荷軽減になる。
>>127 そんなことは知っている。
アガリ役の決定のときにどうせ必要かと思ってやってみた。それに
それは途中でアガリパターンが存在すればリターンするかそのまま
継続して探すかというだけの違いなのでそんなのはいつでもできる
111222333の場合
イーぺーピンフ3アンコウとかは当然ありえないわけだし
ある程度まとまりにして列挙しておいた方が
点計算がしやすいかとおもわれ
アガリパターンが二つあったときどちらを選択するかっていう問題は
点の高いほうを選択するんでしょうか?
>>129 111222333一一七八 九ロン
は順チャンピンフイーペーこーだし
111222333一一七八 六ロン
は三アンコウのみ
極端な例で、ドラもなんもないとき
三レンコウも一色三順もナシならね
必ず高いほうを選択する(最大申告の義務がある)。
符の計算は考慮してる?
56789一一一二三四八八 7ツモ
なんてときはペン7待ち扱いにしなきゃいけないわけだが。
別に義務はないよーな・・
それに点数計算はサーバ側でやるのがりそう・・・といってみるてすと
>>132 鯖は当然やらなきゃならないけど、
点数計算ができないプログラム=麻雀ができないプログラムじゃん。
ルールを効率よく処理する(はずの)具体的なロジックの提示は歓迎だが、
麻雀の当たり前のルールを偉そうに書くアホがいるのにはうんざりだ、
っていう趣旨なら同意。
4枚使いのチートイはアリ?
>>133 当たり前のルールすら知らなそうなわけだが。
こりゃ先が長えわ。
今、手の牌が、「111222333一一七八」だったら、
当たり候補は1234二六七八九になって、
そのうち4メンツ2ジャントウになるのは六九、
六と九をくっつけたとして
1をトイツに見る、2をトイツに見る、3をトイツに見る、一をトイツに見る→失敗
1をトイツに見る、2をトイツに見る、3をトイツに見る、一をジュンツに見る→失敗
1をトイツに見る、2をトイツに見る、3をトイツに見る、六をトイツに見る→失敗
1をトイツに見る、2をトイツに見る、3をトイツに見る、七をトイツに見る→失敗
1をトイツに見る、2をトイツに見る、3をトイツに見る、八をトイツに見る→失敗
1をトイツに見る、2をトイツに見る、3をトイツに見る、九をトイツに見る→失敗
1をトイツに見る、2をトイツに見る、3をトイツに見る、六をジュンツに見る→成功
1をトイツに見る、2をトイツに見る、3をトイツに見る、七をジュンツに見る→成功
1をトイツに見る、2をトイツに見る、3をトイツに見る、八をジュンツに見る→失敗
トイツをT、ジュンツをJで表せば
T1,T2,T3,J六,A一
T1,T2,T3,J七,A一
てな具合に再帰で「あがったときに考えられる組み合わせ」を列挙すればいいじゃん。
符の計算とかも列挙した後に考えればいいし。
>点数計算ができないプログラム=麻雀ができないプログラムじゃん。
点数計算ができなくても、一応麻雀は打てる…… 強い弱いはさておき。
だからとりあえずは「弱くても麻雀を打てるプログラム」を目指しましょ
ごめんよ、先に頭処理したほうが楽だわ。
あと、「六をジュンツに見る」っていうのは「六七八を見つける」ってことね。
>>136 なんか勘違いしてるみたいだけど
点数計算ができないプログラムは
面子構成を把握できてない つまり
麻雀が打てないプログラム ということに
ほかならないんですけど・・・
なんでも再帰でやればいい という考えも
いまのうちに直しておいた方がいいです。
場当たり的なやり方ではなくきちんとね。
とりあえずは「あがれるだけの麻雀」でもいいっていうこと。
最初のプロトタイプであれば、
「白・発・中」が2枚以上あったら鳴く、
それが無かったら、鳴かずに聴牌に持っていく
オタ風いらない。白・発・中が場に3枚以上あったらいらない。
1・9字牌をどんどん切る(笑
これでも十分「ずぶの素人の麻雀」でしょ?
符が何点でー、なんて考えなくても麻雀は打てるし、
「あ、4翻以上になるからマンガンか」程度の理解でも打てるでしょ?
再帰を使おうかというのは、プログラムが簡単になるから。
人間の思考でもそういう感じで処理するでしょ?だからあげただけ。
「なんでも再帰」なんていうのは
>>138の妄想でしかないからあまり気にしないで。
まあもっとも、その「きちんと」という方法を提示してくれればいいんだけど。
(分かってるけどさ。最大で4メンツしか作れないからそれ使えばいいのは)
CPUの思考なんぞより
点数計算(つうか役判定)のほうがウン万倍面倒。
まず役判定から作っとけ。
手牌の管理方法を先に作ってしまうと、
あとで役判定の部分でアルゴリズムの見直しをしたいときに
前者まで作り直しになる。
それに役の有無が判定できないんじゃ、CPUは和了れないよな?
「とりあえず聴牌までもってくだけの麻雀」じゃん。
こんな感じで
鳴ける牌はテンパイするまで全て鳴く
↓
当たり牌が出る又は引いた時、役があれば上がる
↓
役がなければツモ切りで形式テンパイ
あれだ、
本書いてる人、だれだっけ?
ほら有名な人だよ。
初心者入門書を書いてるひと。全般的に。
んでP/ECEってハードのプログラムで
web上で詳しく雀のルーチンについて解説してたきがする。
対戦までできてたっけな。。
サイズが小さいからあまり凄く細かいことはしてないけど
参考程度にググッてみるよろし。
各人好きにやればいいじゃん。
納期があるわけでもなし。
アプローチを試行錯誤するなんて贅沢は、
遊びじゃないとできないよ。
ただし、
>>139の
>初のプロトタイプであれば、
> 「白・発・中」が2枚以上あったら鳴く、
> それが無かったら、鳴かずに聴牌に持っていく
> オタ風いらない。白・発・中が場に3枚以上あったらいらない。
> 1・9字牌をどんどん切る(笑
>これでも十分「ずぶの素人の麻雀」でしょ?
これじゃ動いてもあんまり嬉しくない気がする。
勝ってると配牌やツモが良くなったり、とかは
プログラムする必要はあるの?
井出洋介だね
>「とりあえず聴牌までもってくだけの麻雀」じゃん。
だから「プロトタイプ」言ってるじゃんか(笑)
でも意見ありがとうございます。どれ、このGWは役判定でもいじってるか……
ところで、
>勝ってると配牌やツモが良くなったり、とかは
>プログラムする必要はあるの?
そんな事象はありえません(笑)
152 :
デフォルトの名無しさん:03/05/05 03:11
しかし、カンチャンにずっぽり入るツモとか
プレイヤーが欲しいと思われる牌を選択する
というアルゴリズムはなかなかに難しいぞ。
それはそれで高度な思考ルーチンと言える。
馬鹿みたいに色をそろえるツモなら簡単だけどナ
153 :
bloom:03/05/05 03:13
154 :
デフォルトの名無しさん:03/05/05 03:14
14進数のマシン開発からだな。
話は(ry
最強のプログラムできたとしても
偽アカギ程度の強さだろうな
忙しくてできない……
158 :
デフォルトの名無しさん:03/05/17 03:03
まだできない?
hongyou death march
160 :
デフォルトの名無しさん:03/05/21 17:23
偽アカギは強すぎ!
オサムは弱すぎ!!
ピーコとおすぎ!!!
∧_∧
ピュ.ー ( ^^ ) <これからも僕を応援して下さいね(^^)。
=〔~∪ ̄ ̄〕
= ◎――◎ 山崎渉
神よ早くVBで創れ
163 :
デフォルトの名無しさん:03/06/05 10:42
詳しくのっているホームページない?
165 :
不明なデバイスさん:03/06/13 08:54
age
166 :
デフォルトの名無しさん:03/06/13 10:17
とりあえず役判定のアルゴリズムからだな〜
どこかにクラスとかないの?
そういえば脱衣でリャンペがニコニコになるゲームがあったなぁ
168 :
不明なデバイスさん:03/06/14 20:56
2344556
何を切ればよいですか?
どうやって判断する?
>>168 2,3,4,5,6 それぞれを切ったときの牌姿を想像する。
まあ、切らない(つまりこれ以外を切る)という選択肢もあるし
評価関数の作り方しだいだな
170 :
デフォルトの名無しさん:03/06/19 08:58
なんでもいいから誰か教えてく
考え方がのっている所しらない?
>>170 自分の麻雀うってる時の考え方を整理して、箇条書きにしてみれ。
>>168 5を切ってメンツを確定させてしまうのが一番楽な気がする。
もちろん他の形にもよるけど。
175 :
デフォルトの名無しさん:03/06/23 12:57
遊びのレシピという本にソース付いているが
コメントなしなので、よくわからん
>>174 そうか?状況によるじゃん
他がパンパンで面子決定したいときは 2 (イーペーコニラミ)
頭が欲しいときは 4,6 (5を頭に固定)
チートイやってるときは 6 (プ
234の三色やってるなら 5
誰かが国士やチャンタやってそうなら 5 (イーソーの受け入れ
あとは、誰かリーチかけてて待ちを1点で読みきってたときとか。
待ちを読むのは癖を読むってことだから、
一般統計じゃあ無理だよな。そいつと対局重ねないと。
ていうか、ガッ
178 :
デフォルトの名無しさん:03/06/27 21:08
総天然ショック
180 :
デフォルトの名無しさん:03/06/29 00:45
>>179 まだまだな部分がわからないので教えてください。
とりあえず、プログラミング可能な範囲でね。
「感性」とかも否定するわけじゃないけど、あれは
頭ん中で無意識に演算(と検索)をした結果だと考えてる。
「流れ」は爆牌党とかで出てた考えが面白かったな。
点数に幾分の余裕がありドラが1である場合・・・5切り
これからツモるかもしれないドラを1枚切らなくて済むので、他を切るよりは相手のリーチに対してドラが切れずに降りなければいけない可能性が減る。
自分がリーチ中にドラで振り込む可能性が減る。
等
>>180のような感性とか訳分からない言葉を出してるシロウトは分からんでいいです
182 :
デフォルトの名無しさん:03/06/30 04:56
>>181 感性とかは否定しないけど肯定もしませんよ。
ところで興味があるのが 「点数に幾分の余裕」 の部分。
ここの閾値はナニを基準にします?
絶対的な点数(たとえば25000持ちとか)ではなく
適切な評価関数が必要だと思うんだけど
どんな係数が考えられる?
あと、いろいろ条件を出してきてるけど
それらの複合条件ってのは実際にプログラミングするときは
シンプルにモデル化を行った上でそれを使って
評価を積み重ねた(=評価関数を順次呼び出した)結果
算出されるものであって、if文case文の乱立ではないよね?
183 :
デフォルトの名無しさん:03/06/30 21:26
評価ってどうするの?
184 :
デフォルトの名無しさん:03/07/01 10:03
sage
186 :
デフォルトの名無しさん:03/07/05 20:47
age
まだか?
順次じゃだま
189 :
デフォルトの名無しさん:03/07/13 18:12
まだか?
190 :
デフォルトの名無しさん:03/07/13 19:56
それにしてもスレタイの日本語って変じゃありませんか?
191 :
デフォルトの名無しさん:03/07/13 22:20
__∧_∧_
|( ^^ )| <寝るぽ(^^)
|\⌒⌒⌒\
\ |⌒⌒⌒~| 山崎渉
~ ̄ ̄ ̄ ̄
まだまだみたいだな
194 :
デフォルトの名無しさん:03/07/19 11:59
まだか? まだか?
case文っていくつまで許されるん?
>>195 コンパイラにもよるけど
だいたい1万個までは余裕
1まんこくれい!
(^^)
199 :
デフォルトの名無しさん:03/08/05 01:58
さすがにできただろ?
200ゲット
天和積みこみ(終)
201は過去ログ読めない
203 :
名無しさんの次レスにご期待下さい:03/08/28 12:28
ちきい
204 :
デフォルトの名無しさん:03/09/09 01:25
うほ
結局あれか
なんだかんだ言って誰も作ってないと
206 :
デフォルトの名無しさん:03/09/14 20:53
麻雀アルゴリズム大会とか・・・
適当なレギュレーション決めて、みんなで思考ルーチン持ち寄って
打たせたり出来たら面白いんだけど、どうだろ。
アルゴリズム考えるのは苦手だけど、舞台を作ることなら出来そうな
207 :
デフォルトの名無しさん:03/09/14 22:06
>>206 楽しそう。
インターフェース教えてくれたら参加します
出来たので、適当なページに揚げます
210 :
デフォルトの名無しさん:03/10/31 20:48
各自で作ったアルゴリズムで勝負出来たら面白そうだね
コンピュータだから超高速で打たせて傾向見たら強いとか弱いとかわかるだろう
やるんなら、
あぷろだなら提供するよ。
212 :
デフォルトの名無しさん:03/11/04 00:54
サーバー立てて、ネット経由で対戦したいね。
ただ、ちゃんと通信して、さらに思考するソフトを書くのはかなり大変。
通信部分だけでも誰か作ってくれたらめちゃ楽なのだけど。
サーバーで面倒なのは
・役判定部分
通信関係で面倒そうなのは
・ログイン処理
・配牌を送る処理
・ユーザーにツモを配る。
・ユーザからの捨牌を受け取る
・その捨牌情報を全員に配る(観戦者にも)。
・途中のチー、ポン、カン、ロンを待つ(3秒ぐらい?)
・ユーザーに終局を知らせる。
・上がった場合は点数計算をして、ユーザに知らせる。
・で、配牌をする、の繰り返し。
・終局すれば全員に点数と順位を告げる。
うわー、書いていてめちゃ面倒だわ。
既存の東風荘とかのシステムが利用できるなら、借用したいね。
213 :
デフォルトの名無しさん:03/11/04 00:58
東風荘のリバースをするスレはココですか?
違いますよ
せっかくム板なんだし、人間が対戦するよりも、
システムと、4人分の思考DLL用意して半荘1万回とか10万回自動でやらせて
勝率で勝負するのが楽しいと思う。
>>212 >>215 みたいな方向で良いとは思うんだけど、いきなりフル機能実装するのがむずいよな。
簡易版で
>>212を実装するのが第一歩だと思う。
>>217 おぉ、こんなものが。
まだよく理解してないけど、乱数で打つサンプルが作れれば
一気に大会も実現可能になりそう。
しかし、これデバッグができんな。
4人いないとはじめることもできんし。
すでに作られている自動打ちツールの作者は、どうやってデバッグしたんだろ。
ダミーのMJexeIO.DLLを作るんじゃ、たいへんそ。
>>217 これって、直接東風荘のサーバにアクセスするのではなく、
IEの画面?に表示されたグラフィックの牌とかを認識して何かするソフト、ということみたいやね。
>>219 その自動代打ちツールは公開されてないの?
それさえあれば「とりあえず」なんとかなりそう。
>>220 IEは関係ないけど、そういうこと。
東風荘やったことない?
自動代打ちソフトのソースは公開されてないみたい。
そもそも人間が席をはずしたいときに使うもので、連続して対戦するものでもない。
「電脳代打ろぼっち」と「ドラえもんβ」くらいしか知らないけど。
東風荘でやるなら、普通に遊びにきてる人に迷惑にならないように
せねばいかんので、ちょっと難しいかな。
東風荘じゃ半荘1万回とか10万回できないじゃん
東風荘でやるとすると・・・
1局70回くらいつもれる。
1打に1秒かかるとすると、1局70秒。
俺の成績だと、東風戦1回平均6局。
東風戦1回7分。
24時間やりっぱなしだと、205回。
1日で1万回やるとなると、8秒で1回。
ネット対戦じゃ無理だな。
>>215みたいなやつの方がいいかな。
いや、思考ルーチンが考える時間を入れると結局のところ10万局とかは
実時間ではだめぽの予感。
10万とは言わず100局でも強さを示すには十分だろう。
サーバ作るのは大変なので最初は東風荘を利用するのがお手軽だと思う。
>>224 麻雀ほど順列組み合わせが複雑なゲームで
たかが100局じゃ何もわからないな
誰か統計学でもやってる人いたら
信頼のおけるサンプル数はどれくらいか計算してください
面倒なこと考えず、近場の雀荘に各自パソコン持ち寄って、そこでやれ。
役判定をクライアントにやらせるならサーバーは結構楽に作れそうですねえ
どの道最強のアルゴリズムを目指すなら思考ルーチンに判定アルゴリズムを
入れることは必須ですからねえ。人間ならどんな素人でもあがれるかあがれないか
(=役判定)を考えながら打つわけですし。
いや、ダメだ。クライアント性善説ならいいが、役がないのに上がりを宣言
するクライアントが現れた場合サーバーでチョンボと判定できないとイカサマが
横行する。・・・まんどくせ・・・、牌の配列渡したら役と点数計算する
クラスを作ってくれ。ネットワークプログラミング部はワシが全てやろう。
>>229 他の3クライアントに承認を求めるとか。
ってルールで揉める人間の麻雀と同じになるな(笑)
>>229 牌の配列渡したら役と点数計算するクラスあるぞ。
麻雀サーバ作れるもんなら作ってみれ。
(1)次のファイルを落とす。
麻雀役判定器 Ver.033 YHVer033r.zip
ttp://giga.hp.infoseek.co.jp/NaoSoft/index.html (2)ソースが入ってるので、以下の5ファイルを自分のプロジェクトへコピーする。
Def.h、Hantei.h、Hantei.cpp、Mahjong.h、Mahjong.cpp
(3)ビルドするとErrorMessage()の実体がないといわれるので、game.cppから
この関数だけMahjong.cppにコピーする。
(4)以下サンプル。あとは自力でよろしく。
GameYakuhanteiMode.cppがこのクラスを使ってるので、これを見るといい。
#include "Mahjong.h"
#include <memory.h>
#include <iostream.h>
int main(int argc, char* argv[])
{
//門前清模和 平和 一気通貫 20符 4飜 7700点(親)
//1マンが上がり牌
//2m3m4m5m6m7m8m9m2p3p4p5p5p1m←下のを見やすくしたもの。
char t[]={1,2,3,4,5,6,7,8,10,11,12,13,13,0};
Mahjong m;//役判定クラス
m.Init();//初期化
m.m_Tehai.tehai_num=14;//14枚
memcpy(m.m_Tehai.tehai,t,14);//手牌をコピー
//m.m_Tehai.jikaze=KAZE_NAN;//自風を南にする(子になる)
m.YHM_YakuHantei(false);//点数計算実行(ツモ)
//m.YHM_YakuHantei(true);//ロン
//役を表示
for (int i=0 ; i < m.m_Yaku.YakuNum() ; ++i ){
cout << ::GetYakuName( m.m_Yaku.GetYaku( i ) ) << endl;
}
cout << (int)m.m_Yaku.fu << "符 ";
cout << (int)m.m_Yaku.fan << "飜 ";
cout << m.m_Yaku.score << "点" << endl;
return 0;
}
233 :
デフォルトの名無しさん:03/11/22 04:23
>>231 ほおおお既にあったんか、便利なものが。
じゃあちょっくら作ってみるかね。
折角作っても参加する奴がいないと話にならんなぁ。
サーバ作ってくれたら参加すると思うよ。
最低でもランダムプレイヤーで。
なるほど、ハン数の多いものから優先して
1個1個役をコツコツ判定しながら、
被ったらダメなものを考慮しつつ計算するわけか。
見事なルーチンだねえ。
自分はDelphi使いなので、この判定ルーチンを
移殖したいと思いますが、便宜のために判定クラスは
DLLにして、C++用のヘッダを用意すれば
クライアント側のチャレンジャーもそれを使えるか。
考えたらめんどくせ。どうせサーバーはコンソールアプリになるから
最初からC++で作った方が早いわ。
まあ期待せずにお待ちください。
麻雀はローカルルールが物凄く多いので、その辺を
すり合わせてコンセンサスを得るのがしんどいぞ。
個人的には大富豪やりたいなあ。別スレ作りたいけど
OKだろうか?
>>236 いくつか気になったこととか。
・ソース読んでみて使えそう?
おれは、使い方を調べるために軽く見ただけなんで。
・このソフトの作者、ソースに関する使用条件を書いてないが、
ソースを公開しているのだから、組み込み不可ということはないだろう。
・作り始める前に、仕様を公開した方が良いと思う。
ネットワークを使うなら、サーバはどうするのかとかも。
>>226を書いたのは俺だが、少しだけ着手している。
考えてるところまで。
・ルールは東風荘ルール。
・1時間で1000試合を目指したい。
東風戦1回4秒以内。
>>223のデータを元にして、1打0.01秒以内。
・AI(DLL)とのインターフェース
void OnAction(int PlayerIndex,MJTAKUDATA *Data)//1打毎によばれる
PlayerIndex:Player配列で何番目のが自分の手か。起家が0。
struct MJTAKUDATA{//卓上のデータ
int Yama[136];
int NextTumo;
int Kyoku;
int Dora[8];
int Tsumibo;
int Richibo;
struct MJPLAYER{
int Tensu;
int Kawa[136];
int Tehai[14];
int Furo[4][3];
int RichiPos;
struct MJACTION{//牌を捨てたり、鳴きの指示をするためにDLL側でセットする
int Type;
int Sutehai;
int Furo[3];
}Action;
}Player[4];
};
241 :
デフォルトの名無しさん:03/11/22 09:11
>>240 確かにDLLでやるほうがネットワーク越しにやるよりはだいぶ
速くはなりますね。
ネットワークかませると、おそらく1打0.01秒は無理です。
もしネットワークにするならCRLFで区切った文でサーバから
要求→クライアント応答の繰り返しになるでしょう。例えば
SV -> CL1 : SELECT TSUMO
CL1 -> SV : TSUMO
SV -> CL1 : TSUMO 4PIN
SV -> CL1 : SELECT TAPAI
CL1 -> SV : TAPAI 1MAN
SV -> CL_ALL : TAPAI CL1,1MAN
SV -> CL2 : SELECT TSUMO,CHII
CL2 -> SV : CHII
SV -> CL_ALL : CHII CL2,1MAN
SV -> CL2 : SELECT TAPAI
...
>>240 囚人のディレンマのスレを見ていたが、この程度のシミュで
わざわざネットワークにする必要性もない。基本的にはDLL
方式でいいんじゃないか。ネットワークにするとソケットやら
何やらプログラムの初心者には面倒くさい処理が必要になりますし。
関数の作成だけに専念できるなら参加者の敷居も低い。
今着手しているものを、そのまま発展させていけばOKだと
思う。
243 :
デフォルトの名無しさん:03/11/23 00:08
言語はJavaがいいな
船頭多くして船、山に登る、ってな感じですな。
誰でもいいからサーバなりDLLの原型書いてくれないかな〜。
>船頭多くして船、山に登る、ってな感じですな。
違うと思う。
単に難しいだけ。
>>226 >>240の仕様で作ってみた。
まだ駄目なところもあるが、大体のことはできるとおもう。
ツモって捨てる、鳴く、上がって点数計算、最終結果計算、東風荘牌譜出力など。
これでAI作るという人が現れたら、残りを作る(かも)。
見てみるって人がいたら、そーすをうぷするよ。
うpきぼん
http://up.isp.2ch.net/up/d24a7163be7b.lzh うぷした。
・ソースのみ。
・シフトキーを押すと終了。
・MJSimScore.txtというファイルが作られる。雀譜で再生できる。
雀友やできすぎくんは読めない。
・AI部分は、まだDLLに分離してない。
AIのコードは、MJSim.cppのAIAction0という関数に(とりあえず)書く。
・局は常に流れる。3万点以下でも勝負がつく。
こうしないとずっと流局で終わらんので。
・全体的にテスト不足だが、アルファ版ということで。
250 :
デフォルトの名無しさん:03/12/08 02:15
ダウソ出来ない
期待あげ
期待上げ
>>252さん有難う、ダウンロードできました。
確かにAIAction0の中身を作るだけのようですね。
作っても、他者との対戦が出来ないのが少し残念。
AI部分考えてみます。・・が多分内容表示部分を大量に追加するかも。
内容表示を作らないとデバックもままならない。
間違ってageてしまった。
255 :
デフォルトの名無しさん:03/12/09 09:06
簡単なものですがAIActionの先頭に、下のような卓表示を作りました。良かったら
追加してもらえると嬉しいです。必要ならファイルをUPします。
ドラ1=[6V] ドラ2=[5萬] ドラ3=[8萬] ドラ4=[ 発] 残り枚数=37
[3萬][5萬][9萬][1◎][2◎][1V][2V][3V][5V][6V][ 東][ 北][ 北] [ 中]
8◎ 西 発 発 5萬 7萬 7萬 4◎
[4萬][4萬][6萬][6萬][8萬][9萬][4◎][9◎][1V][2V][6V][ 南][ 北]
5V 5萬 中 1◎ 9萬 4◎ 東 2V
[2萬][2萬][9萬][2◎][7◎][7◎][1V][4V][7V][9V][9V][ 南][ 白]
6◎ 発 3◎ 2V 7萬 西 7◎ 3V
[5萬][6萬][5◎][5◎][8◎][3V][4V][5V][7V][ 東][ 西][ 西][ 中]
白 6◎ 1萬 3萬 8萬 4萬 6◎ 南
つづく。
つづき。
別クラスにしようと思いましたが、いろいろな定義がファイル内なのでコピーしても
管理が大変なので関数にしました、各種定義が.hになれば簡単にクラスに出来ます。
必要なとこだけ表示するようにすれば、5倍以上のスピードになると思いますが、
デバック前提なので簡単にしています。
また、今のデーター構造ではポン・チイ・カンした牌の区別が出来ないように思います。
MJPLAYERデータ内に自分の風(東南・・)が入っていると嬉しいです。
>>252 ようやくDLできますた。(なんかやたら重い+サーバが死んでたよう)
乙でした。
今からソースみてみます。
まだ初たばかりなので、提案を。
>>255 で紹介されているJavaの牌のNOに合わせてみるのも
面白いかと思います。JavaのブリッチAIを作って、対戦できれば楽しいですね。
×今のデーター構造ではポン・チイ・カンした牌の区別が出来ないように思います。
○有りました。別構造体は見てなかった --;
初めてこのスレ見たんですが、とても面白そうなので
私も参加したいなと思い、レスしました。
とりあえず、
>>252さんのソースを参考にDLLを作ってみます。
私はまだ初心者なので、AI機能は253さんの方がいいと思いますが
勉強のつもりで一人で作って見ます。
いいスレですね。また来ます。
262 :
デフォルトの名無しさん:03/12/09 17:42
これが埼京の志向ルーチンでしょう。
1. ユーザーには風牌とか1とか9とかばかりツモらせる。
2. PC側で鳴きまくる。
3. PC側は積み込みまくり。
>>262 4人ともAIなので、PC側がありません。
ユーザー側がありません 訂正
>>255 まうじゃんは、過去レスでも紹介され、AI同士の自動対戦もできるので、意識はしてる。
まうじゃんとの違いは、
・東風荘のログを出す(統計や牌譜再生に東風荘のさまざまなツールが使える)
・本体のソースがあり改造自由(どうでもいいかな)
・AIインターフェースがわかりやすい(と思いたい)
・人間との対戦は全く考慮してない。AI同士を戦わせるのが目的。
>>256 AIActionは、次のバージョン(あれば)でDLLに分離予定。
AIクラスのサンプル(作ってもらえるなら)にいれてほしい。
>MJPLAYERデータ内に自分の風(東南・・)が入っていると嬉しいです。
これに関しては、GetJikaze()を使ってほしい(何か理由があれば考慮します)。
重複するデータは持たないようにしているため。
便利な関数などを提供していないのは不親切だけど、AI用の便利ライブラリ作成に期待。
(自風かどうか調べるものから、見えていない牌の列挙、危険牌列挙など)
>>259 牌の番号が0から詰まっていない理由
・デバッガで見るとき見やすいように
・順子ができてるかどうか判定しやすい
まうじゃんにはWindows版もあり、これのAIインターフェースへのブリッジは考え中。
まうじゃんのAIがつかえれば、当面の敵ができる。
>>260 河のデータのことだと思ってた。
で、河のデータに関しては、-だったら鳴かれた牌ということで。
-19は、19(9ピン)が鳴かれたとき。(次バージョン以降から)
その他のこと。
・バグ多いと思うので、直しながらでよろしく。
・AIに関しての情報を貼ってほしい。
いまのところ肝心の話題があんまりない気がする。
とつげき東北システマティック麻雀研究所
http://www.interq.or.jp/snake/totugeki/ ここを読まずに麻雀AIはありえん。
麻雀講座とか、コンピュータによる「山に残っている牌の予測」とか。
あらの麻雀のページ
http://www8.plala.or.jp/ara3/mj/ とりあえずテンパイに向かうのに必要そうな牌効率(期待値)計算について。
>>255 どうしても「まうじゃん」のような
インターフェースのみの公開型だと
「100万局走らせて統計を取る」
みたいな作業はやり辛い。
やはりオープンソースでないと・・・
>>266さん、もう少し気楽にやっていただけると嬉しいです。
私もやってみたいと思い始めましたが、AI系については初めてに近いです。
>・AIに関しての情報を貼ってほしい。
>いまのところ肝心の話題があんまりない気がする。
これについては今現在、私は何ら答えることが出来ません。
紹介していただいたHPを見て楽しみたいと思います。
こんな程度の参加ですが、期待はずれであれば言ってください。
>>268 興奮しすぎた。自分も手がかりを探している最中。
あと、javaはさっぱりわからんので、そちらはだれかよろしく。
>>270 どうもです初心者ですがよろしくお願いします。
HPを読んだ感想。
あらの麻雀のページ :牌効率の計算については、理論的で分かりやすかったですが
最後の結論がこれでは勝てない^^;(私も読んで同じように感じました)。
また、この様な公開された計算は誰でもできるので、AI戦では勝てないが感想です。
とつげき東北:麻雀講座は有りましたがコンピュータによる「山に残っている牌の予測」
が見つからず。何処でしょう^^;
素人による麻雀AIの考察。異論反論よろしく。
麻雀の様な不確定要素が多いゲーム、及び全数探査が不可能(ほんとに不可能かは不明)
なため浅い探索になりやすい。この様なゲームのAIを作る場合は、一連の強い理論の構築
等は望めないだろう。
では如何にして強いAIを作るのか、それはロジック上の定石の集合体ではないかと考える。
(ここで言う所の定石とは、状況の評価値や、個々の状況を分析するロジック)
オセロや将棋のAIも大量の定石データーベースを持っている。
オセロや将棋のような静的な形での定石は麻雀では難しいだろう、そのため
「プログラムによるロジック上の定石」と表現した。この様なロジックは多くの人が考える
ことにより積み上がるのではないかと、そのため多人数が参加できるのが望ましい。
>>274 頂きました。どうもです。
とりあえず、もう少しマシな形になるまで出直してきます。
私も作ってるけど、なかなか手にならない、^^;
牌の無いとこを捨て牌に選ぶと、牌数が-1になって、表示が暴走するので。
対処用に
// 牌表示
my_locate(xp,yp);
for(int i=0;i<46;i++) {
if((pno=pPry->Tehai[i])) {
while(pno--) {
if(pno<0 || pno>3) { cout << "Error"; break; } <−−−−−−−ここ追加して。
cout << getPaiStr(i);
}
みんなでソースいじるんなら、どっかのcvs鯖使ったほうが良くない?
sourceforgeとか。
保守上げ
http://up.isp.2ch.net/up/bc53812ec9c9.lzh AI部分をDLLに分離してみた。
MJSim.iniを読み込み、[AI]セクションに書かれたDLLをロードする。
DLL名がプレイヤー名になる。
同じAIが卓を囲むのはまずい。
・たとえばAI0〜AI3まで、全部同じDLLを指定すると、4人分のメッセージがきてしまう。1順の間にツモ4回、リアクション16回。
・グローバル変数を共有してしまう。
対処方法
DLLをコピーして名前を変える。
MJSimAI1.dll、MJSimAI2.dll・・・とか。
う〜む・・・
デバッグ中は、いままでどおり、MJSim.cppの中に書くのもいいけど。
DLLとiniファイルは、作業フォルダ(カレントディレクトリ)にないとだめ。
VCのデバッガを使うときとか、
設定で作業フォルダが、プロジェクトのあるフォルダになっていると、
そこにDLLは無いため(DLLはdebugとかにある)、読み込めずに落ちるので注意。
次はiniにフルパス指定できるようにしとく。
>>283 DLLにしてみたけど、やっぱり配列のオーバーランしてるようです。
その他は見てないです。(自分のもやらないと^^;)
デバックモードでやるとランタイムエラー出まくりです^^;
T_Tehai変数は泣いているように見えて笑えました。
オーバーランしているのはCpyTehai配列です
>>285 オーバーランに関してのご指摘有難うございます。
DLL作動せずおかしいなと思ってデバッグかけたら確かに逝ってました。
字牌までジュンツ検索しなくてもいいのに、
大ボケかまして済みませんでした。
逝ってきます。
リーチしたのに、雀譜で見るとリーチがかかってないのはMJSim側のバグで、
リーチのときにログを書き出し忘れている。
void CMJSim::Richi(int Index)関数の最初のところに、
---
LogHaifu(Index, MJACTION_RICHI);
---
↑を追加してください。
>>288 確認しました。どうもありがとうございます。
後は細かな仕様をどんどん加えて公開しようと思いますので
指摘等、至らない点がありましたらよろしくお願いします。
保守
295 :
デフォルトの名無しさん:03/12/12 21:30
>>294について
ただ、チョンボロンしているのであれば
普通は例外が投げられるはずなのですが、どうも
それ以外にも原因があるようなのです。
原因は分かり次第おしらせしますが、とりあえず
AIにもチョンボ判定をつけたほうが無難ですね。
うpしておいてなんですがv0.0.1は無視してください
>>294 まだ配列のオーバーラン起こってるようです。オーバランの仕方で
いろいろなエラーが出るようになった^^
当方、テンパイ出きるようにはなりましたが、まだまだ、捨て牌の選び方が
全然なのでお披露目できません。そちらと全然違う方法なのでソースが巨大化してます;;
今のところ、手牌評価だけは全数検索方法を適用してます。まだまだこれからですが。
>>295 無視してくださいとかいてあるのになんだけど、
MentsCutの一番上のforのところでオーバーランしてる。
たまたまT_Tehai[46](確保してないメモリ)が0以外だと上がりに失敗するので、
---
int T_Tehai[47];←47個
bool MentsCut(int i)
{
T_Tehai[46] = 0;←0を入れておく
---
というか、MJPLAYERのTehaiのデータも47個の配列にすべきだな・・・次で修正する。
データ構造とか、こうしてほしいとかアイディアがあったら教えてください。
データ構造の工夫で手間が大幅に減らせる場合は多いし。
今の手牌だと、カンチャンが判定しずらいかな。
30以下のときで、牌番号%10してから調べればいいか・・・
または、牌番号を10ずつ間を空けるとかどうだろう。
1〜9、21〜29、41〜49、51、61、71、81、91、101、111
>>284 今回これつかってみたけど、結構便利かも。
正直、デバッガで見るからいいやと思ってた。
>>298さんお疲れ様です。
>または、牌番号を10ずつ間を空けるとかどうだろう。
>1〜9、21〜29、41〜49、51、61、71、81、91、101、111
は今のままの方が良いです。forループの回数やデータ量も多くなるので。
修正希望ですが、他家の手牌や、山牌がDLLより見えないようにした方がいいように
思います。また、他家の捨て牌の時のアクションは捨て牌が渡されるようになると
嬉しい。AIにはプレヤーデータのみの渡しで処理できる方が良いと思います。
実際の麻雀のように見えるものしか見えないほうが嬉しいです。
>>300 @>他家の手牌や、山牌がDLLより見えないようにした方がいいように思います。
もちろん。具体的には、参照しても無意味なデータになる。
A>他家の捨て牌の時のアクションは捨て牌が渡されるようになると嬉しい。
たしかに、今の状態だと、最後のアクションはなんだったのかがワカラン。
1つの案としては、有効な最後の他家アクションは参照可能にする。
Game->Player[Game->Turn].Actionの中身が参照可能(捨て牌もわかる)。う〜ん・・・
B>AIにはプレヤーデータのみの渡しで処理できる方が良いと思います。
これはどういう意味でしょう?@と同じ意味?
他家の河、リーチ、フーロ、点数は必要だと思うけど。
MJGAMEの構造は、昔の麻雀ゲームで、4人の手牌や河が縦に並んでいるやつ
(TakuDispで表示されるような)をイメージしてるんだけど、どうでしょ。
ところで、影響大きくてスマンがMJGAME→MJTAKUに名前を変更したい。
卓のイメージとわかりやすいので。
>301お疲れ様です。
>@>........もちろん。具体的には、参照しても無意味なデータになる。
有難うございます。
>A>
やってみます。と言いつつもまだそこまで行ってない;;
>B>AIにはプレヤーデータのみの渡しで処理できる方が良いと思います。
は1と同じ意味です、MJGAMEデータが来るので全部見えるかなと思って^^;
>MJGAMEの構造は、昔の麻雀ゲームで、4人の手牌や河が縦に並んでいるやつ
>(TakuDispで表示されるような)をイメージしてるんだけど、どうでしょ。
了解です。
MJTAKU構造体のイメージ。
-------------------------------------
東2局 2本場 リーチ2本 ドラ9m5p ツモ残50
西家 MEGUMI 27000
北9p8p1m ←河
[][][][][][][] 1m[2m]3m 中中[中] ←フーロ
北家 広末涼子 27000
東1p[中]
3m5m5m9m3p6p9p1s4s5s7s白発
東家 小池栄子 27000 ⊂・⊃リーチ
西9m(リーチ)1m
[][][][][][][][][][][][][]
南家 優香 27000
7m6p[2m]
[][][][][][][][][][] 2p[][]2p
-------------------------------------
ただいま、現実逃避中です・・・
>>302のソースで対戦させようとする人へ
// 捨て牌を探す
for (i = 0; SutePlayer->Kawa[i]; i++);
Sutehai = SutePlayer->Kawa[i];
↓
// 捨て牌を探す
for (i = 0; SutePlayer->Kawa[i]; i++);
Sutehai = SutePlayer->Kawa[i - 1];
に変えてください。
でないと、ロンあがりしない… _| ̄|○
>>297 お疲れ様です。
仕様が変更されている様なので、
ソースは日を改めてうpします。
>>302 お疲れ様です。
とても、参考になります。
>>304 こういう感じの卓は余裕があったらそのうち
GUI化してみようと思います。MFCとかDirectXとか。
保守
(すぐに修正できそうなものだけ)バグ報告
役名
一杯口→一盃口、二杯口→二盃口
CMJSim::LogKyokuEndAgariInfo()
「跳満貫」が2つある
それぞれ「ハネ満貫」、「3倍満貫」に変更したほうがいい
七対子がうまく判定されない
CMJAgari::ConvetTehai(int Index, bool IsRon)と
Hantei::MakeHistogram( char * pHist, const TehaiData & tehai )で
ツモ牌がダブって追加されているため
(どう修正するかは任せます)
小三元のとき役牌がつかない
Hantei ::SearchAndAddYaku(〜)
yaku.yakuhai_num-= 2 ; ←いらない
とりあえずここまで
↑ミスった。
× if(ino<0) { no=-ino; g_strPai[0]='*'; pc=&g_strPai[0]; }
○ if(ino<0) { no=-ino; g_strPai[0]='*'; pc=&g_strPai[1]; } //鳴いてる牌は*が付きます
AIクラスを考えてみた(というか妄想した)。
イメージとしては、普通に東風荘をやっているような感じで
プログラミングできたらなぁと。
ツモのときや、鳴けるときに「ポーン」と音がするアレ。
class MJAI{
public:
MJTAKU m_Taku;
MJPLAYER *m_Self;
int m_Index;
//AIAction()から直接呼ばれる
//状況に応じてOnXxxメソッドを呼び出す
void Tsumo();
void Reaction();
void GameStart();
・・・
private:
virtual int OnTsumo();//ツモ。戻り値は捨て牌番号
virtual void OnReaction();
virtual bool OnPon();//ポンができる状況。trueを返すとポンする
//その後OnSutehai()が呼ばれる
virtual int OnChi();//チーの先頭牌を返すとチーする
virtual bool OnAnkan();
・・・
virtual int OnSutehai();//鳴いた後の捨て牌を決定。戻り値は捨て牌番号
・・・
virtual void OnOtherRichi();//他家がリーチした
virtual bool OnTenpai();//テンパイした
//trueを返すとリーチし、以後自動的にツモ切り
};
あと、本体の方は、次のバージョンには以下をやる予定(できれば)。
・余計な情報は無効にする。
・ちゃんと連荘する。
・
>>309さんのバグ指摘等修正。
とりあえずポン出来るようにしました。けど、どうも少しバグがあるようです。
ちょっと付け足せば、チーもカンも一応出来る仕様にしていますがテスト不足です。
あと、CPUの強さを測るために試合結果からレートを測定できるツールを作りました。
是非、参考にしてみてください。
あと、252さんシミュレータなのですが、一発ロンを見逃してしまうバグがありましたので。
//Turnの次がindex[0]になるようにする
for(i = 0; i < 4; i++){
index[i] = (m_Game.Turn + i + 1) % 4;
}
↓
for(i = 0; i < 4; i++){
index[i] = (m_Game.Turn + i + 1) % 4;
//ロンである時点ですぐに命令を実行する
if(m_Game.Player[index[i]].Action.Type == MJACTION_RON){
Action(index[i], m_Game.Player[index[i]].Action.Type);
return;
}
}
ソースなどは↓でDL出来ます。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/file/1055157603_24/283_MJSimAI.zip >>308 お疲れ様です。
保守
>>314 レートはそのうち上がったり下がったりさせたいなあ。
あと、鳴きでなんかおかしかったら、本体のせいの可能性もかなりあり。
AIの構想。
人間も麻雀をするとき、いくつかのモードがあって、それを切り替えてやっている。
大きく分けて、
面前モード、一色モード、トイトイモード、
守りモード、早上がりモード、逆転モード(点数を意識して上がる)
上記モードの数だけAIクラスを作って、常時切り替えながらやるってのはどうだろ。
>>317 iniファイルにAIをありったけ登録させて、ランダムで対戦させまくって
尚且つレートを反映させたりすればかなり面白くなってきますね。
CalcRate.vbsの方でレート反映処理は可能なのですが、
プレイヤをランダムにはできないので「できすぎ君」に当てても
信憑性薄いかも(^^;
あ、だとすると牌譜は一人だけキャラを統一させる必要ありますね。
AIに関しては後々自前でそうするつもりです。(〜モード)
今は面前と早上がりしかできませんが。
それでも上がるの遅いし。鬱だ・・・
保守age
保守
やっと完成しました^^; まだ、テンパイ即リー、ロン、ツモしか出来ません。
DLLですがサイズが大きいです。手牌評価の全数検索でしたが、完全は出来ず。
役8−9割ぐらいまの探査です。簡単なパターンマッチングDBを持っています。
今回はいかに最適な捨て牌を選ぶかを、自手牌のみの評価で選んでいます。
他は何も見ていません、それでも、そこそこにうまく捨てている感じがします。
DLLはここにあります。
http://up.isp.2ch.net/upload/c=03okari/index.cgi 「お借りします MJSim用AI Dll2003-12-17 20:39:53」
また、どんな配牌でも以下のデータが算出できます。
// 後幾つでテンパイ
// 役の藩数(一部)
// 役まで後1枚の役の藩数(一部)
// 面子の数
// 面子情報
// 最良ターツ評価データ
// ターツの数
つづく
つづき
// 牌の待ち数
// 合計ポイント
// リャンメンの数
// 2カンチャンの数
// カンチャンの数
// ペンチャンの数
上記データの解析はそれほど難しくはありませんでしたが、データを評価し
最適な捨て牌を選ぶことが難しいです。
今後の作成は
・各種評価データ、評価ロジックの最適化、(今は自分の考えで値をふっているだけ^^;)
ここの最適化で、もっともっと強くなります。今は草案
・簡単な役は理解しているが、まったく利用していないので、役の方向へ手の誘導。
・待ち牌の有効個数算出(簡単そう)
・フリテンをしているので、その回避、これも比較的簡単。
・相手の必要牌予測、又は、当たらない牌予測、同じ意味
・山牌のツモ予測
備考: Rでリーチしてますが、その後ロンロンと続くのは
フリテンリーチしていてMJSimが無視しているためロンロンと続くようです。
フリテン回避を作らないと。ようやく場お見る処理がかける。
>>324 頂きました。
参考になります。
>>325 こちらではフリテン処理はしているのですが。
役なしロンだとフリテンなのに、
MJSIMが認識してしまうようです。
まあ、この場合はこちらのフリテン処理が
甘いからなってしまうのですが、
321さんもその点お気をつけください。
ようやく規制解除。
>dllのデバッグ方法が分からないので机上デバッグ状態で
>かなり苦労してます。何か上手い方法あるのでしょうか?
VCとかBCBとか統合環境のあるソフトなら普通にDLLのデバッグができるのでは?
DLLのプロジェクトで、
@ブレークポイントを置く(後でもいいけど)
ADLLをプロジェクトから実行
B実行ファイルの場所を聞かれるので、MJSim.exeのパスを入力
私もデバックはVC++.NETで普通に、EXEと同じようにやっています。
ただ、デバック機能だけでは難しいので、そこらじゅうにデバック処理を
書いています。今回のDLLもデバックモードで出してます。何か起こったら
エラーメッセージが出て止まります^^;
特にC/C++ではポインターのちょっとしたミスで、内容不明のバグが出やすいので。
30箇所以上に多くの基本情報の確認ルーチンが仕込んであります。
エクザプションエラー処理が起こる前にほとんどトラップしてくれます^^
これも入りっぱなしのDLLです^^;
>>324のを実行すると、0.3.1では、いきなり落ちてしまうんだけど、
少し前のやつだと大丈夫なので、こちらの変更にバグがあった??
あんまり考えてなかったが、C#、VB、javaとか他言語でDLLは作成できるのかな?
それらの言語でつくれば、ポインタでのエラーを防げる。
MJTAKU::Tsumoがポインタなので、これは変更するとして。
山の構成で、リンシャンが一番前にきてるのは意味無いな・・・
ドラが一番前でいい。実物の麻雀卓のイメージから抜け出せてなかった。
インタフェースの変更は大変申し訳ないが、変更予定ということで。
>>325 これはどういう意味でしょう?
チョンボは、チョンボになっているはずだけど・・・
やることが増えてきたので、TODOリスト
上にあるほど優先。
★A(緊急)
・鳴いたあと上がるとチョンボになる。
★B(早め)
・リーチ後、ツモ切り以外ができる。
・リーチが2回以上できる。
・ツモ上がりしたときの点数計算を÷3している。
・ダブルリーチができない。
・ハイテイがつかない。
・チャンカンができない。
★C(保留)
・他言語でも使えるようにポインタをなくす。(他言語でも使うならA)
・ドラを山の一番前に持ってくる。(Aかな?)
★D(調査中)
・ロンが2回できる?
AI用の共通ライブラリとクラス(
>>312)も作成予定だけど優先順位低い。
>>328 DLL扱ったこと無いので良くわからないのですが
出来るとのことですので、試行錯誤やってみるです。
>>330 こちらでも0.3.0で確認できました。
0.3.1だと落ちてしまいます。
当方、この後実家に帰ってしまってネットも
プログラムも出来なくなってしまいます。
正月頃復帰しますのでその時はよろしくお願いします。
>>328 ようやくデバッグ出来ました。
これでようやく先に進めそうです。
初心者でホントにすみませんです(^^;;
>>331 0.3.1がある事を気が付いていませんでした、何処からダウンできるのでしょうか?
今は0.3.0でやってます。
手牌評価のがまだ草案のため。次の2点を確認しています^^;
・たまーにリーチなのに、リーチを崩す捨て牌をしてリーチする
(ロンはしていない、これはロン確認と捨て牌決定ルーチンが違うため)
・たまーに、面子を崩す捨て牌をしている。
(これは、上記と同上のバグかな・・・・・)
パターンマッチングDBのデータミスかも
0.3.1がダウン出来次第、対応したDLLをUPします。
質問ですが牌譜読み込み、再生ツールって
peekメッセージでメッセージから牌を識別することは
できますか?
>252さんに代わって最新版はこちらになります。
>
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/file/1055157603_27/MJSim_000301.lzh 有難うございます、ダウンできました。
所で、前のAIで紹介されたドラを取り出す、ルーチンが正常に動かなくなっていました。↓
//ドラ取得(表示牌ではない)
int GetDora(int Index, int *Yama)
{
int DoraFilter[] = {0, 2, 3, 4, 5, 6, 7, 8, 9, 1,
0,12,13,14,15,16,17,18,19,11,
0,22,23,24,25,26,27,28,29,21,
0,33, 0,35, 0,37, 0,31, 0, 0,
0,43, 0,45, 0,41};
return DoraFilter[Yama[Index]]; <====ここで落ちます。
}
0.3.1ではどの用にドラを取り出すのでしょうか?
>>337 そこか〜。ごめん。MJSimのバグだ。
MJSim.cpp 167行目
誤 for(i = 0; i < GetKanNum(m_Taku); i++){
↓
正 for(i = 0; i < GetKanNum(m_Taku) + 1; i++){
ドラのところだけ、AIに渡す用の構造体の山にコピーしてるんだけど、
最低1個はあるはずなのに、コピーしてなかった。
>ところで、ソースはうpできないのでしょうか?
>是非見てみたいのですが、って今は見る機会ないですが。
申し訳ない、ソースを公開しない理由が2つあります。
1.公開できないライブラリー等ヶが使われています。
これを除くと実行できない無意味なソースになってしまいます。
2.今回ツールとして使用したソース以外は、全て0から作ったオリジナルです。
私は、私と違う考えを元にしたAIと戦いたいです。公開した場合
似たようなAIになる事を危惧しています。パターンマッチのデータの変更や
評価の変更だけで簡単に行動の違うAIになりますが、元が同じなので、
強さの限界はまったく同じです。
私の方法が強い方法と思っていません、なので、オリジナルなAIと戦って
いきたいと思っています。
色々な考えを元にしたAIと戦っていきたい^^
MJTAKU構造体の仕様変更案です。意見あればよろしく。
変更点:
・山をわたさない(ドラを渡す)。
・ツモ位置をわたさない(残りツモを渡す)。
struct MJTAKU{
int Kyoku;//局。0:東1、1:東2 〜 4:南1 〜
int TsumiboNum;//積み棒の数
int RichiboNum;//リーチ棒の数
int Turn;//誰の順番か。0:起家〜
//鳴きが入った後のMJMSG_REACTIONメッセージ時は鳴いたプレイヤーを示す
int Dora[4];//ドラ牌。無効なところは0
int RestTsumoNum;//残りツモ数
MJPLAYER Player[4];//プレイヤーのデータ
};
なぜ今まで山やツモ位置を渡していたのか?
・本体側と、AI側で同じデータを使用して、デバッグ時にAIから書き換えたりするつもりだった。
→わかりづらいし、本体側の変更ができなくなるデメリットの方が大きい。
→デバッグ支援機能は考案中だが、その場合は別のインターフェースを作ればいい。
(山を書き換えたり、特定の状況を記録/復活させるなど)
・本体側の開発期間短縮のため(この方がはやいと思った)。
・イメージが浮かびやすそう。と思っていた。
→単に思い込みだった気がする。
>>335 また来年〜。
>>339 質問ですが
・パターンマッチングというのは、具体的にはどういうものなのでしょう?何のパターン?
・なぜ手牌評価を全数検索しないのでしょう?
・面子は複数の分け方があるため、
>>321のデータが複数ある?
まだ、大したことが出来ないのに、説明するのが引けますが。できる範囲で^^
>・パターンマッチングというのは、具体的にはどういうものなのでしょう?何のパターン?
プログラム上のロジックで分析するには、牌の状況は複雑すぎます。これを解消するために
パターンデータによる分析があります。
(このパターン分析のしかたが人それぞれ違ってくると思います、私のオリジナル部分でもある)
何のパターン?=牌のパターンです。
・なぜ手牌評価を全数検索しないのでしょう?
これは、実質的な性能と必要作業数の兼ね合いです。
私の個人的感想としてこれ以上検索しても、それほど有効ではないと判断したためです。
(他のこと(場の評価等々)もやりたいし)
ただ、もっと強くするには、この部分の強化だと思います。
・面子は複数の分け方があるため、
>>321のデータが複数ある?
今ソースで出ている、捨て牌アルゴリズムは、一連の固定的な評価でしかありません。
私のほうは、ツリー構造のデーターになっています。
終端では100を越える時があります。それらの複数の為のデータです。
>>336 >質問ですが牌譜読み込み、再生ツールって
>peekメッセージでメッセージから牌を識別することは
>できますか?
「牌譜読み込み、再生ツールてなんですか?」 て雀譜のことですか?
「peekメッセージ」って何の事?
>>344 そう。雀譜のことだけど調べたら想像と違うアプリ
だったのでスルーしてください。
>>334のたまーに捨て牌をミスしてる点ですが、単にリーチの捨て配を直したり
面子緒崩さないようにするのは簡単なのですが。対処療法では意味が無いので、
なぜその捨て牌を選んだのかの分析と反映に少し時間がかかりそう。
それができれば、もう少し賢くなるかも^^
皆さんおつかれさまです。
私のdll次バージョンは日曜ぐらいになりそうです。
バグ(or未実装?)報告(
>>331以外)
・カンをした時、嶺上牌をツモったのがログに表示されない
・七対子の時、25符になってない
・役牌は飜は追加されているが役名が表示されない
・東風荘に合わせるなら、役牌の役名を(自風、場風、白、発、中)に分けたほうがいい
・ドラがうまく判定されていない
・天和、地和の判定がない
>>342 回答サンクス。
とんちんかんな理解かもしれないけど。
パターンマッチング・・・どんなときにピンフに近いとかは、状況(シュンツがいくつあるとか)を持っておくしかないなぁ。
メンツの分け方・・・なるほろ。メンツやターツ抜いたりするのは、再帰を使っているのだから、ツリーになるほうが自然か。
>>348 バグ報告感謝。
ドラの件がいちばんまずいな(A緊急)。それ以外はBということで。
ポンをした後、チョンボになる件、こちらのバグでした。
ポンが役判定関数の方へわたっていなかった、という情けないバグ。
しかし、これを直したら、役判定の中で落ちるようになってしまった。原因がわからん・・・・・・
これを直したら、新しいインターフェースのやつを出す予定。
今後はインターフェースを換えても互換性を保つようにする予定。
(案)
AI側がint AIInterfaceVersion()を実装して、使用したいインターフェースのバージョンを返す。
それによって、本体側が送ってくる構造体の種類や、呼び出す関数が変わる。
ようやく直った・・・
0.3.2
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/file/1071668170_5/MJSim_000302.lzh ・鳴いたあと上がるとチョンボになるのを修正。
・ドラが判定されていないのを修正。
・食い断は0飜にした。食い断のみでは上がれない。
・小三元だけで4飜なのを小三元2飜+役牌2にした。
★A(緊急)
・新しいMJTAKUインターフェース。
・チーの後、捨て牌がおかしい。
★B(早め)
・リーチ後、ツモ切り以外ができる。
・リーチが2回以上できる。
・役牌は飜は追加されているが役名が表示されない
・チョンボのときに点数が減らない。
・ハイテイがつかない。
・ツモ上がりしたときの点数計算が正確でない。
・ダブルリーチがつかない。
・チャンカンができない。
・カンをした時、嶺上牌をツモったのがログに表示されない
・七対子の時、25符になってない
・東風荘に合わせるなら、役牌の役名を(自風、場風、白、発、中)に分けたほうがいい
・天和、地和の判定がない
★C(保留)
★D(調査中)
・ロンが2回できる?
>パターンマッチング・・・どんなときにピンフに近いとかは、状況(シュンツがいくつあるとか)を持っておくしかないなぁ。
今の段階では、あまり詳しくいえなくてすみません。
勝ったり負けたりのAI対戦ががんがん出来るようになったら議論していきたいです。
>メンツの分け方・・・なるほろ。メンツやターツ抜いたりするのは、再帰を使っているのだから、ツリーになるほうが自然か。
再起構造の問題点は、通り過ぎたところの再評価が出来ないとこです。
例えば、頭緒抜いてから評価していますが、頭が無い場合を評価できません。
---345
123
の場合33以外に頭がない時、33を抜いて評価してしまい、面子二つが消えます。
これ以外にも、たくさんの状況があります。
また、評価も単純なポイントになりやすく、静的です。
>>352 ごめん。それ今デバッグしてた。
MJSim.cpp44行目
誤return j > 0 ? true : false;
↓
正return j == 0 ? true : false;
面前チェックで、面前の判定が逆。
構造体を変更してから、(なんとなく動くので)そのままDLLを使っていてハマった。
突然落ちたり。MJSim終了時にエラーが出たり。
AIが変なアクション指示を返しても、本体側で修正しているため動くけど、
AI側は、関係ないメモリを書き換えている。
まぬけすぎ・・・ほかにもmemsetでsizeofに指定する構造体の名前を間違えたりとか、
ポインタの恐ろしさを十分に堪能した。ヤレヤレ。ポインタの無い国へ帰りたい。
あと、
@DLLをいくつかコピーして
A開発環境で開いているプロジェクトのDLLも(何も更新していなくて)同じもの
のとき、コピーしたDLLの分のメッセージもデバッガで拾えてしまう。
最初何が起こったのかワカランかった・・・
>>351 メンツの分け方・・・たしかに頭を抜く方法はまずい。う〜ん、どうやろうかなあ。
MJSimがある程度、安定したところで、
優先度B(の表示上の問題とか)は修正を保留にしてAIに着手しようかと。
その過程で、MJSimも徐々に直す予定。
Aのはもちろん即修正。
ドラの判定がおかしいのがまだ健在なので、これは何とかしたい。
表示もされてないし。でも、ドラの分ハン数がある場合もあるんだよなあ・・・・
うお、ツモ数も出なかったので、入れた場所が悪かったかも、確認します
ファイルに一定の書式で書いておき、関数を呼ぶとその状況になるとか。う〜む・・・
一案。
・行数は固定。
・[]のところは書きかえない。河でも[]が使える。
・「>」があるところがツモ番のプレイヤー。
・配牌からのつじつまがあってないと、雀譜で再生できないが、まあ問題ないかな。
---------------------------
東2局 2本場 リーチ2本 ドラ9m5p ツモ残50
西家 MEGUMI 27000
北9p8p1m
[][][][][][][] 1m[2m]3m 中中[中]
>北家 27000
東1p[中]
3m5m5m9m3p6p9p1s4s5s7s白発
東家 27000
西9m(リーチ)1m
[][][][][][][][][][][][][]
南家 27000
7m6p[2m]
[][][][][][][][][][] 2p[][]2p
---------------------------
やはり、ドラ牌と残りツモ数が見えないです。
ミスしていないと思いますが、よろしければ見ていただけると嬉しいです。
int Dora[4];//ドラ牌(表示牌ではない)。無効なところは0
int RestTsumoNum;//残りツモ数
ミスってたTT ごめん 場所悪しTT
失礼いたしました。2行の挿入場所は次の2箇所が正しいです。
前野は破棄してください。 m(_ _)m
データは正しく入っていました^^;
void TakuDisp(int Msg, int Index, MJTAKU *Taku); //<=====ここ
void CMJAI::Action(int Msg)
{
switch(Msg){
:
:
:
TakuDisp(Msg, m_Index, &m_AITaku); //<=====ここ
//呼び出し
AIAction(Msg, m_Index, &m_AITaku);
>>362 わかったあああ。謎は解けた〜。本題でないことで悩ませてスマン。
・修正方法
@void TakuDisp(int Msg, int Index, CMJTaku *Taku); にする。
A情報を取得
ドラを取得 Taku->GetDora(index);
ドラの数を取得 Taku->GetDoraNum();
残りツモを取得 Taku->GetRestTsumo() ←Numを付け忘れた・・・
・理由
Doraと、RestTsumoNumは、MJSimでは使っていなくて、
AIに渡す直前に書き込んでいるので、何にも入ってない。
なぜそうなっているのかというと、MJSimではドラと残りツモは山から読んでいるため。
動的に取れる情報は、動的に取ることで代入忘れを防いでいるつもり。
本来は使えなくすべきだが・・・
MJSim 0.0.4対応のAIのDLLです。
↓
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/file/1071668170_10/MJAI.lzh >表示だけじゃなくて、特定の状況を簡単に作れるAI開発支援がいるなあ・・
最初は、欲しいと思いMJSimを変更かけましたが、VUP等の変更が多いのと、
内部が思ったよりもランダムだったのであきらめました。
>今どうやってデバッグしているんでしょう?
私のプログラム作成の基本ですが。確認ルーチンや表示ルーチンが全体ソースの
2割ほど入っています。そこかしこに^^
なので、今ではその部分に助けられて、デバックも楽になりました。
今はある現象が発生するのを条件でハントし、関連情報がダダーーと出ます。
関連が多いのでデバックでは追ってられない感じです。
これが入っているDLLなので、しかもDEBAGモードで、何か起こったらいろいろ
出てしまう・・・^^;
チーを直した。バグバグだった。男チャ漬けさんスマン。
MJSim 0.4.1
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/file/1071668170_11/MJSim_000401.lzh ・チーの後、捨て牌がおかしいのを修正。
・ポン、チー時の捨て牌でツモ切りの指示がされた場合、一番左の牌を切るようにした。
・捨てられた牌を使わなくてもチーできるのを修正。
■既知のバグ
★A(緊急)
★B(早め)
・ドラの判定がおかしい。
・ドラのみでも上がれてしまう。
・リーチ後、ツモ切り以外ができる。
・リーチが2回以上できる。
・役牌は飜は追加されているが役名が表示されない
・チョンボのときに点数が減らない。
・ハイテイがつかない。
・ツモ上がりしたときの点数計算が正確でない。
・ダブルリーチがつかない。
・チャンカンができない。
・カンをした時、嶺上牌をツモったのがログに表示されない
・七対子の時、25符になってない
・東風荘に合わせるなら、役牌の役名を(自風、場風、白、発、中)に分けたほうがいい
・天和、地和の判定がない
>>367 う〜む。たしかにassertとかいれとかないと、もうわけがわからなくなってくるなぁ。
作る前は、(役判定を除いて)せいぜい500行くらいの規模だと思ったんだが・・・
もう、その倍くらいになってもーた。
これの修正、よろしくお願いします。
下記の手でリーチした後、
5m5m6m6m6m7m7m7m1p2p3p5s5s
7m の暗槓をチョンボ扱いにする。
結構基本的なところにバグが有って、直したらAIの性格(打ち方)が
変わってしまった。^^; 今までよりテンパルのが少し速くなったけど。
各パラメータ見直さないと、別の意味で変な打ち方に・・・・・・;;
保守
ガイシュツかもしれんが
東風荘は送りカンが可能
>ペンチャンは切ってしまった方がいいかなと思えるんだけど。これから?
おいおい、麻雀の素人が最強の麻雀プログラマを目指してるのか?
>>252お疲れ様です。
>テンパイ時の待ちを列挙するプログラム無いかなあ。
有ります。ちょっと待ってください。UPします。
>・テンパイが速くなったかどうかって、何で見てる?できすぎ君使えないし。
もう、これは、たくさん雀譜を見ていたから、としか言えない。
まあ、変な打ち回しが多数見えて、それがテンパイを遅くしていた。この調査中で
バグを潰した結果、治せる変な打ち回しがなくなったもあります。
>・牌譜を見ていて気になったのは、ペンチャンを残してるところ。
>ペンチャンは切ってしまった方がいいかなと思えるんだけど。これから?
この辺が今ままで作った処理の上限がうっすらと見えてる所です。小技で
対処しても面白くないので。これを、AI的に打開するには
「状況による牌の打ちまわしを行う。」です。
構想は有るけど、どのような形で何時着手できるかは不明^^;
これより、ポン・チイ・カン、ダマテンの方が先かな・・・・・
一通り完成したAIにもしたいし。
内部的には、やりたいことが細かく山済み状態^^;
例として
・フリテンに対する取扱いー>今の処理でフリテンの確率を調べる
・テンパイ形式の統計を取る。
・イーシャンテンの時の・・・・・・・・・・・・・・
>337
>おいおい、麻雀の素人が最強の麻雀プログラマを目指してるのか?
その意味、わけ教えて。
私は、麻雀は弱い方です。^^; ぜひ参考にしたいです。
>>379 状況によってはペンチャンは有効な待ちになる
・手役が絡む
・4や6が4枚切れ
・煮詰まった状況での引っかけ
リャンメン信仰では最強とはほど遠い
>>380 現在の麻雀は「棒テン、即リー、全ツッパ」が最強です。
>>382 それはレートに対する御祝儀の比率によって変わる。
東風荘は御祝儀などないためその戦術は有効ではない。
>>384 東風荘でR2000出るAIが作りたい^^、私は少ししかやってないがR1500ぐらいだと思う^^;
東風荘連続でやる時間が無くて、中断しまくってRが下がってガックリでした。
>>385 つまり、東風荘で最強であればいいと言う事ですか。
ルールによって打ち筋が変化するようなものではなくて。
>>386 一つの目標ですよ。やりたい事は多々あり。
>>378 修正が、どのぃくらい効果があったか数値で見たいな。
リーチ率とか、リーチ平均順目とか。
目標は、最終的にはR2000だけど、まずはR1500の強さに挑戦かな。
東風荘(ラン卓)で数百試合以上やってR1500を維持しているやつは結構強い。
・リャンメンリーチ率が高く、
・先制2フーロ率も高く、
・きっちり降りて放縦率低めで、
・オーラスでまくり手を作ってくる。
これらを実装してようやくR1500だろう。
テンパイチェック関数ありがとん。
>>386 ひとつのルールでまともにやれるのを作るのにすら相当時間がかかると思う。
いろんなルールへの対応は、自分は全く考えてないなぁ。
>>380 それはもう少し先の話。つくりはじめたばっかりだし。
>>525 >修正が、どのぃくらい効果があったか数値で見たいな。
>リーチ率とか、リーチ平均順目とか。
私もそれが見たいです。昨日処理方法に少し悩んだので、処理の違う3つのAI
を作って、千数百試合3回して雀譜で見たけどほとんど同じ^^;
結局自分が気に入った処理にしました^^;
リーチ平均順目の差が見たい。
>それはもう少し先の話。つくりはじめたばっかりだし。
とても楽しみに待ってます。
できすぎくん、改ざんデータで集計中断ってオプションがあるのに今気づいた・・・
チェックついてた・・・
>MJAIに200試合くらいやらせて、できすぎくんで見たところ、
>リーチ平均順目は10.5順(ちなみに自分(人間)は9.8くらい)。ほほぅ。
できすぎくん初めて使います。いいですねこれ。
さっそく最新版でやりました。リーチ平均順目は10.9順に落ちましたが。
>しかし、リーチ2面以上待ち率が悪く、10%(人間78%)。
ピンフ複合率かなが33.8に上がりました。約350試合 ↓にDLLをUP
ダマテン機能を追加すればもっと上がると思います。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/file/1071668170_17/MJAI.lzh 変更点は
・フィルテンを無くしました。
フリテンに付いては今のでもいいのですが、実は不満で、もっと調査し賢く対処したい。
・役を理解し役に手配を誘導する、を下の役で追加。
タンヨウ・ピンフは手なりで。
// 役牌 場風、自風、白発中 (ポン機能まだ無し、早く入れたい)
// 3アンコ4アンコの分析
// トイトイの分析
// イーペーコの分析
// チイトイの分析
// 国士の分析
__役の誘導について、たまに手配の入り方で、役と役の間で手がふらふらする
現象があります。(人間でもたまにあり^^)これは前回のAI的対策に期待かな。
>でも、僕も正月くらいで仕上げたいところ。
うお、速い・・・速く上がって点の取れるAIにしないと。
役誘導、一通も有りました。
395 :
デフォルトの名無しさん:03/12/23 02:39
>>395 ばっちり七対子上がってますね、参考になります。
保守age
作りこんだ部分が3000行超えたので、整理整頓のリファクタリングしてる^^;
今の上にもう1枚処理被せたいし、入れたいのは状況管理。
>>393 う〜む、変わってないような気がするんだけど。
ピンフ複合率の見方がよくわからんなあ。
というのも、詳細集計ボタン押して、「詳細データ」を見ると、
リーチ時の2面以上待ち率(リャンメン・ノベタン待ち)は7%程度になっている。
ピンフはここでしか複合しないと思うんだけど・・・
で、2面以上待ちのとき、和了率は72%で、クソ待ちのときは、同45%。
2面以上待ちでリーチすれば、クソ待ちに対して1.5倍くらい上がれる。
今ほとんどがクソ待ちなので(93%)、
(即リー全ツッパの場合)今より1.5倍上がれるように改良できる。
>>395 今後さらに強くしていくんでしょうか?
399の続き。そんな簡単にはいかないと思うけどね。^^;
次のバージョンでは、
・フリテンはチョンボにする。
・ドラのみで上がったらチョンボにする。(今は1ハン以上あるかどうかしか見てない)
・チャンカンをできるようにする。
・AIInterfaceVersionを呼び出すようにする。
をやる予定。
・AIInterfaceVersionに関して
インターフェース追加でごめん。
今後、新しいインターフェースを決めても、
前のインターフェースをもつAIも変更無しで同時に使用可能にするためにつけたい。
もちろんルールが変わったりしたときは、同時使用不可だけど(できても意味が無い)。
---
extern "C" __declspec(dllexport)
int AIInterfaceVersion()
{
return 1;
}
---
AIがサポートするインターフェースバージョンを返してください。今のは1。
・チャンカンに関して
いまのところ、カンしたときにリアクションできないが、
リアクションメッセージを送るようにする。
最後のアクションが加カンのときだけロン可能。誤ロンはチョンボ。
暗カン、明カンのときは、アクションに何か指定しても無視する。
401 :
デフォルトの名無しさん:03/12/23 17:30
>>399 七対子だけをねらってるので、あんまり強くはならないと思いますが、
改良はしてくつもりです。
当面の予定
フーロの確認
後半でのダマテン(リー棒分もったいないので)
できれば、途中でアンコが増えたら、スーアンコ狙いへのシフト
>>401 普通の上がりのほうもよろしく。
>>402 「詳細データ」というボタンが右側の上から2番目にあるので、
これを押して出てくる画面も見せてもらえる?
僕も見方が完全にわかっているとはいえんなぁ・・・
>>252 先ほどのデータはもう無いので、新しく作ったら、確かに詳細データの
2面率5.6 クソ待94.3、確かに・・・・・・・・改善の必要性あり。
上がってる点数も低いし、まだまだです。
>>398 対戦してみました、ほとんど同じ感じ、対戦相手がいるとやりがいあり。
私とは方式が違う感じがします。
>>398と、
>>393は別のAIだったのか。
できれば、名前を付けてほしいな。
ちなみに自分のは、ryoko(涼子)という名前の予定。デビューできるかなぁ。
名前を発表しといてリリースできなかったらかなり恥ずかしいかも・・・
408 :
デフォルトの名無しさん:03/12/24 00:07
AIでなくて、単に点数計算をしてくれるプログラムソース。
Javaでないすか?
409 :
デフォルトの名無しさん:03/12/24 01:42
DirectXを使って本場MJ並のゲームを製作中なので、
共にがんばりましょう〜
女の声は二人ほどいただいたけど、男の声で迫力のある声はないっすかね・・。
大きな会社を設立したら、小島プロなんかに頼みたい・・・アニメーションも
ちゃんとしたスタッフ集めて作って。エフェクトも。
いろいろ夢は広がります。
410 :
デフォルトの名無しさん:03/12/24 05:53
とりあえず、この思考を付ければ?
何かをツモって今手牌は14枚です
・今見えてる牌から残りの牌の残量を知る
・あらゆる可能性の確率を求める
(タンヤオやホンイツが出来るまであと何牌必要でどのくらいの確率があるか・・など)
・確率と出来上がる役のバランスから最善の牌を探して切る
ここまでが一人用ってとこか
とにかく、もっとも効率的に高い手を作る手段を探すプログラムだね
これだけで一般人レベルにはなると思う
411 :
デフォルトの名無しさん:03/12/24 06:02
同じ要領で鳴くかどうかの判別もおそらく可能
鳴いた後の上がる可能性と役の高さを考慮して最善の効率を判断・・と
裏ドラの可能性も考慮していかないといけないな
裏ドラに何が来る可能性が高いか、見えてる牌から確率を求めて、乗る可能性が50%なら0、5藩として考えるなど
ここまででほんとに牌効率の考えは終わりかな?
412 :
デフォルトの名無しさん:03/12/24 06:07
複合役の問題があるか
これは全パターンを考慮させてもいいかな
(リーチ、タンヤオの確率で一つ。2藩だからx2する)
(リーチ、タンヤオ、ピンフの確率も求める。x3する)
(ホンイツ、中だとx4)
時間かかりすぎ?
>時間かかりすぎ?
必要な役までの早さを比較するのに
そんなに時間はかからない。だけど
>最善の牌を探して
この一文の中身だけが思考処理であって、あとは検証作業程度のもの。
TODOリスト
★A(緊急)
★B(早め)
・捨てた牌で上がるのがチョンボにならない。
・ドラのみでも上がれてしまう。
・チャンカンができない。
・流局時の七対子と国士のテンパイチェックがおかしい。
・リーチ後の待ちの変わる暗カンをしてもチョンボにならない。
・ツモ上がりしたときの点数計算が正確でない。
・七対子の時、25符になってない
・天和、地和の判定がない
・東風荘に合わせるなら、役牌の役名を(自風、場風、白、発、中)に分けたほうがいい
書き忘れた。
追加する関数は、
>>400のやつです。
>>406 動かしてみた。リーチが速くなってるっぽい。
それに、ごくたまーに鳴いているなぁ。
374さんのやつ(
>>393)と対戦させると、微妙に順位がいい。
>>418 勘違い
AIがおかしいかも。
んー
たまに、相手の捨て牌をスルーしてるみたい。
どこがおかしんだろか?
も少し、調べます。すんまそん。
MJSimのソースにTenpai.cppというファイルが追加されたのでよろしく。
>>418 過去ログ見てみたら、
>>314の一発の方のバグ報告を思いっきり見逃していた。
しらべてみます。
>>252 とりあえず頻繁に更新があるのって嬉しいね。
期待してます。
>>325でも指摘されているんだけど、
一発以外でも見逃すし、フリテンのときというわけでもない。なんだろ・・・
MJSim.cppの543行目の
//優先度の高いアクションを採用
for(i = 0; i < 4; i++){
if(m_Taku.Player[r].Action.Type < m_Taku.Player[index[i]].Action.Type){
r = index[r];
}
}
ところの
r = index[r];
が
r = index[i];
のような気がする。
>>424 ソレダ・・・
例えば、indexに2、3、4、1と入っていて、最初r=2。
3(index[1])が2より優先度が高いとき、
rには4(index[r]つまりindex[2])が代入されてしまい、
3のインデクスのプレイヤーがロンで、4のプレイヤーが何もしないだった場合、
3のプレイヤーのロンは無視される。ぐはっ・・・
バグ修正ありがとん。
2m2m3m4m +あとテキトーに3つメンツ という形で
てんぱって2であがった時の
符計算が良くわかんないです
リャンメン待ちともタンキ待ちとも取れなくも無いです
ピンフの時はリャン面待ちじゃ無いと成立しないし
クイタンだとタンキだと待ちによる符が+2になります
この場合高い方を選択すればいいの?
MJSim 0.5.2にて、
・フリテン時のツモ上がりするとチョンボになる。
★B(早め) 修正項目に追加よろしく。
AI作成優先でOKです。
>>427 ルール上は、あがった人間が申告した点数になるので、
普通は両方の得点を計算して、そのうちの点数の高い方にする筈。
>>427 単騎待ちに取った瞬間に平和は消える
平和とは符が基本符のみの役だから
結論
両方の得点を計算して高い方を選択するのだが
ほとんどの場合、平和でなければ単騎待ちに取る
>>431 東風ルールだと、国士の場合はアンカンのチャンカンOKだったような。
確立的には、まずないから、優先度はカナーリ低くて調査以下で十分な感じですが^^;
435 :
デフォルトの名無しさん:03/12/25 20:51
誰か、捨て牌から相手の手の内を予想するプログラム書ける?
手出しかツモ切りかもちゃんと考慮して
待ちは選択可能なのは良くわかりました。
2m2m2m3m 2s2s2s 2p2p2p 7p8p9p みたいな形で
4mを既に切っている場合で3mでロンアガリは出来ますか?
@リーチ後に4mを切ってる場合
Aリーチしていてリーチ前に4mを切ってる場合とか
Bリーチしてない場合
@の場合アガリ放棄でツモアガリ以外チョンボでいいと思うのですが
Aの場合1mと4mでロンはフリテンチョンボだと思います
3mでのロンはタンキ待ちなので
フリテンにはならないような気もしないでもない
Bもロンできそうな気もするけど
一般的にはどうなってますか?
麻雀のルールも知らんの?
和了出来る牌の一部を自分が切ってるならロン和了は全部チョンボ
ツモ和了はOK
リーチ後に一度見逃してその後ロン和了の場合もチョンボ
ツモ和了はOK
ロン和了出来ない牌が出て見逃し、同巡に和了出来る牌をロンしてもチョンボ
ツモ和了はOK
じゃあ上のは全部チョンボだったのか
ほんと知らなかった
さんきう
ちょっと、おもったけど
>>438の
ロン和了出来ない牌が出て見逃し、同巡に和了出来る牌をロンしてもチョンボ
ツモ和了はOK
だと、カタテンで同順じゃなくてもチョンボでない?
正しくは
ロン和了出来る牌が出て見逃し、同巡に和了出来る牌をロンしてもチョンボ
ツモ和了はOK
ようは、ヤマゴシってことでしょ。
東風ルールだとどうでしたっけ。
ん?
おかしくないだろ
222345四五六七八(345)で九が出ても和了できないから見逃し、同巡に三が出てロン
チョンボだよ
>>442 それって、片テン(正式には片和がりっていうのかな)になりません?
後付けだとそれってOKでしたっけ?
意味がわからん。
何を聞きたいの?
早く麻雀AI作りたいなぁ・・・
保守
リファクタリングしてたら、新し方法が見つかり、作り直しています^^;
前にと新しいので2つの評価方法が出来そう、強いは分かりませんが。
それなりに複雑なので、直ぐに結果が出ないところが辛いところ。
今年中に新しい方法の基本を完成したい。
バグ報告
Tenpai.cppのBOOL CheckKokushi(void)で
国士無双の判定方法が間違ってます
(間違いの責任は私だったりする…?)
>>450 了解〜。
直し方も書いてくれると楽だけど。
AIの方は、設計で迷い中。いい方法が見つからないなあ・・・
あと、関係ないけど思いついたこと。
AIの再利用形態について。
(今、これに関して何かするつもりは全くない。予定もない。)
・MJSimのAIを、ブリッジdllをはさんで「まうじゃん」と接続。
新しく麻雀ソフトを作らずとも、自分(人間)が、自分や他の人が作ったAIと対戦できる。
まうじゃん--ブリッジdll--AI
・MJSimのAIと、MJexeIO.dll(
>>217で紹介されている)をブリッジするソフトを作って、東風荘へ接続。
ブリッジexe--+--AI
. +--MJexeIO.dll--東風荘クライアント
(東風荘の状態をMJexeIO.dllで受け取ってAIに渡し、AIの判断をMJexeIO.dllを使って東風荘に反映)
いまのインターフェースは、これらのことを考えて作ってないので、簡単にはいかないと思うけど。
まあ、強いAIが作られるめどが立ってから検討すればいいと思う。優先順位低い。
>>451 BOOL CheckKokushi(void)
{
int Total = 0;
int haiJ[13] = { 1, 9, 11, 19, 21, 29,
31, 33, 35, 37, 41, 43, 45};
for (int i = 0 ; i < 13 ; i++) {
if ((Tehai[haiJ[i]] != 1) && (Tehai[haiJ[i]] != 2)) {
return FALSE;
}
Total += Tehai[haiJ[i]];
}
return (Total == 14);
}
これでいかがでしょうか
>>453 BOOL CheckKokushi(void)
{
int haiJ[13] = { 1, 9, 11, 19, 21, 29,
31, 33, 35, 37, 41, 43, 45};
for (int i = 0 ; i < 13 ; i++) {
if(!Tehai[haiJ[i]])
return FALSE;
}
return TRUE;
}
これでいかがでしょうか
>>454 それだとヤオチュー牌が全部1枚ずつで
残り1枚がタンヤオ牌のとき
TRUEになってしまいます
保守
BOOL CheckKokushi(void)
{
int haiJ[13] = { 1, 9, 11, 19, 21, 29,
31, 33, 35, 37, 41, 43, 45};
int janto_num = 0;
for (int i = 0 ; i < 13 ; i++) {
if( (Tehai[haiJ[i]] == 0)){
return FALSE;
}
if( (Tehai[haiJ[i]] == 2)){
janto_num++;
}
}
if(janto_num != 1){
return FALSE;
}
return TRUE;
}
>457
雀頭の有無の表現をBOOL型にして、最後のif節を
return janto;
とした方がいいのでは。
BOOL CheckKokushi(void)
{
int haiJ[13] = { 1, 9, 11, 19, 21, 29,
31, 33, 35, 37, 41, 43, 45};
BOOL janto_num = FALSE;
for (int i = 0 ; i < 13 ; i++) {
if( (Tehai[haiJ[i]] == 0)){ // 条件1
return FALSE;
}
if( (Tehai[haiJ[i]] == 2)){
janto_num = TRUE;
}
}
return janto;
}
頭が複数個存在した場合は、自動的に条件1を満たさなくなるので、これでOKか。
s/junto_num/junto/g
s/junto/junto_exit/g
で、すまん
保守
>>463 >AI開発、つまり中。
最初これ読んだとき、
「 AI 開発、つまり "チュン"。」
と読んでしまい、「 "AI" と "中" の間の深い関係とは一体何か?」と
一瞬考え込んでしまった・・・
以下、AI初心者のたわごとで、よくわからずに書いてる可能性あり。
麻雀AIの基本は、期待値計算だろう。
>>266のHPにすべて書いてあることなんだけど、本来は、
・シャンテン数を下げるものも(というか、すべて)計算する必要がある。
・その他の場の状況を、数値(点数)にして掛ける必要がある。
状況を点数にするのも難しい。他家リーチに対して、その牌を捨てることは何点といえるのか?
期待値計算を使って、例えば、ペンチャンを先に落とさせるには、
シャンテン数を下げる形も計算しなければいけない。
しかし、計算量が膨大(具体的に調べてないが)になってしまいできない。
計算量は減らし、なおかつ同じような結果を得るには?
DLL名ですが、番号で253v0000.dllな感じにします。ハンドルも一応253戻し。
>>466 私もAI素人ですが^^;
>計算量は減らし、なおかつ同じような結果を得るには?
もうこれは、練りに練ったアルゴリズムとしか言えない^^;
私の場合、最初から考えても何も出ないので、まずはシャンテン数を下げる処理を、
その結果ペンチャンが残る^^;。今は前よりよさそうなアイデアが出たので作り直し中
正当にペンチャンが切れる処理を目指してます。
ただ、それでもまだまだなのが分かっていますが一応の完成を目指さないと。
>麻雀で使える上手い方法をかんがえよう〜。
実現できる範囲で先ずは作成中〜〜〜^^;
>人間とAIの思考法は違いすぎて、作者は強くならない。へ〜〜〜。
逆の意味で作者より強くなる、この辺がAIを作る上での楽しさだと思っています。
追加
将棋AIと麻雀AIでは大きく違いが有ります。
・将棋はゲーム情報がAIと人間は同じである。
(盤面の情報量は同じ)
・麻雀はゲーム情報が人間よりAIの方が多くの情報を扱える
(卓の情報量を人間は総て計算できない、超人除く)
この点は、麻雀AIの方が有利であると言えます。
>252
459をコピペしても動きません。
460はPerlの置換表現で、それぞれ
まず、junto_numをjuntoに
そのあと、juntoをjunto_exitに
置換することを表します。
要するに、459はBOOL型の名前が統一されていないということです。
もっとも、juntoはjantoの誤記でしょうが。
>>469 それは違うと思う。
将棋の方がよほど人間には処理できない情報量ではないかと。
・とにかくやれることが多すぎる。手駒があるときは特に。
・さらにその1手毎に数十手近く先を読む必要がある。
・相手がこちらの予想どおりの手をさすとは限らない。
将棋をやるとき人間は、そのほとんどの情報をはしょっているだけだろう。
麻雀の場合、
・やれることは、14枚のうちから捨てることと鳴き。
・先読みも、自分のツモと鳴ける状況を足しても20手くらい。
・相手が起こすアクションのうち、こちらに影響のあることはわずか。リーチや2鳴きくらいか。
>471
多分、思い違いおしていると思う。
頭の中やその先でやらなければいけないこと指してはいないです。
今見えて扱える情報量の話ですよ、その先は意味していないです。
頭の中やその先まで考えたら、将棋の方が複雑なのは当然です。
それに、将棋AIの方が難しいのは当然として、尚且つ
麻雀AIの方が将棋AIより、人間に対してほんの少し優位である
を意味しています。
>>470 thx. perlというか正規表現のつもりなんやけどね...
というか存在を表すならexistだしさ(;;)
前のは誤解がありそうなので、書き直し。
将棋AIと麻雀AIでは違いが有ります。
・将棋はゲーム情報がAIと人間は同じである。
(今見える盤面の情報量は同じ、だから対等の立場で戦う必要がある)
・麻雀はゲーム情報が人間よりAIの方が多くの情報を扱える
(今見える卓の情報量を人間はゲーム中に瞬時に総て計算できない、超人除く、
だからほんの少しだけ麻雀AIの方が有利である。)
この点は、麻雀AIの方が将棋AIより、人間に対してほんの少し優位である
を意味します。
>>443 完先だとチョンボ
後付けありだとあがれる。
>>476 意思疎通できました。
つまり、コンピュータの
・数え上げ(速度)能力
・膨大な記憶力
が、ゲーム(将棋と麻雀)に与える影響について論じていると。
そのうち、「現時点の場面の把握」に限れば、麻雀の方が影響が大きいということか。
保守
レスが寂しいので、現状報告でもしてみる^^;
前の手配評価は横に広い方法で評価を行っていた。
今回はこれに加え、枝切りで奥に入る探査を作っています。
2手先とか3手先の定義をします。
ツモる <ーーーーこれが始まり。
捨て配を選ぶ <−−−これが1手目。
仮想ツモ牌を作る <ーーーこれが2手目。
捨て牌を選ぶ <−−−これが3手目と定義します。
前回の探査評価は1手目を選ぶ評価です、これだけでも全を評価するのは大変。
今回はこれに3手先5手先N手先が読めるようにしています。
ここまで来ると、爆発的に種類が増えてくるため、枝切りが必要になってきます。
処理時間を短くするため、当面3手先までの評価を作成中、一応枝狩りがうまく機能
しているようなので、そこそこに速く動きます。うまくいけば、条件により5手先までいけそうです。
問題は先読みをする事では有りません。先読みそのものはそれ程難しくなく、
その結果をいかに評価して最善手を選ぶかでしょう。
また、以前読んだ結果を再利用して先読み処理を数分の1に出来そうですが、
次の時にでも。今は3手先読みの統計を取って評価を決めようとしてます。
追加
因みに3手先詠みを入れた今でも1局は平均0.1〜0.3秒程度です。
東風荘だと、一手に1〜2秒掛けてもよさそうなので、もっと奥まで読みができるかな^^。
枝もそんなに切らなくてもいいかも、私の古いノートPCだと遅いので、今一ですが。
>>480 はやいなあ。こちらは、まだまだ・・・
1手読みと深読みでは、数百試合以上での平均順位はどのくらい変わったのでしょうか?
また、できすぎくんのパラメータ(和了率、リーチ率、リャンメン率)にどのような変化が現れました?
深読みの課題は、
・有効な捨て牌を限定する方法(牌を捨てるとき)
・有効なツモ牌を限定する方法(牌をツモるとき)
・手牌の評価
これらがまずいと、1手読みとあまり変わらないか、むしろ悪くなると思える。
そもそも1手読みでも問題ないのでは?てなことを考え中・・・
>>484 深く読むのではなく、現在(あるいは数順後の)「受けの多さ」を数値化することで
枝狩りすることは可能かも。
もう読んだと思うけど共謀数による探索のとこね。
詰め将棋解析プログラムなんかはこの方法。
麻雀は自分の手牌のみを考えるならば、指し将棋より詰め将棋の方が似ているので
ちょっとした工夫で格段に強くなる可能性はありますね。
>>483 >1手読みと深読みでは、数百試合以上での平均順位はどのくらい変わったのでしょうか?
まだ1手目の評価だけしか打ててないです^^;前の手牌の評価がより広くなって、
10個以上のパラメータが千数百〜数百と出てくるので、それをどの用に評価するのか考え中。
自分の感覚だけの評価では、不透明感が多すぎで。
>・有効な捨て牌を限定する方法(牌を捨てるとき)
>・有効なツモ牌を限定する方法(牌をツモるとき)
これに付いては、手牌評価が詳しい分いろいろな方法が見えてます。が、どれが良いかは
場数を踏むしかないかな〜〜〜
>・手牌の評価
先読みした結果の手牌評価が今の課題。理解するために、統計処理プログラム作ってる^^;
>これらがまずいと、1手読みとあまり変わらないか、むしろ悪くなると思える。
>そもそも1手読みでも問題ないのでは?てなことを考え中・・・
これに付いては次の感想を。
・前の手配評価処理の限界を感じている、ただし、よりよくできる方法も分かってはいるが
それをする為には、今までより大変かもしれない。また、パラメータいじくるのも飽きた^^;
新しいことをやりたい、枝狩り方法のいいアイデアも浮かんだ等々で^^
(作った現在ではは、枝狩りも幾つかの方法ありで、上の説明参照)
・ペンチャン落としの有力な方法として、先読みがあると考えている。
です。
つづく
つづき
>深読みすることで、自然にペンチャンを落とし、リャンメンに変えたりすることができるのだろうか。
それをする為に作っているがいまだ不明。
>枝をあまり増やさずに、かつ、有効な枝を刈ってしまわないようにする必要があるが・・・
ここが、腕の見せ所だと思う、今は暗中模索。
>手牌の評価は、「統計」ということだけど、将棋AIで言う3手先の局面の静的評価関数
これは、評価が統計ではなく、評価関数を作るために(自分が理解するために)統計を
取っている状態です。
>(麻雀では期待値?その手牌になる可能性×見込み点数×その他)
>の結果の統計でしょうか?これがいまいち、どう作っていいのかわからない。
「可能性」×「その他」このあいまいな言葉が具体的になったら、分かると思います。
今一どの部分をさしてるのか不明で、答えられない。
見込み役は多少考えていますが、見込み点数はまだぜんぜん入っていないです。
>>486 「共謀数による探索」、に付いて、よく知らないです^^
良かったら、説明してもらえませんか?
>>486 共謀数については、わかりやすい解説が見つからなかったけど、
最初は読む深さを1にしておいて、ある評価関数を使って、
動的にもうひとつ深く読むかどうか決めるというもの、かな。
使える気がする。
>麻雀は自分の手牌のみを考えるならば、指し将棋より詰め将棋の方が似ているので
新しい視点だ。これも思いつかなかった。
相手玉の動きを封じていって、最終的に玉を動けなくする詰め将棋の様子が、
麻雀で手牌を上がりやすい有望な形を探索しながら、
上がりに向かっていくのに似ている気もする。これから検証しよう。
>>487 >まだ1手目の評価だけしか打ててないです^^;前の手牌の評価がより広くなって、
>10個以上のパラメータが千数百〜数百と出てくるので、それをどの用に評価するのか考え中。
10個以上のパラメータというのは何のパラメータ??
同じメンツで打ってみて、(前バージョンと最新バージョンで)
「できすぎくん」で見たときの和了率とかが、変わったかどうかということなんだけど。
僕がまた勘違いしてる?
>これは、評価が統計ではなく、評価関数を作るために(自分が理解するために)統計を
勘違いでした。
>「可能性」×「その他」このあいまいな言葉が具体的になったら、分かると思います。
・可能性は、「その局面での有効牌/その局面で山に残った枚数」。要するにツモってくる確率。
・その他は、他家リーチとか。これは後まわしかな。
かな。
>10個以上のパラメータというのは何のパラメータ??
前回出した下記プラス少し増えてます。
// 後幾つでテンパイ
// 役の藩数(一部)
// 役まで後1枚の役の藩数(一部)
// 面子情報
// ターツの数
// 牌の待ち数
// 合計ポイント
// リャンメンの数
// 2カンチャンの数
// カンチャンの数
// ペンチャンの数
>僕がまた勘違いしてる?
3手先読みした場合の評価関数が出来ていないので、まだ対戦すら出来ないです。
自己感覚で評価関数作っても不透明なので作りたくないーー>統計を取って研究です。
>・可能性は、「その局面での有効牌/その局面で山に残った枚数」。要するにツモってくる確率。
了解しました。
>・その他は、他家リーチとか。これは後まわしかな。
私も後回しです。
追加
>統計を取って研究です。
は、できすぎ君ではなくて、3手先を読んだ結果のデータ分析です。
できすぎくんでは無理なので。
>>494 ニューラルネットはとーぶんゲームAIには実用的には使えないと思う。
追加+α
評価値ですが、上記の10以上のデータも結局一つの数値にすることは可能です。
しかし、状況により評価の基準が変化することがあり、今のところ別に扱っています。
これらのパラメータが正当に評価されれば、強さにつながると思いますが、
正当に扱えない場合や中途半端な扱いでは、単純な評価の力ずく検索の方が
強いかもしれません。
自分の手牌からどの役の方向に進むべきなのか、という指標には
使えるとは思う。例えば、ヤオチュウ牌が9枚以上ならば、
国士無双狙いにいってもいいが、それ以下ならばチャンタで
我慢しておけ、とか。
ただし、これをやるためには相当数のデータが必要になるし、
何を基準に(入力パラメータ)として、あがりやすさ(出力値)
を求めるのかを決めるのが難しい。
まあ学習済みのニューラルネットを使用する分には、速度の
面では問題にならないだろう。
>>498 >使えるとは思う。例えば、ヤオチュウ牌が9枚以上ならば、
>国士無双狙いにいってもいいが、それ以下ならばチャンタで
例えばの例に反論するのは悪いかも知れんが、これならif文1個でできる。
できれば、こんな簡単な例以外で説明して欲しい。
>何を基準に(入力パラメータ)として、あがりやすさ(出力値)
>を求めるのかを決めるのが難しい。
上記問題点を上げながら、使えると言うのはいかがなものかと。
解決案の出して、使えると言って欲しいが。
読み直して気づいたが、
>>463で紹介したscene.research.stationてところで、
東風荘用麻雀AIを作ってる。安定R1200程度らしい。
ダウンロードページ
http://kmkz.jp/mtm/?load=mahjong 日記やReadmeを読むと、
>数学的なモデルだけを使って切る牌を決定しています.
だそうで。
>4面子1雀頭になるまでどんどん多牌していく.
考えてみると、麻雀の場合、将来メンツになる牌を残したいわけで、
リャンメンを残したいわけではない。この方法、いいかも。
前にこの部分(2003/9/30の日記)は読んでいたはずだし、
comjong.comというHPでも紹介されていた方法だが、将棋AIの方に気をとられていたかも。
↓は、この自動打ちソフトのBBSで、牌譜がダウンロードできる。
http://www.kmkz.jp/mtm/roro/rorobbs.cgi?num=148 見てみたが、たまに良い捨て方をするが、いきなりメンツを切ったりしてよくわからない。
復帰しました。
こちらでも引き続きAI作成を続けて行きます。
こちらのAIでは今後コードをいったん整理してから、
面子情報と役回しを強化させようと思います。
その他、具体的理論は後で載せようかと思います。
252さん、253さん、お疲れ様です。
>>499 >上記問題点を上げながら、使えると言うのはいかがなものかと。
>解決案の出して、使えると言って欲しいが。
無理(笑)。
一番の問題は、AIは学習にどれだけ時間がかかるということ。
>例えばの例に反論するのは悪いかも知れんが、これならif文1個でできる。
>できれば、こんな簡単な例以外で説明して欲しい。
そうだねー、ただ聴牌を狙うのではなく、複数の役を目指しつつ
手を伸ばしていくには、複数の評価を同時にやる必要があるでしょ?
国士無双しか狙わないなら、2、8とかはとっとと切るが、
まあ無難にチャンタにも手を伸ばしたいなら、そういう牌に
「重み」をつけて、他の牌よりかは捨てにくくするとかね。
参考までに、学習済みのネットワークならif-thenルールで
書こうと思えば(ある程度は)書けます。
問題は、さらにそこから汎化性を生み出せるかどうかです。
また、k-NN(過去からのもっとも良く似た例をいくつか取り出して、参考にする)
というのは学習データ数が莫大になれば性能が低下しますが、
ニューラルネットワークの場合であれば、「使用」する分には性能の低下は
まだ遅いです(とは言っても、「学習」に時間がかかりすぎるのですが)。
>>503 言ってる事は、妥当な範囲だが、それでAIに実用的に使えるのか?
たまに見かける、コンユーター上のニューロが数億個集まれば人間的な知能が
発現する脳内妄想か?実際にできる事と妄想をしっかり区別してくれ。
ここはム板だ妄想はいらない、ニューロネットを使用した実用的な麻雀AIを作って
自分の発言を証明しろ。
なんでこんなにこの人噛み付いてくるのか解からない。
>自分の手牌からどの役の方向に進むべきなのか、という指標には
>使えるとは思う。
「できるんじゃないの?多分」という程度にしか発言してないのだが。
もうちょっと落ち着け。
実際にやろうとした際の問題点としては、前述した通り、指標に何を
用いるかという点がある。今捨てた牌は、手牌から切ったか、
それともツモ切りかというのを指標に入れるかどうかをどう考えるか、
などなど。何が重要で何が重要ではないかを判断する必要がある。
そういう点から見ても難しいと言っているのだが、わかる?
あと、闇雲にべらぼうな数の指標を入れると、
今度は関係のないはずの指標が悪さをしたりする。
これを考慮するとboostingがまだマシだな。
>>502さん、お帰りなさい。がんばりましょう。
>>252さん、いろいろ情報ありがとう。
>scene.research.stationてところで、 東風荘用麻雀AIを作ってる。
見てみました、枝狩り8ツモ先まで読んでいますが、それでもR1200とは、
AI作成が難しいのか、又は、内部判断がまだまだなのか・・・
その他感想。
>・そもそも、不完全ゲームと、ゲーム木の関係。
1局としては不完全かもしれないが、半ちゃん4人と考えれば完全ゲーム
と考えてます。ゲーム木とあまり関係ないかな
>・詰め将棋解析が、麻雀に適用できるか。
これは、次の差が大きいので同じようには考えるのは難しいと考えてます。
詰め将棋は必ず正解のゴールがある。ー>ゴールに向かって探索すればいい。
麻雀は必ず正解のゴールが無い。ー>可能性の高い方に向かって探索するが
その結果出た答えが、次のツモで答えが間違っているのを気付く。
>・他に麻雀に似た不完全ゲームは無いか。
上記と同程度の不完全ゲームならたくさんあります。
・パチンコ・スロット・野球・競馬・株^^
>あと、ミニマックスと麻雀は関係なさそうな気がするんだけど、どうだろ・・・
自分だけでなく、他の3人の手の予測まで出きる様であれば、
その時の全体のゲーム木は、変形ミニマックスになりそうな気がしますが。
ゲーム木に出来そうなほど、相手の手を読むことは難しい。
少し訂正
>・他に麻雀に似た不完全ゲームは無いか。
上記と同程度の不完全ゲームなら
似たので考えると。
条件は複数でやって勝敗の不成立があるもので・・・
4人ポーカー、ジャンポン、似たのと考えると意外と少ない。
多牌していく方法を少し考えてみた。ぜんぜん見当違いかもしれず・・・指摘よろしく。
例えば、コインを2回投げて表裏が出るパターンを木(なんて名前だろ?)であらわすと、
-+-表-+-表
...|..............+-裏
...+-裏-+-表
.................+-裏
これを麻雀牌でやる。
>>480の方法でも、これはやっているわけで、何が違うのかといえば、
「捨てない」ということだけだ。
これによって、途中何を捨てたかに関係なく、未来の形を検討できる、かな。
課題としては、
・どのように評価するか?(
>>500のReadmeだけでは、捨て牌を選ぶ評価の方法がよくわからん)
・全ての可能性の期待値の総和が最善手とは限らない。中途半端な打牌になって余計にだめかも。(Readmeより)
・ペンチャンはメンツになる可能性が低いから切ろう、ということになるだろか?
・枝刈りの方法。
Readmeの「とりあえず現時点のものをダメ出しすると・・・」のところに書いてあることは、
そんなに重要でない気がする。
>>506 >AI作成が難しいのか、又は、内部判断がまだまだなのか・・・
捨て牌も変だし、即リー全ツッパのみでは無いにしても
他家リーチにちゃんと降りてないみたいだし、まだまだでしょう。
>1局としては不完全かもしれないが、半ちゃん4人と考えれば完全ゲーム
完全ゲーム・・・2人で交互に手を指し、最終的に、勝ち、負け、引き分けとなるようなゲーム。
不完全ゲーム・・・判定に確率的要素が含まれるような場合。
ゲーム木は「完全ゲームを扱うもの」と定義されているようだ。
「AND/ORグラフとゲーム木」
http://kyu.pobox.ne.jp/softcomputing/ai/ai4.html まあ、名称はどうでもいいけど、不完全ゲームに適用できるものはなんだろう。
それすらまだ知らない。
>詰め将棋
う〜む、そういうこともあるなあ。似てると思ったけどなあ。
>ミニマックスと麻雀
敵の手は読めないので、だめでしょう。
>麻雀に似た不完全ゲーム
「ポーカー AI」で検索するといっぱいありそう。先に検討しようか、どうしようか・・・
現状報告を簡単に
「うお〜〜〜〜〜頭が爆発する!、頭が真っ白になる!」
なぜ爆発するか
・データが多すぎて分けわからん;;
(結構良さそうな結果が出るが、なぜそうなのか分からん。そうでない場合もある。)
・変な点を注目して調べれば調べるほど、初期手牌評価の未着工部分が目立つ
それも幾つも。TT
(初心に戻って、初期の手牌評価を100%にしろと神のお告げ?)
今の状況は、やらなければいけないことが見えすぎて、何から手を付けていいか分からない状態だ〜〜
頭が爆発しそう。正直こんなに複雑になるとは思ってなかった。
少し一休みして、自分のAI以外のことでも考えてみる。
>「捨てない」ということだけだ。
一応、捨てたことにしています。
他のAIについ考察
302さんのAIについて。
初期に公開された、再起的な単一の評価ポイントの延長線上にあると考えられる。
単純な評価式では有るがその分高速で、3手先を読む付加価値と何かアレンジした
AIではないかと思われる。
残念ながら、私の初期AIは微妙に負けている。くやしい。
なぜ負けているか、それは、分析されたデータが有効に評価されていない点と
やはり未着工の部分・・・・
>scene.research.stationてところで、 東風荘用麻雀AIを作ってる。
日記とReadmeを読んだだけの考察^^;、嘘を言っていたらごめん。
8ツモ先と有るが、こちらの見方では16手先となる、
ここまで来ると、相当の枝狩りをしないと東風荘でも、現実的な時間で終わらないと
思われる。その枝狩りで16手先に意味があるのか疑問。
現時点で3手先の予測は有効であると判断している。(結果が出せていないが)
正統に5手先を読めば、それなりに強いうち回しが出来そうに予測される。
先読みの考察
先読みそのものは、それ程難しいことではない。
先読みした結果をいかに評価するかが問題である。302さんの比較的単純な
ポイント形式はその単純さゆえ、先読みした多くのパターンをポイントで
平等に評価できる利点を持つ、ただし変化に対応したうち回しが可能かは不明。
問題は多数の一つ一つの手を平等に正しく評価できるかである。手の評価自体に
問題が有れば、いくら先読みしても良い結果は得られない。
考察の続き。252さん編^^
>・どのように評価するか?(
>>500のReadmeだけでは、捨て牌を選ぶ評価の方法がよくわからん)
ここが、問題である。単純な評価(隣り合っているとか、N枚有る等の)でも、一応麻雀AIになる。
これにポン・チイ・カンや、リーチ等の直接的処理。これに場を把握する・ダマテン・降り・点数の把握
等でも十分にAIとして機能するようにも思う。
私が選んだ方法は、人間が思うように正しく評価しようと考えた。ある程度は正しく評価できる段階ではある
しかし、完全でない部分があり今はそれが問題として現れてきた。
人間は意識することなく普通にしていることを思うと、さすが人間である
>・全ての可能性の期待値の総和が最善手とは限らない。中途半端な打牌になって余計にだめかも。(Readmeより)
これは、私が見るに、評価が不十分だからそうなると思っている。
>・ペンチャンはメンツになる可能性が低いから切ろう、ということになるだろか?
時と場合により、その時と場合を理解しなければいけないだろう。先読みと場の状況で時と場合を見定めようと思う。
>・枝刈りの方法。
いくつか有りそうですが、何が良いのか不明。
感覚的な部分があり、聞かれても答えられないと思う。
>例えば、コインを2回投げて表裏が出るパターンを木(なんて名前だろ?)であらわすと、
私のゲーム木はこんな感じかな。
初期のより、シンプルになってる。
手牌
ツモる
捨て牌パターン1__・・・・___捨て牌パターンN
評価パターン1___・・・・・・・・___評価パターンN
仮想ツモを作る
捨て牌パターン1__・・・・・・・・・___捨て牌パターンたくさん
評価パターン1__パターン2_・・・・・・・___評価パターンたくさん
ここが3手目。
仮想ツモを作る
捨て牌パターン1__・・・・・・・・・・・・・・・・・・・・___捨て牌パターンとても多い
評価パターン1__パターン2_・・・・・・・・・・・・・・・・・・・___評価パターンとても多い
ここが5手目。
各所に枝狩り。
253さんのレスを読み返してみたのですが、
手牌の先読み、深読みに関してはちょっと
イメージしにくいです。
河の情報を総合して判断させれば例えば、
ピンフ狙いであれば効率良くリャンメンが
残るようにすることは出来そうですけど、
全役汎用的に使えるようにするのにめちゃ
手間かかりそうですね。
私はあまり頭良くないので、もう少し簡単な
仕組みでなるべく無駄切りが出来ないよう
に工夫してみるつもりです。
駄目かもしれないけど(^^;
>>515 >253さんのレスを読み返してみたのですが、
>手牌の先読み、深読みに関してはちょっと
>イメージしにくいです。
あい^^
>河の情報を総合して判断させれば例えば、
>ピンフ狙いであれば効率良くリャンメンが
>残るようにすることは出来そうですけど、
今すでに河含む見える牌すべて計算していますが、なかなか難しいです。
>に工夫してみるつもりです。
>駄目かもしれないけど(^^;
いえいえ、是非がんばってください。
私と違う方法が見たいです。
私はもうこの道を選んでしまった以上、これで行きますが、複雑だから
優秀なわけでは有りません。ただ、遊びなので妥協したくなくて。
考えが少しまとまってきたので書いてみる。
どんどん多牌していき、その中から14枚とって、
テンパイまたは上がりの形かどうか調べる、というセンはそのまま。
探索方法は、反復深化法がよさそうだ。
「反復深化法」
http://tt.sakura.ne.jp/~suzu/search_problem/i_deepening.html 最初は、最大探索深さを1(1枚多牌した形)で探索し、
解(テンパイ)が無ければもうひとつ下・・・と順に深く探索する。
これで、最も浅い位置の解(最速のテンパイ)を探索できる。
当然1シャンテンの時は、深さ1のところでテンパイが見つかるはずだ。
深すぎるときは途中で止めて、静的評価関数の良さで決める。
で、これだけだと、「12599・・・・」という形のときに5を切って3待ちテンパイしてしまうので、
待ちが少なすぎる(静的評価関数があまりにも低い値)のときは、もう2つ下くらいまで探索する。
これで1の方を切る(5にくっつけてリャンメンテンパイする)可能性を見つけるようになるだろう。
(
>>486を参考にした。
話がそれるが、共謀数については、あまり理解していないけど、そのようなものが使える気もしている。)
これに加えて、あまりテンパイに関係のなさそうなツモは、
探索前にリストアップして、前向き枝刈り(最初から調べない)で刈る。
(上記の例でいえば他の種類の牌など)
静的評価関数は、その局面(手牌)だけをみて良さを評価する関数で、
期待値の計算をすることになるだろう。
これらは253さんのやつにも適用できると思うがどうでしょ。
>>513 たしかに、あれじゃ何にも分からないですな。
しかし、上記方法もまだ妄想部分があるので、これからという感じ。
>>515 まとまらなくても、どうするつもりか書いて、問題点を挙げてくれれば、
アイディアを書いてくれる人がいるかも。
>>511 の「他のAIについ考察 」あれから、多少調査した結果。
>302さんのAIについて。
この考察は間違っています、こんな単純なものではないと思われ、申し訳ありません。
悩み中〜。
>>517は無しの方向で。
どうすれば、上手く捨て牌を決定できるだろうか?
以下のような、探索木が考えられる。アイディアをプリーズ〜。
そもそも、このモデル化に問題があるのかもしれん。
解を導きやすいモデルのアイディアがあれば・・・
記号の意味
○・・・1シャンテン以上
●・・・テンパイ
★・・・上がり
記号の隣の()内は牌。12599だと、1マン2マン・・・9マン。
あとの3メンツは、すでにそろっていることにする。
牌が5つ以上あるときは、5つとって考える。
・例1
テンパイからの可能性の木。
この木の情報を使って、ルート(現局面)の「●(12599)」で1を切ることができるだろうか?
それに「●(125994)」の状態から3をツモると上がってしまうのが問題・・・
●(12599)
.|
.+---------+---------+--
.|.............................|.............................|
★(125993) ●(125994) ●(125996)←5699でテンパイしているという意味
...............................|
...............................+----------+--
...............................|................................|
..............................★(1259943) ★(1259946)←この2つの上がりは12が共通して要らないが・・・
・例2
1シャンテンからの例。
○(15899)
.|
.+---------+---------+--
.|.............................|.............................|
●(158992) ●(158994) ●(158996)
...............................|
...............................+----------+--
...............................|................................|
..............................★(1589943) ★(1589946)
「探索法」
http://kyu.pobox.ne.jp/softcomputing/ai/ai3.html ↑の「知識を用いた探索(ヒューリスティック探索)」のところでいう
その枝を通る「コスト」が、その牌をツモる可能性と考えるとどうだろう・・・
ペンチャン外しの基本知ってるかい?
125 なら2から (裏目の3を持ってきても35のカンチャンになる)
126 なら1から (4を持ってきたら246のリャンカンになる)
当然124なら1からだし、127なら2から
128や129はペンチャン外しの意味がない
自分もまだまだですが^^
>★・・・上がり
この上がりの木は要らないと思います。
テンパイの段階で先が見通せると考えてます。
テンパイの段階で何待ちかは簡単に導き出せるので。
その時点で、ターツの形を理解する必要があり、
ターツ種類 単騎・シャボ・リャンメン・カンチャン・ペンチャン
この種類がわかった時にペンチャンならもう一つ先読みするか判断し、
次の読みでペンチャンより良い待ちの可能性(●の所)があればペンチャンを
切っていく事も考えられます。
実現方法は組み方によって違ってきます。
一応、3手先のよさげと思われる評価関数を仮組みしてみました。
多少対戦してみて、リャンメン待ちが5−8だったのが9−10に変化。
そんなに上がらないのは、単騎・シャボ・カンチャンの方が多いからかな。
まだまだです。
こちらは只今、comjong.comさんの
「混合法」ってやつを作ってます。
ttp://comjong.com/old/algo/shanten.htm 仕組みは252さんの「探索法」 と似たような
やり方で作るつもりです。
具体的には前のAIで作った方法で2向聴
まで読み、それ以下は揃ってない所を
抜き出しどんどん牌を足していくのですが、
意味の無いツモを除き「有効牌」だけ揃えた
配列をつくり、その中でリストを生成します。
もちろんこのままでは
>>521の状況に
成りますが、その点は「役誘導」と、
>>523 を参考に回避するつもりです。
問題点はまだまだ有りそうですが、バグを
除き次第うpします。
プログラム技術的に未熟ですし、発想も
時代遅れですが自分なりにマイペース
に逝きます。
>>523 知らなかった。とにかく1から切ってたかも。
125で2から切る意味は、他家リーチに対して
2より1が安全(失点が小さいと期待できる)だからだと思うが、
牌効率には関係ないので、ベタ降り能力がついてからでいいかも。
>>524 このレスを見て思いついたんだけど、上がりを見つけてから、
ひとつ戻ったところがテンパイと考えるのはどうだろう。
テンパイの価値は、上がりの形の評価関数の総和と考えられるので。
>一応、3手先のよさげと思われる評価関数を仮組みしてみました。
手が早いなあ。
>>522 「知識を用いた探索(ヒューリスティック探索)」
私の独自枝狩りは、まさにこれです。
訂正して。
枝狩りは 前向き枝狩りとヒューリスティック探索を使用
うっ、さっそく訂正、似ているが少し違いました。
ヒューリスティック探索はゴールを意識してます。
私の場合ゴールは意識していない。う〜〜ん、何だろう。
麻雀板から来ました。
数学的根拠をもって正着打を決定することが可能か?
http://gamble2.2ch.net/test/read.cgi/mj/1070768502/ の107=124です。今、モンテカルロ法によって最善手を求めるシミュレーションをEXCELのVBAで作っているんですが、プログラミングはあまり得意では無くて難航しています(´・ω・`)
良かったら参考にして下さい。
まず、13枚の手牌の「評価値」というものを考えます。
残りのツモがn回あるとします。
山からランダムにn枚取り出し、手牌と合わせた13+n枚の牌の中から最も高得点になる和了り形14枚を抜き出す、という操作を充分な回数繰り返します。
この時、1回の操作あたりの平均得点をこの手牌の評価値とします。
評価値は「未来のツモを見通せる神様が打った場合の得点の期待値」と言い換える事も出来ます。
次に、14枚の手牌から何を切るかを考えます。
14枚の手牌からは最大14通りの打牌候補があり、それぞれについて打牌後の13枚の牌姿があります。
この14通りの牌姿それぞれについて評価値を計算し、最大になるものを打牌として決定します。
>>531 教えて欲しいのですが。
その方法だと枝狩りが無いので下記のようにパターンが増えます。
0枚の組合せ nCr n=14 r=14 P=1
1枚の組合せ nCr n=15 r=14 P=15
2枚の組合せ nCr n=16 r=14 P=120
3枚の組合せ nCr n=17 r=14 P=680
4枚の組合せ nCr n=18 r=14 P=3060
5枚の組合せ nCr n=19 r=14 P=11628
6枚の組合せ nCr n=20 r=14 P=38760
7枚の組合せ nCr n=21 r=14 P=116280
8枚の組合せ nCr n=22 r=14 P=319770
何枚ぐらいまでやればモンテカルロ法として妥当な結果が得られると思いますか?
その可能性の数字を教えてください。妥当であればやって見るのもあり。
>>531 いらっしゃいませ。
参考になる情報をありがとうございます。
スレの方も拝見しました。これは、数学的にも
充分算出可能な方法かもしれないですね。
もし、ツモを見通せて尚且つ期待値に合った
切り方ができれば相当強いCPUが
出来上がると思います。
すばらしいアイデアですね。参考になりました。
追加、私のAIではのテンパイは10順目が平均リーチです。
だから、10枚ツモってようやくリーチできるかどうかです。
リーチ出来ずに流れるのが2倍以上なので、
10枚有っても、上がれるパターンはとても少ないです。
>>531は無視した方が吉
理想だけ書いて自分は全然何もやらない素人だから
計算量の事もわかってないし
>>修正^^;
組合せは、下手でした、3枚パターンでの組合せです。
数字はもっと低いです。う〜〜計算不可;;
いま、少し。
「数学的根拠をもって正着打を決定することが可能か? 」
の板読んでたのですが、麻雀における「期待値」の表現は普通だったんですね^^;
麻雀シロートばればれだな〜〜、これでも昔雀荘で打ちまくってたが。
私がAIを作る上で意識したのは、あまり情報を入れずに、自分の知識だけで
作って見ようでした。これで現在にいたってます。
板を読んだ感想を一つ。
・やはり人間は無意識に誰でもやっていることは、当たり前すぎてあまり
問題にもならない。AIは人間にとって当たり前すぎる事を一々指示する
プログラムを作らなければならない。(あたり前だが再認識)
当初から、麻雀でいう「期待値」は一切考えていなかった。今も低い。
今も、今ここにある13枚の手牌の解析が完全に出来ていない。
「期待値」以前の段階。3手先を読む処理で初めて期待値を利用している。
まだまだ先は長そうだ。
麻雀AIの種類の考察
今見える範囲では大きく分けて2つの種類のAIがある。
1.手牌の状態を完全に理解し、その有効性を各牌にそして牌と牌の関係を含めて
理解し、不要牌を割り出す。(私が目指している方法)
2.先読みを深くし、先読みの情報から今現在の不要牌を割り出す。
どちらも利点欠点があり。どちらが強くなる可能性があるか、まだ不明である。
面白い情報が一つ
今の3手先を読むAIで、他のAI対戦時とツモ切りするだけのAIでは、
できすぎくんのリャンメン待ち数が違う。
AI対戦では 9−10
ツモ切りダミーでは 6−8
対戦では、局が最後まで行くことが少ない為に起こるのではないかと。
AIは終盤を意識していないため何時でもリーチですが、山牌が少なくなると
期待値が減るためペンチャン落としを止めている可能性あり。
評価処理が仮実装ですから、バグかも・・・
連続投稿すまそ。
もう一つ^^
ペンチャン落としの評価は2シャンテンから1シャンテンの間でやっています。
数値では見えないですが、気持ちペンチャン落ししたほうが良さそうな感じです。
もっと明確になれば、「ペンチャン落しは、時に有効である」の証明になるかも
しれません。無条件ペンチャン落しではなく、3手先にペンチャンを落としてもいい
評価があったときに落とした場合です。
>>538 10C4通りよりも桁違いに多いですよ。シュンツだけで。
1234の場合123と234で考えなければならないです。
牌が多くなるともっと多いです。
12345は 123、234、345です。これに牌の重なりやマンズ・ソーズ・ピンズの
関係も有るので、考えたくないぐらい有ります。
>>542 私の旧AIでは減らしてませんよ。(ソースみれば分かりますが)
と言うよりも、Playerデータはオリジナルのコピーなので、
減らしても減らさなくても問題ないと思います。
因みに私の仕様では一旦ポンする牌を減らしてから、
捨牌を選択して元に戻しますが、実は無意味な行為です。
こちらも、今作ってるAIと共に、旧AIの方も鳴き全部
出来るように直しているのですが、vectorのアドレス
参照時に起こるバグと、配列の中身がおかしく
なってしまうバグが未だ引きずってて困ってます。
ソースとか牌譜とか、後でうpしときますので
よろしければどぞ。
531はスルーした方がいいって。
こいつ何にもわかってないから。
モンテカルロ法を頭の中で色々妄想してみました。
妄想では、まったく使えないと結論がでた。^^
なぜなら
最初のツモで手配が14有り、それに18枚足したとして
上がりの高い手はどれも、最初の手配から平均8枚ぐらいしか使わないとしたら。
14−8=6枚がいらないと事になります。この中の何を捨てて良いでしょう?
手牌14枚が均等に使われると考えるのは楽観的過ぎで、とても不均等だと思われる。
仮に考えられないほどたくさんのパターンと回数したとして、点数がとても高い牌の
集団と点数の低い集団ができるでしょう、点数の低い集団から一番低いのを選んだとして
、はてさて、それに価値があるのかはなはだ疑問です。
これの問題点は、手配の14枚より、足すほうが多いのです。この中から上がれる手を
作る場合、足す方が主体となってしまい、手牌14枚の存在価値が少ないのです。
その結果、手牌1枚1枚の意味が霧散してしまうことです。
私の結論、
モンテカルロ法は手配の数より、少ない数足すことで結果が出ないと、意味が無い。
足す数が少なければ少ないほど良い。できれば手配の半分以下の数枚程度がいい、
しかし、数枚程度では上がり手があまり出来ないため使えない。
>>542 今見てみました。
MJSimのバグと、AIのバグ両方がある。
・AIのバグ
ポンの指定はOKだけど、捨て牌が指定されてないようだ。
捨て牌が前回のまま?みたいなので、捨て牌も指定してください。
・MJSimのバグ
「鳴きの指定がOKだが、捨て牌が間違っているとき」に、「ツモ切りに修正」してしまう。
このため、その後の牌譜がおかしくなる。
正常な動作は、捨て牌として適当なもの(ソートしたとき一番左にくるやつ)を切るようにすべき。
スマン。
・修正するには、MJSim.cppの746行目↓を削除またはコメントアウトしてください。
Player->Action.Type = MJACTION_SUTEHAI;
・ポン自体を無効にしたほうが良いかどうか、という話になるが、
この措置は、特に意味は無い。止まらなければ良い、と考えている。
そもそも、AI対戦では誤ポンはありえないはずなので。
・エラーをログに残したり、AIへ通知すべき。今後改善しようとおもう。
>質問。ポンチーした時のPlayer内の手牌データはポンチーした牌は減ります?
減ります。ポンした牌を-2している。
>>531さんのはおもしろいなぁ。まだ良く考えてないので、あとでレス書く予定。
>>548補足
>減ります。ポンした牌を-2している。
当然その後、捨て牌の分も減り、合計3つ減る。
さらした牌はFuroへ入るイメージ。
フーロ牌も「手牌」じゃないのかといわれると困るけど・・・
>>549 了解しました、減るようにフーロ部分作り直します。ポン・チー・カン完成したいので。
>>554 とんちんかんな回答すんません。
暫く逝ってきます。
MJSim 0.5.6
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/file/1071668170_35/MJSim_000506.lzh ・デバッグモードをつけた。
不正なアクションが指定されたとき、エラーを表示してキー入力待ちする。
使用方法: コマンドラインに「-d」を指定する。
・鳴きの指定がOKだが捨て牌が間違っているときに、ツモ切りに訂正してしまうのを修正。
・国士無双のテンパイチェックが間違っているのを修正。
鳴きの指定が分かりづらいということで、デバッグモードをつけてみた。
簡易ブレークポイントみたいな感じ。
不正なアクションが指定されとき、↓のようなメッセージを出して、キー入力待ちする。
---
不正なアクションが指定されました。
場所: チー
理由: 捨てられた牌が使用されない形でのチー。鳴く牌: 16
訂正内容: MJACTION_NULLに訂正。
何かキーを押すと続行します。
---
この場合、他家が捨てた16(6ピン)を使用できないチーが指定されたことを示す。
表示される場所は、
・鳴き全部
・リーチ後の不正なアクション
・チョンボ(これは点数計算の後)
・補足
ツモ切りするとき、0でなく牌の番号を指定している場合、
その牌が手牌の中にないと、ツモ切りに訂正するが、そのときにデバッグメッセージが出る。
(問題ないといえば問題ないのだが)
公開されているAIは、結構↑の状態のようで、デバッグメッセージがでまくる。
これが鬱陶しい場合は、MJSim.cppの804行目のDebugMessage関数は無効にしてください。
>>252 お疲れ様です。 デバックモード助かります。
確かに、でまくり。^^;
ポン・チー関係はデバックが難しいので、助かります。
どうも、フーロ関係と鳴き関係でバグを作りこんでたようです^^; 直さねば
253v0002は、ポン候補リストもチー候補リストも、思いっきり壊れてます。
あまり使わない方が良いかも^^; 寝ます、おやすみなさい。
>>552 見てみた。
今300試合したところ、302さんのと0.02位差で負けたが、何が違うのかワカラン。
ペンチャンの処理を見ようと、何試合か見たけど、
なかなかモデルケースみたいなのがないなぁ。
カンチャンが残ってリーチが多いので、これもリャンメンが残るようにできるといいな。
リーチリャンメン率11%くらい。
>>557 先読み処理の完成型マッテル。
あと、画面表示だけど、今のはデバッグ版と思うけど、
リリース版も入れて、そっちではコマンドラインへ出力しないようにした方がいいと思うのでよろしく。
MJSimのこと。
AIもコマンドライン引数で指定するようにしようかと考え中。
相手を変えるのにバッチファイルが使えるようになる。
たくさんのAIをランダムに打たせるときは、
ファイルに名前だけ書くようにする。「AI0=」とか無しで。
いつやるかは未定。
あぼーん
↓readme.txtつけ忘れた・・・
---
MJSim AI 何切る
■概要
AIに何切る問題をやらせる。
■使い方
nanikiru DLL名 手牌 ツモ ドラ
例: nanikiru MJSimAI 1m2m5m9m9m2p3p4p7p8p9p5s6s 7s 2p
添付のnanikiru.batも参照してください。
・牌は、東風荘のログの形式で記述してください。
以下のものが使える。
1m,2m,3m,4m,5m,6m,7m,8m,9m,
1p,2p,3p,4p,5p,6p,7p,8p,9p,
1s,2s,3s,4s,5s,6s,7s,8s,9s,
東,南,西,北
白,発,中
・状況は、東1局の一番最初のツモ。
状況を変化させたいときは、nanikiru.cppのNanikiru関数を修正してください。
■注意事項
・手牌の数は、1,4,7,10,13個でなければならない。
13個以外のときは、AIがエラーを出す可能性がある。
(フーロ牌はセットされない)
風牌を鳴いて上がるとチョンボになる。
↓東鳴き後ロンでチョンボ
東4局 0本場(リーチ0) MJAI -8000 MJAI3 2000 MJAI1 2000 MJAI2 4000
チョンボ
[1南]1m3m4m1p7p7p8p7s8s8s9s東東
[2西]1m6m7m8m2p2p2p4p5p6p発中中
[3北]5m7m1p3p6p6p9p1s2s3s9s北北
[4東]1m2m9m9m1p3p4p6p2s8s9s白白
[表ドラ]3m [裏ドラ]西
* 4G8p 4D8p 1G4s 1d1m 2G2m 2D2m 3G白 3D白 4G6m 4D6m 1G9m 1D9m 2G5s 2D5s 3G1p
* 3D1p 4G8m 4D8m 1G南 1D南 2G9p 2D9p 3G6m 3D6m 4G東 4D東 1N 1d1p 2G北 2D北
* 3G2p 3D2p 4G4s 4D4s 1G8p 1d8s 2G2m 2D2m 3G4p 3D4p 4G発 4D発 1G西 1D西 2G2s
* 2D2s 3G白 3D白 4G1m 4D1m 1G東 1D東 2G北 2D北 3G南 3D南 4G中 4D中 1G1s 1D1s
* 2G3m 2D3m 3G6m 3D6m 4G6s 4D6s 1G5s 1d4m 2G3p 2D3p 3G4p 3D4p 4G4m 4D4m 1G西
* 1D西 2G3m 2D3m 3G西 3D西 4G7p 4D7p 1G7p 1d3m 2G5s 2D5s 3G4s 3D4s 4G5p 4D5p
* 1G発 1D発 2G8m 2D8m 3G4m 3D4m 4G発 4D発 1G4m 1D4m 2G3s 2D3s 1A
×風牌
○場牌
>>558 >ペンチャンの処理を見ようと、何試合か見たけど、
>なかなかモデルケースみたいなのがないなぁ。
ペンチャン切りしてる雀譜だけ何処かにでもUPしましょうか?
>カンチャンが残ってリーチが多いので、これもリャンメンが残るようにできるといいな。
カンチャン変えは、牌確率とダマテン機能かな〜〜〜〜入れたいと思っています。
>先読み処理の完成型マッテル。
これは時間がかかるかも、手牌評価を機能UPしないといけないので。
詳しい手牌評価があって初めて3手先の浅さでもそれなりに機能している可能性あり。
5手先もやってみたいと思ってるし。
学習機能をつけたいとも思ってます。
今までは、複雑さを解決するためのパターン認識でしたが、これからは、知識ベースの
パターン認識の方向へ行くかな〜〜〜
そうそう、前に読んだ先読みデータの再利用もして、スピードUPしたいし。
それに、深読みとの併用も面白そうだし。
う〜〜〜〜〜やりたいこといっぱいです^^
>リリース版も入れて、そっちではコマンドラインへ出力しないようにした方がいいと思うのでよろしく。
了解。
追加。
いや、それよりも、302さんに勝つために、上がり点数を上げないと。
ファイル容量で数倍も有るのに、負けているのは悔しい。
雀譜を見ると変な切り牌がまだたくさん有るので、直していって徐々に強くしないと。
ほとんどは内部の見えないバグですから。
ご苦労様です。
最強になりましたか?
>>569 ひょっとして、私?
>最強になりましたか?
最強なんて程遠いです。 今のAIは麻雀覚えた小学生ぐらいですね。
今も短時間にバグが3つも見つかったTT
1.チートイツの役判定が間違っていて、チートイテンパイなのに崩す牌切ってた。
フーロ関係の作りこみの反映がミス;;
2.if分ミスでドラ牌を先に切ってた;;
3.タンヨウ判定ミスで、イソー持っててもタンヨウ役ありとして、待ちの悪い方切ってた。;;
短時間にこれほど出るとは、バグバグだらけですTT
>>566>>572 お疲れ様です。
↓リーチ直後のロンなのにリーチ棒が動いているようですが仕様ですか?
普通は動かないと思うのですが・・・
===== 東風戦:ランキング卓 300卓 開始 2003/01/01 00:00 =====
持点27000 [1]253v003 R1500 [2]302v012 R1500 [3]253v000 R1500 [4]283_v004 R1500
東1局 0本場(リーチ0) 302v012 9000 253v000 -9000
40符 四飜ロン リーチ ドラ3
[1南]3m4m8m3p5p7p9p1s4s6s9s東南
[2西]1m4m5m9m6p8p1s3s4s5s6s南中
[3北]2m2m3m5m6m7m8m1p2p2s3s8s西
[4東]3m7m9m2p2p4p6p1s2s5s8s北中
[表ドラ]6m [裏ドラ]6s
* 4G9s 4d中 1G7s 1d東 2G8p 2d中 3G3m 3d西 4G発 4d北 1G9m 1d南 2G9p 2d南 3G7p
* 3d8s 4G6p 4d発 1G2m 1d1s 2G1m 2d9p 3G1p 3d2p 4G6p 4d3m 1G1p 1d9s 2G6m 2d9m
* 3G7m 3d7p 4G東 4D東 1G1p 1d8m 2G9p 2D9p 3G白 3D白 4G6m 4d9m 1G5p 1d4s 2G8s
* 2d6p 3G4p 3D4p 4G7m 4D7m 1G9s 1D9s 2G5s 2d8s 3G西 3D西 4G5p 4d5s 1G中 1D中
* 2G6s 2d1s 3G5m 3d8m 4G白 4D白 1G7p 1d9m 2G3p 2D3p 3G4p 3d2m 4G6m 4D6m 1G4s
* 1D4s 2G9m 2D9m 3G南 3d3m 4G9s 4D9s 1G6s 1d6s 2G7s 2R 2d3s 3G3s 3d3s 4G3s
* 4d8s 1G2m 1d2m 2G東 2D東 3G1m 3d南 4G白 4D白 1G中 1D中 2G北 2D北 3G4m 3d4p
* 4G7s 4d2p 1G北 1D北 2G北 2D北 3G1s 3R 3d1m 2A
>>567 どういうときに、ペンチャンおとしするんでしょうか?
何切るでいくつかやらせてみたところ、
nanikiru 253v0003 1m2m5m6m9m9m2p3p4p7p8p9p5s 7s 2p
これは2mを切る。へ〜、内側から切るのか。
nanikiru 253v0003 1m2m5m6m9m9m2p3p4p7p8p9p3s 7s 2p
3sを切る。この場合はペンチャン落とさないの?
>う〜〜〜〜〜やりたいこといっぱいです^^
成績に大きく影響があると思われる順番に作って、一足先に最強を目指してください。
ぼくは、普通に切るのだけでいっぱいいっぱい・・・
>>573 バグです。
すぐには修正しないけど、修正リストの上のほうに入れる。
nanikiruは局面も設定(
>>361みたいに)したり、
鳴くかどうかの局面も作り出せるようにすれば、
デバッグツールとして使えるものになりそうかな。
で、その作戦が実際に成績を上げるものかどうかの検証はMJSimをつかうと。
>これは2mを切る。へ〜、内側から切るのか。
元々私の雀風は2mから切ってました、現在のAIは
>>523さんの知識を
実装してます。(他の牌との兼ね合いも有るのでもっと複雑)
>3sを切る。この場合はペンチャン落とさないの?
これは、仮実装のためそうなってます。(オイ^^;
これでは怒られそうなので簡単に、上の例はペンチャンを切っても4m7m6sが
きた時1シャンテンとなる可能性があり、下は無いです。
本実装になったら統計的検討してから^^;、条件により落とせる予定。
感想を一つ
人間はすごいな、問題を理解するため、無意識に知りたい点とそれ以外の
ノイズを分離して、問題のモデル化ができる。AIはこれが難しい。
先のモデルは、理解しやすいためにターツシュンツがまったく関係しないように
配置され、なおかつ知りたい点をそれらと一切関係しないソーズにする。
さすが人間。
で、実際の麻雀2シャンテンは色々な牌が関係してごちゃごちゃが多い。
(私が統計統計と言っていた意味が疑問だったと思います^^)
特に、面子2つ頭ターツ1つより、面子1つ頭ターツ3つ以上が多く、なおかつ
ごちゃごちゃに重なり合った2シャンテンのほうが多い、上記の例題は稀です。
この中でも、落としていいペンチャンと落とさない方がいいペンチャンが
有ると考えました。それを理解するにはどうするか、もう統計的手法しかありません^^;
その結果、人間のパターン認識には落ちるが、統計的に有効であった仮実装をした。
>nanikiruは局面も設定(
>>361みたいに)したり、
>鳴くかどうかの局面も作り出せるようにすれば、
>デバッグツールとして使えるものになりそうかな。
はい、できると助かります
モンテカルロ法と奥の深い先読み探査について考察。
今では、多くの牌を足して行うモンテカルロ法がまったく
使えなくなることが証明できます。説明はめんどいので止めます。
(自分で考えてみて^^)
実は深い先読みも同じ問題点を抱えているのではないかと考えてます。
先読みを8ツモ先までやるのと、ランダムに8ツモして分析するのと
何処が違うのでしょう。
とても深い先読みをした場合この問題に直面するでしょう。
気がつかない人もいるかも^^
内容は、聞かれても答えません、自分で考えてください。
何とかそれらしきプログラムが出来たのでうpします。
http://briefcase.yahoo.co.jp/mahjongxp 場風、自風、ドラ表示牌、手牌、残りツモ回数、繰り返し回数、場に出ている牌
を入力すれば
>>531の考え方で打牌を求めてくれます。
古いマシンだとなかなか終わらないかもしれないので、繰り返し回数は最初は少なめで試して下さい。
あと注意点ですが、
・全てダマのツモ和了と考えて計算しています。
・和了牌を考慮していないので、両面待ちでないのにピンフとして計算してしまう場合があります。待ちに付く符を計算していないので符の計算が若干違う場合があります。
ソースはとても汚くて見づらいです。すみません。
AI未だに作成中。少しは強く仕上がるかなあ・・・
↓役間違えのバグですが既出ですか?
これはびっくりしました(^^;
===== 東風戦:ランキング卓 300卓 開始 2003/01/01 00:00 =====
持点27000 [1]253v000 R1500 [2]253v003 R1500 [3]283v004 R1500 [4]302v012 R1500
東1局 0本場(リーチ0) 253v000 3000 253v003 -500 283v004 -2000 302v012 -500
30符 二飜ツモ 門前清模和 断ヤオ
[1西]3m7m9m2p3p5p5p6p6p8p8s9s南
[2北]4m7m3p4p3s5s5s9s東南北北白
[3東]1m2m3m5m5m1p2p9p2s3s5s6s中
[4南]5m6m7m7p7p9p9p1s3s6s9s南白
[表ドラ]2s [裏ドラ]9p
* 3G2s 3d中 4G9m 4d白 1G5p 1d南 2G西 2d南 3G8m 3d2s 4G7m 4d南 1G4m 1d8p 2G中
* 2d西 3G7s 3d8m 4G3s 4d9s 1G6m 1d9m 2G北 2d白 3G東 3D東 4G東 4D東 1G2m 1d9s
* 2G1m 2d東 3G4p 3D4p 4G中 4D中 1G白 1D白 2G4m 2d中 3G6p 3D6p 4G3p 4D3p 1G3p
* 1d3p 2G東 2D東 3G4p 3D4p 4G4s 4d1s 1G2p 1d2p 2G北 2d北 3G7s 3D7s 4G2s 4d3s
* 1G7s 1d2p 2G2p 2d1m 3G8p 3D8p 4G発 4D発 1G2m 1d2m 2G8p 2d9s 3G2m 3D2m 4G4s
* 4d9m 1G8m 1d3p 2G9m 2d8p 3G4s 3R 3d9p 4G7s 4d7m 1G8m 1d8m 2G西 2D西 3G南
* 3D南 4G1p 4D1p 1G9s 1A
>>579 お疲れ様です、がんば〜〜〜、少しずつできる範囲からが良いよ。私もさ少しずつで今に^^
ここを見ている、麻雀に詳しい人に質問です。私は麻雀弱い^^;
今。ポン・チーするAIですが、あまりにもアホな鳴きをしています。泣きたい位アホ。
ポンチイーを賢くする知識を入れたいのですが今ひとつ浮かびません。
私の案では。
・鳴くのを10順以内にする、10順過ぎたら鳴かない。
・ドラ等が1枚以上あるときしか鳴かない。
・1シャンテン以上でしか鳴かない。2シャンテンでもOK?
・2鳴きしかしない。
・そもそも、鳴きは良くない?
う〜〜〜〜ん。今一賢くないアイデア、私自身はあまり鳴かない雀風なので不明^^;
何か知識を教えてください、又はHPでも紹介してください。
>>580 > ・鳴くのを10順以内にする、10順過ぎたら鳴かない。
> ・ドラ等が1枚以上あるときしか鳴かない。
> ・1シャンテン以上でしか鳴かない。2シャンテンでもOK?
> ・2鳴きしかしない。
> ・そもそも、鳴きは良くない?
まずどういう意図でその行き方が出てきたかが問題だろ。何のために鳴くのか、
あるいは鳴かないのかを考えて、そこから打ち方を導くべきだと思う。10順以内
とか2鳴きまでとかシバリを入れるのは良いが、なぜそうするのかが前提にない、
“なんとなく”っていうんじゃダメ。
>>581 >まずどういう意図でその行き方が出てきたかが問題だろ。何のために鳴くのか、
>あるいは鳴かないのかを考えて、そこから打ち方を導くべきだと思う。10順以内
>とか2鳴きまでとかシバリを入れるのは良いが、なぜそうするのかが前提にない、
>“なんとなく”っていうんじゃダメ。
どういう意図で、どうするのが良いですか?
鳴きの基本意図は手を早くすることだと思う。鳴いた後は選択肢が減っていく
わけだから、振るリスクは高くなっていくわけで、だからこそアガる意思を明確
にするという意味も強くなる。
まずアガりの欲しい流れ、点数配分が鳴きを入れる場の前提条件に必要なん
じゃないかと思う。
次に鳴きで早くなる手なのかが問題。例えば両面鳴いて面子作っても他の待ち
が狭いなら、残してつもってる間に拾うかもしれないわけだし。
>>580 AIの場合、鳴きは複雑すぎて難しい問題なのでむしろ門前で手を進める方がいいかと思います。
ある程度書くと
・トップ目の場合、鳴きすぎる(2フーロ、3フーロする)と手牌が短くなるので凶
・門前で手を進めてると他家が高い手を和了しそうな時は鳴くと吉
・和了トップの時は無理鳴きでも和了を目指す
・上家が国士をやっている時は一色手でも鳴きやすい
・高点数が必要な状況では門前
・基本は一鳴きテンパイで
・他家が鳴いてくる場では門前で
・ファン牌を二鳴きするくらいなら対子落としまたは雀頭(安パイでも可)に、もしくは一鳴き
・門前からのリャンメンチーは凶
・周りが腰の重い打ち手が多い場合には門前で
以上は東風荘に限ったものです。
フリーでは御祝儀があるので赤牌あるだけでもガンガン鳴いた方が強いです。
鳴きに関するプログラムは再帰的に定義できそうな気がします(素人意見ですが)
>鳴きの基本意図は手を早
:
>にするという意味も強くなる。
確かに。
>まずアガりの欲しい流れ、点数配分が鳴きを入れる場の前提条件に必要なん
>じゃないかと思う。
そうすると次のような条件があるといいですか?
1.親でなら、2シャンテンぐらいでも鳴きで上がろう。(2,3位ぐらいの時、トップ親は鳴かない)
2.トップ子なら、1シャンテンで無条件に鳴いて上がろう。
>次に鳴きで早くなる手なのかが問題。例えば両面鳴いて面子作っても他の待ち
>が狭いなら、残してつもってる間に拾うかもしれないわけだし。
なるほど。
1.リャンメンは鳴かない。
プログラム的で確定的です、おかしかったら指摘してください。
m1m2m3m9m9p2p3s1s3s7s8s9s北 (ドラp2)
こんな手だったらp1はリャンメンでも鳴くべき。
(どうしてもハネマン欲しい状況なら別)
リャンメンとは言え、実質ペンチャンのようなものだからね。
・鳴いても高い手はどんどん鳴くべき
>>523さん
>>587さん、有難うございます。
なるほど、実践の知識ですね、ぜひ、組み込みたいです。
特に、鳴きは、トップを確定する戦略の上で、持っているべき機能と感じました。
1.場の状況をTOPを左右するための戦略の一つに鳴きを組み込む。
・トップ目の場合、鳴きすぎる(2フーロ、3フーロする)と手牌が短くなるので凶
・和了トップの時は無理鳴きでも和了を目指す
2.鳴いて手が確定して上がれるなら鳴き、1シャンテンの時のみ。
・鳴いても高い手はどんどん鳴くべき
3、以後随時に。
・高点数が必要な状況では門前
・基本は一鳴きテンパイで
・ファン牌を二鳴きするくらいなら対子落としまたは雀頭(安パイでも可)に、もしくは一鳴き
・門前からのリャンメンチーは凶
・他家が鳴いてくる場では門前で
999、この辺はAIには難しいかも^^;
・周りが腰の重い打ち手が多い場合には門前で
・上家が国士をやっている時は一色手でも鳴きやすい
・門前で手を進めてると他家が高い手を和了しそうな時は鳴くと吉
この感じで良いでしょうか?
私自身は2鳴き優先でしたが、1鳴きのほうがいいのは、初めて知りました。
1.親でなら、2シャンテンぐらいでも鳴きで上がろう。(2,3位ぐらいの時、トップ親は鳴かない)
2.トップ子なら、1シャンテンで無条件に鳴いて上がろう。
この二つは変?
>>589 そうですね、AIは人間と違うので条件をある程度ぼかす必要がありそうですね。
一番下のを実装してみて結果を教えて下さい。
>>586 > 1.リャンメンは鳴かない。
いやそう単純にはいかんだろw
>>587のような手でチャンタの端寄せなら1が欲しいってのは道理だろうし。
でも鳴いて純チャンでもドラ付きで39、なしなら2千止まりだろ。その程度
の点だと実戦なら局面次第っていう要素が強くなるな。
・他家との点数配分でその点が必要な局面か?
・両面でも待ちが河などに見えてる牌に多いなら鳴いておかないとアガれなくなる
(両面ならといった待ち形というより待ち牌の残り牌で考えた方がベターかも)
当然だけど、逆目拾ったら役無しでフリテンとかになるのは、早そうでも論外。
>>592 HP紹介有難うございます。凸氏の所気がつきませんでした。
検索しても、鳴きについては少なかった。フーロか^^
>>578 おもしろい。
しかも、まあまあいいセンいってるような気がする。
結果は毎回ばらつきそうだが、それほどばらつかない。
打牌候補順位も要らないものが上位にきている。
例えばこれ。
残りツモ回数 10
繰り返し施行回数 200
二三四六BCDHH12566
1位 1
2位 六
3位 2
4位 H
5位 6
何回か試したが、似たような感じ。
二三四六BCDHH12579
これだと、9を切ることが多い。
この形でも、普通は1を切るのがはっきりとよさそうだが・・・
>>546、
>>577の意見ももっともな話だけど。
>>594 サンプルとツモ数と回数が少ないとそれなりの結果は出ますよ。
その範囲で利用すれば・・・・・サンプルが厳しくなると難しいかな。
それを、たくさんのツモとたくさんの回数まで、同じになると考えなければOK^^。
目に見える形で。
一二三六BCDHH25668
これを18ツモで、10回でやって見て、10回は早く終わらせるために。
何回もやって見て、ほとんど同じ結果になるから。 分かる人は理解できる。
今、雀球 for windowsを作っていますが、むずかしくて頓挫しています
>>594 二三四六(3)(4)(5)(9)(9)12579
UPしたファイルには例として、場に見えている牌に「東9南北」が入れてあったんですが、それは消しました?あとドラは?
残っていたらその影響もあるかも。
ドラを字牌、場に見えてる牌を空にしてやると1になりやすいですよ。
残りツモ回数を減らした場合は9、あるいは六になりやすいですね。
12のターツ落しは一時的にターツ不足になるため、短期戦では不利という事が関係していると思います。
訂正、ほとんど同じではなく、よく同じのが出る^^;
>>598 10回だと回数が少なすぎて意味のある結果は出にくいですね。
一になる事が多いのは最大値の検索にExcelのMatch関数を使っているためで、同点上位の何個かの中から一番左端のものを返すからです。
100回も繰り返せば大きなポカはやらなくなるようです。
>>604 ごめんなさい、ちょと訂正。
六と8に並んで、確かに一もよく来ますね^^
左端云々はあまり関係ないか・・・
通常の麻雀だったら確かに悪手なのですが、このシミュレーションはあくまでも
「一人麻雀の最善手を求めよう」
という主旨で考えたものなので、一概に悪手と決め付けられません。
一人麻雀やった事ありますか?
麻雀好きな人なら誰でも一度はやった事あると思いますが、一人で牌を並べ配牌を取って一人で黙々と打つ。
そういうゲームでの最善手だからです。
和了の巡目は考慮せず、18巡以内に出来る最高形を目指す、という事をやっているから極端なタンヤオ指向の一切りという打牌になるのでしょう。
(一切りが本当に最善手かどうか、このアルゴリズムが正しいかどうか、まだまだ検討する必要はありますが)
ここまでは理解していただけましたか?
タンヨウと言う理由をなくす、牌パイ
一二三六BCD2566789
一と9が良く出るよ
18ツモでやってね^^
このアルゴリズムを4人麻雀に適用する場合はどうしたらいいか。
まず、現在の局を「早く和了るのか」あるいは「高得点を狙うのか」方針を決めます。
河の状況から場の進み具合を判断したり、点棒状況から判断したりする事になるでしょう。
私には具体的な考えはまだありませんが、方針が決まったとしましょう。
早く和了りたいのであれば「残りツモ回数」を実際よりも少なくすればいい。
(遅くてもいいから)高得点を狙いたい場であれば「残りツモ回数」は多めのままでいい。
こんな感じで4人麻雀にも利用できると考えています。
「残りツモ回数」というのを「何巡後までに和了りたいかという目標」と置き換えて考えれば分かり易いかもしれませんね。
>>606 質問の意図が良く分からないのですが?
あと「タンヨウ」じゃなくて「タンヤオ」ですよ。
今から家に帰るので、出れないです。
だから531は放置しなって言ってるのに・・・
安全牌を判定するAIは作らないんですか?
>>612 家から^^、 可能な範囲でやりたいと思っています。
今わかる範囲では、AI戦には効果が薄いことが残念。
AIを作っていくと、可能な範囲と不可能な範囲が見えてきて、当初思っていた以上に
色々出来そうです。だから、相手の手お読むことは不可能だと思っていますが、
やって見ると、意外な方法を見つけるかもしれません。楽しみです。
614 :
デフォルトの名無しさん:04/01/10 02:07
以前、Windows用に日下部氏のつくった麻雀ゲームが入ったパッケージ(いくつかのゲームのセット)がマイクロソフトから売られていましたが、
プレイしたことがあります。
あれの花札は強かった。
>安全牌を判定するAIは作らないんですか?
いま、妄想してたら、ある程度安全牌を判定出来そうなアイデアが出ました。
ほんとに可能なのか、作ってみないと分からないです。
でも作るのが難しそう。CPUの計算能力がとてもいるし。
簡単に言うと、見えない牌と見える牌から、可能な手を逆推論するんです。
妄想だと行けそうな感じがする、多分山が半分ぐらい無くなってから性能が
出てくるような。終盤では高い的中率が出そうな気が・・・・・
AIも強くしたいし、252さん、試しにそちら作ってみて良い?
妄想で終わるか、可能なのか試してみたい。^^
仕様は、
・山が半分ぐらい無くなってから動作する。
・CPUパワー食いそうで、多分遅い。
・安全牌を予測するだけのAI、
・出力は・・・・・・外見はふらないこと?
他のAIと通信して、手予測の自動検証が出来ないと無理かな。
252さん、AI同士で通信方法が有ると嬉しいです。
500Byte位の中継を、1つのAIだけに送るような。
試合の時は動作しないでオプションか何かで指定して。
と勝手に妄想してるけど。検討よろしく。
でも、作ってもらった後、妄想で不可能でした、になるかも。もし暇なら検討を。
一つのAIに手配情報も山も全部見えるようにするだけでもいい。
全部カンニングできるAI。 これなら通信は不要だし。
普通のAIを使用できる。
もちろん、手配予測の正しさを、自動検証するために、動くのみ。
だめだ、妄想爆発
理由:今現在14枚の手牌解析だけで100パターンを超えます。
内部的な最大は900近く行きます。それが、50枚以上となると、
現実的ではない。
ごめんなさい、早くも挫折。 もっとゆっくり考えます。
>>606 一二三六BCD2566789
この場合、18ツモにすると、一や9になることが多いが、
5ツモにするとほぼ2になる。
最高形も見ても、ツモがたくさんあると元から持っている牌が
大事にされないというか、必要になることが少なくなる。(253さんの考察どおり)
この形から、人間の場合は2しかないが、無意識のうちに速い上がりを考慮しているからだろう。
今、この形で1順目だからといってタンヤオもつけようということは無い。
なので、
>>608のようにするか、
ツモ順を考慮して「早い上がりにはそれに応じた加点」してやるという手もある。
もっと自然に「上がり順が遅いと他家に上がられる可能性が高まり減点」とか。
これで、このAIが「上がりの速さを考慮する」ようになる・・・かも。
>>601 >12のターツ落しは一時的にターツ不足になるため、短期戦では不利という事が関係していると思います。
なぜペンチャンを落としたいかというと、そこはメンツになる可能性が低いからで、
短期決戦であればむしろメンツになりにくい(ここがネックになり、上がりにくい)と思える。
二三四六BCDHH12566
残りツモ 5
打牌 6
統計を取ってないから分からないが、この形から5回のツモで3をツモる確立は少ないし、
「ツモ」のところをみてもあまり3はないとおもう。
上がり形を見てみると、ほとんど上がれておらず、
たまたま3を積もったときだけ上がれていることが多い(パッと見)。
六、5、6にくっついて上がる方が可能性が高い気がしてならないが・・・
ツモだけを考慮しているからそうなるのかも。
最後がロンをつかえるとなれば、リャンメンを残した方がいいはず。
あと↑にも関係あるが、テンパイの待ちがリャンメンかどうか、
他家に必要ない字牌などであるかどうかは和了率に大きく影響するはずなので、
そこらへんも「考慮する」ようになるといいかも。
ペンチャン、カンチャンがあると、そこが最後(テンパイ)まで残ることが多いのは当然なので。
>>618 「とつげき東北HP ベタオリ技術論」
http://www.interq.or.jp/snake/totugeki/kouza3.htm 牌ごとの危険度の表がある。へたに読まない方が失点を減らせるようだ。
でも、そういうのにチャレンジしてみるのも面白いかも。
麻雀の戦術書では、他家のあたり牌をよく1点読みしている。
わずか6個くらいの捨て牌から「これは3色で○-○待ち」とか。
あと、AIもいろんなバリエーションがあるといいかも。
■AI雀鬼 仕様
・1打目に字牌を切らない。
・前の局で「中」で上がったりすると、次の局でも「中」を大事にする(アヤっ牌システム搭載)。
・あたり牌を1点読み。点数も分かる。
・全員マイナスを狙う。
・天運、地運などを評価した打牌。
・2個くらいの捨て牌から、相手の手牌を読む。
ものすごく強くなったり・・・しないか。
■AI兎 仕様
・とにかく適当にあたり牌を1点読み。
(乱数で決める。・・・相手のしぐさとかそういうの取得できないし)
>>600 スレ違いだけど・・・
やってみた。14個たまを打ってからが地味すぎ。なんとかならんか・・・
>ツモ順を考慮して「早い上がりにはそれに応じた加点」してやるという手もある。
>もっと自然に「上がり順が遅いと他家に上がられる可能性が高まり減点」とか。
>これで、このAIが「上がりの速さを考慮する」ようになる・・・かも。
モンテカルロ法を麻雀に適用した場合、構造的な欠陥があるので、この欠陥が
目的に影響しない範囲で使用する分には、それなりの成果が出ます。
ただし、欠陥を理解して使用しないと本末転倒。
オリのルーチンなんかで現段階であまり悩まない方がいいと思いますよ。
だって、高い手を作るルーチンがない≒相手の手の高さが読めない
でしょ?
(現状では更に、自分の手を最速で上がるルーチンも無い訳ですよね?)
相手の手が確実に高い手だからこそ自分の手の速度を落としてオリる価値があるのであって、
リーチのみの安手にベタオリして「読み切ったぜ!」なんてのは初心者もいいとこだよ。
>あと、AIもいろんなバリエーションがあるといいかも。
>■AI雀鬼 仕様
>・1打目に字牌を切らない。
>・前の局で「中」で上がったりすると、次の局でも「中」を大事にする(アヤっ牌システム搭載)。
>・あたり牌を1点読み。点数も分かる。
>・天運、地運などを評価した打牌。
>・2個くらいの捨て牌から、相手の手牌を読む。
>ものすごく強くなったり・・・しないか。
いわゆるオカルトですね^^
それを検証する意味でも、思いっきり暇があればやってみたいです。
実際、数百試合やってみると良い時と悪い時の波が見えます。
波が見えるからと言って予測できるものではないですが^^
まるで、株価の上下のように予測できそうに見えて、不可能なように。
上の方で、「相手の手を一点読みして、三色で○○待ち」とかものの本に書いてあるのは、
「三色でなかったら(安いので)振っても構わない」というニュアンスが暗にあるんですよ。
ごめんなさい、割り込んだ形になっちゃった。
いえいえ、気にしないでください。
>現状では更に、自分の手を最速で上がるルーチンも無い訳ですよね?
最速では302さんが最速です。
私の方は、多少手作りの方向に行きそうなので、最速は諦めています。
別のAIを作って最速を検証するのも面白そうですが、次の機会にでも。
今回のことでも良く感じたのですが。
私は、短い文章の中で説明を試みています。たぶん、はぐらかしてるとか、煙に巻いいるように
感じているかもしれません。そんなつもりは、たまーにほんの少しだけ有ります^^;
今後もこの形でしか説明できないと思います、よろしく。
正直、分かりやすいように書こうと思ったら、図解入り数ページになる^^;
>>628 別にここは解説スレじゃないんですし、
それでいいんじゃないんですか。
AIのことは飽くまで意見を言い合う場、
もしくは、シミュレータのバグ情報報告
として使うべきですし、それ以上のことは
各自で研究すべきだと思います。
私だってAI作りはプログラム独学の一環
のつもりでやってますし、自分なんかが、
大したもの作れるとも思ってませんしね。
まあ、正直解説はして欲しいですが。
勉強になるし。
>>623 > 相手の手が確実に高い手だからこそ自分の手の速度を落としてオリる価値があるのであって、
> リーチのみの安手にベタオリして「読み切ったぜ!」なんてのは初心者もいいとこだよ。
相手の手が良いかどうかなんて確実に分かるもんじゃないし、それを無理に読むのは
どうかと思う。間違った仮定で分岐していったら結論もおかしくなるわけだし。役の高さ
や牌形に及ぶ読みは簡単にできない。思い込みの一点読みとかは論外だろう。
>>625にもあるし
>>621のサイトの解説でも分かるが、問題は振り方。ベタオリ技術論
は論理的に牌を段階評価してるし、そのままプログラムに応用できると思うが。
安牌を切るのはハイテイでノーテンの時だけでいいんじゃないの?
>>252さんへ
>一つのAIに手牌情報も山も全部見えるようにするだけでもいい。
>全部カンニングできるAI。 これなら通信は不要だし。
>これだと、普通のAIを使用できる。
この機能をオプションか何かで入れることは難しいですか?
前回の案は、現実的に無理ですが、他の案が無いわけではありません。
今度は密かに検証して、発表かな^^
私以外も、やって見たい人がいると思います。
よろしければ、検討してください。
>
>>625にもあるし
>>621のサイトの解説でも分かるが、問題は振り方。ベタオリ技術論
>は論理的に牌を段階評価してるし、そのままプログラムに応用できると思うが。
今読んでみましたが、プログラム的にはある程度は書けそうです。
ただ、何時それを使用するのかが問題、行くべきか降りるべきかの判断はとても難しい。
統計的に傾向を取ったとしても、それはAI固有の振る舞いでしか取れない。
AI固有の振る舞いをいくらとっても、価値はそのAIにしか無い。
やはり東風荘にAIデビューでもしないと・・・・・ 先は長そうだ。
最初は振る舞い云々なんてものは考えなくて良いだろ。
強い弱いって問題は降りがあるかないかが直接関わってくるところ。鳴きの件でも
あったが、アガる意思の強い局かどうかも関係するだろう。とりあえずアガる見込み
の強弱を測って、よっぽど強くない限りは、他家のテンパイに対し、降り姿勢に変え
るべき。
少なくともリーチ一発や親リーチの捨て牌には降りの一手を打つべきなんじゃないか?
>>631 麻雀の強い弱いは手がきれいに並べられるかではなくて、相手との駆け引きに
ポイントがある。特に降りが上手いかどうかは最も重要なところ。
質問です。
人間から見ると、最速リーチの全つっぱが3人いるとします。
一般的に勝つための有効な戦略とは何んでしょう?
>少なくともリーチ一発や親リーチの捨て牌には降りの一手を打つべきなんじゃないか?
はい、その通りです。
が、今のAIは、一度手を崩したらまず上がれない。手を回す概念はとても難しい。
ペンチャンやカンチャンを落とす以上に、難しいです。
>麻雀の強い弱いは手がきれいに並べられるかではなくて、相手との駆け引きに
>ポイントがある。特に降りが上手いかどうかは最も重要なところ。
手お創ることは早く、降りも降りしか出来ないAI、弱いですね。
中間か〜〜〜〜ムズイ
>>622 構造的欠陥とは具体的には?
うまくいかない事を証明したと言ってましたがその事ですか?
>>606はどうなりました?
14+n枚から最高形を導き出すのは計算量の問題で不可能ではなかったのですか?
相手を批判するならきちんと論拠を示して下さい。
私のやり方がうまくいかないとあなたの中で結論が出ているのなら放って置けばいいでしょう。
意味不明で中途半端な批判をする暇があったら、ご自分のプログラム作りに専念していた方があなたにとっても得なはずですよ。
>>622 もうちょっと検討して、これをAIに実装しようかなあと考え中。
いい感じの結果だし、簡潔さが魅力的。
まずい問題に気づいてない可能性は高いけど。
先読みの方法では、AIの作成がずっとずっと後になりそうだし、
新しい方法を編み出すには、自分に数学的素養がなさすぎる。
検討は続けるけど。
>>624 流れを読むプログラムは無理だろうなあ。
株価の場合いろんな予測方法があるらしい。
Software Designという雑誌で、
それでほんとに儲かるかシミュレーションする連載があったな。
>>623 >>630 まあ、この辺はいろいろな考えがあるでしょう。
ぼくは、相手の手配は読めないと思っている派。
>>625 それは無いと思うなあ。
それに、リーチ、ピンフ、タンヤオでも、表裏のドラや一発で満貫になってしまう。
>>632 了解。
一応確認だけど、暫定だけなら、単にMJSim側が持っている山や、
プレイヤーの配列へのポインタを渡すようにするけど、
当然ずっと使えるものが必要だよね?
>>620 気が付いたのですが、
今のプログラムではペンチャンやカンチャン待ちでもピンフになってしまう事があるので、その影響でペンチャンが切られにくくなってるかもしれません。
その辺りは早いうちに修正しようと思ってます。
ロンや鳴きの考慮はもっともなご意見ですね。
ただ、ロンや鳴きは対戦相手との関係で決まってくるものなので、現時点で適当な重み付けのような形にはしないと思います。
相手の手牌の読みとか場全体の状況判断とかを考えるようになった段階でそれらの考慮をしたプログラムにしようかと考えています。
>>639 >一応確認だけど、暫定だけなら、単にMJSim側が持っている山や、
>プレイヤーの配列へのポインタを渡すようにするけど、
>当然ずっと使えるものが必要だよね?
はい、お願いいたします。お世話掛けます。
>>640 >今のプログラムではペンチャンやカンチャン待ちでもピンフになってしまう事があるので、その影響でペンチャンが切られにくくなってるかもしれません。
それはあるかも。
でも、上がれなかった場合、0点なわけで、
ペンチャンを残すと上がれる可能性が低くなるから、
大きく平均点を下げる気がするんだけど。
もしかすると、意外とペンチャンはメンツになる(浮き牌がメンツになるのと比較して)のかもしれないが・・・
「ひいいの麻雀研究 牌効率理論」
http://www.ix3.jp/hiii/02mahken/2-04paikouritsu.htm ↑の「辺搭と浮き牌」のところ、なぜこうなるのかワカラン・・・
>相手の手牌の読みとか場全体の状況判断とかを考えるようになった段階でそれらの考慮をしたプログラムにしようかと考えています。
たしかに、最終的にはなるべく人為的な重みはつけずにやったほうが、おもしろそうだ。
でも、仮につけてみて、上手くいくか検証するのも良いかも。
>>638 まだ、考え中だけど・・・また、253さんの考えるものとは違うかもしれないけど。
やはり気になったのは、結果がばらつくかもしれないということ。
サンプル数を多く取れば、だいたい同じになるけど、
乱数を使う以上、変な形が連続することはありうる。
(まだやり方は分からないが)期待値計算で求める最善の1打は、
常に一意に決まるはずだ。と考えている。
>>636 手が入っているときは勝負、そうでないときはベタ降り。
この戦略で平均的に勝てない場合は、
1.牌効率がマスターできていない
2.手が入っているかどうかの判断ができていない
3.異常にツキがない(まず考えなくていいけどw)
のいずれか。
>>644 >1.牌効率がマスターできていない
とは、手作りが遅いと言うことですか? テンパイが遅い?
>2.手が入っているかどうかの判断ができていない
「手が入っているかどうか」とは具体的にどのような事でしょうか?
単に「最速でテンパイ」にするだけなら、AIはとても効率よく動作します。
並みの人間より速い、ただし、手と待ちは誉められた内容では有りませんが^^
なぜ上記AIを出したかですが。
700試合300,400試合を3回やりました、302さんに3回とも少し勝てた。
正直嬉しい。^^ もちろんダミーは負けです。
ツモ切り2AIだと、302さんには何回やっても勝てなかった、理由は不明ですが検討の余地あり。
とまあ、そんなことがあったので出しました。302さんスマソ^^;
補足、試合をしたのは、最新のバグつぶし、鳴かないAIでした。
>>645 あれ?
3人のAIと対戦する人間の話ですよね?
1.は取捨選択を間違えるということ。
確率に基づき取捨選択ができるのであれば、手を大きくする事もできるはず。
人間のばやいです、あくまでも。
2.は大きくて和了りやすい手が来ているということ。
これで具体性OK?
私も人造雀士を作った事りますが、牌効率より先に役や読みに溺れてあまり強くなりませんでした。
最近、このスレ見てまた作ろうかと思ったりしてます。
>>649 >3人のAIと対戦する人間の話ですよね?
そうです、その知識をAIに活用できないかと思い。
>1.は取捨選択を間違えるということ。
>確率に基づき取捨選択ができるのであれば、手を大きくする事もできるはず。
>人間のばやいです、あくまでも。
了解しました。 手作りをして、早いリーチに対抗すると考えて正しいですか?
スピード的には多少落ちるかもですが。
>2.は大きくて和了りやすい手が来ているということ。
>これで具体性OK?
OKです、麻雀の専門的な言い回しがシロートなもので^^;
AI的にすると、手の役の大きさを評価する関数を作り、その評価と場の点数バランス
で、手が入っていると判断するの理解で良いですか?
>最近、このスレ見てまた作ろうかと思ったりしてます。
ぜひ参加お願いします。
>>650 ほっといてもAI同士で振り合い、4着はツモられ貧乏のときしかありませんので、
手作りをしてというか、「ある程度良い手の時にしか行かない」に近いです。
早くて高い手の時に行く感じなので、スピードを犠牲にするのとはちょっとニュアンスが違うかも。
2は、大きさと速さを評価した方がよいと感じます。
偉そうなこと言ってるけど、プログラマーなんだから自分で作れ。 >>自分
ずいぶん前に作ったのでよく覚えていませんが、
手牌を渡すと点数計算してくれる関数なんかが提供されていたプラットフォームだったので、
その辺から自作するのはちょっと難儀かと。
再開するとなるとそっちの環境でになりそうです。
今、昼休みに少しずつ設計してますが、完成するのかなあ。
途中で投げそう・・・。
652 :
デフォルトの名無しさん:04/01/11 00:55
もちろん勝ったら女の子が服を脱いでくれますよね??
>>651 プログラマさんが参戦していただけるならとても心強いです。
是非とも最強の麻雀AIを作ってください。
自分もプログラムの素人ながらやれる限りやっていますので。
>>632 山や他家手牌も見えるインターフェースを考えてみた。
仕様としては、v1とほとんど一緒で、以下の点を変更。
・AIは、AIInterfaceVersion関数で2を返す。
(インターフェースv2を新設)
・AIAction関数の宣言はv1と一緒。
・Taku構造体の中の、他家手牌も見える状態。
(v1ではすべて0になっている)
・Taku->Player[Index].Action.Typeに山配列へのポインタが入っている。
(キャストしてください)
山の仕様は、
int Yama[137];
//0〜3:リンシャン牌
//4〜7:表ドラ表示牌
//8〜11:裏ドラ表示牌
//12〜13:使用しない牌
//14〜:ツモ牌(最初の13×4牌は配牌)
//136:番兵。常に0
また、MJSimのオプションで、v2のAIを許可するかどうか指定できる。
オプションが無い場合、v2のAIが1つでもあるとエラーになる。
>>646 乙。
見てみた。シャンテン数だけみてるのかなあ。
たしかになんか順位が良くなっている。
添付はいまのとこ考えてない。
男チャ漬けさんのやつを添付してるのは、説明書が不親切なので
補足になればいいなと思って・・・( ´Д`)
>>651 >手牌を渡すと点数計算してくれる関数なんかが提供されていたプラットフォームだったので、
>その辺から自作するのはちょっと難儀かと。
点数計算などの関数は、AI用ライブラリを作る予定なんだけど・・・まだ無し。
あと、テンパイや鳴きのタイミングを知らせたりする
基盤クラスとか(
>>312みたいなの)も考えてはいる・・・
>再開するとなるとそっちの環境でになりそうです。
どういうソフトでしょう?まうじゃんかな?
個人的な考えだけど、AI作成で必要なのは、
・たくさん(1000試合単位で)打たせて、
・再生して打ち方を確認したり、
・さまざまなデータを取ること
なので、宣伝だけど、MJSimは最初からAI作成用ツールとして作って、
再生、統計に東風荘のツールが使える。
しかし、たしかに
・点数計算関数すらAIへ提供しない不親切設計、
・バグも多く、
・成熟もしてない
ので・・・(´Д`)
まあ、何が重要と考えるかは、みんな違うと思うので。
上記がクリアされていて、かつ作りやすいとなれば、ぼくもそっちで作るw
「まうじゃん」ってちょっと前によく遊んだけど
PCのクセにフリテンチョンボ連発するのが解せなかった
>>654 了解しました。よろしくお願いします。
>>655 今はシャンテン数しか見ていないですが、あれからやったら勝ったり負けたり^^;
相変わらず、リーチの速さと得点はこちらが低いです。
>男チャ漬けさんのやつを添付してるのは、説明書が不親切なので
>補足になればいいなと思って・・・( ´Д`)
了解。、新しいAIはどれも重いので、試験対戦用には使えず又、ツモ捨てでは
実践的ではないのでデーターが違ってくるようで、それで出しました。
たくさんAIが出てきた時にでもまた。
>>657 >>まうじゃんです。
まうじゃんですか、Javaも悪くないのですが、AIの様に小さなループや大きなループを
ガリガリ回すのにはC++は特に速いですよ。
最新AIも汎用ライブラリーは遅いので、メモリー管理から総て100%自作になってしまいました^^
その分とても高速^^。ゲーム木も、作った後は、2命令で開放してます。
オリジナルNewも空きを探して、使用中フラグ立てるだけ。
ゲーム用に書かれたNew,Deleteライブラリーも遅く感じて、新規です。
過去に点数計算等いろいろ出来るライブラリーが紹介されてました、それを使用するのも一考。
>>659 最近はjavaもあるみたいですが、私が作ったときはC++でしたよ。
>>660 どこかHPでも見れますか?。
さくっと探した感じでは、AI対戦できるまうじゃんはJavaのAI対戦しか見つからなかった。
>>661 www.amy.hi-ho.ne.jp/ishihata/maujong/のwindows版のプラグインの部屋で。
>>662 AI,DLLは有ったけど、作るに付いては無いような・・・
>>663 関数のインタフェースとdllはついてますよ。
うわ、不幸な打ち込みw
あっとととと、誤爆失礼
667 :
人工知能研究者:04/01/11 21:11
>>659 2命令ってのはアセンブラの話ですか?
今のCPUは命令数が少ないからといって速いってのは
成り立ちませんよ。
ちなみに、汎用ルーチンをアセンブラで書いた時
普通はコンパイラに負けます。
Javaは最適化自体を動的に行うという離れ業を行いますので
さらに高速化できる可能性があります。
実際はどうだか・・・(かなり速い)
高速化のポイントは
命令数よりは
メモリの読み書きの仕方ですね。
メモリを一回読み込むのと
レジスタ上で演算を一万回やるのって同じくらいのコストになるんじゃないでしょうか?
(かなり妄想かも)
そうなると結局はアルゴリズムなんですよね。
なので、アルゴリズムを考える事に全力を注ぐといいと思いますよ。
例えば
バイナリツリーからハッシュへ変えたりとか
ヒューリスティックソートを用いるとか
そういうところにプロファイラを活用してみるといいかもです。
>>667 Javaの速度議論はしたくないので、私は降ります。
2命令は。
INITF=true;
BufCount=0;
の2行です。
>>667 >メモリを一回読み込むのと
>レジスタ上で演算を一万回やるのって同じくらいのコストになるんじゃないでしょうか?
ソースだせ、ゴルァ!
補足説明。
結局、AIで使用するゲーム木は大きさがさまざまです。
少ない方が多い、いま1000のバッファーを持っていますが。
これを、数十回も使用開放してます。今最高が900まで使うので1000です。
開放する度に初期化していては時間がもったいないので。
上記2命令です。もっと短くすると。
1行でもできます。
INITF=true;
バッファーカウンターを0にしているのは、愛嬌です^^
補足の補足。
ゲーム木は2種類あって縦方向と横方向で、
上記は横方向のバッファーです。縦方向は全部の検索が終わった時同じように
2行程度で初期化してます。
最強を目指すにしてはちまちました部分を考えすぎのような・・・
プログラム板じゃしょうがないか。
673 :
デフォルトの名無しさん:04/01/12 03:21
>>670 メモリを確保したり解放したりすることのコストは
たいしたことないよ。
フラグメントとかを気にするならまだしも。
>>673 いや、それが中々、気にな量です。
概算すると。
ノードおきのデータ数が平均約70ぐらい。(最高900まで行きます)
ノード数が少なく見積もって40。
これが1ツモのnew、delete回数。
1局18ツモあるとして。
1秒に4局ぐらいできます。
この場合のnew、delete回数は
70データ*40ノード*18ツモ*4局=201600回 約20万回です。
標準提供のnew、deleteでは、まったく遅く。ゲーム専用に作られたnew、delete
ライブラリーでも遅く感じたので。専用の最短最速のメモリー管理を作りました。
これがあるので、5手目も行けそうな気分です。
訂正
×20万回
○20万/秒
探査まで行かない、ツモ切りがあるので、数値は半分ぐらいにしてください。
約 10万new,delete/秒
677 :
デフォルトの名無しさん:04/01/12 11:47
過去レス読まずにカキコ
速いに越した事はないが1半荘が数秒?
そこまで早く打つ必要あるん?
1打1秒くらいかかっていいからまともな打牌をしてくれるプログラムキボンヌ
補足 (補足が多いな〜〜〜^^;)
ちなみに、縦方向探査だけならメモリー確保は少しでいいのですが。
探査後の分析に出来るだけデーターが欲しいので、探査データは残るようにしてます。
次の時に、そのデータを再利用してもっと高速にする予定。
>>677 過去スレに有りますが、麻雀の強弱には1000−2000試合して初めて分かるのではないかと
言われています。そこから逆算して、速く打つ環境のMJSimができ、今のところAIもまた、
速く打てるようにしてます。実際200−300ぐらいでは、強弱ははっきり出ないです。
ゆくゆくは、人間相手に1,2秒を考えていますが。今速ければ一手に1,2秒使ってもいいときは、
もっと多くの処理が出来るので、当然強くなります。
別に、速いに越したことは無いんだから、遅くても良いって言う必要はない。
速くて強いのを作ってくれ。
681 :
デフォルトの名無しさん:04/01/12 13:51
ドングリの背比べ状態で1000試合競ったところで何の意味があるんだ?
プログラム同士の強さを競うのは人間から見て最低限のまともな手を打てるようになってからでいいよ。
1半荘打たせた打ち筋を人間が見れば最低限の強さがあるかどうかは大体分かるだろ。
反論も可能だが、逆反論も可能、煽られてる感じがするので、降ります、あとはお好きにどうぞ。
ヘタレだな。反論可能ってのもハッタリかw
>682
多少乱暴な言い方だったかもしれんが、
この程度で煽りと言われちゃ2chで何も話し合えないな
反論できるけどしない、て書き方もみっともないぞ
こいつは無能だろうな
687 :
デフォルトの名無しさん:04/01/12 15:13
これからのソフトウェアはセンサーフュージョンによって、
人間の表情などから心情を読み取って動作を変えるものがたくさんでてきます。
麻雀ソフトの場合いわゆるポーカーフェイスを崩さずにいられるかで
結果がちがってくるのでしょう。
となるのはいつかな。
ポーカーフェイスより、視線判定したら見ないわけに行かないから、
人間がなに考えてるかばればれだな。
そこまで行かなくても、人間の打牌のリズムの癖(テンパると遅くなるとか)から手を読むプログラムは簡単に作れそうだな。
690 :
デフォルトの名無しさん:04/01/12 17:02
>>678 メモリ確保・解放の時間<<<<<<<<<<<<<<<<<<<メモリリード・ライトの時間
という事で
メモリ確保・解放を一生懸命やっても意味ない。
ゲーム用のはフラグメントを気にしてるんだよ。
そもそもメモリの確保と解放ってなんだと思ってるんだろう・・・
プロファイラの使い方を知ってたら、使ってみるといいよ。
あと、木の話も勘違いしてるようなのでアドバイスしておくと
深さNの木のノード数を数式で書いてみるといい。
Size(Tree(N))=M^Nになる。
つまり、縦方向の深さはちょっとした最適化を行ったからといって
深くなるようなものではない。
将棋などでは、枝狩りを行う事によって深くしている。
麻雀でも同じ事ができるよ。
ちなみに麻雀では強化学習を使うといいよ。
このスレの頭の方でも出てたと思うけど。
>>681 別に煽りには見えないな。もっともな意見。
で、競うという目的もあるけど、
1000試合やらないと、結果がわからないということは、
その打牌で良いのかどうか(偶然好手になったのか、もともと良いのか)
そのくらいやらないとわからないってことにならない?
1000試合結果の、例えば和了率が偶然でない程度に違うとかで、
ようやく搭載した機能が実際に良いかどうか分かる。
人間が見て良いと思う打牌とは違う可能性がある。
なので、ある程度速く打ってくれないと困るということはある。
でも、そんなこと心配するほど進んでないわけだし、
まずは人間がいいと思う打牌を目指すのでいいし、
ましてメモリを最適化しないといけないレベルではないというところには同意。
なので、思いついた最適化法は、メモだけしておいて、
今やらなければいけないかどうか、優先度を決めた方が早く完成するかと。
おいおい、252はAI作れもしないのに、言うことだけは立派だな。
手牌の可能性を全部見ていくのを考えてみた。
○・・・現手牌
.+--+-
○...○・・・14種類の切り方(14通り)
.......-+--+-
..........○..○・・・それぞれに34種類のツモ(14×34通り)
.....................・・・それぞれに14種類の切り方
.....................・・・それぞれに34種類のツモ
繰り返し
18順(捨ててツモる)で1.5×10^48通り。
3順で1億通りくらい。
それぞれで、上がっているかどうか、上がっていたら点数計算して、
現手牌からの切り方14種に点数を加えるという方法だと、
残り3ツモなら数十分〜1時間くらいでやれるかな?
(1万命令*1億通り/クロック2GHz=17分 てきとう。1万命令は根拠なし)
>>690 >ちなみに麻雀では強化学習を使うといいよ。
なぜその方法がいいと思うのかとか、実際にやれそうかとか、
もう少し説明があるとありがたいけど。
>>692 どのレスの、どの部分に対して書いたの?
こいつの計算デタラメすぎて笑える
以下、
>>692に対するレスでない、ということをはっきりしておく。
(
>>692がどこを指しているか分からないため)
>>691の話だけど、これは人のことは言えない。
上のほうのレスでは、メインの考え方もないうちから、枝刈りのことを考えていたし、
MJSimにしても、数百バイト程度のメモリコピーが嫌で最適化しようとしたり。
もっと昔は、意味なくメモリ最適化もやったし、printfが遅いから自作したこともあるw
結局そのとき作ってたソフトは完成しなかった。
これはプログラミングではよくあることだと思う。なにが重要なのか分からなくなっている。
そして、他人から指摘されるか、放り出してずっと後に気づくということを何度もやってきた。
253さんが、AI作りが嫌になってやめるなら別にいいけど、
上記のようなくだらないことで放り出すことになりはしないかと愚考して、僭越ながらアドバイスした。
えらそうに見えたかもしれないな。
696 :
デフォルトの名無しさん:04/01/12 19:26
>残り3ツモなら数十分〜1時間くらいでやれるかな?
無理
N順目で(2^5)^N通りだとする。
2^5=512=14*34と近似している
2^10=10^3と近似する。
そうすると
2順目先まで読むと1000倍の時間がかかる事がわかる。
K順目まで読むのに1秒かかったとすれば
K+2順目まで読むのには1000秒=15分
k+4順目まで読むのには15000分
まあ、実装してみればわかるよ。
強化学習って単語の意味がわってるなら
なぜ使うといいかを解説してあげるよ。
697 :
デフォルトの名無しさん:04/01/12 20:42
>>696 252は「残り3ツモなら」と言ってるのに、一般的なK巡読みの話をして「無理」というのは話がかみあってないような・・・
巡目を増やせばすぐに天文学的な計算量になる事ぐらいはここの人なら誰でも分かってる思うけど。
>696
2^5=32ですが?ダサ。
K+3手先を読むには(14*34)^3=1.07*10^8で約一億であり693はとっくに述べている。
残り3ツモを一時間で読み切るためには1秒で三万手の判定をすればよいので
速いCPUなら可能かな?
現実的には空ヅモが多すぎて役に立たないかな。
「シャンテン数が減る・ヤオチュウ牌が減る(タンヤオ狙えるなら)」という制約で枝狩りしても
そのための計算量が指数関数で増えてしまうので何とも。
「今の手から3つ牌を入れ替えて出来る手や役」を探して見えてる牌から確率計算した方が速そう。
木構造を使わないで実装できないものか?
個人的には696の強化学習についてのご高説を拝聴希望。
「何を」報酬にするか?点数?シャンテン数?
盤上のファジーさをどうやって一つの状況としてまとめる?
よしんば纏められてもその状況は学習に必要最低限で時間的に有意な回数発生するか?
ここらへんキボンヌ。
カオス理論
>252は「残り3ツモなら」と言ってるのに、一般的なK巡読みの話をして「無理」というのは話がかみあってないような・・・
K巡目の話じゃなくて
時間がどれくらいのレートで上がっていくかの話をしてるんじゃない?
>>698 みたいに計算量を出しても
結局できるかできないかわからないし
3秒以内に切れ!3秒以内に切れないのは考えてるんじゃない、迷ってるんだ!
>>701 人間の読みは消去法だからな。
そんなルールはこんぴーたには適用できまへん。
私の様に書いた、文も見受けられるが私ではない!
人間が出来ること、AIが出来ること可能なことを、AIを作った経験ある人とそうでない人との「討論」
は土台が違うため平行線が多くむなしい。
私はモチベーションが下がったので終了、モチベーションが上がるようなことがあったらまたよろしく。
何か私に関係が有ることがあっても、書かないのでよろしく。
252は、モンテカルロ法でも何でもいいから、簡単なAI作った方がいいぞ。
AI作った上でぶつかる問題点も分からないで、話が表層ばかりだ。
>>698 「1」>「シャンテン数が減る・ヤオチュウ牌が減る(タンヤオ狙えるなら)」という制約で枝狩りしても
>そのための計算量が指数関数で増えてしまうので何とも。
「2」>「今の手から3つ牌を入れ替えて出来る手や役」を探して見えてる牌から確率計算した方が速そう。
>木構造を使わないで実装できないものか?
指数関数に増える部分を枝狩りして絞り込むことが木構造の目的なのだが、
それを木は指数関数で増えるから何とも、言うのはおかしい。
例えるなら。枝狩りして3つ牌を読む「1」と確率の「2」の牌を選ぶ性能差を比較すべきで、
将棋のAIの枝狩り数手先を考えれば、麻雀の枝狩で3ツモ先はそれ程重くないと思われ。
木構造についてアホな勘違いしていた。正直スマン。
枝を刈る手間は枝をそのまま読む手間に比べてずっと小さいのは当たり前だ。
704の話はもっとも。
実際に確かめればいいんだけどな。VCがあれば。
昔MJSimのJAVA版みたいなのを自作したけど、組んだAIをプラグインにすることが出来なくて諦めたので
MJSimには期待してるんだけどな…。
>>703 開発中断は残念だなぁ。
最初からいろいろと協力してくれてありがとう。
ここまで続いたのは、その協力があったればこそと言って過言でない。
>私の様に書いた、文も見受けられるが私ではない!
どれのことかな?
>人間が出来ること、AIが出来ること可能なことを、AIを作った経験ある人とそうでない人との「討論」
>は土台が違うため平行線が多くむなしい。
これも何をさしているのか分からない。
話の流れから、メモリのことか、
それとも僕を含めた人たちの提案のどれかなのか。
そこらへん意思疎通したいところだが・・・しかたないか。
>>696 計算間違いはドンマイ。
よくあることでしょう。
「2」GHzと自分で書いたのを忘れて、1GHzで計算してたりとかさ。
あと、
>>693の捨て牌選択手法には、かなりまずいところがある。
牌の残り数が全く考慮されていない・・・
これを解決するもっとも単純な方法は、
4枚ある同一牌を別のものとして考えることだが・・・
強化学習について。検索してみた。
http://hawaii.aist-nara.ac.jp/research/reinforcement.html ↑の一番最初のところだけ読んだ。
よさそうだけど、将棋AIのことを調べていたときは、この単語は出てこなかった。
将棋では使ってないのだろうか。もしくは使えない理由があるのか。
最強レベルの将棋AIのページで、アルゴリズム解説しているところもあるし、
将棋AIを評価しているページなどもあったけど、
使っているなら、少しくらいは説明や宣伝があってもいいはずだ。
>>704 >AI作った上でぶつかる問題点も分からないで、話が表層ばかりだ。
今やっている話を表層というのはおかしいと思う。
根っこの部分では?
建築に例えるなら、鉄筋にするのか、木造にするのかみたいな。
AI作成に関しては、明日から時間が大きめに取れるので、ここで進めたいと思う。
例のタンヤオのバグを直してから、モンテカルロ法で作る予定。
>>654のデバッグ用インターフェースは、保留ということで。
また必要だという人が現れたら検討する。
>今やっている話を表層というのはおかしいと思う。
>根っこの部分では?
>建築に例えるなら、鉄筋にするのか、木造にするのかみたいな。
残念ながら設計図レベル、あそこにキッチン此処にリビング
2階に10部屋欲しいの潰れそうな家かもしれない。
構想は良いが作ったら小屋だった、立派な家にするためには、見えなかった
問題がXXX有った。
小屋ではなく、立派な家を期待する。
えーと・・・やっぱ俺の
>ドングリの背比べ状態で1000試合競ったところで何の意味があるんだ?
は言い過ぎだった、荒れるキッカケ作ってスマソ
なんつーか、色んな人が色んなやり方でやればいいジャン、と言いたかっただけなんだわ
「こういうやり方じゃないと駄目、それじゃ無理」みたいな排他的なふいん気が嫌でつい筆が滑ってしまった
俺自身はプログラムは書けないが、麻雀打ちとして気が付いた事があったらまた色々言わせてもらうよ。
>252
それはもう試し済みです。
BCCではVCとDLL内関数の内部的な名前形式?(詳しくわからない)が違うのですよ。
最終目的が皆で持込対戦することである以上、他人と同じVC流の名前の付け方でコンパイルせんと。
このやり方が判らずに挫折したヘタレです。
714 :
デフォルトの名無しさん:04/01/14 01:09
4月頃でよければ、
俺が作るけど。
仕様とか要望とか適当に出して
まとめておいてくれれば
反映する事も可能。
ただし、当方麻雀のルールはあまり理解できてない。
だいたいはわかるけど、細かいルールとかローカルルールは知らない。
用語もわからないのがちらほらと。
ので、お勧めの本とかも教えてくれると助かる。
>>707 現在市販されている将棋ソフトで、「学習」を積極的に取り入れているものは無い。
「学習機能有り」というソフトもあるけど、それのおかげで悪手を指さなくなるという
類のものではないようです。
(だいたい、どうやって悪手と判定するんだ?という問題があるし)
採用されない最大の理由は将棋は局面の場合の数が多すぎる事でしょうね。
将棋は何百局も指しても同一局面になる確率がかなり低いですから。
となると、麻雀でも期待薄のような気はしてきますけど・・
AI作っている方々お疲れ様です。こちら、只今配牌から役情報を返す
ライブラリを自作中なのですが、全くアイデアが浮かばず滞っております(^^;
各役ごとに必要な牌、面子が違ってくるためにそれらを踏まえた上で
面子検索を行う必要があり、余りにも複雑で困ってます。
ヒントを求めていろんなサイト回ってますが、分かりやすい解説サイト
今のところ全く無いし、解決の糸口も未だ見つかりません。
何か、アイデア、情報が載ってるサイトありましたらご教授願えませんか?
もしくはアドバイスでも構いませんので是非お願いします。
自力ではかなり時間掛かりそうなので(^^;
>713
できるよ
EXPORTS
ちと興味があって作ろうかな〜と思ったんだが
二人打ちなのか四人打ちなのか教えてくれ
↑717を参考にしたということで。
>>714 Java版?期待。
Javaのほうがいいような気もするなぁ・・・使ったことはないけど。
CからもJavaのクラスを呼べればいいけど・・・
>>715 う〜む、麻雀はまだ「こうすれば上がりやすい」みたいなのがありそうだけど・・・
でも、どう作るかは思いつかん・・・
>>716 配牌から狙える役を予測するということでしょうか?
>>721 配牌を各役の形に当てはめてあと何牌あれば聴牌に成るかを
測定するだけです。最終的には構造体にデータを格納して
AI側でも呼べるようにするつもりで作ってます。
シャンテン数、有効牌測定をあらゆる役にも応用できるように
するよう構想を練っている所ですが、いいアイデアが浮かばず。
麻雀AI Ryoko 0.0
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/file/1071668170_41/Ryoko_0000.lzh 現在のところ以下のような仕様
・モンテカルロ法のアルゴリズムのみで、
シャンテン数を見たりなど、他の対策はやっていない。
・役はリーチとピンフしか見ない。
・試行回数は200回。
・ツモ回数(読みの深さ?)は、自分がツモれる回数。
ブッチギリで最弱。
253Dummy(シャンテン数だけ見て切っているらしい)にすら大きく差をつけられる。
他のAIに勝つまでうぷはやめようかと思っていたが、
その道のりはかなり遠そうなので、とりあえず。
モンテカルロ法がダメなわけではなく、これから発展していくであろう・・・たぶん。
変な切り方をひんぱんにやる。
字牌の孤立牌があるのにターツやトイツを先に落としたり、
わざわざテンパイにならないところを切ったり・・・
なぜそっちかね!と突っ込みたくなる。
特に特定のAIにツッコム訳ではないが、漠然と感じた事を。
ある程度強くなれば純理論的・総当たり的な理論も必要だろうが、まだまだ人間的な一般論や定式の実装が先な気がする。
例えば、ペンチャンの落とし方とかそういう所は、始めからAI的に全て計算させるより先に、面子があまった時に初めて考えても良いと思う。
少なくとも人間は(私)はそう考えて麻雀してる。
そのためには、一般論や定式をどう実装するか問題な訳だが、今のところ泥臭くロジックを書くしかなさそうだ。
しかし、そんなもんいちいち手牌をIFで判断するのは馬鹿らしいしので、手牌を検査できる正規表現のようなものが欲しいのだが、どんなもんだろう?
いちいち特定の条件を検査するロジックを書く手間を省くと共に、一段踏み込んだ論理的な会話をするにも有益だと思うのだが。
(正直、今の麻雀用語だけでは語彙も表現も少なすぎて、プログラマ間の会話は成り立たないと思う)
>252
感謝します、が今は時間的制約があって独自のAIを書けるほど
余裕がありません。一段落ついたら始めようと思いまつ。
>>725 >>321で「パターンマッチングDB」というのが出てきたことがあるけど・・・
まあ、詳しい説明もないし、ソースもないから、よく分からないけど。
「人間的な一般論や定式の実装」というのは、
・ペンチャンの落とし方のようなこまかい「手筋」
・将棋AIで言う「定跡データベース」みたいな大まかな作戦をきめるもの
どちら?両方?
将棋AIでは、(おおまかには)序盤は定跡DBを使い、終盤は総当りらしい。
で、僕が思うに、麻雀は配牌時点からほとんどの場合すでに、
将棋で言う終盤に入っている気がする。
将棋では、ゲームが始まった瞬間に詰みが見えていることはないが(「月下の棋士」除くw)、
麻雀は配牌から何をするか決めるし、おぼろげながら上がり形が見えている。
また、そのように打たなければ勝てないだろう。
総当り法や、その簡易版であるモンテカルロ法は、
配牌から自然と上がりやすく高い方へ向かう(はず)。
パターンマッチングで、それができるだろうか?
正規表現というのはおもしろそうだけど・・・
729 :
デフォルトの名無しさん:04/01/17 04:15
MJSimのコンパイルができません。助けてください。
$bcc32.exe MJSim.cpp
じゃだめなんですか?上のほうでexternとか出てますけど、MJSimのコンパイルにも必要なんでしょうか?
↑パターンマッチングが絶対だめってことではなく、一意見ということで。
>>726 加カンのバグ、なるべく早めに直す予定。さんくすこ。
StdAfx.hでインクルードする「283_AI.h」は、283_v007.hの間違い?
男チャ漬けさんのAIは、今後どの方法を使う予定でしょうか?
・総当り法
・モンテカルロ法
・パターンマッチング法
・メンツやターツに重みをつける方法(パターンマッチングと同じかな?)
・その他
>>729 bcc32 MJSim.cpp Hantei.cpp Mahjong.cpp StdAfx.cpp Tenpai.cpp
アーカイブのMJSimフォルダのファイルを全部リンクする必要あり。
>>724で紹介したBCC Developerを使うという手もあり。
EXPOTSというかdefファイルは、AIのコンパイル時に必要。
関数名に「_」がついてしまうようだ。
「-u-」オプションで消すと他がおかしくなる。
>>731 ありがとうございます。MJSimは無事コンパイルできました。
次はAIを試してみます。
モンテカルロ法について。
厳密な期待値計算でないので、しばしば「運のみ」で捨て牌が決まってしまうことがある。
試行回数をできるだけ多くするのはもちろんのこと、
微妙な場合でも運でない程度に差がつくように、
いろいろ追加する必要があると思う。
例えば、(手牌がばらばらで、見える数も同じ、ドラでもないという場合で)
孤立牌の字牌と、孤立した9マンがあるとする。
使われなさで似たようなものだが、9マンを残した方が
シュンツに使えることもあるし微妙にいいはず。
しかし、9マンを残したときと、字牌を残したときで同じような点数になってしまう。
で、9マンを切ったあと7マンをツモって困るということがある。
こういうのでも点数に差がつくようにするにはどうしたらいいのだろうか。
>>531さんはもうこないのだろうか・・・
AIも
>>720に書いてあるとおりに
bcc32 -tWD -eMJSimAI.dll MJSimAI.cpp StdAfx.cpp
MJSimAI.defファイル
---
EXPORTS
AIAction = _AIAction @1
AIInterfaceVersion = _AIInterfaceVersion @1
---
で無事にコンパイルできました。やっとすたぁと地点に立てた・・・・。感動の涙。
さてと、cppの勉強にでも行ってくるか。先は長そうだ・・・・
テンパイ判定のバグです。
これもびっくりしました(^^;;
===== 東風戦:ランキング卓 300卓 開始 2003/01/01 00:00 =====
持点27000 [1]Ryoko_v000 R1500 [2]302v012 R1500 [3]253Dummy R1500 [4]283v007 R1500
東1局 0本場(リーチ0) 253Dummy -3000 283v007 1000
流局
[1南]1m1m3m4m5m7m7m8m4p1s3s5s中
[2西]3m3m4m9m2p3p3p2s7s東北発発
[3北]2m6m1p2p4p7p7p3s6s7s8s9s9s
[4東]5m5m8m9m3p8p5s6s7s東白発中
[表ドラ]1m西 [裏ドラ]9m5s
* 4G8p 4d3p 1G6s 1d中 2G2s 2d9m 3G9m 3D9m 4G東 4d9m 1G発 1d1m 2G8s 2d北 3G8p
* 3d1p 4G東 4d8m 1G9p 1d発 2G4s 2d東 4K東 4G7p 4d中 1G7m 1d7m 2G6p 2d2p 3G2p
* 3d2m 4G西 4D西 1G6s 1d1m 2G9s 2d6p 3G2m 3D2m 4G5s 4d発 1G1s 1d9p 2G9p 2D9p
* 3G西 3d3s 4G南 4D南 1G3s 1d3s 2G白 2D白 3G1p 3d4p 4G2m 4D2m 1G1m 1d6s 2G2m
* 2d3m 3G5m 3d9s 4G6m 4d白 1G南 1d1m 2G6p 2D6p 3G1s 3D1s 4G南 4D南 1G9p 1d南
* 2G5p 2d4s 3G中 3D中 4G3s 4D3s 1G北 1d4p 2G6m 2D6m 3G4m 3d9s 4G1p 4D1p 1G5p
* 1d9p 2G北 2D北 3G1m 3d西 4G4p 4D4p 1G7s 1d北 2G8s 2D8s 3G9s 3D9s 4G7p 4d5s
* 1G3p 1d5p 2G6p 2d発 3G5s 3d8s 4C6s7s 4d5s 1G8m 1d3p 2G2s 2R 2d発 3G白 3D白
* 4G中 4d6m 1G5p 1d3s 2G6p 2D6p 3G5p 3d1m 4G1s 4D1s 1G7m 1R 1d5p 2G西 2D西
* 3G6m 3d6m 4G西 4D西 1G9p 1D9p 2G白 2D白
>>730 >StdAfx.hでインクルードする「283_AI.h」は、283_v007.hの間違い?
はい。そのとおりです。直すの忘れてました(^^;
>男チャ漬けさんのAIは、今後どの方法を使う予定でしょうか?
えーと、今のところ
>>526のやつを応用しようと考えています。シャンテン数、期待できる役の数、有効牌数を評価して
捨て牌の検索ができるようにしたいなと。最終的には期待値まで計算できればライブラリとして公開できそうですね。
でも、選択肢で言えばどれになるんでしょう(^^;
>>734 C++でなくても、普通のCでOK。
また、AI作成ではプログラミングは適当に使えればいいと思う。
数学的センスの方が重要と思われる。
あと、前にも書いたけど、デバッグがきついのでDelphiの方がいいかも。
>>735 あらら。もしかして、手牌に字牌しかなかったら国士テンパイになるのか・・・
これもはやめに。
>>526のやつ、あんまり理解してなかったかも。
有効牌だけ抽出して、期待値計算かな。
あとから捨て牌の検索をするんでしょうか?
先に切っておいて、14種の形から有効牌を抽出のほうが簡単そうに思う。
でも、1m2m5m9m9mの形なら、たとえば
@1m2m9m9m 有効牌3m
A1m5m9m9m 有効牌4m6m9m
こんな感じだが、そもそも有効牌とは、どこまでのことを言うのか・・・
@の場合、1m2m9mをツモれば、それも形が変わってテンパイになるし、
Aも同様に1m3m7m9mでもテンパイ。う〜む。
分類だけど、ちょっと変えて、
・総当り
...・ほんとに総当りする
...・有効牌だけ期待値を調べる ←これかな
...・モンテカルロ
・ターツに重みをつける
...・パターンマッチング
・その他
>>737 こちらの方も先に切ってから有効牌を調べる方式にしてます。
そちらの例えに、メンゼンで他に3つ順子がある形で
1m2m5m9m9mとある場合でメンツ検索します。
その場合頭は省くので実質上1m2m5mのみで検索します。
役なしでリーチのみの手にする場合(YAKUTYPE_BASEの場合)
手牌=1m2m(9m9m) 向聴数=0 有効牌=3m 役の数=0←形式聴牌である
役を平和にする場合(YAKUTYPE_PINFUの場合)
手牌=1m5m(9m9m) 向聴数=1 有効牌=4m6m 役の数=-1←聴牌していない
役をタンヤオにする場合(YAKUTYPE_TANNYAOの場合)
手牌=2m5m9m9m 向聴数=2 有効牌=2m3m5m4m6m7m 役の数=-1←聴牌していない
タンヤオですと頭とみなされないので9mを含んで検索を行います。
有効牌に関しては「役を形作るのに必要な牌」と定義できるかもしれませんね。
あとは実装のみなのですが問題点も幾つかありまして。
・固定された牌の検索方法(一気通貫、三色同順、チャンタ、イーペーコーなど)
・ピンフの検索方法(両塔子をいかに残すか、どう検索するか)
・孤立牌の処理方法(孤立牌をどう生かすか)
上の3つが主な問題点です。
間が空いてスマン。
>>726 漠然としたアイデアしかないが、AIとまではいかず、一昔前のエキスパートシステムの発想が頭に浮んでる。
例えば私は、配牌を見た瞬間次のような順で考えている。
1.役牌のトイツ、タンヤオ、ピンフ、ホンイツなど狙い易い手は無いか。
2.その手を上がっても問題無いか。(主に点差の問題)
このうち、1.は主に過去の経験に基づいたパターンマッチングが大半。
パターンは確率計算に基づいてAIで計算してもいいけど、データベース化の方が良サゲ。
このデータベースを書くためにも、ルール化した表記が欲しい。
たとえば(今パッと思いつくだけ)こんな感じ。
特定の牌を示すのは、今の表記に従う。(m1とかs5とか)
$1〜:任意の字牌、#1〜:任意の数牌
[]:メンツ、<>:頭
で、ピンフを示すパターンは(例えば)こんな感じ。
<($1|#1)($1|#1)>[(#2)(#2+1)(#2+2)][(#3)(#3+1)(#3+2)][(#4)(#4+1)(#4+2)][(#5)(#5+1)(#5+2)]
これだけだと、役牌が頭でもマッチしちゃうんで、役牌とか否定とかの表記も勿論居るけど。
手牌が、これにどこまでマッチするか(あと何枚)、なにが入ればマッチするか(なにで上がれる)が返ってくれば、ロジックはだいぶ楽になりそう。
あとパターンの表記には、19牌とか、ドラとか、牌種とか色々いるし、カンの処理が難しいけどね…。
>>740 なるほど。面白そうですけど、いろいろと難しいかもしれません。
うーん、ルールとかは色々新たに自作して使うことになるんでしょうね。
あと、頭はメンツの一部としてメンツすべてを<>にすれば[]の本来の意味が
取り戻せるのでもし実装するのであればその方向で逝きそうですね。
ちょっとピンフをパターン化させて見ます。
$1〜:任意の字牌、#1〜:任意の数牌
<>:メンツ +:前要素のインクリメント
\j:自風 \b:場風 \y:ヤオチュウ牌
ピンフ : <([^\j\b白発中])\1><(#1)(#1+)(#1++)><(#2)(#2+)(#2++)><(#3)(#3+)(#3++)><(^\y)\1+>
タンヤオとか、どうしよう(^^;;
全く新しい正規表現を作ることになるので、各要素のルールとかを
メンツ検索としていかに効率よく制御できるように決めるかに掛かってますね。
+も$も#も全く違うものだし。何かいい方法はないのだろうか?
最近忙しくてこっちになかなか集中できないです。
新バージョンに関してはもう少しお待ちください。
>>743 僕は忙しくはないのだが、いろいろ悩み中。
パターンマッチングはおもしろそうだけど、
見える役から切る牌を決めるのはどうかなあと。
というのも、いろいろHPをみたりしていると、
今のルールの場合、いかに先制リーチをかけるかが、勝敗を分けるらしいので。
一発、裏、ツモとかがなければ違うだろうけど。
今読んでる本・・・「確立統計であばくギャンブルのからくり」
役に立つのかどうかは不明・・・
>>745 学生用の検索システムのようなので
現場に行かないと見れないようですね。
「麻雀研究特集」以外にも麻雀に関する論文がちらほら。
747 :
デフォルトの名無しさん:04/01/24 15:28
麻雀ゲームを作ってるんだが、
役判定を作ってておもいっきりわからなくなった、誰か助けてくれ。
上がった牌14枚を役判定に渡したらありえない重複の仕方をしてしまうわけだ
たとえばチャンタイーペー三暗刻とか。
とりあえず今できているのは、14枚を渡すとそれがその役になっていれば
OKが帰ってくる関数はできてる。 つまりそのありえるところとありえないところ
の境界線を作りたい。あとは、ありえる最高の組み合わせをだすアルゴリズムを誰か
考えてくれないか・・・
自分でもかいててよくわからないが 興味示したら誰か助けてくれ・・・
ヨロシク。
>>747 1m1m1m2m2m2m3m3m3m7p8p9p北北
こんな手だったら
1m1m1m 2m2m2m 3m3m3m 7p8p9p 北北
1m2m3m 1m2m3m 1m2m3m 7p8p9p 北北
こんな風に4面子1雀頭が取り得るすべての組み合わせを求めるアルゴリズムを考えればいいと思われ。
具体的には・・・よく分かんない(´・ω・`)
たぶんいま個々の牌の枚数で役判定していると思う、それを
面子を基準にした役判定処理にする。以下の手順で役判定。
1、面子を使用しない役の判定をする
2、
>>748の様に、取りえる総てのパターンの面子を作る
3、その面子パターンおきに役判定する
4、その中で一番高い役を役とする
で出来る。
ただし何時何をツモったか等々の状況が多いので、それも考慮して役判定する。
>>747 三暗刻形と一盃口形ってのはたいてい重なるわけだ。これは当たり前。で普通は
高い方の役形を採る。
重複する役形というのは決まっていて麻雀のルール本でも見れば書いてあるだろ。
決まった条件で起きることなんだからそれで条件分岐書けば良いだけだと思うが。
順子系か刻子系かで役の合算して高い方で見れば?
最初そうやって考えたんだが共存できるときとできないときがあったりするんだよなぁ
111222333 78999
こういうときはピンフジュンチャンイーペー + 三暗刻三連刻
チャンタのときは三暗刻だめなのかとおもいきや
111 999 111 789 99
このときは ジュンチャン 三暗刻 になる
つくった役判定関数はおのおのが別々で存在していて、判定にひっかかった瞬間に
フラグを立てていくようにしてあるんだ。
その状況でどっちの役を優先してあがれば点が高くなるかっていう
判定の関数を作れないだろうか・・・・
やはり
>>749のいったように
何種類かある面子パターンを作ってそれごとに判定するべきだよねぇ
ありがとう。頑張ってみます。
また追ってカキコします。
三連刻なんて役
普通、採用されてないぞw
あ、いつも連れと実際に麻雀やってるときに採用されてたんでつい・・・w
>>751 >その状況でどっちの役を優先してあがれば点が高くなるかっていう
>判定の関数を作れないだろうか・・・・
役だけなら有るかもしれない、考えたこと無い
どうせ、符計算もする時、面子の取り方で符が変わるので、面子パターンは
作らないと、高い点を算出できない、結果的に面子パターンは必要。
例えば
厨厨厨五六七九九12334 ツモ2
は厨とツモで2翻 符はフーテイ20符+ツモ2符+厨暗刻8符 だと思われがちだけど
12334を13と234で見れば2のカンチャンなので+2符
よって700-1300になる
東風R2100のおれが最強プログラム組んでやろう
ただしプログラムは素人なので
後三ヶ月まってくれ
いまから勉強する
東風R1500のプログラム暦5年の奴と
東風R2100のプログラム暦なしの奴だったら
三ヵ月後どっちが強いプログラム作れるだろうか?
どう考えてもプログラム暦5年の香具師だろw
・麻雀を熟知してるがプログラムは知らない
・プログラミングはベテランだが麻雀はルールを知ってる程度で打った事はない
どちらかのタイプが強いプログラムを作れそうな気がするから後者。
まともな日本語も書けない
>>759は、まともなプログラムも組めないと思う。
>>760 自分でプログラム組むなんて言ってませんが、何か?
痛いところ突いちゃったかなw
>>757 東風のRはあてにならんからなー
プログラミング暦もあてにならんけどな
プログラム知らない奴は「気合い」だの「最強」とやらをプログラムして
タコ突っ張りなプログラムを作るヨカーン
(ノ∀`)アチャー
イタイのがいるなw
学生とかなんだろうなぁ
麻雀ゲームを作ってるソフトメーカーってどうやってるんだろうね。
プログラマー自身が麻雀を勉強するのかな?
それとも麻雀に詳しい人に協力を仰ぐ?
>>765 麻雀好きなプログラマが作るんでないかな。
そうでないと、ゲーム作成プランも上がらないと思う。
>>765 麻雀エンジンだけ外販している所(シャノアールだっけ?)もあったはず。
あと、市販のゲームは
プロ雀師監修とか、麻雀連盟公認とかいろいろあるよね?
どれくらい制作に関与しているんだろうか?
>>764 むしろヲヤジ?
>>768 お疲れ様です。早速試してみたところ、どうやら有効牌を結構逃しているみたいです。
どういう処理しているのかソースが無いので良く分かりませんが(^^;
次バージョン期待しています。
こちらの状況なのですが、今メンツ情報ライブラリの雛形を作成しているところです。
まだ、いろいろと問題があるので公開できませんが近日中に公開する予定です。
2月上旬辺りまでには何とか公開できる形にしないとなぁ・・・早く完成させねば。
プログラマー歴10年以上、東風荘ではR2100以上、フリー歴10年くらいなので、
仕事でやれっつーたら、調整含めても半年くらいで申し分のない奴ができると思っているが、
趣味の範囲で作ったプログラムは弱弱w
えーと、3000円で1000本売れると300万だな。
そーすっと、6で割って月50万か・・・。
じゃ、やーめた、ってなっちゃうんだよなーw
>>767 麻雀エンジンはメディアリュウムというところかな?
でも、まだできてないっぽいけど。
シャノアールは麻雀悟空とか作ってる会社。エンジンはないんじゃないかな。
HPをみると「イカサマなし」という単語が何度も出てくる。
シャノアール「麻雀における思考ルーチンについての考え方」
http://www.chatnoir.co.jp/engine/index.html >「天竺」は、ファジー理論に基いた思考ルーチンです。
ファジー理論というのがよくわからんが・・・
>>768 何を持って最強と称するのか?
しかもたったの3時間とはスーパーハカーですか?
>>769 メンツ情報ライブラリというのは、
>>738のやつ?ガンガレ。
ところで、「12599 あと3メンツ」となっている時に、
ペンチャンを落とした方がいいのかどうかということだが・・・
凸HPの掲示板で、
>テンパイした後というのは手変わり牌が2種類とかしかない場合が多く、そういう
>場合には手変わりを待たないほうが良いことがわかっています。
と書かれていた。これを読む前から考えてはいたのだが・・・
ツモる牌を、さいころを振ることに例えると、
@3が出る確立・・・1/6。
A4または6が出た後、
4が出たときは3か6、
6が出たときは4か7が出る確立・・・2/6×2/6 = 4/36 = 1/9
Aの方が悪い。しかも、これは6面のさいころだからまだいいが、
麻雀だと4/100〜4/50(4枚の同一牌は別々に考える)くらいになってしまうので、
「4/100」と、8/100×8/100 = 64/10000 = 「0.64/100」の差になってしまう。(6.25倍)
しかも、リャンメンになればいいが、カンチャンになる場合もある。
最後の牌はロンできるので、リャンメンがさらに倍くらい得だとしてもなぁ・・・
間違ってたら指摘よろしく。
>>772 ペンチャン落しをテンパイ時点で考えるのが遅く、3〜1シャンテンの間に考えるべきだと思われ。
>>770 東風荘につぎ込んだリソース代と時間x時給を計算してみることをオススメしまつ。
>>771 シャノアールは外販してますね。
明言している会社もあるし、それ以外にもいろいろなゲームで採用されてます。
クセのある打ち方(w)をするので、すぐ解る。
>>774 ぶはっははは。
趣味ってのはそーいうもんなの。
仕事とは違うのさ。
>>775 「趣味の麻雀は強いのに、趣味のプログラムは趣味だからって弱いんですか?(w」
って事だと思うんだけれどな。774の冗談の意図は。
770の発言の後半は金勘定してるだろ? まああれ自体は何とでも解釈が出来るけど、
それを「こんなもんにそんな時間かける気も湧かんしなぁ」の意と見て774の返しが通じるのに、
そこで「趣味と仕事は違いますよ」と言われても会話がつながらないよん。
つながらないよん。
つながらんよ〜ん。
さて、「ぶはっははは」が何を意味していたのか解明キボンヌ。
>>773 テンパイ時だったらという話なので。
ところで、1シャンテンのときは、いつでもペンチャン落としがいいだろうか。
たとえば、12 5 99 3 67あと2メンツという場合、
リャンメンになる手変わり牌が4種類16牌ある。
この場合も、
「4/100」と、16/100×16/100 = 256/10000 = 「2.56/100」の差になる。(1.56倍)
しかし、これならまあなんとかいいかもしれない。
12 5 99 2 67あと2メンツという場合・・・は孤立の2を切ればいいか・・・
>>774 へ〜〜、しらんかった。
今こんな感じの盤面のゲームを考えていて、
4X XX X X X X XXX X X X X XXX X X X
3X O X X X X X X XXX X X X
2X O X X O X X X X XXX X X X
1X O OO X OO O X O X XOX X XXX X X X
01234567890123456789012345678901234567890123456
・「O」を全部消すのが目的。
・OはまずランダムにXのない位置へ14個置かれる。
・Oは消すとXになり、上から下へ積みあがる。
・消したOの上にOがあると、Oは「ぷよぷよ」みたいに下へ落ちる。
・Oを消すには、縦か横に3つそろえる。または、1度だけ縦に2つでもいい。しかも、この操作はいつでもできる。
・上記以外で、Oを1つだけ選んでXにすることができるが、この場合は空いた位置のどこかにOが追加される。
多少は単純化されて、考えやすくないだろうか・・・
ぜんぜん変わらんと理由付きで言われたら、考えるのをやめるw
>>778 それ、パチンコ麻雀そのままのような気もする。
考え方は面白いと思うが3枚又は2枚で消えた場合、その消えた物に関連があったときの応用が
効かないと思う。(麻雀として考えた場合)
>>779 雀球を見て思いついたのは見破られたか・・・
3枚又は2枚で消すのは、「いつでもできる」ので、最後までやらないことも可能。
だから常に最後までやらない方がいいが、これをつかって(将来的に)鳴きの処理ができる。
目的のところで、「速く」というのが抜けてた。
あと、Xが上から伸びるとか、Oが下から伸びるというのはなくてもよさげ。
縦の列は自由に交換可能とすればいいかな。
>テンパイ時だったらという話なので。
限定して考えるのも良いけど、テンパイ時になってくるとペンチャンの牌確率より、
場の状況の方が関連が多いと思われ。
>ところで、1シャンテンのときは、いつでもペンチャン落としがいいだろうか。
777で書いてあるように、場合によりけりでは。
で、その場合は1シャンテンより前のシャンテンで落とせればより優位になると思われ。
>>780 >3枚又は2枚で消すのは、「いつでもできる」ので、最後までやらないことも可能。
>だから常に最後までやらない方がいいが、これをつかって(将来的に)鳴きの処理ができる。
了解、Xの発想が面白いと思う。色々妄想して楽しめた^^
スレ違い
迷惑
>>776 「損得勘定するのは結構だが、既に東風荘に費やした無駄な時間(=費用)の事を忘れてんじゃないの」
って言うから、
「麻雀にはずいぶん時間使ってるし、そりゃまあ無駄なんだけどさ(笑)、
そいういう損得勘定はあくまでもビジネスでの話で、趣味ってのは無駄でも成立するからね」
と答えたんだが。
でも趣味なのに損得勘定しちゃうから成立しないって話だよな。
じゃ、やーめた、ってw(プゲラッチョ
はいはいスレ違いの話題にそんなに必死にならなくていいから
メンツ解析の雛形まだ作成中です。実行してもエラーでまくりで(^^;
↓リーチかけてないのに裏ドラ載っちゃってるバグ発見しました。
===== 東風戦:ランキング卓 300卓 開始 2003/01/01 00:00 =====
持点27000 [1]MJSimAI R1500 [2]253Dummy R1500 [3]302v012 R1500 [4]253v003 R1500
東1局 0本場(リーチ0) MJSimAI 13600 253Dummy -1000 302v012 -1000 253v003 -11600
30符 四飜ロン 役牌1 ドラ3
[1東]2m6m6m6m7m8m5p6p5s東発中中
[2南]2m4m5m1p3p5p8p9p1s3s9s9s発
[3西]8m3p4p1s3s5s6s7s7s8s南発発
[4北]8m9m1p2p8p8p2s4s4s南西北白
[表ドラ]2p [裏ドラ]6m
* 1G白 1d発 2G8m 2d発 3G2m 3d南 4G中 4d西 1G5s 1d白 2G東 2D東 3G9m 3d2m 4G北
* 4d南 1G2p 1d東 2G7m 2d2m 3G1p 3D1p 4G東 4d中 1N 1d2m 2G2s 2d9p 3G5p 3d1s
* 4G3m 4d東 1G6s 1d5s 2G4p 2d1p 3G9s 3R 3d3s 4G白 4d3m 1G3m 1D3m 2G6s 2d8p
* 3G4s 3D4s 4G1m 4D1m 1G4p 1d2p 2G中 2D中 3G4m 3D4m 4G4p 4d1p 1G8s 1D8s 2G3m
* 2R 2d6s 3G4m 3D4m 4G7s 4D7s 1A
785で論理が破綻して786で説明が入るから、787は余分だぞ。
786は何をいつまでもウダウダ言ってるんだ。
何か私生活でで困った事でもあったのか。
やってはいけないAI版
1,マナー違反(コンピュータには、無理ポ)
2,限度を超えた長考。
3,自分の手しか見ない捨て牌を全く考えない“引き込もり麻雀”
4,点数差や、巡数、など状況を全く考えない“場違い麻雀”
人間だと良く見かける(w
ニヤ (・∀・) ニヤ
>>791 >人間だと良く見かける(w
つまり、そういうことを行わない AI は人間らしくないので
AI の名に値しないと言うことか。
>>782 縦方向の意味がないので、結局は
・Oの数のヒストグラム(0,0,0,1,0,1,3・・・)←
>>778のやつのヒストグラム
・空白の数のヒストグラム(0,4,3,2,4,1・・・)
になるだけだけど。
で、これを使った解法は思いつかないわけだが・・・
>>788 うわ。加カン、テンパイ判定とあわせて修正します。
>>795 お疲れ様です。
さあ、こちらも早くバージョンを上げないと。
次は283_v008で、シャンテン数と有効牌しか見ないAIを作ります。
強く仕上がるといいなあ・・・
>>252 チイトイのリーチが流れた時チョンボになってしまいます。
799 :
デフォルトの名無しさん:04/02/02 22:29
AI作ってるひとってどのくらいるんだろう
ノ
今まで出てきたのは5種類5人。
今まで出てきた中では253さんが強いですね。
現状では早く聴牌して早くリーチした人が勝っている状況ですが、降りに対する処理をするAIが出てきたらどうなるのか楽しみです。
聴牌すらできねぇ。。。
>>799 今まで名乗り出て実際に作ったのは多分
252氏、253氏、302氏、七対子氏、西家氏と、あとは私ですか。
今作ってる人っていう意味では過去ログ見る限り252氏と私かも。
私のほうはアルゴリズム作るのに思いの外てこずってます。
>>801 今作っているのですか?確かに聴牌にするのも結構難しいと思いますが、
過去のソースを参考にして作ってみるといいと思います。
>>802 ついさっき聴牌できるようになりました。過去のソースをパクリまくってますw
ツモ上がりは出来るようになったのでロンあがり出来るようにしているところです。
最強には程遠い_/ ̄|○
>>803 それはおめでとうございます。
もし出来上がりましたら是非オリの作成をしてみましょう。
253氏に勝るとも劣らないAIが出来るといいですね。
>>804 ありがとうございます。ぅぅぅ、永かった・・・・
オリジナルの作成はほぼ無理かと思われます。目指しては見ますが。
今現在の253さんAIに追いつくにはあと1年くらいかかりそうですw
253さん、男チャ漬けさん、西家さん、自分でやっていますが、トップ率2%くらいです。
10%くらいを目指してがんがるぜええええええええええええええええええええええええええええええええええええ
806 :
デフォルトの名無しさん:04/02/03 18:34
質問なんですが、暗カンをした場合、
Player[暗カンした人].Tehai[暗カンした牌] は0になるんでしょうか?
例えば1万を暗カンした場合に、Tehai[1]は0になるのかどうか?という質問なんですが。
面白そうだなあ、、、
「ふっ 背中が煤けてるぜ」
>>806 カン、ポン、チーしたら、Tehaiの中身は消えるよ。
>>808 わかりました。ありがとうございます。
こうなってくれてたら便利なのに、っていう仕様になってるもんですねw
>>809 いや〜、不親切なところも多かったりして。
鳴いたらTehaiからその牌が消されるというのは普通だと思っていたが、
意外と分かりにくいのかな。この種の質問は前にもあった気がするし。
説明書に追加しとくか・・・
応援ほしゅ
忙しくてなかなかこっちに手が付けられない。
それに、なかなか上手く出来上がらないんだよなー
無限ループの嵐で。構成練り直そうかなーと考え中です。
思考ルーチンも興味あるが、
役判定の一番効率の良いルーチンもかなりほしい気がする。
>>812 自分も考え中。
結局、完全に読みきるのは無理なので、
何らかの方法で、何を切ればいいか評価しなければいけない。
今考えてるのは、
@最大14種類ある、切った後の形を作る。
A1つ1つについて、そこから予測できる上がりの形をいくつか作る。
Bそのときの「点数×その形になる確率」を足していく。
C最も高得点になる捨て牌を捨てる。
Aをどうやってやるか、どこまで調べるのか。
モンテカルロ法では、
乱数でツモる牌を決めておく。(切った後の形すべてで、ここで決めたツモを使う)
A1つ1つについて、上記のツモをくっつけてみる。
B上がっていたら点数を足す。
とやっていた。
あと、Aでホンイツとチートイツを、それ以外の上がりとは別に調べるつもり。
あれ・・・これパターンマッチングか・・・?
>>813 ↓みたいな上がりチェック関数を使ってメンツを切り分けて、
あとは、役ごとにその役があるかどうか調べるという方法以外があるだろうか?
http://www.interq.or.jp/snake/totugeki/mjcom_p0.htm そういえば、過去レスで役判定作っているといってた人どうなっただろう・・・
>>814 >↓みたいな上がりチェック関数を使ってメンツを切り分けて、
>あとは、役ごとにその役があるかどうか調べるという方法以外があるだろうか?
>
http://www.interq.or.jp/snake/totugeki/mjcom_p0.htm 私の場合は各役ごとに有効牌種と有効面子を設けて検索しています。
例えば、ピンフでしたら
・有効牌種=数牌+オタカゼ
・有効面子=ジュンツ3つ+トイツ1つ+両ターツ1つそれ以外は無効、鳴きも含む
トイトイでしたら
・有効牌種=制限なし
・有効面子=コーツ、トイツ、ポン、カン以外全て無効
三色でしたら
・有効牌種=(9 * i + j),(9 * i + j + 1),(9 * i + j + 2){i=0~2,j=1~7}
・有効面子=トイツ1つ、チーを含み有効牌種がいくつあるか、ターツ1つ,
ポン1回まで、カン1回までそれ以外は無効
と定義して以上の条件をどれだけ満たしているか検索かけていく方式を採用しています。
でも、切り取るパターンが幾つかある上、この方法だとイッツー、三色、ペコとかだと
検索の効率が悪くてどうも・・・困ったなあ(^^;
>>816 お疲れ様です。
試して見たのですが、時々「終了します」とエラーがでて
終了されてしまうようです。どんな内容なのかはソース
がないので良く分かりませんが次回作期待しています。
どうも〜〜、たまにこけます。バグだと思いますが、たまに出るので現象が見つけにくく。
対策予定。
820 :
デフォルトの名無しさん:04/02/13 23:23
>>821 因みに今回のAIでは
>>815のようなものは一切使用してません。
まだ、作成中です。いや、本当に難しくて(^^;;
ノー店リーチならオレだってやるぞ
>>819 302v012、253v0003、253dummyのメンツで300試合打たせてみた。
結構勝ってる。
他のメンツも即リーゼンツだけど、なにがちがうんだろ。
特徴とかアルゴリズムとかの解説とかあるといいな。
>>821 まあ、普通にシャンテン数を落としてる感じですな。
ちょっと思ったこと。
AIの強さをRateであらわせるといいんだけどなあ。
東風荘のRateは、いちおうあれで実力がなんとなく分かるし。
どれかひとつ基準になるAIが、東風荘でRいくつって分かるといいけど・・・
いちいち総当りとかはせずにすむ、なにかうまい実力評価方法がほしいところ。
例えば、253Dummy.dll×3と自作AIで1000試合して、最終的なRateの値とか
(いまのところMJSimではRate変わらないけど、できすぎくんの安定Rとか)。
あと、AI発表のときに、こんなんあったらいいなと思ったもの
(あくまで希望なんで、なくても一向に構いませんが)。
・特徴とかアルゴリズムとかの解説。
・20試合程度のログ(ダウンして動かすまでやらない人も見るかも)。
・なんらかの強さの指標(上で書いたみたいなもの。これは考え中・・・)
プログラミングはしない観戦者用に、対戦するAIをGUIで選択するツールでも作ろうかと思ったが、
ログがあったほうが手っ取り早いな・・・と
>>821をみて思った。
下にできすぎくんの分析結果とログをアップしています。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1071668170&res=52&fi=no ・特徴とかアルゴリズムとかの解説。
捨て牌決定は場の状況による、行動決定と手牌分析+1ツモ先の先読み。
場の状況は、局・ツモ順目・順位・点差・他家のリーチ・手牌の内容・等を少しだけ。
人間が思うような状況判断は全然出来ていません。
・20試合程度のログ(ダウンして動かすまでやらない人も見るかも)。
一応UPしてみたけど、適当に切り取ったので特長が出てるか不明。
実際特徴が出てるのを探そうと思ったが、多すぎるログから取り出すのは困難。
・なんらかの強さの指標(上で書いたみたいなもの。これは考え中・・・)
欲しいです
302v012+253dummy*2との1761試合のできすぎくんの情報から特徴が見て取れるもの。
・降りが有るので、放縦率が少し低い。
・点よりトップを目指しているので、局辺りの全収支がマイナス。
詳しく見方を知らないので、他に有ったら教えてください。
>>827 いま計画していることを素直に作っていけばいいと思います。
それに、デバックの仕方を身近な経験豊富な人に聞くといいですよ。
単一プログラムのよく暴走するバグは、簡単に対処できるバグですから
デバックの仕方を身近な人に聞けばそれだけで、レベルUP確実です。
>>828 どなたかは知りませんが、どうもありがとうございます。
名無しさんでしょ
>>826 さんくす。
しかも、できすぎ君の画面もつけるのはたいへん便利。
1ツモ先の先読みというのは、具体的にはどういうものでしょう?
捨て牌を捨てた後の手牌に、全種類の牌を1つずつツモってみて、
「良い」と評価できるのが多かったやつを捨て牌にする・・・とかかなあ。
>実際特徴が出てるのを探そうと思ったが、多すぎるログから取り出すのは困難。
これはたしかに。
20試合と書いたのは根拠なし。もう少し多いほうがいいのかどうか・・・
>・点よりトップを目指しているので、局辺りの全収支がマイナス。
勝っている場合、プラスになりそうだけど、なぜ?
4位だけ異常に少ないなあ。これが平均順位に効いている感じ。
ここをこうしたらとかは、今は思いつかないや。
しかし・・・和了素点より和了時収入が少ないってどういうことだろ。MJSimバグってるのかなあ・・・
>>827 スマン。正直、最初にCalcRateを見た頃は、Rについてはあんまし考えてなかった・・・
ソースを見たけど、安定Rをだしてるのかあ。
>因みに、CalcRateで、
>>825と同じような処理を施して実力を調べたところ
これは、253Dummy×3ってことかな?
いまのところ、こうしないといけないと思う。
MJSimがRを変化させないので、
強いAIをメンツに入れてしまうと、そのときだけ安定Rが下がってしまう。
Rが変化するようになれば、253Dummyが1つでもいれば、
それとのR差を指標とすればいいかな?根拠なし(;´Д`)オシエテ
>捨て牌を捨てた後の手牌に、全種類の牌を1つずつツモってみて、
>「良い」と評価できるのが多かったやつを捨て牌にする・・・とかかなあ。
これとほぼ同じ。
>勝っている場合、プラスになりそうだけど、なぜ?
3,4着だと、積極的に上がりに向かうので、だめだった時、点数はもっと低くなり。
1,2着だと、防御的になるので、あまり点が伸びません。
それにリーチして上がれずが多いので、他支出が多くなってマイナスに。
どれかAIが東風にデビューして、安定Rが出れば、それを基準に強さの比較ができるといい。
そのうち東風で対局しているのはAIばかり、というシュールな図を想像してしまった・・
いや、余裕で人間が強いよ。
それに動機が次の2つしかない。
1.プログラミングの勉強のため、実力を試したいためのAI自作する人。
これは、とても少ない、ほぼ無視してもいい人数。
2...実力でAI以上のRが取れない人で、卑怯にも他人のAIでRを取ろうとする卑屈な人。
最初は良くても直ぐ飽きるか、自分の無能を自覚して止める。
なので、そんなに使われない。
837 :
デフォルトの名無しさん:04/02/15 20:31
http://www.interq.or.jp/snake/totugeki/mjcom_p0.htm のコードを参考にさせてもらってるのですが
for(i=0;i<44;i++)
if(2<=tehai[i]) //頭を抜き取る
のi<44ってのは43の間違いですか?それとも何か意図が?
一応どちらでも動作はしたのですが…
それとif(tehai[i+1]&&tehai[i+2]) //シュンツとして抜き取れる場合
なのですがこれだと字牌を東南西などで持ってたら順子として数えちゃいませんか?
i<30などとした方がいいでしょうか?
コードを書いた本人ではないですが
>for(i=0;i<44;i++)
>if(2<=tehai[i]) //頭を抜き取る
>のi<44ってのは43の間違いですか?それとも何か意図が?
たぶん配列が終了の0を含み「44」あるのかもしれません。
>それとif(tehai[i+1]&&tehai[i+2]) //シュンツとして抜き取れる場合
>なのですがこれだと字牌を東南西などで持ってたら順子として数えちゃいませんか?
東南西は30,32,34と1つずつ離れてるのでシュンツにはならないです。
>>838 あ、離れてるんですか。
よく見ずにすいませんでした(;´Д`)
俺のコードの手牌番号が30,31,32...となってました。
ちなみに上の44は43でもいいですかね。
手牌配列は自分は43個の宣言なのですが。
>ちなみに上の44は43でもいいですかね。
頭の検査は43でもいいと思います。
>手牌配列は自分は43個の宣言なのですが。
中が[42]個目なら[43]に0を入れておかないと、配列先のデーターに0以外が有ったら
シュンツになってしまうので、配列は44で0エンドがいいですよ。
30までしかシュンツを探さなければいいのですが、
安全のためにも最後に0を入れるのをお勧めします。
>>832-833 >>因みに、CalcRateで、
>>825と同じような処理を施して実力を調べたところ
>これは、253Dummy×3ってことかな?
はい。その通りです。 因みにソースはとつげき東北氏のページの
公式集を参考に作りました。よって「出来すぎ君」の第2安定レート
と全く同じ結果になります。多分(^^;
>>253v003=1536,816v001=1596,302v012=1601,283v010=1156
>これが今のところ強さの指標と考えていいかな。
>100程度差がついていると、強さに差があるといえるのかな?
そうですね。ただ、1000試合で検索したとしてもやはりレートにばらつきが
生じるようです。↑のは何回かやった結果の平均を四捨五入したものですが
それでも結果が間違ってる可能性は大です。
842 :
デフォルトの名無しさん:04/02/16 08:13
>>842 なんか宣伝ぽく見えるけど。そうじゃないならスマソ
で、本を買った目的教えて?何のAI作ってるのor作るの?
>>834 >>「良い」と評価できるのが多かったやつを捨て牌にする・・・とかかなあ。
>これとほぼ同じ。
まあ、何がどれだけ良いのかってのが問題だけど。
メンツが増えたら10点とか・・・
今後、まだまだ強くなっていくんでしょうか?
>>841 >よって「出来すぎ君」の第2安定レートと全く同じ結果になります。多分(^^;
なぜ第2なんでしょ?
>そうですね。ただ、1000試合で検索したとしてもやはりレートにばらつきが
>生じるようです。↑のは何回かやった結果の平均を四捨五入したものですが
>それでも結果が間違ってる可能性は大です。
どの程度ばらつくんでしょう?
まあ、強さの差が、ある程度分かれば充分かと。
>>842 学習機能はおもしろそうだけど、使えるかなあ・・・
>>252 >今後、まだまだ強くなっていくんでしょうか?
その予定。
やれる事はたくさん有るが、一つ一つに時間がかかりそう。
>学習機能はおもしろそうだけど、使えるかなあ・・・
学習機能は内容を限定すれば使えると思います。
が、まったく万能ではなく、AI同士対戦学習では
3すくみ問題が有って適用範囲を絞るのが難しい。
ちょうど上に
>>814のあがりチェック関数について質問がありますが
同サイトで紹介されている聴牌チェック関数の作り方がイマイチわかりません。
一枚足してagari_check()を呼べばいいわけですが、
そこから待ち牌を得る綺麗な方法(国士無双を除いた最高の待ち数である9個の配列を作って
順番に入れるくらいしかおもいつきませんでした)と、
待ちの形の求め形がわかりません。
どなたかアドバイスをいただけないでしょうか?
>>847 その文章ではいったいどれが分からないのか分からないが、とりあえず回答してみる。
>そこから待ち牌を得る綺麗な方法
int i, mati[43] = { 0 };
for(i=0;i<43;i++){tehai[i]++;if(agari_check()) mati[i]=1;tehai[i]--;}
とやって、mati[i] == 1 であれば、それは待ち牌
>待ちの形の求め形がわかりません。
mentu_cut() の
if(tehai[i]==3) //コーツとして抜き取れる場合
と
if(tehai[i+1]&&tehai[i+2]) //シュンツとして抜き取れる場合
および、agari_check() の
if(2<=tehai[i]) //頭を抜き取る
の条件が成立したとき、各面子と雀頭を記録。
for(;!tehai[i];i++)if(i>=43){return;} //上がっている場合ここが実行される
にきた後、記録しておいた各面子と雀頭をみて、
上がり牌が
・コーツの面子の中にあれば -> シャンポン待ち
・シュンツの真ん中にあれば -> カンチャン待ち
・シュンツの端で逆側の牌が1か9の場合 -> ペンチャン待ち
・シュンツの端で逆側の牌が1か9でない場合 -> リャンメン待ち
・雀頭の場合 -> タンキ待ち
849 :
デフォルトの名無しさん:04/02/16 20:55
>>843 某ゲーム会社のオンラインゲームのNPCを作ってます。
あまり詳しい事は言えませんが。
その仕事が終わり次第、麻雀もやってみようかと。
本当はいろいろレスしたいのですが、事情がありまして。
という事で、ROMメインですがよろしく。
>>849 うお、失礼いたしました。
期待しています。
是非いっしょに、AIの具体的な部分で議論できたら嬉しいです。
とりあえず、Rを出してみた。
Rは次のような条件で出した。
・それぞれのAIと、253Dummy×3のメンツでの1000試合対戦。
・253DummyはR1500固定。
・できすぎくん安定R(第1東風荘)の数値(ルールが第1なので)。
・環境は、MJSim 0.5.10。
言い換えれば、253Dummyにどの程度差をつけて勝てるか、という感じ。
あくまで参考値とお考えください(もっといい方法があれば提案プリーズ)。
しかしながら、大きく数値が離れている場合は、強さに差があると考えられる。
ここでのR1500は東風荘のものと同じレベルではない。東風荘では1000くらい?
「特徴」は、いい加減なものですので、作者さんが気分を害したら申し訳ない
(間違いがあればご指摘ください。また、今後紹介してほしくない場合は言ってください)。
紹介順は、だいたい出てきた順番で。
正直おまいらカッコイイな。
俺もそんな感じに作ってみたいものだ。
そんな俺は今日も雀荘…(;´Д`)ハァ勉強シヨウゼ
856 :
デフォルトの名無しさん:04/02/17 22:02
>>851-854 お疲れ様です。やっぱり皆強いですね。
私のやつもいい加減強くなって欲しいものだ・・・
>>855 正直そうでもないと思います。
私も雀荘は時々通いますよ。
>>858 やってみました。
聴牌したのになんで切った後じゃないと
リーチ出来ないんだろう(^^;
しかもリーチした後でもチーできるのは何故?
>>859 ちなみにフリテンもなかったよ。
遊びでチョンボの画面みようとしたら普通にあがっちゃってんの
861 :
男チャ漬け ◆VmNuOcUpJs :04/02/23 20:54
念のため保守age
862 :
男チャ漬け ◆VmNuOcUpJs :04/02/26 03:07
保守。なんか泣けてきたなあ・・・(つД`)
AIの方も忙しくて作れないよヽ(`Д´)ノウワァァァン!
>>862 保守乙。
まあ、またーりいきましょう。3年計画くらいでいいんじゃない?
ニューラルネットの本を読んでみた。まだ、よくわかってないのだが・・・
これ、結局何ができるかというと、「組み合わせ問題が高速に解ける」みたい。
たとえば、「Nクイーン問題」は、クイーンの置き方に膨大な組み合わせがあるが、こういうのに使える。
http://web.sfc.keio.ac.jp/~t01613mt/java/Nqueen/Nqueense.html http://www.neuro.sfc.keio.ac.jp/demos/gallery/ ←のnqueen.cがCで書いたソース
上のリンクには、Σの入った長い式があるが、「動作式」というもので、
どうやって解いているかの説明になっている。
別にこれ無しで、いきなりプログラミングしても良いが、説明するときに便利。
プログラムで書くと、nqueen.cで70行(画面表示部抜きで)くらいになる。
Σはプログラムではfor文になる。
で、麻雀に使えるかどうかだが・・・ワカラン。
とりあえず、上がりチェック(4メンツ1雀頭あるかどうか)はできそう。
まあ、上がりチェックは、しらみつぶしでやっても何とかなっているわけで、どうでもいい。
上がっていないときに、将来上がりやすそうなターツの組み合わせは多いから、
その中で最善の組み合わせを出すのに、これを応用してやれないかなあと考え中・・・・
ニューラルネットで、「タイル問題(ポリオミノ)」を解く方法があって、これが麻雀に似ていると思う。
もう少し、使えるのかどうかのめどが立ってから書こうかと思ったが・・・
そんな状態。誰かフォローしてくれないかなあ・・・
訂正
>上がっていないときに、将来上がりやすそうなターツの組み合わせは多いから、
>その中で最善の組み合わせを出すのに、これを応用してやれないかなあと考え中・・・・
上がっていないときに、すべてのメンツ、ターツ、孤立牌に分ける組み合わせは多いから、
この中から最も上がりに近い組み合わせを探して(残り牌やドラとかも考慮して)、
要らない牌を切れるようにするのに、これを応用してやれないかなあと考え中・・・・
上がっていないときには4メンツ1雀頭にはならないわけで、解答は無いが、
ニューラルネットでは、だんだん解へ近づいていくように動くので、できるんじゃないかなあと。
866 :
男チャ漬け ◆VmNuOcUpJs :04/02/28 03:10
>>863-865 お疲れ様です。
8クイーン問題って案外簡単に解けるものですね。
しかも高速化とは恐れ入りました。
ニューラルネットの概要はソースを読んでなるほどなあと思いました。
こちらのAIなんですがメンツ検索まだ時間が掛かりそうなので先に
オリの方をつくろうかなと考え中です。次のバージョンはリーチが掛かったら
即オリ、もしくは状況を見て降りるAIの作成に入りたいと思います。
暇があれば(^^;
>>866 >ニューラルネットの概要はソースを読んでなるほどなあと思いました。
ソースだけで分かる?
説明を何度も読んでようやく理解できたのだが・・・
>オリの方をつくろうかなと考え中です。次のバージョンはリーチが掛かったら
>即オリ、もしくは状況を見て降りるAIの作成に入りたいと思います。
凸HPのベタオリかな?
今のところ、ほとんど誰もおりない状況だが、おりると強くなるのかなあ。
またどの程度強くなるのだろうか。
4着になる可能性は低くなり、平均順位は上がるかな。
869 :
男チャ漬け ◆VmNuOcUpJs :04/02/29 14:35
>>867 >>ニューラルネットの概要はソースを読んでなるほどなあと思いました。
>ソースだけで分かる?
>説明を何度も読んでようやく理解できたのだが・・・
式をどうやってプログラムに応用しているかはよくわかりました。
Σの部分を上手くfor,while文で繋げてるなあって。
すみません。完全に理解したわけではありません。
>>868 お疲れ様です。しかしよくできてますね〜。勉強になります。
いい加減sageよう・・・
しかし、何故皆ソース公開しないのだろう。。。
>>871 公開する理由もありませんし別に良いじゃないですか。
私のでしたら常にソース公開しますけど。
>>872 ソース公開しないと面白くないし、話題発展していかない・・・
>>873 それを言うためには、貴方がAIを作成し公開すべき。
作ってもいない人が、公開公開と騒いでも発展しない。
>>874 >>873ではないが、先人がソースを出してこそ後が続くってものだと思うが。
「お前が先に・・・」なんて子供の喧嘩じゃあるまいし。今作って持ってる人から
出していくしかないじゃない?
じゃ君がソース以上の情報を出してくれよ、それともクレクレ君か?
現状でも十分おもしろいと思うよ。
実際に動作してるのを見ると、まだブツを作ってないこちとらもやる気になる。
>>868 いくつかやってみたけど、結論から言うと、ばらつきすぎてよくワカラン・・・
1000試合程度では、予想通りにはならないみたい。
もうちょっとはっきりと効果が現れるのかと思ったが・・・
>816Dummyと253Dummy×3
>816Dummy R1639 和了率22.55 放縦率10.48
816Dummy強いなと思って、前回保存しておいた816v002のを見てみる。
>816v002と253Dummy×3(前回)
>816v002 R1570 和了率21.39 放縦率11.13
Dummyの方が和了率が高いのはおかしいなあと思って、再度816v002をやり直してみる。
>816v002と253Dummy×3(今回)
>816v002 R1647 和了率22.87 放縦率12.34
なぜかRがかなり上がった。和了率が1.5%もあがってる(放縦率も1%上がってるけど)。
816v002と816Dummyでは、816v002が和了率1%高く、放縦率も1%高いようだ。
結局強さは同じくらいということかな?
わからんので、直接対決させてみた。
>816v002と816Dummyと253Dummy×2
>816v002 R1636 和了率22.73 放縦率11.44
>816Dummy R1526 和了率2074 放縦率12.66
816v002の方が強いみたい。(このときは)
816Dummyの放縦率が高いが、たまたまか?
>>869 まあ、ぼくもよくわからんけどね(´Д`)
>>872 AIプログラミングの力試しに来てる人はソース公開しないでしょう。
簡単にまねされては、力試しにならないし。
自分も強いのができて、ぎりぎりの戦いになるようだったらソースは出さないかも。
今のところそれを考える必要は無いが・・・
ちなみにMJSimはイカサマ防止のため常にソース公開。
だれかが、これを元に(しても、しなくてもいいけど)、
もっといい感じのやつを作ってくれればいいなぁという希望もあり・・・
816v002と816Dummyでは先読みを行っているかいないかだけなので強さとしては
差ほど変わらないです。
特に、降りについては100%まったく同じ処理です。
また、同じAIは戦略がほぼ等しいので、強さの強弱はあまりはっきりと出ません。
302さんとか他のAIとの試合で意味があるものと思います。そちらをやっていただければ
違いがはっきりします。牌効率と全つっぱのAI、253Dummyより実戦的な降りが出来る、
816Dmmyを基準にAIの強さを測ったほうが良いと思われます。
また、全つっぱ同士の戦いでは単純に牌効率がいいAIが高い勝率を出しますが、降りが
出来るAIと全つっぱだけのAIではTOPを取る強さの違いが有り。
その点も検討してみてはいかがでしょう。
>881
つまり相手が降りるか降りないかの行動アルゴリズムの推定を行う必要があるということですね
>>882 相手の行動を推定するのは有用なアルゴリズムだと思います。今はそこまでは考えていません。
今言えることは、「最高に速くリーチする」と言った点では302さんが今のところ最高です。
実は、302さん並に高速なアルゴリズムを作りましたが、いくつか試行した結果、何かを追加すると
必ず遅くなってしまいます。
今あるAIは最短リーチを目指し、テンパッたらリーチのAIではほぼ上限が見えてきました。
より賢いAIを作るためには、それ以外でのアドバンテージを作らなければならないです。
それが、816Dummyの状況判断です。
先読みをしていない分、最短リーチ性能は低いが、状況判断が補っています。
この事は、すなわち、最短リーチ以外の色々な事を付加出来ることを意味しています。
追加、↑とは言ったものの、このスレ上では816のデータは弱いですね^^;
こちらでは勝っているのですが、自己判断では証明できないし、とほほ・・・
上記
>>883は、816が弱いとまったくの説得力がありません。残念。
>>881 >302さんとか他のAIとの試合で意味があるものと思います。そちらをやっていただければ
>違いがはっきりします。
ぼくが何か勘違いしてるような気がしてきたが・・・
とりあえず302v012×3とやらせてみた。
あんまり違いは無いが、816Dummyのほうが放縦率が1%程度低いくらいかなあ。
302v012にもちょっと勝ってる。
816Dummy 2.45位 302v012@ 2.52位 302v012A 2.47位 302v012B 2.55位
816v002は、2.489位 302v012@ 2.486位 302v012A 2.488位 302v012B 2.53位 微妙だ・・・
>牌効率と全つっぱのAI、253Dummyより実戦的な降りが出来る、
>816Dmmyを基準にAIの強さを測ったほうが良いと思われます。
単純なAIが相手の方が、効果や問題点が分かりやすいかなと思って、253Dummyを使用したんだけど。
降りるやつの方が実戦的かもしれず。
253Dummyを使用した強さの基準は、たたき台になればいいと思って、とりあえずやってみただけなので。
>今あるAIは最短リーチを目指し、テンパッたらリーチのAIではほぼ上限が見えてきました。
牌譜を見ていて、テンパイがもう少し速くなるんじゃないかと思ってた。
具体的には、トイツを残すことが多いなと。
たとえば、1m3m7m1p1p2p4p6p7p9p9p3s7s 5s (序盤)
というときに7mを切った。1pか9p切りのほうが広そうだけど・・・
期待値計算とかしたわけでないので分からないけど。
>追加、↑とは言ったものの、このスレ上では816のデータは弱いですね^^;
>こちらでは勝っているのですが、自己判断では証明できないし、とほほ・・・
いや、816v002は今のとこスレ内では最強レベルかと。
相手によって成績がかわってしまうのは前にも指摘されてたなあ・・・
まず1点の元々の疑問の答え。
>今のところ、ほとんど誰もおりない状況だが、おりると強くなるのかなあ。
>またどの程度強くなるのだろうか。
>4着になる可能性は低くなり、平均順位は上がるかな。
これの為に816Dummyを出したので、それを816v002と比較したので、あれあれと思い。
300ぐらいの試合結果では結構ランダムなので、簡単にはいえないのですが。
私が見た範囲では、降り機能はトップ取りには貢献していると思っています。
>単純なAIが相手の方が、効果や問題点が分かりやすいかなと思って、253Dummyを使用したんだけど。
>降りるやつの方が実戦的かもしれず。
この辺は確かに難しいかな。
いけいけバンバンなAI同士だと単純により効率の良いAIの勝率が高い。
性格のAI同じだと少しの違いでも、勝ち負けがハッキリとしてくる。
816v002、816Dummyは状況判断で行動が違う性格なので、確実に勝とうとするが
いまは、たくさん勝てる様にはなってはいない。
確実に勝てて、尚且つたくさん勝てるように出来ればいいのだが・・・・
他のAIよりは少しだけ人間の考える方法に似ているので、対人間には他のAIより
強いかもしれない。(次に続く)
>牌譜を見ていて、テンパイがもう少し速くなるんじゃないかと思ってた。
>具体的には、トイツを残すことが多いなと。
>たとえば、1m3m7m1p1p2p4p6p7p9p9p3s7s 5s (序盤)
>というときに7mを切った。1pか9p切りのほうが広そうだけど・・・
>期待値計算とかしたわけでないので分からないけど。
雀譜を見るとその場面をよく見かける、人間が考える牌効率とコンピュータが
計算で出す牌効率は意外と違うものが出てくる。
>今あるAIは最短リーチを目指し、テンパッたらリーチのAIではほぼ上限が見えてきました。
これは、コンピュータが計算で出す牌効率が今の方法では限界が近い感じがして書いています。
違う計算方法が有るかもしれない。
元々は、最速テンパイ即リーのAIは強いのか?の疑問が有り、状況判断を作ってみた。
意外と効果が出たと考えている。この結果から、最速テンパイ即リーのAIは対人間に対しては
パターンが読まれやすく弱いと思われる。(あたり前か^^;、実際の結果が出たと言うことで)
>>887 >>4着になる可能性は低くなり、平均順位は上がるかな。
>私が見た範囲では、降り機能はトップ取りには貢献していると思っています。
そういうことかぁ。
で、順位を見てみると(対302v012の1020試合の成績)
名前、1位、2位、3位、4位、平均順位
816v002、240、266、289、225、2.48
816Dummy、257、267、266、230、2.45
4位が少なくなるわけでなく、全体的によくなる感じか。
>これは、コンピュータが計算で出す牌効率が今の方法では限界が近い感じがして書いています。
>違う計算方法が有るかもしれない。
あると思うけどなあ。
で、リーチ関係を見てみる(対253Dummyの成績)
名前、リーチ率、リーチ平均順目、先制リーチ率、リーチ和了率
312v012、44.69、9.50、29.06、53.38
リーチ率(自分がリーチした局/誰か1人でもリーチした局)を下げずに、
リーチ順目を下げれば、リーチが速くなったといえるかな。
または、リーチ平均順目を遅くせずに、リーチ率を高めるとか。
816v002は状況判断しているということなので、ここだけ取り出して312v012と比較すべきでないが参考で。
816v002、37.31、9.13、26.86、56.22
816Dummy、36.13、9.17、25.55、58.56
>4位が少なくなるわけでなく、全体的によくなる感じか。
そんな感じだと思います。簡単に降り機能って言ってますが中身は結構複雑で
状況判断だけでもパラメータが500以上あり、設定もある意味適当なので改善の余地あり。
>あると思うけどなあ。
私も有るとは思うけど、単純なアルゴリズムではないような感じが・・・。
>リーチ率(自分がリーチした局/誰か1人でもリーチした局)を下げずに、
>リーチ順目を下げれば、リーチが速くなったといえるかな。
>または、リーチ平均順目を遅くせずに、リーチ率を高めるとか。
ここが難しいところで、最速テンパイ即リーAIはテンパル事に対しては人間より明らかに速いです。
できすぎくんはリーチした順目のみの集計で、その数字的には人間と変わらないのですが、
AIは終盤でも期待点が低かろうが平気でリーチしますが、人間は終盤ではあまりリーチしないので
結果として9順目辺りが出ます。AIも終盤のリーチを止めれば8切ります。
因みに、これからの改善案に以下のものが有ります。
1.安牌を持つ、(今は危険パイばかり持っている)
これは、面子ターツが揃っている場合、余分の1枚は安牌を持つようにする。
2.ペンチャンカンチャン待ちリーチを減らす。
3.TOP子の時、鳴いて早上がりが出来る時は鳴く(状況判断に追加)
これは、全体に対する効果が少なそう。(作っても目に見えた数にならないかも)
4.上がり点数まで考慮した状況判断をする。(今は上がり点数は見ていない)
5.リーチ率を上げるアルゴリズムを考える。
6.現在の状況判断パラメータを最適化する。
何が一番いいと思いますか?又は他に入れた方がいいのは有りますか?
ただ、人間が考える理想が10とした場合、AIに出来ることは1以下です^^;
尚且つ出来るのはずいぶん先で、出来るかも不明ですが^^;
>>891 >状況判断だけでもパラメータが500以上あり、設定もある意味適当なので改善の余地あり。
xシャンテンならおりない、点差がx点以上ならおりる、とかそういうやつでしょうか?500も?
>AIは終盤でも期待点が低かろうが平気でリーチしますが、人間は終盤ではあまりリーチしないので
順目はここをキープで、リーチ率はまだ高まる・・・などと断言はできないが・・・
>何が一番いいと思いますか?又は他に入れた方がいいのは有りますか?
自分の場合、予定としては、
@リーチ率、リーチ順目を高める。
A上がれなさそうなとき、鳴いたほうが点が高い場合は鳴いて上がる。@Aで和了率をひたすら高める。
Bおりる。放縦率をひたすら下げる。
C細かい状況判断。
D最適化
まあ、@でとまっとるわけですが・・・
無理やり順序付けると↓
>5.リーチ率を上げるアルゴリズムを考える。
>2.ペンチャンカンチャン待ちリーチを減らす。
>4.上がり点数まで考慮した状況判断をする。(今は上がり点数は見ていない)
>3.TOP子の時、鳴いて早上がりが出来る時は鳴く(状況判断に追加)
>6.現在の状況判断パラメータを最適化する。
>1.安牌を持つ、(今は危険パイばかり持っている)
いろいろ書いたけど、ヨワヨワAIしか作ってないやつの言うことなので(´Д`)
>xシャンテンならおりない、点差がx点以上ならおりる、とかそういうやつでしょうか?500も?
そんな感じです。状況判断と行動をテーブルにしたら500超えました。
一つだけ愚痴をいわしてくれないか
> 873 名前:デフォルトの名無しさん 投稿日:04/02/29 18:54
>ソース公開しないと面白くないし、話題発展していかない・・・
そこの君、情報も話題も提供しているが、やっぱり貰うだけなんだね。
まあ、匿名だから仕方ないが、少し悲しいよ。
894 :
デフォルトの名無しさん:04/03/05 06:43
ふと思った。今の段階なら、形式聴牌をとるようにしたらかなり強くなりそう。
>ふと思った。今の段階なら、形式聴牌をとるようにしたらかなり強くなりそう。
うんうん、書き忘れてたけど、追加はあれなので書かなかったです。
形式聴牌は、上の中では比較的簡単に追加できます。
ただ、条件が、
・他者がリーチしていない
・イーシャンテン。
・残り牌が10個以下(ここの数が微妙かな・・・いい案が無い)
の時に、無条件にチー又はポンして形式聴牌を取るを考えていますが、
どうでしょうか?
>>894を見て、ふと、他メンツがツモ切りだったらどのくらいリーチできるだろうと思って、
いろいろやっていたらバグを見つけたので修正。
と同時に、初期設定で連荘するようにした。
AIが上がれないものだと1試合も終わらないので、連荘「しない」ようにしていたが、
iniファイルで設定できるようにしてみた。
で、連荘ありで、
816v002を253Dummyと500試合ほどやらせてみたらR1660。
816DummyはR1590くらい。
前回の結果より少し良くなっているなぁ。
できすぎくんで、流局の局が有効局とみなされないときを修正したけど、
こういうのまだありそうなヨカーン。見つけたら指摘よろしく。これが間違っていると話にならん・・・
※できすぎくんのリーチ率って「誰か1人でもリーチした局」が母数だと思っていたが、局が母数でした。
先制リーチは、誰かがリーチした局だけど。
で、他がツモ切り×3のとき、どうなるか見てみると、
302v012で、リーチ率67%、和了率50%(239試合、3495局)
816v002で、リーチ率56%、和了率47%(168試合、2639局)
単純に比較はできないが一応。毎回例に出してスマン。
手順ミス (裏目を含む) がない場合の向聴数の推移
http://www.comjong.com/article_nomiss/index-j.html 手順ミスがなければ
>70%以上の確率で自摸和了れます。聴牌まで加えれば、90%以上です。
ってことで、勘だけどリーチ率75%くらいはいけるんじゃないかなと。
>>895 一向聴の時は残り10牌動いていいと思います。
個人的には残り15牌の二向聴で動いてもいいかなと思いますが。
>>896 お疲れ様です。
コマンドライン使えない事に関しても了解しました。
>>898 >単純に比較はできないが一応。毎回例に出してスマン。
いえいえ、とても参考になります。
816v002がリーチ率が低いのは2つ理由があります。
1、純粋な牌効率より、少し手作りが入っています。
前に示したように、最高スピードに何か手を加えると遅くなってしまう、が有りその点が少し。
2、に付いては、すみません今のとこ内緒にしておきます。結構簡単な方法なので
知れ渡ると楽しみが減ってしまうので、すまそ^^、この点がリーチ率に大きく影響しています。
1、については、もっと色々アルゴリズムを検討する必要があります。
2、に付いては、微妙で私は効果があるとは思っていますが、まだ数字的な分析は出来ていません。
今、7種類のAI行動があり、1つ以外は総て守備のための行動です。
次は攻め方の種類による行動定義を追加したいと思う反面、独断的に効果があると思う実装が
沢山あり、それが実際に効果があるのか分析したいと思っています。
事実500以上のテーブルデータは、多分こうだろうと思うあいまいなデータが入っています。
>手順ミス (裏目を含む) がない場合の向聴数の推移
このデータの向聴の時の待ちの形の分布が見れるといいんだけど・・・
>勘だけどリーチ率75%くらいはいけるんじゃないかなと。
そこまでいけるといいな〜〜、問題はペンチャンや19含むカンチャンを嫌って単独の456牌を
選んだ時本当にリーチ率が上がるかどうかですね、AIに組み込んで統計を取ってみたい。
実装方法は見えているのですが、複雑で時間がかかりそうです。
>>899 >一向聴の時は残り10牌動いていいと思います。
>個人的には残り15牌の二向聴で動いてもいいかなと思いますが。
お疲れ様です&ありがと〜〜。
残り15牌の二向聴も作り込んで、2つのDLLを出して統計を取って効果を見てみたいですね。
>>900 >1、純粋な牌効率より、少し手作りが入っています。
和了時平均点は、
>>898のデータで、
302v012 和了素点6755、和了時収入8825
816v002 和了素点6524、和了時収入8754
まあ、これはリーチのときばっかりのデータなので、
鳴きを含む戦いになると変わってくるのかも。
>独断的に効果があると思う実装が
>沢山あり、それが実際に効果があるのか分析したいと思っています。
強くするためのポイントと、それを計測するやり方を発表してもらえれば。
形式聴牌については、凸HPでは、
http://www.interq.or.jp/snake/totugeki/kouza5.htm ↑の「いつから形テンを目指すか」に、
>平場であれば一般に、残り17枚くらいの段階からケイテンを目指すといい
など書いてあるけど、あんまり根拠とか書いてないな。
保守
保守
すすんでる?
907 :
◆R/rLuLKeEI :04/03/18 19:43
年度末で本業が忙しいんかな?
スレ発のオープンソース・プロジェクトとしてまとめでもしなければ、結果は出ない
だろうね。各人それぞれでやってるだけだと一人抜け二人抜けで廃れていくだけ。
あんましすすんではいないが、やめてもいないよ。
もしDAT落ちしても、強いのできたらまた立てる。
しかし、燃料というか話題がほしいねえ。
こちらも同じく。気長に行きましょう。
上げておくか
>>908 AIの場合、まとまってやるよりは個々で作って競争というかんじじゃない?
将棋AIも基本的には個々でやってるみたいだし(チームでやってるところもあるけど)。
おまいら最強の脱衣麻雀プログラムしてみろよ!!
風で寝込んでる間に雑談が、
>おまいら最強の脱衣麻雀プログラムしてみろよ!!
CPU側最強の脱衣麻雀なら、裸絵無くても出来る。(100%負けないので)
・・・釣られないクマ----(AA略
ギャグは置いといて、麻雀AIに、基本的なアルゴリズムが無い点が
話題の無さと、その為にアルゴリズムを0から作り上げるのは時間がかかる点が。
例えば、より早くシャンテンを減らすアルゴリズムはいくつか有り、シャンテンを
減らす性能は高い。でもこれは麻雀の極一部だけをAI化しているだけで、
その他のほとんどがアルゴリズムとして確立されていない。(公開されていなとも言える)
私の方では、幾つかのアルゴリズムを入れて試しているがパラメータが増える一方で
その設定値の正当性や妥当性が有るか疑問でなかなか先に勧めない。
だから、分析ソフトを作ろうとしている。あまり進んでないけど。
それに、誰かと競ってないとモチも減少気味で^^;
元日本物産の方はおられませんか〜
>>914 >だから、分析ソフトを作ろうとしている。あまり進んでないけど。
たとえば、どんな分析をするんでしょう?
>それに、誰かと競ってないとモチも減少気味で^^;
精進します・・・
>>916 >たとえば、どんな分析をするんでしょう?
ログファイルから分析します。
できすぎくんは人間に対応した分析で、AI的にはあまり向かない感じです。
やりたい事はたくさん有りすぎますが一例で。
・テンパイした時の形の統計
・フリテン時の統計
・裏目のはまり率
・他家リーチのときの自分のシャンテンと余り牌の危険率。
・他家リーチ時の降り牌決定後のシャンテン変化、回し率
・他家リーチ時の自分の順位と行動決定時の勝率
・行動決定とその正解率
・手回しをした場合のシャンテン上昇率、テンパイ率、上がり率、上がり点率
・色属性趣向の可能性分析
・その他にもたくさん。
上記がやりたい事の一例です。やりたいのは自分のAIが持ってるパラメータを
数値的に見えるようにした分析。ただ、AI作る並みの作業量があり、
手配の分析AIが有るので、それを使って作るのは難しくないのですが
作業数の多さが大変で・・・
>>917 これは大変そうだなぁ。
強い人間のデータも凸HPで手に入るので、どこが違うか見ると参考になるかも。
>>915 バニラシンドロームは結構やったなあ。
やヴぁい。保守age。
うーん、麻雀AIいろいろやってみたいけど
本業の方が忙しくて機会が少ない。
C++の勉強になってよかったんだけどねえ。
活動再開にはちょっと時間がかかりそうです。
自分は、ほかの本を読んだりしてる。C#とか。
て、麻雀の方も考えねば・・・
926 :
デフォルトの名無しさん:04/04/26 03:18
Σ(゚Д゚;≡;゚д゚) ナ、ナイ!!
まあみんな本職で忙しいんでしょ。
俺も、GWくらいには再開したいなぁ。。。
>>926 お。2週間ぶりの書き込みでしたか。
では、私も暇ができたら進めてみたいと思います。
まだ、捨て牌分析完成してないし。
せめて、それぐらいは提供したいですしね。
先はまだまだ長い・・・
(゜∀゜)ノ生きてます。
凸掲示板で最近話題になっている、
「カンチャンだろうがペンチャンだろうが先制なら常に即リーがよい」
というのにはショック。ずーっとリャンメンにしてたよ・・・
>>928 そんなの、時と場合によるでしょ・・・。
>>929 「常に」は言い過ぎか。まあ、ほとんどってことで。
時と場合によるけど、少なくとも人間同士では、
細かい状況を加味してどうするか考えるより、常にリーチしたほうが勝てる、という意味だと思う。
AIなら、そこらへんもう少し考えられるだろうけど。
>>930 というか、
>>928の状況はおかしいぞ。
即リーしないつもりなのにカンチャンやペンチャンが最終型に残ってて、
しかもそれを聴牌後に落としていく、なんて最悪の動作だろ。
(ダマでロンできるならまた話は別か。でもそんな話じゃないんだろーなぁ)
聴牌即リーのつもりだったならば、最終待ちが多少悪くてもリーチするしかないし、
「ペンチャンリーチなんてとんでもない」と思ってる奴なら最初っからそんなとこを残さない。
>>931 たとえば、23m137pのような残り方をしていたとき、14mが先に来た場合、
1pを落とすことはよくやっていたってこと。
何か変かな?
>>932 速度は確実に落ちてるけど(面子のタネ叩き切ってるんだから)、
手役をつけるためならおかしくないだろうね。
その形ならタンヤオとか三色とか・・・・ってどっちも付かないだろその形じゃ・・・・。
やっとクライアントとサーバーの二つのプログラムを作って
その間でTCP/IP接続出来ました
誰かが東風荘のサーバー側の役目を果たすプログラムを作ってくれれば
皆で接続して対戦を1万回ぐらい行ったら強さが分かるんじゃない?
>>934 あなたがどういうものを作ったのかよくわからんので、仕様を書いてほしいな。
いやいやいや
麻雀のサーバープログラムを作ったのではなくて
ただ単に二つのプログラム間でTCP/IPによる接続に成功しただけ。
つまり超初心者です。
>>937 サーバやAIも作ってーな。
しかし、サーバとか作る前に、AIを作ってくれる人をいかに増やせるか(開発環境の魅力)を考えないとね。
サーバナシで、P2Pもどきで出来ないかねぇ?
某winnyみたいにIPアドレスを直接打ち込んで相互通信。
ついでにファイル交換もできれば人も増えて(ry
>>939 つーかTCPコネクション使うなら必然的にどちらかがサーバになるわけだが
それに麻雀というゲームのシステムからしていずれか一台が配牌や他家の
打ちデータの面倒をみないといけない
将棋ならサーバー無し(2台のうちどちらかはサーバーになるけど)でいけるけど
↑が言ってるように麻雀はサーバー無しでは無理だね
ってわけで誰か作れ
というか、鯖にできる環境が欲しい。むしろw
>>942 今問題にあがってるような1卓対戦で環境もクソもないだろ
ネットワーク接続できるならそれでもうOKなわけだが
データ量極小、レスポンスどうでもいい
だから、ルールさえ決まれば、たとえばhttpで大丈夫なような。
>>944 プロトコルの意味が分かってないだろ?
httpで通信したいというならデータをまずHyperText形式にしなくちゃならんわけだが
>>945 ど素人はどっか逝ってください。
なんだよ、HyperTextって(w
通信プロトコルっていうのは、データ形式とそのデータを送受信する手順がセットに
なったもの。バイナリ・スタイルならオクテット区切りでのデータ配列規則が必要だし
テキスト・スタイルならコマンド等のキーワードや区切り文字を設定しなければなら
ない。ただそれもこれも扱うべきデータがまずあっての話。
この場合は、スタンドアロンの麻雀プログラムがあって、その中で使用する変数が
決まっているなら、そこから通信型のプログラムに書き換えが進む。どの変数を
クライアント間で取り交わすか、ゲーム進行に関する制御系の通信をどう行うか
が先にないとプロジェクトとして進まない。
いきなりhttpっていうのはちょっとトンチンカンだね。
HTTP はあらゆる形式のデーターをやりとりできるようになってるから
はっきりいって実装するのがめんどくさい
もっと単純なものでOK
>>948 >いきなりhttpっていうのはちょっとトンチンカンだね。
トンチンカンなのはあんたのほう。
専用の鯖を用意しなきゃならんみたいなことを上で言ってるからだ。
そんな必要はないということ。
>>949 他のやり方だとそれ用の鯖が必要だろ。
だれかが鯖を用意できるなら、あんたの言うとおり。
>>950 なんだ専鯖無しで考えてるのかい?
だったらレンタル鯖でCGIチャットみたいなやりかたでデーター交換するくらいしか手が無いね
4人のうちどれかひとつがサーバになる、って話じゃないの。
それはともかく、鯖ナシだとサンマをやるときに面倒だったりしないかね?
わざわざコンピュータでサンマなんかやらんか・・・。
>>950 webサーバ間に置いて・・・なんてことは誰も提案してないよ。
だいたいそんなことしたらサーバ・プログラムが大変になるだけ。
2者接続にしろにしろどちらかがサーバにならなければならないというだけの話。
クライアントとして接続するかサーバとして接続するかは大した問題じゃないだろ。
ネットワーク・インタフェースを介してプレイできるならloopback使って単一ホスト
で対戦させることも可能になるし、そういうところがそもそもの利点だろ?
上げてみる。
957 :
デフォルトの名無しさん:04/08/23 01:41
これ新しいスレのあるんですか?
958 :
デフォルトの名無しさん:04/08/23 01:44
あの、えっちがしたいんですけど
959
960
961
962
964
964
965
966
落ちきって放置されてるスレで
何がしたいんだ?
968
969
970
971
972
973
974
975
976
977
978
979
980
981