前回の「理解の補助線003」でゲームの中のAIの最初のアルゴリズムのルールの限界を知った。さて、ここからは残り6つのアルゴリズムがどういう役割をしているかを見て行こう。
今回は2番目のステート(ベース)AIをみて行こう。
ゲームの中のAIコンセプトの全体を理解する
今回も前回同様に 三宅氏の「人工知能の作り方」を参考に引用・抜粋しながら考えてゆく。
ゲームの中には3つのAIがあり、その連携でゲームがデザインされている
・キャラクターAI (ゲームに登場する敵・味方、それ以外の)キャラクターの頭脳になるAI
自律的な判断
仲間同士の協調
時にチームAIとなる
・メタAI ゲーム全体を監督しコントロールするAI
エージェント(小さなAI)の動的な配置
レベル状況の監視
エージェントに指示
ゲームの流れを作る
・ナビゲーションAI (ゲームの各ステージある点からある点へ経路を探してくれるなど)
キャラクターAIやメタAIのサポートとして情報を獲得するAI
メタAI、キャラクターAIのためにレベル認識のためのデータ準備
オブジェクト表現を管理
ナビゲーション・データの管理
経路検索・位置解析
意思決定をするのは、キャラクターAIとメタAIの2つの機能が対象である
ゲームの中のAIは、ゲーム体験をより面白くするために
キャラクターを知能を与え、よりリアルにするための手段である
意思決定のアルゴリズムとして(ルール以外の)
状態・行動・タスク・ゴール・ユティリティ・予測 のそれぞれを理解する
今回はその「状態」を取り上げる。
ストーリーの設定(恒例の私のオリジナルの説明)
サーカスの綱渡りのシーンを今回の例で設定してみよう。通常ゲームはアクション型かボードゲーム型(囲碁や将棋)に別れるが、今回はアクション型の延長で考えてみる。
(戦う敵がいないのであまり面白い設定ではないが基本の理解のため)
舞台は名物サーカス団のサーカス小屋である。大きなテントが張られていて、満員の観客、スポットライトは大きな円形のステージを照らしていて、左右に高いポールが立っている。2つのポールにはロープが渡っている。
サーカス団のスター男性は、今、右のはしごを登って行く。大きな観客の歓声とファンファーレ。さあ、柱の上につくと観客に手を振り一礼。
ロープの上をそのまま歩いて、無事左の柱に着けば得点が入る。落ちれば、得点はマイナス。
第一ステージは簡単な小手調べで、何も持たずにただロープの上を歩くだけ。
クリアすれば第2ステージへ
第2ステージは長い棒を持って、バランスを取りながらロープを歩く、高得点
第3ステージはもっと難しくして、ロープの真ん中で椅子の上に乗る、さらに高得点
最後はアンコールと称して、一番難しい人を一人担いで渡る
こんな設定のゲームの意思決定は6つのアルゴリズムでどう表現できるだろうか?
メインキャラクターは綱渡りの男性スターである。
ステートベースAIを理解する
ステートとは状態のことであり、キャラクターの行動を表現する。
状態遷移(ステートマシンと呼びます)という表現方法で、
人間の行動をある状態から別の状態に移るという形で表現する。
(三宅氏の本の例)P138 警備兵
巡回・休息・追撃・攻撃の4つのステート(状態)を警備兵は行き来する。
この状態遷移の作り方は結構難しい。一つの大きな設計である。
考えなければいけないのは、そのキャラクターとしての目的に沿った行動の分解である。
・何もしていない状態を1つ置く(休息)
・そのゲームの中でのそのキャラクターの役割を設定(敵を倒す)
・その目的のための行動をいくつかに分解する
(敵を探す、巡回)(攻撃する)(相手を追いかける、追撃)
その結果
上の4つの状態(巡回・休息・追撃・攻撃)を得る
そして、その状態がどういう条件のときに移るかの条件を設定する
まず4つの状態のあり得る遷移の組み合わせを考える。
・攻撃と巡回(両方向であり得る)
・巡回と休息(両方向あり得る)
・巡回と追撃(巡回中に敵を見つけてそれを追いかけるのはあるが、逆はない)
・攻撃と追撃(追いかけた後の攻撃はあるが、攻撃中に敵を見失ったら巡回とする)
これで全部で6通りになる。
その上で、遷移が発動される条件(時間と距離)を上の6通りで設定する。
・休息→巡回 (30秒以上経過したら)
・巡回→休息 (30秒敵が見つからない場合)
・巡回→攻撃 (敵を発見し、5メートル以内に接近している場合)
・攻撃→巡回 (敵を見失って5秒たったら)
・巡回→追撃 (敵を発見し、5メートル以上離れている場合)
・追撃→攻撃 (敵と5メートル以内に接近している場合)(追いついた場合)
ステートAIの状態遷移の作り方がこれでわかった。一般化するとこんな手順ではなかろうか?
①そのキャラクターとしての目的に沿った行動に分解する(3〜4個が理想)
・何もしていない状態を1つ置く(休息)
・そのゲームの中でのそのキャラクターの役割を設定
・その目的のための行動をいくつかに分解する
②その状態がどういう条件のときに移るかの条件を設定する
(1) まず状態のあり得る遷移の組み合わせを考える
(2)その上で、遷移が発動される条件(時間と距離等の数値化できるパラメータ)を
上の組み合わせで設定する
・パラメータの設計
・数値設定
そこで、今回のサーカスの例で状態遷移を作ってみよう。
サーカスの綱渡りの男性についての状態遷移を考える。
①そのキャラクターとしての目的に沿った行動に分解する
・何もしていない状態を1つ置く(柱かロープ上にいる:休憩)
※この何もしていない状態の設計はいちばん難しいことにここで気づく。
休息中にエネルギーを補給させるゲームにするのか?とか、結局はゲームの目的次第。
・そのゲームの中でのそのキャラクターの役割を設定(ロープを左から右に渡る)
・その目的のための行動をいくつかに分解する
(ロープの上を前に歩く:前歩き)
(バランスをとる:バランス)
これで「休憩」「前歩き」「バランス」の3つの状態ができた。
②その状態がどういう条件のときに移るかの条件を設定する
(1) まず状態のあり得る遷移の組み合わせを考える(バランスを中心に考えればいい)
「休息」 → 「前歩き」
「前歩き」→ 「休息」
「前歩き」→ 「バランス」
「バランス」→ 「前歩き」
「バランス」→ 「休息」
「休息」→ 「バランス」
(2)その上で、遷移が発動される条件(数値化できるパラメータ)を
上の組み合わせで設定する
まずパラメータの設定が必要だ。2つくらいをまず置いてみよう。
※ここで大切なのは、キャラクターがロープから落ちるかどうかではないことで
状態を移す条件でなければならないことに気づく。ここも難しい。
キャラクターの行動のリアリティが追求される一面を見た気がする。
B:バランスの度合い(重心の傾き)
R:ロープの揺れ具合(重さと歩く速さで変わる)
「休息」 → 「前歩き」 (R<一定値)ロープの揺れがおさまったら歩ける
「前歩き」→ 「休息」 (R>一定値)その逆
「前歩き」→ 「バランス」 (B>一定値)体のバランスが取れたら歩ける
「バランス」→ 「前歩き」 (B<一定値)その逆
「バランス」→「休息」 (B+R>一定値)体もロープも安定しないなら止まる
「休息」→「バランス」 (B+R<一定値)その逆
わかったこと
6つのアルゴリズの中の1つ目であるが、緻密な設計ポイントが、簡単なサーカスの例でも結構あることがわかった。
このアプローチでこのままいけそうである。同じサーカスの例を使って、残る5つも見て行こう。次回はビヘイビアベースAIからです。
いやぁ、DEEPですねぇ。