1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Pythonで〇×ゲームのAIを一から作成する その64 ルールベースの AI の一覧、対戦成績、作成したデータファイルのまとめ

Last updated at Posted at 2024-03-18

目次と前回の記事

これまでに作成したモジュール

以下のリンクから、これまでに作成したモジュールを見ることができます。

この記事の内容

今回の記事は、下記の内容をまとめたものです。

ルールベースの AI の一覧

アルゴリズムの一覧

これまでに作成した AI の アルゴリズム は以下の通りです。

ルール アルゴリズム
ルール1 左上から順空いているマス を探し、最初に見つかったマス着手 する
ルール2 ランダム なマスに 着手 する
ルール3 真ん中 のマスに 優先的着手 する
既に 埋まっていた場合ランダム なマスに 着手 する
ルール4 真ん中 のマスの 優先的着手 する
既に 埋まっていた場合ランダム なマスに 着手 する
ルール5 勝てる場合勝つ
そうでない場合は ランダム なマスに 着手 する
ルール6 勝てる場合勝つ
そうでない場合は 相手の勝利阻止 する
そうでない場合は ランダム なマスに 着手 する
ルール6改 勝てる場合勝つ
そうでない場合は 相手勝利できる 着手を 行わない
そうでない場合は ランダム なマスに 着手 する
ルール7 真ん中 のマスに 優先的着手 する
そうでない場合は 勝てる場合勝つ
そうでない場合は 相手の勝利阻止 する
そうでない場合は ランダム なマスに 着手 する
ルール7改 真ん中 のマスに 優先的着手 する
そうでない場合は 勝てる場合勝つ
そうでない場合は 相手勝利できる 着手を 行わない
そうでない場合は ランダム なマスに 着手 する
ルール8 真ん中 のマスに 優先的着手 する
そうでない場合は 勝てる場合勝つ
そうでない場合は 相手勝利できる 着手を 行わない
そうでない場合は、自分の手番勝利できる ように、「自 2 敵 0 空 1」が 1 つ以上 存在する 局面になる着手を行う
そうでない場合は ランダム なマスに 着手 する
ルール9 真ん中 のマスに 優先的着手 する
そうでない場合は 勝てる場合勝つ
そうでない場合は 相手勝利できる 着手を 行わない
そうでない場合は、自分の手番必ず勝利できる ように、「自 2 敵 0 空 1」が 2 つ以上存在する 局面になる着手を行う
そうでない場合は、自分の手番勝利できる ように、「自 2 敵 0 空 1」が 1 つ存在する 局面になる着手を行う
そうでない場合は ランダム なマスに 着手 する
ルール10 真ん中 のマスに 優先的着手 する
そうでない場合は 勝てる場合勝つ
そうでない場合は 相手勝利できる 着手を 行わない
そうでない場合は、自分の手番必ず勝利できる ように、「自 2 敵 0 空 1」が 2 つ以上存在する 局面になる着手を行う
そうでない場合は、以下 の 2 つを 総合的に判断 して着手を行う
  • 自分の手番勝利できる ように、「自 2 敵 0 空 1」が 1 つ存在する 局面になる着手を行う
  • 自分有利になる ように、「自 1 敵 0 空 2」が 最も多い 着手を行う
そうでない場合は ランダム なマスに 着手 する
ルール11 真ん中 のマスに 優先的着手 する
そうでない場合は 勝てる場合勝つ
そうでない場合は 相手勝利できる 着手を 行わない
そうでない場合は、自分の手番必ず勝利できる ように、「自 2 敵 0 空 1」が 2 つ以上存在する 局面になる着手を行う
そうでない場合は、以下 の 3 つを 総合的に判断 して着手を行う
  • 自分の手番勝利できる ように、「自 2 敵 0 空 1」が 1 つ存在する 局面になる着手を行う
  • 自分有利になる ように、「自 1 敵 0 空 2」が 最も多い 着手を行う
  • 相手不利になる ように、「自 0 敵 1 空 2」が 最も少ない 着手を行う
そうでない場合は ランダム なマスに 着手 する
ルール12 真ん中 のマスに 優先的着手 する
そうでない場合は 勝てる場合勝つ
そうでない場合は 相手勝利できる 着手を 行わない
そうでない場合は、自分の手番必ず勝利できる ように、「自 2 敵 0 空 1」が 2 つ以上存在する 局面になる着手を行う
そうでない場合は、斜め方向〇×〇並び他の 6 マス空のマス の場合に、いずれか辺のマス に着手を行う
そうでない場合は、以下 の 3 つを 総合的に判断 して着手を行う
  • 自分の手番勝利できる ように、「自 2 敵 0 空 1」が 1 つ存在する 局面になる着手を行う
  • 自分有利になる ように、「自 1 敵 0 空 2」が 最も多い 着手を行う
  • 相手不利になる ように、「自 0 敵 1 空 2」が 最も少ない 着手を行う
そうでない場合は ランダム なマスに 着手 する
ルール12 改 勝てる場合勝つ
そうでない場合は 相手勝利できる 着手を 行わない
そうでない場合は、自分の手番必ず勝利できる ように、「自 2 敵 0 空 1」が 2 つ以上存在する 局面になる着手を行う
そうでない場合は、斜め方向〇×〇並び他の 6 マス空のマス の場合に、いずれか辺のマス に着手を行う
そうでない場合は、以下 の 3 つを 総合的に判断 して着手を行う
  • 自分の手番勝利できる ように、「自 2 敵 0 空 1」が 1 つ存在する 局面になる着手を行う
  • 自分有利になる ように、「自 1 敵 0 空 2」が 最も多い 着手を行う
  • 相手不利になる ように、「自 0 敵 1 空 2」が 最も少ない 着手を行う
そうでない場合は ランダム なマスに 着手 する
ルール13 勝てる場合勝つ
そうでない場合は 相手勝利できる 着手を 行わない。ただし、「自 0 敵 2 空 1」の 少ない着手優先 する
そうでない場合は、自分の手番必ず勝利できる ように、「自 2 敵 0 空 1」が 2 つ以上存在する 局面になる着手を行う
そうでない場合は、斜め方向〇×〇並び他の 6 マス空のマス の場合に、いずれか辺のマス に着手を行う
そうでない場合は、以下 の 3 つを 総合的に判断 して着手を行う
  • 自分の手番勝利できる ように、「自 2 敵 0 空 1」が 1 つ存在する 局面になる着手を行う
  • 自分有利になる ように、「自 1 敵 0 空 2」が 最も多い 着手を行う
  • 相手不利になる ように、「自 0 敵 1 空 2」が 最も少ない 着手を行う
そうでない場合は ランダム なマスに 着手 する
ルール14 勝てる場合勝つ
そうでない場合は 相手勝利できる 着手を 行わない。ただし、「自 0 敵 2 空 1」の 少ない着手優先 する。また、下記の 総合的に判断 して 着手 を行う 条件考慮 する
そうでない場合は、自分の手番必ず勝利できる ように、「自 2 敵 0 空 1」が 2 つ以上存在する 局面になる着手を行う
そうでない場合は、斜め方向〇×〇並び他の 6 マス空のマス の場合に、いずれか辺のマス に着手を行う
そうでない場合は、以下 の 3 つを 総合的に判断 して着手を行う
  • 自分の手番勝利できる ように、「自 2 敵 0 空 1」が 1 つ存在する 局面になる着手を行う
  • 自分有利になる ように、「自 1 敵 0 空 2」が 最も多い 着手を行う
  • 相手不利になる ように、「自 0 敵 1 空 2」が 最も少ない 着手を行う
そうでない場合は ランダム なマスに 着手 する

ルール 11 ~ 14評価値を計算 する際の パラメータ は以下の通りです。

ai11s
ver 1
ai11s
ver 2
ai11s ver 3
ai12s
ai13s
ai14s
「自 2 敵 0 空 1」が 1 つの場合の評価値 1 2 2
「自 1 敵 0 空 2」が 1 つあたりの評価値 1 1 0.5
「自 0 敵 1 空 2」が 1 つあたりの評価値 -1 -1 1

アルゴリズムとルールの関係

下記は、ルール 14アルゴリズムそれぞれの条件 が、どのルール追加されたか についてまとめたものです。

順位 条件 種類 ルール
1 勝てる場合勝つ 十分条件 ルール 5
2 相手勝利できる 着手を 行わない
自 0 敵 2 空 1」の 少ない着手優先 する
優先順位5 の条件考慮 する
必要条件 ルール 6
ルール 13
ルール 14
3 自 2 敵 0 空 1」が 2 つ以上存在 する着手を行う 十分条件 ルール 8
4 斜め方向〇×〇並び他の 6 マス空のマス
の場合は、いずれか辺のマス に着手を行う
十分条件 ルール 12
5 自 2 敵 0 空 1」が 1 つ存在 する着手を行う
自 1 敵 0 空 2」が 最も多い 着手を行う
自 0 敵 1 空 2」が 最も少ない 着手を行う
ルール 9
ルール 10
ルール 11
6 ランダム なマスに 着手 する

ゲーム木を利用した強解決の AI

以下は ゲーム木を利用した強解決の AI の関数のアルゴリズムの違いです。

AI アルゴリズム
ai_gt1 下記の手順で処理を行う。
  1. ゲーム木の中で、現在の局面を表すノードを探す
  2. そのノードを使って、その局面の最善手を調べる
  3. その中からランダムに着手を選択する
ai_gt2 上記の手順 2 をゲーム木の作成の時点で行い、Node の bestmoves 属性に代入しておく
ai_gt3 上記の手順 1 をゲーム木の作成の時点で行い、Mbtree の nodelist_by_mb 属性に代入しておく
ai_gt4 上記の手順 1 と 2 をまとめてゲーム木の作成の時点で行い、Mbtree の bestmoves_by_mb 属性に代入しておく
ai_gt5 Mbtree の bestmoves_by_mb 属性だけを仮引数に代入するようにする
ai_gt6 board 属性を利用した局面と最善手の対応表を仮引数に代入するようにする

gui_play に登録した ai_gt6 を利用した AI

下記は、gui_play に登録した ai_gt6 を利用した AI の性質と、その AI が利用するゲーム木のノードの評価値を計算する方法です。

ai_gt6

全ての最善手の中からランダムに着手を行う強解決の AI です。

局面の状況 評価値
〇 の必勝の局面 1
引き分けの局面 0
× の必勝の局面 -1

ai_gtsv

必勝の局面 の場合は最善手の中で 最も早く勝利できる合法手 を、必敗の局面 の場合は最善手の中で 敗北を最も先に延ばす合法手 を選択する強解決の AI です。

局面の深さ 5 6 7 8 9
〇 が勝利した場合の評価値 3 2 1
× が勝利した場合の評価値 -2 -1

引き分けの局面の評価値は常に 0 とする。

ランダムな AI である ai2 との対戦結果

基準となる ai2 との 対戦結果(単位は %)は以下の通りです。太字ai2 VS ai2 よりも 成績が良い 数値を表します。欠陥 の列は、アルゴリズム欠陥 があるため、ai2 との 対戦成績良くても強い とは 限らない ことを表します。欠陥の詳細については、関数名のリンク先の説明を見て下さい。

なお、敗率0 % になっている ai12 ver 2 以降AI弱解決の AI です。

また、ai_gt1 は、ゲーム木の評価値を利用した 強解決の AI です。なお、ai_gt1 ~ ai_gt5 の AI の強さはすべて同一なので、表では ai_gt1 のみを表記します。

関数名 o 勝 o 負 o 分 x 勝 x 負 x 分 欠陥
ai1
ai1s
78.1 17.5 4.4 44.7 51.6 3.8 61.4 34.5 4.1 あり
ai2
ai2s
58.7 28.8 12.6 29.1 58.6 12.3 43.9 43.7 12.5
ai3
ai3s
69.3 19.2 11.5 38.9 47.6 13.5 54.1 33.4 12.5
ai4
ai4s
83.0 9.5 7.4 57.2 33.0 9.7 70.1 21.3 8.6 あり
ai5
ai5s
81.2 12.3 6.5 51.8 39.8 8.4 66.5 26.0 7.4
ai6 88.9 2.2 8.9 70.3 6.2 23.5 79.6 4.2 16.2
ai6s 88.6 1.9 9.5 69.4 9.1 21.5 79.0 5.5 15.5
ai7
ai7s
95.8 0.2 4.0 82.3 2.4 15.3 89.0 1.3 9.7
ai8s 98.2 0.1 1.6 89.4 2.5 8.1 93.8 1.3 4.9
ai9s 98.7 0.1 1.2 89.6 2.4 8.0 94.1 1.3 4.6
ai10s 97.4 0.0 2.6 85.6 2.6 11.7 91.5 1.3 7.2
ai11s ver 1 98.1 0.0 1.9 82.5 1.9 15.6 90.3 1.0 8.7 あり
ai11s ver 2 98.8 0.0 1.2 87.7 2.4 10.0 93.2 1.2 5.6
ai11s ver 3 99.1 0.0 0.9 87.7 0.8 11.5 93.4 0.4 6.2
ai12s ver 2 98.9 0.0 1.1 88.2 0.0 11.8 93.5 0.0 6.5
ai12s ver 3 95.8 0.0 4.2 86.9 0.0 13.1 91.3 0.0 8.7 あり
ai13s 98.9 0.0 1.1 88.5 0.0 11.5 93.7 0.0 6.3
ai14s 99.0 0.0 1.0 88.8 0.0 11.2 93.9 0.0 6.1
ai_gt1 96.9 0.0 3.1 78.0 0.0 22.1 87.4 0.0 12.6

本記事全体で作成したデータファイルの一覧

下記は、本記事全体で作成したデータファイルの一覧です。

ファイル名 説明
bftree.mbtree 幅優先アルゴリズムによって作成されたゲーム木
dftree.mbtree 深さ優先アルゴリズムによって作成されたゲーム木
bfscore.mbtree 幅優先アルゴリズムによって評価値を計算したゲーム木
dfscore.mbtree 深さ優先アルゴリズムによって評価値を計算したゲーム木
aidata.mbtree ゲーム木を利用する AI に必要なデータが計算されたゲーム木
bestmoves.dat 局面を表す棋譜のデータと最善手の一覧の対応表を表すデータ
bestmoves_by_board.dat board 属性を利用した局面と最善手の一覧の対応表を表すデータ
mblist.dat 決着がついていない局面の一覧を表すデータ
mblist_by_board.dat board 属性を利用した決着がついていない局面の一覧を表すデータ
mblist_by_board2.dat 合法手の一覧と最善手が同じ局面を除いた決着がついていない局面の一覧を表すデータ
mblist_by_board_min.dat 合法手の一覧と最善手が同じ局面と、同一局面を除いた決着がついていない局面の一覧を表すデータ
bftree_shortest_victory.mbtree 幅優先探索アルゴリズムで決着がついた局面の深さに応じた評価値を計算したゲーム木
dftree_shortest_victory.mbtree 深さ優先探索アルゴリズムで決着がついた局面の深さに応じた評価値を計算したゲーム木
bestmoves_by_board_shortest_victory.dat bftree_shortest_victroy.mbtree を使ってboard 属性を利用した局面と最善手の一覧の対応表を計算したデータ
bestmoves_and_score_by_board.dat 局面と最善手・評価値の対応表のデータを保存したファイル
bestmoves_and_score_by_board_shortest_victory.dat 最短の勝利を優先した評価値を計算した局面と最善手・評価値の対応表のデータを保存したファイル

本記事で入力したプログラム

本記事で入力したプログラムはありません。

更新履歴

更新日時 更新内容
2024/09/22 gui_play に登録した ai_gt6 を利用した AI の項目を追加しました。
2024/08/18 ゲーム木を利用した AI と、作成したデータファイルの情報の項目を追加しました。以後は、本記事の更新に合わせて適宜修正します。

次回の記事

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?