08/01/20 05:09:44
>>356
強化学習が当てはまるけど
それぞれ独立した手法で通常は併用されるもの
358:デフォルトの名無しさん
08/01/20 05:40:58
強化学習はの実装はこれがわかりやすい
URLリンク(www.vector.co.jp)
359:デフォルトの名無しさん
08/01/20 10:03:16
宣伝乙
360:デフォルトの名無しさん
08/01/21 01:25:32
Cプログラマ必須テキスト!
URLリンク(mori.eco.to)
361:デフォルトの名無しさん
08/01/23 00:02:55
強化学習面白いな
確かHeraklesも使ってるんだっけ
362:デフォルトの名無しさん
08/01/27 06:19:42
AIを実装しようと挑戦中なのですが、MiniMax法について質問させて頂きます。
先手、後手ともに最善の手を取った場合を数手先読みし最善の場所を
決めるのがMiniMax法ですよね?
いざ実装してみようと試みたのですが最善手を評価する際のMAXとMIN
を以下のようにしたのですが、このようなやり方はダメな例ですか?
まずBord[10][10]というメインとなるボードと、それとは別に8*8の盤面にあらかじめ
数値を入れた盤面 (この数値の差分から数手先の最善手を決める) を用意しようと
考えています。
363:362
08/01/27 06:37:24
すいません何言ってるか分からないですよね。とりあえず>>362の方法で作ってみます
その上でどうか尋ねてみます。
364:デフォルトの名無しさん
08/01/27 09:43:00
MinMax法やばす・・・難しすぎるんだけど
とりあえずMiniMax法を作る上でのコツか何かありませんか
365:デフォルトの名無しさん
08/01/27 10:44:34
NegMax の方が実装は楽だが,minmax が作れないんじゃ一緒だろうねぇ.肝の部分は再帰使って数行で書けるんだけど.
プログラム例が載ってる本でも買えば?
366:デフォルトの名無しさん
08/01/27 10:45:23
int minmax (int min, int max)
{
for (i = 0; i < n; i++) {
move (i);
v = -minmax (-max, -min);
undo ();
if (v > max)
return v;
if (v > min)
min = v;
}
return min;
}
今30秒くらいで書いたけど基本はこれだけだと思う
367:デフォルトの名無しさん
08/01/27 11:30:57
>>365
ネット上の読み物で出来たらいいんですが、買うことを考えるべきですかね・・・
>>366みてみるとundoとかいう機能を作りずらい作りになってしまっている予感です
ネット上の拾いものからその行程が出来ないか試してみます
参考例ありがとうございました
368:デフォルトの名無しさん
08/01/27 15:40:51
書籍購入を躊躇うようなら、その程度ってこった。
369:デフォルトの名無しさん
08/01/27 15:46:51
NegaMax、MinMaxくらいならネットの説明だけでも十分すぎる。
まじで。
370:デフォルトの名無しさん
08/01/27 19:02:14
そんな脳を俺に下さい・・・
#define BOARD_SIZE 8
int Board[10][10];
自作関数1: ・x と y の座標を引数に貰い、Board[x][y] ( A1と打ったならば x = A(1)、y = 1 )
について8方向を調べたあと置ける場所があるならばその場所を 返し、ひっくり返す。
・調べる方向は左上からy行x列方向に。
・手を指して次の盤面の状態にする
371:デフォルトの名無しさん
08/01/27 19:03:38
先手黒から見た評価関数の一部の例
>>366での
for (i = 0; i < n; i++) {
move (i);
v = -minmax (-max, -min);
undo ();
の部分だと思います
─────────────────────
/* ネット上の拾いものの解説 */
while( 打てる手がある ){
①手を差して次の盤面を作る;
②val = minimax( 盤面, depth - 1 ); 一手先を読む再帰。3手まで読んでみるつもり
③盤面を1手戻す;
─────────────────────
/* 上記を例に作ってみた */
blackturn( int **board , depth ) 2次元配列のポインタと、3手読みたいので3を貰う
{
int val;
if( depth == 0 ) return 評価値(盤面);
for( y=1; y<=BOARD_SIZE; y++ ) { 盤面全部を検索し置ける場所を8*8全部調べる
for( x=1; x<=BOARD_SIZE; x++ ) {
① if( 自作関数1 ) { board[x][y]に石が置けるならひっくり返してみる
ターンを次にする;
色を変える;
② val = blackturn( &board , depth - 1 );
③問題点 ここの処理がスタックを用いておらず出来ません。通常どのように行って居るのでしょうか?
長々と見ずらく申し訳ないですが伝わって頂ければ幸いです
372:デフォルトの名無しさん
08/01/27 19:56:38
石を返せることが分かってから返す際に石を置いた場所と返した場所の情報スタックに記録しておく
返した場所の代わりに方向とそれぞれの方向で返した数を記録してもいい
373:デフォルトの名無しさん
08/01/27 20:26:17
>>372
ネット上からスタックの例を見て条件満たせるよう作ってみます。
レスどうもありがとうございます!
374:デフォルトの名無しさん
08/01/27 20:26:47
もう世界一のプロが敗北してだいぶ経つんだし強さはもういらないだろ。
あとは人間との対局で統計データを取りながら
自動的にぎりぎりの強さで負けるような
ナチュラルな強さ調整機能をつけてくれ。
375:デフォルトの名無しさん
08/01/27 20:28:11
黙れ門外漢
376:デフォルトの名無しさん
08/01/27 22:15:23
>>375
お前のことか?
377:デフォルトの名無しさん
08/01/27 23:05:05
>>374と>>376だよ(笑)
378:デフォルトの名無しさん
08/01/27 23:56:00
と門外漢が申しております
379:デフォルトの名無しさん
08/01/28 00:25:11
お前らこういう言い合い好きなんか
380:デフォルトの名無しさん
08/01/28 04:15:18
見るのも仕掛けるのも受けてたつのも好きだ
381:デフォルトの名無しさん
08/01/28 04:33:45
まぁそれくらいしか能が無いしな
がんばれ
382:デフォルトの名無しさん
08/01/28 06:23:57
石を返す処理って1方向ずつじゃないとダメっぽいんだな・・・
糞コード全開だぜ・・・
383:デフォルトの名無しさん
08/01/28 06:53:01
>>372の続きでスタックの質問なのですが
石を返す”場所”をスタックに書き込む処理というのは
Board[x][y]というBoardがあったとしますよね。
f5という入力の場所の記録を行う場合には
f5という数値を入れるのでしょうか?
スタックには
← スタックポイントがここ
方向
石の数
場所
方向
石の数
場所(F5) 1番最初のデータ
という風に入れればいいのでしょうか?
384:デフォルトの名無しさん
08/01/28 10:14:42
>>383
これ無視して下さい。一から作り直すことにします
385:デフォルトの名無しさん
08/03/06 22:37:11
>>380
可能です。
以上。
はい、次。
386:デフォルトの名無しさん
08/03/06 23:05:43
誤爆か?
387:デフォルトの名無しさん
08/03/07 08:51:01
>>386
最近の流行
388:デフォルトの名無しさん
08/03/07 09:00:18
誤爆か?
389:デフォルトの名無しさん
08/03/23 01:42:36
あげ
390:デフォルトの名無しさん
08/06/19 01:43:37
再帰使わないで囲碁プログラムできないか?
391:デフォルトの名無しさん
08/06/19 01:46:01
できるよ
392:デフォルトの名無しさん
08/06/20 10:10:58
つーか,囲碁でも将棋でも再帰は使わない方が普通だと思うが
393:デフォルトの名無しさん
08/06/20 10:14:20
スレ違いなんだから話を引き伸ばすなよ
394:デフォルトの名無しさん
08/07/01 20:58:30
アルファベータ検索とか再帰だろ
395:デフォルトの名無しさん
08/07/02 13:25:00
概念的にはそうだが,実際は自分で管理してループにする方が普通
全データローカルスタックに取るわけにも行かないし
396:デフォルトの名無しさん
08/07/02 16:30:33
>>394
×検索
○探索
397:デフォルトの名無しさん
08/08/04 03:03:57
評価関数のパラメータに使う盤面の特徴量ってどんなのがありますか?
パターン、パリティ、クアッドパリティ、モビリティ、ポテンシャルモビリティ、他にあれば教えてください。
思いつきでもかまいませんので。
398:デフォルトの名無しさん
08/08/05 01:00:46
思いつきとしては、安定度みたいなのがあっても良い気がする。
αβ探索で深読みすると浅読みで良手だったのが悪手になったりするでしょ?
これって、その局面を進めていくとそういう局面を発見するからだって考えがちだけど、
単純に考えれば、浅読みの評価値が間違っているとも言える訳で。
評価関数が、局面の善悪を出力するのなら、1手読みで十分な筈でしょ?
俺としては、深読みが有効なのは評価値にはランダムな誤差があって、
何段ものミニマックス探索がその誤差をフィルタリングする結果、
安定度の高い(評価誤差が少ない)局面を選択できるからだと思ってるんだよね。
今はパターンの重みを決める時とかは、結果的にそのパターンが現れた時の
最終的な石差の平均値に収束するように決めてるでしょ?
でも、実際にはそのパターンが現れた時に勝つこともあれば負けることもある。
勝てる局面で下手をして負けるってこともあるけど、
実はそうではなくて、そのパターンを含む局面は本質的に不安定なのかもしれない。
と、考えてみると安定度というパラメータが見えてくる。
パターンAは50%は大負けで50%は大勝だとすると
普通に学習させるとこのパターンは勝ち負けに影響しないと判断されて重みは0になる。
10%は僅差負けで90%は大勝のパターンBと100%僅差勝ちのパターンCでは、
10%は僅差で負けるパターンBの重みの方が大きくなるのが普通だよね?
それで良いんだろうか?ってこと。
これらのパターンが選択可能な時、より確実に勝ちたかったら、パターンCを選びたいよね?
安定度っていうのはそういうこと。
今の評価関数にはこういうのが入っていないと思う。
399:デフォルトの名無しさん
08/08/07 02:53:31
>>398
評価関数が正確なら1手読みで十分だけれど、
逆に、
局面が最後まで読めるのなら
評価関数は石数を数えるだけで良いと考えると
読みの深さを増やすほど強くなりそうなことがわかる
だから、評価関数を正確にすることだけではなく
計算速度が速い評価関数が使われてるんだ。
>今はパターンの重みを決める時とかは、結果的にそのパターンが現れた時の
>最終的な石差の平均値に収束するように決めてるでしょ?
評価にMinimaxが使われているのだから、
評価関数のスコアも平均値ではなくて、
自分、相手が共に評価関数の決める最善手を指したときのスコアに
近づくようになってると思う。
だから
>パターンAは50%は大負けで50%は大勝だとすると
>普通に学習させるとこのパターンは勝ち負けに影響しないと判断されて重みは0になる。
>10%は僅差負けで90%は大勝のパターンBと100%僅差勝ちのパターンCでは、
>10%は僅差で負けるパターンBの重みの方が大きくなるのが普通だよね?
こんな風に勝率で評価関数を決めていないと思うんだが。
もし、そのやり方に沿って決めるなら
Minimax法が使えなさそう。
400:デフォルトの名無しさん
08/08/08 02:15:55
>>399
評価関数が局面から一定の値を導出するのであれば(極端な話、ハッシュ関数でも)
AIとしての強弱はともかくMinimax法は使える。
401:デフォルトの名無しさん
08/08/08 20:50:29
>Minimax法は使える
はぁ?
402:デフォルトの名無しさん
08/08/08 23:45:00
ひぃ?
403:デフォルトの名無しさん
08/08/09 00:13:50
ふぅ。
404:デフォルトの名無しさん
08/08/09 01:26:46
へぇ・・・
405:デフォルトの名無しさん
08/08/09 02:06:45
hint : static evaluation function, heuristic evaluation function
406:デフォルトの名無しさん
08/08/09 09:09:26
Minimaxを使う目的を分かってない人が混ざってるようだ
407:デフォルトの名無しさん
08/08/09 13:31:15
雑魚が混ざってきたか
408:デフォルトの名無しさん
08/08/11 02:16:50
URLリンク(slashdot.jp)
409:デフォルトの名無しさん
08/08/11 09:37:27
>勝つ可能性が一番高い動きを取り続けた。まるで機械のようだった
ワロタ
410:デフォルトの名無しさん
08/08/12 12:20:09
ミニマックスとアルファベータの違いがわからん
>>366に枝狩りの処理を入れたらアルファベータ?
どうでもいいけど評価値得てないよ・・・ minとmaxをアホみたいに
引っくり返してるアホ関数だなそれはw
411:デフォルトの名無しさん
08/10/20 02:17:59
age
412:デフォルトの名無しさん
08/12/04 20:42:21
ほす
413:デフォルトの名無しさん
08/12/05 12:29:18
読む->引き分けか勝ちが出る
優先順位に置く
完成
414:デフォルトの名無しさん
08/12/06 16:57:36
>>374
>もう世界一のプロが敗北してだいぶ経つんだし強さはもういらないだろ。
勝ち切る手のDB出来ちゃったからな
>あとは人間との対局で統計データを取りながら
>自動的にぎりぎりの強さで負けるような
>ナチュラルな強さ調整機能をつけてくれ。
序盤20手:大負けしない手を打つ
中盤20手:引き分けか2手差で負けるくらいの手を打つ
終盤20手:全力で勝ちに行く
このくらいでナチュラルに強い打ち手になると思うけど
415:デフォルトの名無しさん
08/12/06 16:58:56
2手差->2石差
すまんこ
416:名無し
08/12/25 01:19:00
オセロ懐かしい
父親が森田オセロ(8bitパソコン)より強いヤツをめざして、ORや多次元尺度など色んな手法を試していたな。
417:デフォルトの名無しさん
08/12/26 15:13:51
プログラム作成者の能力以上の強さにはならない件
418:デフォルトの名無しさん
08/12/26 22:34:13
関係ない書き込みばっかで本題が全く進行してねぇw
419:デフォルトの名無しさん
08/12/30 23:36:12
URLリンク(down11.ddo.jp)
420:デフォルトの名無しさん
08/12/31 01:16:31
>>419
NetBSD/MIPSだが、動かないぞ。
421:デフォルトの名無しさん
08/12/31 01:35:47
ソースは無し?
422:デフォルトの名無しさん
08/12/31 08:00:33
思考ルーチン以外のところは終わっているテンプレートオセロプログラムってあるの?
ないにしても、どういうテンプレートにしておけば組み込みやすいのだろうか?
データ構造とか、必要な関数とか、それらの関係性とか。
前に(学部でC++習ったときのプロジェクト)オセロ作ったことあるんだけど、
今見ると、この構成じゃ、思考ルーチンいれにくいなぁと思ったのであります。
423:デフォルトの名無しさん
08/12/31 12:13:57
URLリンク(www.vector.co.jp)
424:デフォルトの名無しさん
08/12/31 12:42:09
>>417
技術的にはそうだけど実際の強さは自分より強い物が作れるだろ
第一技術的に高度な物が強くなるとは限らないし
425:デフォルトの名無しさん
08/12/31 12:44:05
チェスのチャンピオンに勝ったプログラムだって
プログラマがチャンピオンより強かったわけじゃないしな。
426:424
08/12/31 12:45:25
例え話をすると素数を出すプログラムを作った人がその素数をそこまで数え上げられるわけじゃないだろ?
そういうこと
427:デフォルトの名無しさん
08/12/31 19:22:26
神の一手に一番近いのはプログラムかもしれないな
428:デフォルトの名無しさん
08/12/31 22:56:49
何を今更
429:デフォルトの名無しさん
09/01/01 00:34:42
Googleの社員の個人情報がググれるみたいなもんか
430:デフォルトの名無しさん
09/01/03 20:27:48
>>422
あらかじめ独立化することを考えておかないと、修正は難しいだろうね
どうせなら思考部分を別プロセスにすると、プログラム同士で対戦とか
簡単に出来て面白そう
Windowsだとoverhead大きいかな
431:デフォルトの名無しさん
09/01/03 21:08:14
最後の行関係ない
432:デフォルトの名無しさん
09/01/06 15:41:18
>>422
チェスのChess Engine Communication Protocolみたいに規格を決めればいいんじゃねえの。
参照:URLリンク(www.tim-mann.org)
433:デフォルトの名無しさん
09/01/06 16:19:31
オセロで他のプログラムと対局するのは
GGSっていうサーバを介するのが一般的
434:デフォルトの名無しさん
09/01/06 16:57:04
「神の一手は誰でも打てる。2手目以降の全てが平凡なのだ」 ―俺俺
435:デフォルトの名無しさん
09/01/14 20:53:49
第二法だが、コマンドを打つ。
光学的なコマンドを打つ。
光学的なコマンドを打つ。
物理段差という肉体計算の処理です。
この手の光線にきづかないように。
1+x+x+1+a+x+x+a+x+x+a+a+a+a+a+a+1+a+a+a+a+a+a+a+a+a+a+a+a+a+a
+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a
+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a
+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a
+a+a+a+a+a+a+a+a+a+a+a+a+a a 1
436:デフォルトの名無しさん
09/01/14 20:54:56
>>453はこのスレッドのオセロの作者です。
437:デフォルトの名無しさん
09/01/14 20:56:06
上記更新
>>453は>>423のオセロの作者です。
438:デフォルトの名無しさん
09/01/14 20:57:09
上記更新
>>453は>>423のオセロの作者によるものです。
439:デフォルトの名無しさん
09/01/14 21:00:29
上記更新
>>453は>>422のオセロの作者によるのです。
440:デフォルトの名無しさん
09/01/14 21:01:47
>>453は>>422のオセロの作者によるものです。
上記更新
441:デフォルトの名無しさん
09/01/14 21:02:37
脳が無くなった。
442:デフォルトの名無しさん
09/01/14 22:15:20
>>453
おいおい、まじかよ。冗談じゃないぜ。