質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

2回答

1122閲覧

三目並べ 人vs人 から 人vs CPU

DANNBU

総合スコア19

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

2クリップ

投稿2017/08/04 17:35

三目並べの人vs人のプログラムを完成させ、ここから人vs CPU に派生させたいと思っているのですが
いろいろサイトを調べてもどうしたらよいかわからずご教授願いたいです。

モンテカルロ法で強化学習をしたいと考えています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

CPUってそんな簡単にできるものじゃないんですよ。探索ってご存知ですか?ゲーム理論でいうゲーム木を用いたものなのですが、まずはそこを学んだ方が良いと思います。一つ一つ着実に行きましょう。

ボードゲームの思考アルゴリズムの入門

再帰関数として実装してやるのが一般的です。
あくまで一例です。色々な例外処理は抜けていますし省略も多いです。そこは自分で考えてください。

python

1def min_search(board,depth,target): 2 moves = generate_moves(board) 3 min_move = 1000000 4 if depth != target: 5 for move in moves: 6 value = max_search(update(move),depth+1,target) 7 if value < min_move: 8 min_move = value 9 else: 10 for move in moves: 11 value = evaluate_move(update(move)) 12 if value < min_move: 13 min_move = value 14 return min_move 15 16def max_search(board,depth,target): 17 moves = generate_moves(board) 18 max_move = -1000000 19 best_move = moves[0] 20 if depth != target: 21 moves = generate_moves(board) 22 for move in moves: 23 value = min_search(update(move),depth+1,target) 24 if value > max_move: 25 max_move = value 26 best_move = move 27 else: 28 for move in moves: 29 value = evaluate_move(update(move)) 30 if value > max_move: 31 max_move = value 32 best_move = move 33 return best_move if depth == 1 else max_move 34 35def min_max(target): 36 return max_search(board,1,target) 37 38if __name__ == '__main__': 39 best_move = min_max(5)#5手探索

投稿2017/08/04 18:50

編集2017/08/09 09:40
_Victorique__

総合スコア1392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

DANNBU

2017/08/04 19:13

読ませていただきました。 そのサイトの中にあるようにminimax法について勉強した方がよいでしょうか?
_Victorique__

2017/08/04 19:32

minimax法は探索の中でも基礎の基礎にあたる大事な部分ですのでそこから始めるのが妥当ですね。
DANNBU

2017/08/09 08:44

返信遅くなって申し訳ありません。 minimax法について調べていたアルゴリズムは理解できたのですが、 ここからコードに起こすとなるとイメージがつかめてない状況です・・・
DANNBU

2017/08/09 10:07

コード載せていただきありがとうございます。 このコードを読み解くことから始めてみます!
DANNBU

2017/08/10 08:14

すみません。 このコードでのboard と generate_movesは何を表しているのでしょうか?
_Victorique__

2017/08/10 09:25

それぞれ盤面、指し手の生成です。 関数の実装は省略しています。
DANNBU

2017/08/10 11:22

boardとはself.boardとまた別物ですか?? 指し手の生成というのがよくわからないんですが、碁を打ったときに打った場所の位置を保存するっていう感じの関数ですか??
_Victorique__

2017/08/10 11:29

ボードゲームにおける一般的な盤面の情報なので作りたいゲームの盤に当てはめてください。 5手読みなら ▲1手目 △2手目 ▲3手目 △4手目 ▲5手目 のように盤面を5手進めた後の盤面の評価を数字にします。generate_moveではその手番で考えうる全ての手を用意して全て調べます。なので手番で各50通りの指し方があった場合、50^5乗通りの盤面を調べることになります。 もう少しゲーム木について調べてください。
DANNBU

2017/09/16 08:51

かなり遅くなって申し訳ないです。 generate_movesとevaluate_moveの関数を新たに作らないとだめですよね?
_Victorique__

2017/09/17 06:58

そうです。 そこらへんは自分で頑張って実装してください。
DANNBU

2017/09/24 15:39

質問が多くなって申し訳ないです。 moves = generate_moves(board) for move in moves: このfor文の動きがいまいち理解できなくて...
guest

0

盤の大きさによりますが、まずはシンプルにminimaxやAlpha-Beta Pruningなど定番の探索アルゴリズムを幾つか実装してみるのはいかがでしょうか。

その過程で局面ごとの評価関数の実装方法や、ゲーム木探索時のクセが見えてくると思うので、アウトプットを強化学習にも活かせると思います。また複数のアルゴリズム同士を対戦させて評価過程を見たりするのも楽しいですよ。

投稿2017/08/04 18:42

shuntksh

総合スコア196

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

DANNBU

2017/08/04 19:11

私自身、そういった探索アルゴリズムに関してはまったく無知なのですが やはり実装するなら最初はminimaxとかから取り組むほうが良いですか?
shuntksh

2017/08/04 19:17

大学の授業などではゲーム木や探索について軽く触れたあと、MiniMaxから始めるのが定番だとおもいます。シンプルな総当りのアルゴリズムで実行が遅いですが、実装は楽です。おそらくDANNBUさんが一番苦戦するのは評価関数の実装でしょうか。_Victorique__さんの回答にある通り、入門書/サイトを探して一つづつ進めていくと良いと思いますよ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問