Powershell(オセロ009_ロジック_3:最多数)
■石を置くロジックについて考えてみる(その3)。
オセロのロジックについて考えてみるの3回目。今回考えたロジックは、単純に各手順で最も多く相手の石を裏返すようにするもの。
コードは下の通り($logic_num -eq 3)。
空欄(_)の位置を取得して順番をランダムにするのは、前のロジックと同じ。その後、一覧の頭から実際に置くことができるか試し、石を置いた際の盤上の変化を確認する。すべての石を確認し、最も変化の数が多いものの中で一番初めの位置を採用する。ゲームは、最多数vsランダムで行う。
elseif ($logic_num -eq 3){
$max_diff_num = 0
$tempposition ="00"
$inputArray = get-random -input $blankArray -count ([int]::MaxValue)
foreach ($position in $inputArray) {
$tempBoard = [Utility]::copyBoard($boardData)
$tempClass = [Player]::new($this.playercolor, $this.logic)
$tempClass.reverseStones($position, $tempBoard)
$diff_num = [Utility]::compareBoardDiffNum($tempBoard, $boardData)
if ($diff_num -gt $max_diff_num) {
$max_diff_num = $diff_num
$tempposition = $position
}
}
$inputArray[0] = $tempposition
}
黒(最多数)vs白(ランダム)で5000回ゲームを行った結果は次のようになった。
黒 3227 vs 白 1600 vs 引き分け 173 (勝率65%)
勝率はやはり最多数の方が高くなった。
最終的な黒の石の数を見ると、黒37のゲームが最も多くなっている(下のグラフ、200ゲーム以上)。常に相手の石を最も多く裏返せる位置に置くので全体的に黒の数が多くなるのは当然だろうけど、それでも少ない数で負けるゲームもある。あと、白の数を0にして勝ったゲームが150回くらいあった。
四隅に置いた数については、下のようになった(行が黒、列が白、0から4は四隅をとった数)。四隅優先のロジックでは、四隅すべてをとっているゲームが1700回くらいあったので、それに比べると少ない。途中で終わっているゲームもそこそこあるように見える。
プログラムの実行速度はランダム同士で行ったときより少しかかった(5000ゲームで13分程度)。ランダムでは置くことができたらすぐにその位置を採用するけど、最多数の場合は置ける場所をすべて検討するので、その差だと思う。
常に最多の数を求める戦略は悪くないように思えるけど、勝率は65%。そこまで高くないように見える。やはり単純に最も多く相手の石を裏返せる位置を求めていってもだめらしい。個人的な経験から、ゲームの始めは裏返す石を少なくし後半で裏返すことができる石を多く保つのもいいと思う。次回は、逆に(途中まで)最小数で考えてみようか。