Ruby でリバーシ(オセロ)
昨日、Min-Max法で戦うプレイヤを作りましたが、評価関数を変えたらもっと強くなるんじゃないか?と思い、もう少しマシな評価関数にしてみました。
評価関数はココを参考にさせてもらいました。http://hitsujiai.blog48.fc2.com/blog-entry-26.html
昨日のMinMaxPlayerと対戦させてみたところ、先攻後攻入れ替えても圧勝です。
MinMaxPlayer ○black 24
MinMaxPlayer2●white 40 ←強い!
MinMaxPlayer2○black 46 ←やっぱり強い!
MinMaxPlayer ●white 18
# ReversiMinMax2.rb require "Reversi" require "ReversiAI" require "ReversiMinMax" # Min-Max法 # 評価関数は、自分のコマの数。 # depth は 3 or 4 手ぐらいが妥当です。 class MinMaxPlayer2 < MinMaxPlayer # 評価関数。 # 参考 http://hitsujiai.blog48.fc2.com/blog-entry-26.html def eval(board) value = 0 for y in 1..Reversi::SIZE for x in 1..Reversi::SIZE if board.get(x, y) == @color then value += WEIGHT[y-1][x-1] else value -= WEIGHT[y-1][x-1] end end end value end WEIGHT = [ [120, -20, 20, 5, 5, 20, -20, 120], [-20, -40, -5, -5, -5, -5, -40, -20], [ 20, -5, 15, 3, 3, 15, -5, 20], [ 5, -5, 3, 3, 3, 3, -5, 5], [ 5, -5, 3, 3, 3, 3, -5, 5], [ 20, -5, 15, 3, 3, 15, -5, 20], [-20, -40, -5, -5, -5, -5, -40, -20], [120, -20, 20, 5, 5, 20, -20, 120]] end def test() player_b = MinMaxPlayer2.new(:black, 3) player_w = MinMaxPlayer.new(:white, 3) play(player_b, player_w) end
では、いよいよ人間様(a-san)との対決です。
結果は人間様(a-san)が勝ちました。
確かに「隅へのシノギ」がうまくなってます。運が悪ければ負けていたかも。
play(ManPlayer.new(:black),MinMaxPlayer2.new(:white,3)) ■■■■■■■■■■ ■○○○○○○○○■ ■○○●○●●○●■ ■●●●●●●●○■ ■●●○○○●●○■ ■○○●○○○●○■ ■○○○●○○●○■ ■●●○●○○○○■ ■○○○○○○○○■ ■■■■■■■■■■ ○black 42 ←a-san ●white 22 winner:black => :black