昨日はランダムAIを作った。
今日はもうちょいマシな思考ルーチンを作る。
貪欲AI
すぐに思いつくのは、可能な手をそれぞれ実行してみて、その中で一番よさそうな手を選ぶというもの。
「選択肢の中からとりあえず一番いいものを選ぶ」というのを「貪欲法」と呼ぶけど、近似アルゴリズムでは意外とこの貪欲法がいい手段の場合も多かったりする。
今回は、自分の色が勝ちなら100点、自分の色が負けなら-100点、そうでなければ(自分の色の数 - 相手の色の数)を盤面の評価として、貪欲法を実装してみた。
#!/usr/bin/env ruby require_relative "board" require_relative "game" module YWF class GreedyCom def initialize(color) @color = color @opponent = (color == Board::BLACK) ? Board::WHITE : Board::BLACK end def select(board) current_select = nil current_select_value = -1000 board.legal_actions.each do |action| command, place = action new_board = case command when :pass board.pass when :play board.play(*place) when :change board.change(*place) end new_board_value = calculate_board_value(new_board) if new_board_value > current_select_value current_select = action current_select_value = new_board_value end end puts "#{current_select[0].to_s} #{current_select[1]}." current_select.flatten end private def calculate_board_value(board) if board.win?(@color) 100 elsif board.win?(@opponent) -100 else board.count(@color) - board.count(@opponent) end end end end if __FILE__ == $PROGRAM_NAME include YWF black_player = GreedyCom.new(Board::BLACK) white_player = GreedyCom.new(Board::WHITE) game = Game.new(black_player, white_player) game.start end
見ての通り、やっているのは、可能な手を実際に試してみて、よりいい手が見つかったらそれを覚えておくようにして、最終的に見つかった一番いい手を選ぶというだけ。
実行例
実行すると、以下のようになる。
[001] turn: O, token: - 1 2 3 4 5 6 7 8 9 +---+---+---+---+---+---+---+---+---+ 1 | | | | | | | | | | +---+---+---+---+---+---+---+---+---+ 2 | | | | | | | | | | +---+---+---+---+---+---+---+---+---+ 3 | | | | | | | | | | +---+---+---+---+---+---+---+---+---+ 4 | | | | - | O | X | | | | +---+---+---+---+---+---+---+---+---+ 5 | | | | X | - | O | | | | +---+---+---+---+---+---+---+---+---+ 6 | | | | O | X | - | | | | +---+---+---+---+---+---+---+---+---+ 7 | | | | | | | | | | +---+---+---+---+---+---+---+---+---+ 8 | | | | | | | | | | +---+---+---+---+---+---+---+---+---+ 9 | | | | | | | | | | +---+---+---+---+---+---+---+---+---+ play [3, 4]. [002] turn: X, token: - 1 2 3 4 5 6 7 8 9 +---+---+---+---+---+---+---+---+---+ 1 | | | | | | | | | | +---+---+---+---+---+---+---+---+---+ 2 | | | | | | | | | | +---+---+---+---+---+---+---+---+---+ 3 | | | | O | | | | | | +---+---+---+---+---+---+---+---+---+ 4 | | | | O | O | X | | | | +---+---+---+---+---+---+---+---+---+ 5 | | | | - | - | O | | | | +---+---+---+---+---+---+---+---+---+ 6 | | | | O | X | - | | | | +---+---+---+---+---+---+---+---+---+ 7 | | | | | | | | | | +---+---+---+---+---+---+---+---+---+ 8 | | | | | | | | | | +---+---+---+---+---+---+---+---+---+ 9 | | | | | | | | | | +---+---+---+---+---+---+---+---+---+ play [4, 3]. [003] turn: O, token: - 1 2 3 4 5 6 7 8 9 +---+---+---+---+---+---+---+---+---+ 1 | | | | | | | | | | +---+---+---+---+---+---+---+---+---+ 2 | | | | | | | | | | +---+---+---+---+---+---+---+---+---+ 3 | | | | O | | | | | | +---+---+---+---+---+---+---+---+---+ 4 | | | X | - | - | X | | | | +---+---+---+---+---+---+---+---+---+ 5 | | | | X | - | O | | | | +---+---+---+---+---+---+---+---+---+ 6 | | | | O | X | - | | | | +---+---+---+---+---+---+---+---+---+ 7 | | | | | | | | | | +---+---+---+---+---+---+---+---+---+ 8 | | | | | | | | | | +---+---+---+---+---+---+---+---+---+ 9 | | | | | | | | | | +---+---+---+---+---+---+---+---+---+ play [3, 7]. [004] turn: X, token: - 1 2 3 4 5 6 7 8 9 +---+---+---+---+---+---+---+---+---+ 1 | | | | | | | | | | +---+---+---+---+---+---+---+---+---+ 2 | | | | | | | | | | +---+---+---+---+---+---+---+---+---+ 3 | | | | O | | | O | | | +---+---+---+---+---+---+---+---+---+ 4 | | | X | - | - | - | | | | +---+---+---+---+---+---+---+---+---+ 5 | | | | X | O | O | | | | +---+---+---+---+---+---+---+---+---+ 6 | | | | O | X | - | | | | +---+---+---+---+---+---+---+---+---+ 7 | | | | | | | | | | +---+---+---+---+---+---+---+---+---+ 8 | | | | | | | | | | +---+---+---+---+---+---+---+---+---+ 9 | | | | | | | | | | +---+---+---+---+---+---+---+---+---+ play [4, 7]. [005] turn: O, token: - 1 2 3 4 5 6 7 8 9 +---+---+---+---+---+---+---+---+---+ 1 | | | | | | | | | | +---+---+---+---+---+---+---+---+---+ 2 | | | | | | | | | | +---+---+---+---+---+---+---+---+---+ 3 | | | | O | | | O | | | +---+---+---+---+---+---+---+---+---+ 4 | | | X | X | X | X | X | | | +---+---+---+---+---+---+---+---+---+ 5 | | | | X | O | - | | | | +---+---+---+---+---+---+---+---+---+ 6 | | | | O | X | - | | | | +---+---+---+---+---+---+---+---+---+ 7 | | | | | | | | | | +---+---+---+---+---+---+---+---+---+ 8 | | | | | | | | | | +---+---+---+---+---+---+---+---+---+ 9 | | | | | | | | | | +---+---+---+---+---+---+---+---+---+ play [6, 7]. [006] turn: X, token: - 1 2 3 4 5 6 7 8 9 +---+---+---+---+---+---+---+---+---+ 1 | | | | | | | | | | +---+---+---+---+---+---+---+---+---+ 2 | | | | | | | | | | +---+---+---+---+---+---+---+---+---+ 3 | | | | O | | | O | | | +---+---+---+---+---+---+---+---+---+ 4 | | | X | X | - | X | X | | | +---+---+---+---+---+---+---+---+---+ 5 | | | | X | O | O | | | | +---+---+---+---+---+---+---+---+---+ 6 | | | | O | - | O | O | | | +---+---+---+---+---+---+---+---+---+ 7 | | | | | | | | | | +---+---+---+---+---+---+---+---+---+ 8 | | | | | | | | | | +---+---+---+---+---+---+---+---+---+ 9 | | | | | | | | | | +---+---+---+---+---+---+---+---+---+ play [7, 4]. [007] turn: O, token: - 1 2 3 4 5 6 7 8 9 +---+---+---+---+---+---+---+---+---+ 1 | | | | | | | | | | +---+---+---+---+---+---+---+---+---+ 2 | | | | | | | | | | +---+---+---+---+---+---+---+---+---+ 3 | | | | O | | | O | | | +---+---+---+---+---+---+---+---+---+ 4 | | | X | X | - | X | X | | | +---+---+---+---+---+---+---+---+---+ 5 | | | | X | O | - | | | | +---+---+---+---+---+---+---+---+---+ 6 | | | | - | X | O | O | | | +---+---+---+---+---+---+---+---+---+ 7 | | | | X | | | | | | +---+---+---+---+---+---+---+---+---+ 8 | | | | | | | | | | +---+---+---+---+---+---+---+---+---+ 9 | | | | | | | | | | +---+---+---+---+---+---+---+---+---+ play [8, 4]. [008] turn: X, token: - 1 2 3 4 5 6 7 8 9 +---+---+---+---+---+---+---+---+---+ 1 | | | | | | | | | | +---+---+---+---+---+---+---+---+---+ 2 | | | | | | | | | | +---+---+---+---+---+---+---+---+---+ 3 | | | | O | | | O | | | +---+---+---+---+---+---+---+---+---+ 4 | | | X | - | - | X | X | | | +---+---+---+---+---+---+---+---+---+ 5 | | | | - | O | - | | | | +---+---+---+---+---+---+---+---+---+ 6 | | | | O | X | O | O | | | +---+---+---+---+---+---+---+---+---+ 7 | | | | - | | | | | | +---+---+---+---+---+---+---+---+---+ 8 | | | | O | | | | | | +---+---+---+---+---+---+---+---+---+ 9 | | | | | | | | | | +---+---+---+---+---+---+---+---+---+ play [3, 5]. [009] turn: O, token: - 1 2 3 4 5 6 7 8 9 +---+---+---+---+---+---+---+---+---+ 1 | | | | | | | | | | +---+---+---+---+---+---+---+---+---+ 2 | | | | | | | | | | +---+---+---+---+---+---+---+---+---+ 3 | | | | O | X | | O | | | +---+---+---+---+---+---+---+---+---+ 4 | | | X | - | X | X | X | | | +---+---+---+---+---+---+---+---+---+ 5 | | | | - | - | - | | | | +---+---+---+---+---+---+---+---+---+ 6 | | | | O | X | O | O | | | +---+---+---+---+---+---+---+---+---+ 7 | | | | - | | | | | | +---+---+---+---+---+---+---+---+---+ 8 | | | | O | | | | | | +---+---+---+---+---+---+---+---+---+ 9 | | | | | | | | | | +---+---+---+---+---+---+---+---+---+ play [3, 6]. [010] turn: X, token: - 1 2 3 4 5 6 7 8 9 +---+---+---+---+---+---+---+---+---+ 1 | | | | | | | | | | +---+---+---+---+---+---+---+---+---+ 2 | | | | | | | | | | +---+---+---+---+---+---+---+---+---+ 3 | | | | O | - | O | O | | | +---+---+---+---+---+---+---+---+---+ 4 | | | X | - | X | - | X | | | +---+---+---+---+---+---+---+---+---+ 5 | | | | - | - | O | | | | +---+---+---+---+---+---+---+---+---+ 6 | | | | O | X | O | O | | | +---+---+---+---+---+---+---+---+---+ 7 | | | | - | | | | | | +---+---+---+---+---+---+---+---+---+ 8 | | | | O | | | | | | +---+---+---+---+---+---+---+---+---+ 9 | | | | | | | | | | +---+---+---+---+---+---+---+---+---+ play [2, 5]. 〜長いので省略〜 [191] turn: O, token: O 1 2 3 4 5 6 7 8 9 +---+---+---+---+---+---+---+---+---+ 1 | O | O | O | X | X | X | X | O | O | +---+---+---+---+---+---+---+---+---+ 2 | O | O | O | X | X | X | X | O | O | +---+---+---+---+---+---+---+---+---+ 3 | O | O | O | X | X | X | O | O | O | +---+---+---+---+---+---+---+---+---+ 4 | O | O | - | - | - | O | X | O | - | +---+---+---+---+---+---+---+---+---+ 5 | O | X | O | X | O | - | - | O | O | +---+---+---+---+---+---+---+---+---+ 6 | X | X | X | - | - | - | X | X | X | +---+---+---+---+---+---+---+---+---+ 7 | X | X | O | - | - | X | O | O | X | +---+---+---+---+---+---+---+---+---+ 8 | X | X | O | X | O | O | X | O | - | +---+---+---+---+---+---+---+---+---+ 9 | | | X | X | X | X | X | X | X | +---+---+---+---+---+---+---+---+---+ change [5, 6]. [192] turn: X, token: - 1 2 3 4 5 6 7 8 9 +---+---+---+---+---+---+---+---+---+ 1 | O | O | O | X | X | X | X | O | O | +---+---+---+---+---+---+---+---+---+ 2 | O | O | O | X | X | X | X | O | O | +---+---+---+---+---+---+---+---+---+ 3 | O | O | O | - | X | X | O | O | O | +---+---+---+---+---+---+---+---+---+ 4 | O | O | - | - | O | O | - | O | - | +---+---+---+---+---+---+---+---+---+ 5 | O | X | O | X | O | O | O | O | O | +---+---+---+---+---+---+---+---+---+ 6 | X | X | X | - | O | O | - | X | X | +---+---+---+---+---+---+---+---+---+ 7 | X | X | O | O | - | - | O | O | X | +---+---+---+---+---+---+---+---+---+ 8 | X | X | O | X | O | O | X | O | - | +---+---+---+---+---+---+---+---+---+ 9 | | | X | X | X | X | X | X | X | +---+---+---+---+---+---+---+---+---+ change [7, 6]. [193] turn: O, token: O 1 2 3 4 5 6 7 8 9 +---+---+---+---+---+---+---+---+---+ 1 | O | O | O | X | X | X | X | O | O | +---+---+---+---+---+---+---+---+---+ 2 | O | O | O | X | X | X | X | O | O | +---+---+---+---+---+---+---+---+---+ 3 | O | O | O | - | X | X | O | O | O | +---+---+---+---+---+---+---+---+---+ 4 | O | O | - | - | O | - | - | O | - | +---+---+---+---+---+---+---+---+---+ 5 | O | X | O | X | O | - | O | O | O | +---+---+---+---+---+---+---+---+---+ 6 | X | X | X | - | - | - | - | X | X | +---+---+---+---+---+---+---+---+---+ 7 | X | X | - | - | X | X | - | - | X | +---+---+---+---+---+---+---+---+---+ 8 | X | X | O | X | - | - | X | O | - | +---+---+---+---+---+---+---+---+---+ 9 | | | X | X | X | X | X | X | X | +---+---+---+---+---+---+---+---+---+ change [8, 5]. [194] turn: X, token: - 1 2 3 4 5 6 7 8 9 +---+---+---+---+---+---+---+---+---+ 1 | O | O | O | X | X | X | X | O | O | +---+---+---+---+---+---+---+---+---+ 2 | O | O | O | X | X | X | X | O | O | +---+---+---+---+---+---+---+---+---+ 3 | O | O | O | - | X | X | O | O | O | +---+---+---+---+---+---+---+---+---+ 4 | O | O | - | - | O | - | - | O | - | +---+---+---+---+---+---+---+---+---+ 5 | O | - | O | X | O | - | O | O | O | +---+---+---+---+---+---+---+---+---+ 6 | X | X | - | - | O | - | O | X | X | +---+---+---+---+---+---+---+---+---+ 7 | X | X | - | O | - | - | - | - | X | +---+---+---+---+---+---+---+---+---+ 8 | X | X | O | - | O | O | - | O | - | +---+---+---+---+---+---+---+---+---+ 9 | | | X | X | X | X | X | X | X | +---+---+---+---+---+---+---+---+---+ change [6, 6]. [195] turn: O, token: O 1 2 3 4 5 6 7 8 9 +---+---+---+---+---+---+---+---+---+ 1 | O | O | O | X | X | X | X | O | O | +---+---+---+---+---+---+---+---+---+ 2 | O | O | O | X | X | X | X | O | O | +---+---+---+---+---+---+---+---+---+ 3 | O | O | O | - | X | X | O | O | O | +---+---+---+---+---+---+---+---+---+ 4 | O | O | - | - | O | X | - | O | - | +---+---+---+---+---+---+---+---+---+ 5 | O | - | O | X | O | X | O | O | O | +---+---+---+---+---+---+---+---+---+ 6 | X | X | X | X | - | X | - | X | X | +---+---+---+---+---+---+---+---+---+ 7 | X | X | - | O | X | X | X | - | X | +---+---+---+---+---+---+---+---+---+ 8 | X | X | O | X | O | - | - | - | - | +---+---+---+---+---+---+---+---+---+ 9 | | | X | X | X | X | X | X | X | +---+---+---+---+---+---+---+---+---+ change [8, 9]. [196] turn: X, token: - 1 2 3 4 5 6 7 8 9 +---+---+---+---+---+---+---+---+---+ 1 | O | O | O | X | X | X | X | O | O | +---+---+---+---+---+---+---+---+---+ 2 | O | O | O | X | X | X | X | O | O | +---+---+---+---+---+---+---+---+---+ 3 | O | O | O | - | X | X | O | O | O | +---+---+---+---+---+---+---+---+---+ 4 | O | O | - | - | O | X | - | O | - | +---+---+---+---+---+---+---+---+---+ 5 | O | - | O | X | O | - | O | O | O | +---+---+---+---+---+---+---+---+---+ 6 | X | X | X | X | - | X | O | X | - | +---+---+---+---+---+---+---+---+---+ 7 | X | X | - | O | X | X | X | O | - | +---+---+---+---+---+---+---+---+---+ 8 | X | X | O | X | O | O | O | O | O | +---+---+---+---+---+---+---+---+---+ 9 | | | X | X | X | X | X | X | X | +---+---+---+---+---+---+---+---+---+ change [4, 9]. [197] turn: O, token: O 1 2 3 4 5 6 7 8 9 +---+---+---+---+---+---+---+---+---+ 1 | O | O | O | X | X | X | X | O | O | +---+---+---+---+---+---+---+---+---+ 2 | O | O | O | X | X | X | X | O | O | +---+---+---+---+---+---+---+---+---+ 3 | O | O | O | - | X | X | O | - | O | +---+---+---+---+---+---+---+---+---+ 4 | O | O | - | - | O | X | X | - | X | +---+---+---+---+---+---+---+---+---+ 5 | O | - | O | X | O | - | O | - | - | +---+---+---+---+---+---+---+---+---+ 6 | X | X | X | X | - | X | - | X | X | +---+---+---+---+---+---+---+---+---+ 7 | X | X | - | O | X | X | X | O | X | +---+---+---+---+---+---+---+---+---+ 8 | X | X | O | X | O | O | O | O | - | +---+---+---+---+---+---+---+---+---+ 9 | | | X | X | X | X | X | X | X | +---+---+---+---+---+---+---+---+---+ change [6, 5]. [198] turn: X, token: - 1 2 3 4 5 6 7 8 9 +---+---+---+---+---+---+---+---+---+ 1 | O | O | O | X | X | X | X | O | O | +---+---+---+---+---+---+---+---+---+ 2 | O | O | O | X | X | X | X | O | O | +---+---+---+---+---+---+---+---+---+ 3 | O | O | O | - | X | X | O | O | O | +---+---+---+---+---+---+---+---+---+ 4 | O | O | O | - | O | X | - | - | X | +---+---+---+---+---+---+---+---+---+ 5 | O | - | O | - | O | O | O | - | - | +---+---+---+---+---+---+---+---+---+ 6 | X | X | X | X | O | X | - | X | X | +---+---+---+---+---+---+---+---+---+ 7 | X | X | - | O | - | - | X | O | X | +---+---+---+---+---+---+---+---+---+ 8 | X | X | O | X | O | O | O | O | - | +---+---+---+---+---+---+---+---+---+ 9 | | | X | X | X | X | X | X | X | +---+---+---+---+---+---+---+---+---+ change [7, 5]. [199] turn: O, token: O 1 2 3 4 5 6 7 8 9 +---+---+---+---+---+---+---+---+---+ 1 | O | O | O | X | X | X | X | O | O | +---+---+---+---+---+---+---+---+---+ 2 | O | O | O | X | X | X | X | O | O | +---+---+---+---+---+---+---+---+---+ 3 | O | O | O | - | X | X | O | O | O | +---+---+---+---+---+---+---+---+---+ 4 | O | O | O | - | - | X | - | - | X | +---+---+---+---+---+---+---+---+---+ 5 | O | - | O | - | - | O | O | - | - | +---+---+---+---+---+---+---+---+---+ 6 | X | X | X | X | - | X | - | X | X | +---+---+---+---+---+---+---+---+---+ 7 | X | X | X | - | X | X | X | O | X | +---+---+---+---+---+---+---+---+---+ 8 | X | X | O | X | - | - | O | O | - | +---+---+---+---+---+---+---+---+---+ 9 | | | X | X | X | X | X | X | X | +---+---+---+---+---+---+---+---+---+ play [9, 1]. [200] turn: X, token: O 1 2 3 4 5 6 7 8 9 +---+---+---+---+---+---+---+---+---+ 1 | O | O | O | X | X | X | X | O | O | +---+---+---+---+---+---+---+---+---+ 2 | O | O | O | X | X | X | X | O | O | +---+---+---+---+---+---+---+---+---+ 3 | O | O | O | - | X | X | O | O | O | +---+---+---+---+---+---+---+---+---+ 4 | O | O | O | - | - | - | - | - | X | +---+---+---+---+---+---+---+---+---+ 5 | O | - | O | - | O | O | O | - | - | +---+---+---+---+---+---+---+---+---+ 6 | - | X | X | - | - | X | - | X | X | +---+---+---+---+---+---+---+---+---+ 7 | - | X | - | - | X | X | X | O | X | +---+---+---+---+---+---+---+---+---+ 8 | - | - | O | X | - | - | O | O | - | +---+---+---+---+---+---+---+---+---+ 9 | O | | X | X | X | X | X | X | X | +---+---+---+---+---+---+---+---+---+ play [9, 2]. [201] turn: O, token: O 1 2 3 4 5 6 7 8 9 +---+---+---+---+---+---+---+---+---+ 1 | O | O | O | X | X | X | X | O | O | +---+---+---+---+---+---+---+---+---+ 2 | O | O | O | X | X | X | X | O | O | +---+---+---+---+---+---+---+---+---+ 3 | O | O | O | - | X | X | O | O | O | +---+---+---+---+---+---+---+---+---+ 4 | O | O | O | - | - | - | - | - | X | +---+---+---+---+---+---+---+---+---+ 5 | O | - | O | - | O | O | O | - | - | +---+---+---+---+---+---+---+---+---+ 6 | - | X | X | - | - | X | - | X | X | +---+---+---+---+---+---+---+---+---+ 7 | - | X | - | - | X | X | X | O | X | +---+---+---+---+---+---+---+---+---+ 8 | - | X | O | X | - | - | O | O | - | +---+---+---+---+---+---+---+---+---+ 9 | O | X | X | X | X | X | X | X | X | +---+---+---+---+---+---+---+---+---+ ---------- black: 29, white: 31 X win.
なんと、201手!
すごく捻りあいが続く感じ。
ランダムAIとの対戦成績
試しにランダムAIと100回ずつ戦わせてみると、次のような戦績。
黒 | 白 | 黒の勝ち数 | 白の勝ち数 | 貪欲AIの勝率 |
---|---|---|---|---|
貪欲AI | ランダムAI | 92 | 8 | 92% |
ランダムAI | 貪欲AI | 4 | 96 | 96% |
このように、ランダムな選択に比べて90%強勝てることが分かる。
いい感じ。
でも、さらに強くすることを目指す。
今日はここまで!