サイトへ戻る

理解の補助線005

ゲームの中のAI (3)

アルゴリズムの基礎を理解する(その3)ビヘイビアAI

· AI

振る舞いや行動レベルでキャラクターを動かす最もポピュラーなゲームAIのアルゴリズム部分である。前回同様、三宅氏の著作「人工知能の作り方」を参考にサーカスの例で理解をしてみよう。

ゲームのストーリーの設定(前回の再掲)

舞台は名物サーカス団のサーカス小屋である。大きなテントが張られていて、満員の観客、スポットライトは大きな円形のステージを照らしていて、左右に高いポールが立っている。2つのポールにはロープが渡っている。

サーカス団のスター男性は、今、右のはしごを登って行く。大きな観客の歓声と小太鼓の音が始まる。さあ、柱の上につくと観客に手を振り一礼。

ロープの上をそのまま歩いて、無事左の柱に着けば得点が入る。落ちれば、得点はマイナス。ゲームの始まりである。

第一ステージ 簡単な小手調べで何も持たずにただロープの上を歩くだけ。

       クリアすれば第2ステージへ 

第2ステージ 長い棒を持ってバランスを取りながらロープを歩く高得点

第3ステージ 棒を持って自転車の上に乗る、さらに高得点

       (写真はまさにこの第3ステージ)

アンコール  一番難しい、美女を一人担いで自転車で渡る

ビヘイビアベースAIとは

ゲームAIの世界では最も多く使われれている手法で、キャラクターの身体的行のレベルでキャラクターの行動(ビヘイビア)を考える と説明されている。

キャラクターの行動(ビヘイビア)を木の枝のような階層構造(Tree構造と呼びます)に、行動の実行順序を決める形で分解してゆき、一番末端部分(ノードと呼びます)にそれぞれの行動のアクションベースの一つ一つが書いていく形で表現します。

(三宅氏の例) 敵キャラクターを制御する戦士のビヘイビアTreeの例

まず階層構造を3段階(メイン)ー(サブ)ー(ノード)に分けます。

下にその内容を書いてみます(いずれもっと見やすくチャート図にします)。

(メイン)    (サブ)                (ノード)

          戦闘                  剣を振る

                              弓を射る

                              魔法を唱える

ルート       待機                  薬草を飲む

                              回復魔法

          逃走      立て直す        ポイントに移動

                              持ち場で静止

                  本拠地防衛       本拠地に移動

                              回復魔法

ビヘイビアTree設計上のポイントは3つです。

1)サブの部分の洗い出し

  上の例では「戦闘」「待機」「逃走」の3つです。

  どのようにしてこの分解をすればいいのでしょうか?

  頭の中では、こんな作業が必要と考えますかね。

  ・目的(この場合は戦闘)に合致した行動パターンをまず中心に一つ設定する

  ・次にその行動が実施されない場合の状態を思い浮かべて、その目的と行動パターンを作る

   (この例では待機です、その目的はエネルギーの回復です)

  ・目的が達成できなかった場合の行動パターンを設定する(この例では逃走です)

2)個々の行動の洗い出し

  ここは末端のノードに現れるキャラクターのアクションの定義の部分です。

  戦士が実際のアクションをとります。上のサブの3つの行動パターンに沿ったアクションを

  考えますが、このキャラクター(戦士)の場合、結局使えるのは手足と武器と魔法ですね。

  戦闘では 武器を使用する(剣を振る・弓を射る)

       魔法を唱える(いかにもゲームキャラクターらしい

  待機では 体の回復をする(薬草を飲む・回復魔法を使う)また魔法ですね。

  逃走では、またサブに分かれまして 

       「態勢を立て直す」では(元の位置に戻る・持ち場で待機・武器を補充)

       「本拠地防衛」では(本拠地に移動・回復魔法)また魔法だあ。

  さて、頭の中ではどんな作業をするとこの設計ができるのでしょうか? 

  上の1)オレンジの部分を見ながら考えて行きましょう。

  ・目的に合致した行動パターンでは

   目的の達成のためにキャラクターそのものが使う体の部位を特定する(ここでは手足)

   その上で、どういう道具を使うかを選択する(ここでは剣・弓・魔法)

  ・その行動パターンが実行されない場合の目的を考える

   (この場合は、体の回復・武器の補給)

  ・最後に目的が達成できなかった場合(この例では負けそうになった場合)の行動として

   このキャラクターとしての行動(逃げる)とゲーム全体での行動(本拠地防衛)に分けた

   行動を並べる

3)それぞれのサブにおいて、実行判定のロジック(優先順位)を設定する

このAIの大きなポイントです。一番下にそのロジックを載せておきましたが、

それぞれのサブの部分で、どういう選択で末端の行動(ノード)に移るかを決めておきます。

  (例えば)

  戦闘というサブはPriority(優先度リスト)というやり方で、剣を振るか、弓を使うか、魔法を

  使うかを決めます。

  下の補足でも説明していますが、このPriority(優先度リスト)とは、

  あらかじめノードの優先度(プライオリティ)を決めて、実行可能(Active)なノードのうち

  最も優先順位の高いノードだけを実行する選択方法です。

  この場合、まず剣を持っていれば、剣を振ることを優先的に設定しておきます。

  剣を持っていない(戦いの途中で手から離れた)場合は、弓を射る・魔法をかける に

  あらかじめ優先順位を設定しておいて、高く設定された行動を実行します。

  さて、頭の中ではどんな作業をするとこの設計ができるのでしょうか? 

  上の1)2)同様にオレンジの部分を見ながら考えて行きましょう。

  ここはかなりセンスを問われる部分ですね。キャラクターの設計とも絡んできますね。

  またゲームの世界ですから基本は面白くなくてはいけません。そしてスリル感動

  ・ゲームを操作する人が、非日常の世界の主人公になれる(ありえないことが擬似体験)

   (面白さの設計)

   (スリル・願い・祈り等の設計)

   (感動の設計)

  ・そのキャラクターの得意とする技をシンプルに3つ決める

  ・その技をどういう順番で出すかの設定をする

ここまで作業を分解すれば、もう作業は楽になりました。

では同様に、私のサーカスの例で綱渡りのスターのビヘイビアTreeを作ってみましょう。

サーカスのビヘイビアTreeを作ってみよう

設計作業(上の3つの作業を順番にやって行きましょう、多少シンプルすぎますが)

1)サブの洗い出し

  ・目的に合致した行動パターンをまず中心に一つ設定する

    目的は空中で左から右にロープの上を渡ることです。「渡る」としておきます。

  ・次にその行動が実施されない場合の状態を思い浮かべて、その目的と行動パターンを作る

    この場合は「立ち止まる」で「バランスを取りなおす」か、「呼吸を整える」かです。

  ・目的が達成できなかった場合の行動パターンを設定する

    この場合は「ロープから落ちる」です。

2)個々の行動の洗い出し

  ・目的に合致した行動パターン

   目的の達成のためにキャラクターそのものが使う体の部位を特定する(ここでは手足)

   その上で、どういう道具を使うかを選択する(ここでは棒・自転車・美女)

  ・その行動パターンが実行されない場合の目的を考える

   (この場合は、バランスを取り直す・呼吸を整える)

  ・最後に目的が達成できなかった場合(この例ではロープから落ちる場合)の行動として

   このキャラクターとしての行動(落ちる)とゲーム全体での行動(再挑戦)に分けた

   行動を並べる

3)それぞれのサブにおいて、実行判定のロジック(優先順位)を設定する

  これはゲームの設計そのものでいちばん上に書いたゲームのストーリー設定を引用

  ・ゲームを操作する人が、非日常の世界の主人公になれる(ありえないことが擬似体験)

   (面白さの設計)        順番に難易度を上げてゆく

                   (歩く→棒を持つ→自転車+棒→自転車+美女)

   (スリル・願い・祈り等の設計) ここでは、時間制限を設ける(2分以内)

                   重いほどバランスをとるのにエネルギーを使う

                   観客の祈りが伝わるとエネルギーが回復する

   (感動の設計)         無事渡り終わったら、拍手喝采とファンファーレ

  ・そのキャラクターの得意とする技を決める

                   エネルギーがあるときはバランス回復ができる

  ・その技をどういう順番で出すかの設定をする シーケンス法(順番に出す)

    

そして出来上がったビヘイビア・ツリーはこんな感じです。・

(メイン)    (サブ)              (ノード)

          渡る                歩く

                            棒を持って歩く

                            自転車に乗って棒を持つ

                            美女を持って自転車    

ルート       待機                バランスをとる    

                            エネルギー回復

          落ちる               ロープから落ちる

(補足)実行判定のロジック

それぞれのノード(末端レベルの行動の一つ一つ)が実行可能か判定するロジックが三宅氏の著書で紹介されている。行動選択の優先順位を決定する考え方として面白いと思ったので、このサブノートでまとめておく。5つのロジックである。 P146より引用

① 優先度リスト法(Priority)

あらかじめノードの優先度(プライオリティ)を決めて、実行可能(Active)なノードのうち

最も優先順位の高いノードだけを実行する

②シーケンス法(Sequence)

あらかじめノードの実行順位を決めておいて、実行可能なノードをすべて順番に従って実行する

③シーケンシャル・ルーピング法

基本は②と同じだが、終端まで行くともう1度実行する

④確率的方法(Random)

実行可能なノードのうち、ランダムに選ぶ

⑤オン・オフ法(On-Off法)

ランダム、あるいは優先リストによって選ぶが、優先リストによって選ぶが、一度選んだものを選び直さない

わかったこと

このビヘイビア・ツリーを三宅氏は次のようにコメントしている。

「実際、ビヘイビアツリーは10年以上経った現在(2017年)も発展段階で、ゲームごと、会社ごとに多様なバリエーションが作られています。・・・ビヘイビア・ツリーには定義されていない自由度がたくさんあり・・そういった余地をいろんなゲームで試しながら、ビヘイビア・ツリーは発展しています。」P146

「ビヘイビア・ツリーは, ステートマシン(ステートベースAI)にはなかった連続動作(Sequence)やランダム性をシンプルなツリー上で実現した制御方法であり、ビヘイビア・ツリーは身体動作を志向して運動の制御に適した技術です。」P148

ビヘイビア・ツリーは珍しくゲーム産業が生み出した技術なのですが、年月を経て改良と進化が続けられて、今なお変化し続けています。」P150

以下、私のコメント

ゲームの世界のAIがここまで進んでいるとは思わなかった。ゲームのソフトは色々あるが、その奥にある設計思想は少し垣間見れたような気がする。

ここまでゲームのアルゴリズムを見てきて、併せて気がついたことがある。

それは、ゲームもストーリーの設計が極めて大切である世界であることだ。

芝居や小説や映画と同じ、また経営とも同じ、面白いものをいかに刺激的に感動させるか、

そこだ!

少しゲームのAIが続いているので、来週は3週間ぶりに雑誌Scienceに戻ります。お楽しみに

いやぁ、DEEPですねぇ。