[表示 : 全て 最新50 1-99 101- 201- 301- 401- 2chのread.cgiへ]
Update time : 05/09 22:06 / Filesize : 112 KB / Number-of Response : 443
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C言語で素晴らしいオセロを作らないか?



1 名前:デフォルトの名無しさん mailto:sage [04/06/23 17:34]
素晴らしいものだぞ

352 名前:デフォルトの名無しさん [2008/01/16(水) 03:59:48 ]
オセロ作るのにスタックを用いてるソース等見るのですが
スタックのがいいのですかね?

353 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 04:06:50 ]
すいませんageてしまった

354 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 05:47:39 ]
>>352
スタックを用いるといいのは盤面をintか何かの配列で表現するとき。
bit boardで表現するときは盤面全体をコピーしたほうがいいからスタックは不要。

355 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 06:04:20 ]
>>354
配列で表現してみた方が自分にはイメージしやすいので、スタックを考慮して考えてみる事にします
レスありがとうございました!

356 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 02:47:48 ]
論理的にしらみつぶしで先読みするタイプのものではなく
実際に対戦してみて経験を積むようなプログラムって
どのように書けばよいのでしょうか

357 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 05:09:44 ]
>>356
強化学習が当てはまるけど
それぞれ独立した手法で通常は併用されるもの

358 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 05:40:58 ]
強化学習はの実装はこれがわかりやすい
www.vector.co.jp/soft/winnt/game/se415793.html

359 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 10:03:16 ]
宣伝乙

360 名前:デフォルトの名無しさん [2008/01/21(月) 01:25:32 ]
Cプログラマ必須テキスト!

mori.eco.to/




361 名前:デフォルトの名無しさん [2008/01/23(水) 00:02:55 ]
強化学習面白いな
確かHeraklesも使ってるんだっけ

362 名前:デフォルトの名無しさん [2008/01/27(日) 06:19:42 ]
AIを実装しようと挑戦中なのですが、MiniMax法について質問させて頂きます。

先手、後手ともに最善の手を取った場合を数手先読みし最善の場所を
決めるのがMiniMax法ですよね?
いざ実装してみようと試みたのですが最善手を評価する際のMAXとMIN
を以下のようにしたのですが、このようなやり方はダメな例ですか?

まずBord[10][10]というメインとなるボードと、それとは別に8*8の盤面にあらかじめ
数値を入れた盤面 (この数値の差分から数手先の最善手を決める) を用意しようと
考えています。

363 名前:362 mailto:sage [2008/01/27(日) 06:37:24 ]
すいません何言ってるか分からないですよね。とりあえず>>362の方法で作ってみます
その上でどうか尋ねてみます。

364 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 09:43:00 ]
MinMax法やばす・・・難しすぎるんだけど
とりあえずMiniMax法を作る上でのコツか何かありませんか

365 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 10:44:34 ]
NegMax の方が実装は楽だが,minmax が作れないんじゃ一緒だろうねぇ.肝の部分は再帰使って数行で書けるんだけど.
プログラム例が載ってる本でも買えば?

366 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 11:30:57 ]
>>365
ネット上の読み物で出来たらいいんですが、買うことを考えるべきですかね・・・
>>366みてみるとundoとかいう機能を作りずらい作りになってしまっている予感です
ネット上の拾いものからその行程が出来ないか試してみます
参考例ありがとうございました

368 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 15:40:51 ]
書籍購入を躊躇うようなら、その程度ってこった。

369 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 15:46:51 ]
NegaMax、MinMaxくらいならネットの説明だけでも十分すぎる。
まじで。

370 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 19:03:38 ]
先手黒から見た評価関数の一部の例
>>366での
for (i = 0; i < n; i++) {
move (i);
v = -minmax (-max, -min);
undo ();
の部分だと思います
─────────────────────────────────────────
/* ネット上の拾いものの解説 */
while( 打てる手がある ){

  @手を差して次の盤面を作る;

  Aval = minimax( 盤面, depth - 1 );       一手先を読む再帰。3手まで読んでみるつもり

  B盤面を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]に石が置けるならひっくり返してみる
        ターンを次にする;
        色を変える;
A       val = blackturn( &board , depth - 1 );

B問題点  ここの処理がスタックを用いておらず出来ません。通常どのように行って居るのでしょうか?
        長々と見ずらく申し訳ないですが伝わって頂ければ幸いです

372 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 19:56:38 ]
石を返せることが分かってから返す際に石を置いた場所と返した場所の情報スタックに記録しておく
返した場所の代わりに方向とそれぞれの方向で返した数を記録してもいい

373 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 20:26:17 ]
>>372
ネット上からスタックの例を見て条件満たせるよう作ってみます。
レスどうもありがとうございます!

374 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 20:26:47 ]
もう世界一のプロが敗北してだいぶ経つんだし強さはもういらないだろ。
あとは人間との対局で統計データを取りながら
自動的にぎりぎりの強さで負けるような
ナチュラルな強さ調整機能をつけてくれ。

375 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 20:28:11 ]
黙れ門外漢

376 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 22:15:23 ]
>>375
お前のことか?

377 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 23:05:05 ]
>>374>>376だよ(笑)

378 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 23:56:00 ]
と門外漢が申しております

379 名前:デフォルトの名無しさん [2008/01/28(月) 00:25:11 ]
お前らこういう言い合い好きなんか

380 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 04:15:18 ]
見るのも仕掛けるのも受けてたつのも好きだ



381 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 04:33:45 ]
まぁそれくらいしか能が無いしな
がんばれ

382 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 06:23:57 ]
石を返す処理って1方向ずつじゃないとダメっぽいんだな・・・
糞コード全開だぜ・・・

383 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 06:53:01 ]
>>372の続きでスタックの質問なのですが
石を返す”場所”をスタックに書き込む処理というのは

Board[x][y]というBoardがあったとしますよね。
f5という入力の場所の記録を行う場合には
f5という数値を入れるのでしょうか?
スタックには       

             ← スタックポイントがここ
方向
石の数
場所
方向
石の数
場所(F5)       1番最初のデータ

という風に入れればいいのでしょうか?

384 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 10:14:42 ]
>>383
これ無視して下さい。一から作り直すことにします

385 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 22:37:11 ]
>>380
可能です。
以上。
はい、次。

386 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 23:05:43 ]
誤爆か?

387 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 08:51:01 ]
>>386
最近の流行

388 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 09:00:18 ]
誤爆か?

389 名前:デフォルトの名無しさん [2008/03/23(日) 01:42:36 ]
あげ

390 名前:デフォルトの名無しさん [2008/06/19(木) 01:43:37 ]
再帰使わないで囲碁プログラムできないか?





391 名前:デフォルトの名無しさん mailto:sage [2008/06/19(木) 01:46:01 ]
できるよ

392 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 10:10:58 ]
つーか,囲碁でも将棋でも再帰は使わない方が普通だと思うが

393 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 10:14:20 ]
スレ違いなんだから話を引き伸ばすなよ



394 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 20:58:30 ]
アルファベータ検索とか再帰だろ

395 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 13:25:00 ]
概念的にはそうだが,実際は自分で管理してループにする方が普通
全データローカルスタックに取るわけにも行かないし

396 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 16:30:33 ]
>>394
×検索
○探索


397 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 03:03:57 ]
評価関数のパラメータに使う盤面の特徴量ってどんなのがありますか?
パターン、パリティ、クアッドパリティ、モビリティ、ポテンシャルモビリティ、他にあれば教えてください。
思いつきでもかまいませんので。


398 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 01:00:46 ]
思いつきとしては、安定度みたいなのがあっても良い気がする。

αβ探索で深読みすると浅読みで良手だったのが悪手になったりするでしょ?
これって、その局面を進めていくとそういう局面を発見するからだって考えがちだけど、
単純に考えれば、浅読みの評価値が間違っているとも言える訳で。
評価関数が、局面の善悪を出力するのなら、1手読みで十分な筈でしょ?

俺としては、深読みが有効なのは評価値にはランダムな誤差があって、
何段ものミニマックス探索がその誤差をフィルタリングする結果、
安定度の高い(評価誤差が少ない)局面を選択できるからだと思ってるんだよね。

今はパターンの重みを決める時とかは、結果的にそのパターンが現れた時の
最終的な石差の平均値に収束するように決めてるでしょ?
でも、実際にはそのパターンが現れた時に勝つこともあれば負けることもある。
勝てる局面で下手をして負けるってこともあるけど、
実はそうではなくて、そのパターンを含む局面は本質的に不安定なのかもしれない。
と、考えてみると安定度というパラメータが見えてくる。

パターンAは50%は大負けで50%は大勝だとすると
普通に学習させるとこのパターンは勝ち負けに影響しないと判断されて重みは0になる。
10%は僅差負けで90%は大勝のパターンBと100%僅差勝ちのパターンCでは、
10%は僅差で負けるパターンBの重みの方が大きくなるのが普通だよね?
それで良いんだろうか?ってこと。
これらのパターンが選択可能な時、より確実に勝ちたかったら、パターンCを選びたいよね?

安定度っていうのはそういうこと。
今の評価関数にはこういうのが入っていないと思う。


399 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 02:53:31 ]
>>398
評価関数が正確なら1手読みで十分だけれど、

逆に、
局面が最後まで読めるのなら
評価関数は石数を数えるだけで良いと考えると

読みの深さを増やすほど強くなりそうなことがわかる

だから、評価関数を正確にすることだけではなく
計算速度が速い評価関数が使われてるんだ。

>今はパターンの重みを決める時とかは、結果的にそのパターンが現れた時の
>最終的な石差の平均値に収束するように決めてるでしょ?

評価にMinimaxが使われているのだから、
評価関数のスコアも平均値ではなくて、
自分、相手が共に評価関数の決める最善手を指したときのスコアに
近づくようになってると思う。

だから

>パターンAは50%は大負けで50%は大勝だとすると
>普通に学習させるとこのパターンは勝ち負けに影響しないと判断されて重みは0になる。
>10%は僅差負けで90%は大勝のパターンBと100%僅差勝ちのパターンCでは、
>10%は僅差で負けるパターンBの重みの方が大きくなるのが普通だよね?

こんな風に勝率で評価関数を決めていないと思うんだが。

もし、そのやり方に沿って決めるなら
Minimax法が使えなさそう。

400 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 02:15:55 ]
>>399
評価関数が局面から一定の値を導出するのであれば(極端な話、ハッシュ関数でも)
AIとしての強弱はともかくMinimax法は使える。




401 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 20:50:29 ]
>Minimax法は使える
はぁ?

402 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 23:45:00 ]
ひぃ?

403 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 00:13:50 ]
ふぅ。

404 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 01:26:46 ]
へぇ・・・

405 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 02:06:45 ]
hint : static evaluation function, heuristic evaluation function


406 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 09:09:26 ]
Minimaxを使う目的を分かってない人が混ざってるようだ

407 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 13:31:15 ]
雑魚が混ざってきたか

408 名前:デフォルトの名無しさん [2008/08/11(月) 02:16:50 ]
slashdot.jp/article.pl?sid=08/08/09/2221200

409 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 09:37:27 ]
>勝つ可能性が一番高い動きを取り続けた。まるで機械のようだった

ワロタ

410 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 12:20:09 ]
ミニマックスとアルファベータの違いがわからん
>>366に枝狩りの処理を入れたらアルファベータ?

どうでもいいけど評価値得てないよ・・・ minとmaxをアホみたいに
引っくり返してるアホ関数だなそれはw



411 名前:デフォルトの名無しさん [2008/10/20(月) 02:17:59 ]
age

412 名前:デフォルトの名無しさん [2008/12/04(木) 20:42:21 ]
ほす

413 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 12:29:18 ]
読む->引き分けか勝ちが出る
優先順位に置く
完成

414 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 16:57:36 ]
>>374
>もう世界一のプロが敗北してだいぶ経つんだし強さはもういらないだろ。
勝ち切る手のDB出来ちゃったからな

>あとは人間との対局で統計データを取りながら
>自動的にぎりぎりの強さで負けるような
>ナチュラルな強さ調整機能をつけてくれ。
序盤20手:大負けしない手を打つ
中盤20手:引き分けか2手差で負けるくらいの手を打つ
終盤20手:全力で勝ちに行く

このくらいでナチュラルに強い打ち手になると思うけど

415 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 16:58:56 ]
2手差->2石差
すまんこ


416 名前:名無し mailto:(^_-) [2008/12/25(木) 01:19:00 ]
オセロ懐かしい
父親が森田オセロ(8bitパソコン)より強いヤツをめざして、ORや多次元尺度など色んな手法を試していたな。

417 名前:デフォルトの名無しさん mailto:sage [2008/12/26(金) 15:13:51 ]
プログラム作成者の能力以上の強さにはならない件

418 名前:デフォルトの名無しさん [2008/12/26(金) 22:34:13 ]
関係ない書き込みばっかで本題が全く進行してねぇw

419 名前:デフォルトの名無しさん mailto:sage [2008/12/30(火) 23:36:12 ]
down11.ddo.jp/uploader/download/1230647574.zip/attatch

420 名前:デフォルトの名無しさん [2008/12/31(水) 01:16:31 ]
>>419
NetBSD/MIPSだが、動かないぞ。



421 名前:デフォルトの名無しさん mailto:sage [2008/12/31(水) 01:35:47 ]
ソースは無し?

422 名前:デフォルトの名無しさん mailto:sage [2008/12/31(水) 08:00:33 ]
思考ルーチン以外のところは終わっているテンプレートオセロプログラムってあるの?
ないにしても、どういうテンプレートにしておけば組み込みやすいのだろうか?
データ構造とか、必要な関数とか、それらの関係性とか。
前に(学部でC++習ったときのプロジェクト)オセロ作ったことあるんだけど、
今見ると、この構成じゃ、思考ルーチンいれにくいなぁと思ったのであります。

423 名前:デフォルトの名無しさん mailto:sage [2008/12/31(水) 12:13:57 ]
www.vector.co.jp/vpack/browse/pickup/pw4/pw004827.html

424 名前:デフォルトの名無しさん [2008/12/31(水) 12:42:09 ]
>>417
技術的にはそうだけど実際の強さは自分より強い物が作れるだろ
第一技術的に高度な物が強くなるとは限らないし

425 名前:デフォルトの名無しさん mailto:sage [2008/12/31(水) 12:44:05 ]
チェスのチャンピオンに勝ったプログラムだって
プログラマがチャンピオンより強かったわけじゃないしな。

426 名前:424 [2008/12/31(水) 12:45:25 ]
例え話をすると素数を出すプログラムを作った人がその素数をそこまで数え上げられるわけじゃないだろ?
そういうこと

427 名前:デフォルトの名無しさん mailto:sage [2008/12/31(水) 19:22:26 ]
神の一手に一番近いのはプログラムかもしれないな

428 名前:デフォルトの名無しさん mailto:sage [2008/12/31(水) 22:56:49 ]
何を今更

429 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 00:34:42 ]
Googleの社員の個人情報がググれるみたいなもんか


430 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 20:27:48 ]
>>422
あらかじめ独立化することを考えておかないと、修正は難しいだろうね
どうせなら思考部分を別プロセスにすると、プログラム同士で対戦とか
簡単に出来て面白そう
Windowsだとoverhead大きいかな



431 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 21:08:14 ]
最後の行関係ない

432 名前:デフォルトの名無しさん [2009/01/06(火) 15:41:18 ]
>>422
チェスのChess Engine Communication Protocolみたいに規格を決めればいいんじゃねえの。
参照:www.tim-mann.org/xboard/engine-intf.html

433 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 16:19:31 ]
オセロで他のプログラムと対局するのは
GGSっていうサーバを介するのが一般的


434 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 16:57:04 ]
「神の一手は誰でも打てる。2手目以降の全てが平凡なのだ」 ――俺俺

435 名前:デフォルトの名無しさん [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/01/14(水) 20:54:56 ]
>>453はこのスレッドのオセロの作者です。

437 名前:デフォルトの名無しさん mailto:sage [2009/01/14(水) 20:56:06 ]
上記更新
>>453>>423のオセロの作者です。

438 名前:デフォルトの名無しさん mailto:sage [2009/01/14(水) 20:57:09 ]
上記更新
>>453>>423のオセロの作者によるものです。

439 名前:デフォルトの名無しさん mailto:sage [2009/01/14(水) 21:00:29 ]
上記更新
>>453>>422のオセロの作者によるのです。

440 名前:デフォルトの名無しさん mailto:sage [2009/01/14(水) 21:01:47 ]
>>453>>422のオセロの作者によるものです。
上記更新



441 名前:デフォルトの名無しさん mailto:sage [2009/01/14(水) 21:02:37 ]
脳が無くなった。

442 名前:デフォルトの名無しさん mailto:sage [2009/01/14(水) 22:15:20 ]
>>453
おいおい、まじかよ。冗談じゃないぜ。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<112KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef