はじめてのGOAP

ごぶさたしておりますちょびえです。てっきりGOAPについて書いたと思ったけどそんなことはなかったので今日はGOAPについて書いてみようと思います。
GOAPに関してはわりと書いている方もいらっしゃいますのでここでは私の解釈という形で記します。すごい適当に書いているので間違ってるかもしれない。

Goal Oriented Action Planning

最近流行りのDeepLさんはいいました:目標指向型行動計画と
漢字ばっかりにするとそれはそれで趣が違ってまたいいですね。

現代社会におけるOKRやMBOとかGOAPの一種でもあると言えるのではないでしょうか。

そんな話はさておきGOAP、、、というか自立型エージェントの本質としては知覚、手段、行動、計画、評価です。大前提として

・知ることが出来ないと何も行動が出来ない
・手段を知っていなければ行動出来ない
・目指すべきゴールが分からなければ選択できない
・評価ができないと適切にゴールに向かっているか分からない

ということです。AIの話をしているのか人事考課の話をしているのかアレですがそういうAIなんです。

説明するよりも実際コード書いて考えてもらったほうが楽なんで、早速GOAPのコード例いってみましょう。

単純GOAP: ちょびえさんは行きて帰りしご飯を食べる

GOAPのキモとしてはAIの設定者は「ゴールに到達すべき手順の条件を知っている」です。

初期状態:ちょびえさん自席に座っています。ご飯は持っていません。自販機は10の位置にあります。
GOAL: ちょびえさんは満腹になる

知っている行動:
・席を立つ(状態:立つ、前提:座る)
・行く(状態:移動+1、前提:立つ)
・帰る(状態:移動ー1、前提:立つ)
・自販機で食べ物を買う(状態:食べ物を所持、前提:自販機前にいる)
・座る(状態:座る、前提:立つ、自席前)
・ご飯を食べる(状態:満腹、前提:食べ物を所持、座っている)

さて、これでご飯が食べれる組み合わせをプランニングしてみましょう。
ストレートに総当りで実装します。

結果として

無事ご飯を食べることができました。

コード例を踏まえて

ストレートに実装して全体で200行程度です。GOAPのプラン算出部分は70行。このぐらいのサイズであれば色々試しやすいですね。
試しにpriorityを外して実行するとどうなったりするか遊んでみたり、ゴールと手段を変えてみたりすると面白いですよ。
シンプルであるがゆえに奥が深く、強力なツール(かけた労力の何倍もの効用をだしてくれる)にもなりえるのがGOAPです。

とはいえ、雑な設定をすると無限ループなどに陥ったりするので事象の適切なモデル化が必要です。

今回のサンプルコードはGOAPの仕組みの紹介程度なので非常に雑です。実際に使う場合はA*等を利用した行動選択の最適化等を行ってください。

GOAPの強み

GOAPの強みは手段の前提条件があるため、既知の状態であれば強固な復帰力で最後までやり遂げられるという所にあります。
反面、未知の状態に陥った場合や、そもそもゴールへの到達手段を設定側が知らない場合は意味のない行動をしてしまいます。

今回の例の場合、外的要因等による影響がなく実装が間違っていなければ成功する状況でしたが実際のゲーム、例えば自動実行エージェントをGOAPで実現するとした場合マップギミックで移動させられたり、イベントの介入があったり、外敵との戦闘などが出てくるのでそれらの状況に対応できるように組まなければいけません。
モデル化の抽象度も具体的な手順まで落とし込むのか、メタ的な事象に抑えて下位エージェントに委ねるのか、はたまたどうするのか…

プランニング系は単一AIというよりかは既存システムやUtility系のAIと組み合わせて使うことに真価があります。
自由度とメタ度が高すぎて、最終的に個別ソフトごとに密結合となるのでいまいちライブラリとしては流行りませんが知ってると便利なので使いこなしてアプリにあわせた実装ができるようにするのがおすすめです。

そいでは良いAIライフを