自動計画問題の概要
自動計画問題とは、ある目標を達成するために必要な一連の行動を計画する問題となる。具体的には、ある状態から出発し、目標状態に至るための行動の順序を決定するアルゴリズムで、自動計画問題は、人工知能やロボット工学などの分野で広く用いられる。
自動計画問題は、次のような要素を持つ。
- 状態空間: 自動計画問題は、状態空間上で定義される。状態空間とは、システムが取りうる全ての状態の集合のこととなる。状態空間は、有限状態空間や無限状態空間である場合がある。
- 行動空間: 自動計画問題では、ある状態から別の状態に遷移するために取る行動の集合を行動空間と呼ぶ。行動空間には、有限行動空間や無限行動空間がある。
- 制約条件: 自動計画問題には、行動に制約条件がある場合がある。制約条件の例として例えば、ある行動は他の行動に先行する必要がある、ある状態では特定の行動を実行することができない、などがある。
- 目的関数: 自動計画問題においては、目標状態に到達するための最小のコストや最短時間などの目的関数を最小化することが求められる。
自動計画問題には、状態空間探索法や逆問題解法、深層強化学習など様々な手法があり、実際に、自動計画問題を解決するには、問題に応じた最適な手法を選択することが重要となる。以下にそれらの手法について述べる。
自動計画問題での各種手法
自動計画問題を解決する手法として、以下のようなものがある。
- 状態空間探索法: 状態空間探索法は、状態空間が有限である場合に有効な手法で、状態空間上を探索することで、目標状態に至る計画を見つけるものとなる。具体的なアルゴリズムとしては、幅優先探索、深さ優先探索、Aアルゴリズム、IDAアルゴリズムなどがある。以下に状態空間探索系のアルゴリズムについて述べる。
-
- Aアルゴリズム: Aアルゴリズムは、最も一般的に使用される自動計画アルゴリズムの1つとなる。A*アルゴリズムは、与えられた問題に対する最適な解決策を探索するために、ヒューリスティック関数を使用する。このアルゴリズムは、計算時間がかかることがあるものの、概ね最適解を得ることができる。これら木探索系のアルゴリズムの詳細は”Clojureを用いたネットワーク解析(1) 幅優先/深さ優先探索・最短経路探索・最小スパニング木・サブグラフと連結成分“や、”グラフデータの基本的アルゴリズム(DFS、BFS、ニ部グラフ判定、最短路問題、最小全域木)“等を参照のこと。
- STRIPSアルゴリズム: STRIPSアルゴリズムは、人工知能の分野で広く使用される自動計画アルゴリズムの1つとなる。このアルゴリズムでは、計画を実現するために必要な前提条件とアクションのリストを考慮するものとなる。STRIPSアルゴリズムは、計算時間が比較的短く、シンプルな問題に適している。推論系のアルゴリズムに関しては”エキスパートシステムとCLIPSについて“や”後ろ向き推論と前向き推論“等を参照のこと。
- SATソルバー: SATソルバーは、命題論理の分野で使用される自動計画アルゴリズムの1つとなる。SATソルバーは、命題論理式が真であるかどうかを決定する問題を解決するもので、自動計画問題への適用では、SATソルバーを使用して、制約充足問題として解決する。SATに関しては”命題論理の充足可能性判定問題(SAT:Boolean SAtisfiability)の概要と実装“を参照のこと。
- 逆問題解法: 逆問題解法は、目標状態が与えられている場合に有効な手法で、目標状態から逆に遡って、初期状態に至る計画を見つける手法となる。これは以下のような手順で行われる。
-
- 目標状態を初期状態として設定する。
- 初期状態に至るためのアクションを計画に従って逆に適用し、現在の状態を更新する。
- 現在の状態が初期状態と一致する場合は、計画が見つかったとして終了する。そうでない場合は、ステップ2に戻る。
- 計画が見つからなかった場合は、問題が解決不能であることを示す。
この手法は、計画の長さに比例して計算量が増大するため、大規模な問題には適していない。また、計画の逆方向に進むためには、計画に関する情報を保持する必要があるため、メモリの使用量も問題となる場合もある。
- ランダム化探索法: ランダム化探索法は、ランダムな行動を繰り返して目標状態に至る計画を見つける手法となる。具体的には、”メタヒューリスティクスの数理 読書メモ“で述べてられているようなヒュリスティック系のアルゴリズムである”ランダムウォークの概要とアルゴリズム及び実装例“でも述べているランダムウォーク、焼きなまし法、”遺伝的アルゴリズムの概要と適用事例および実装例について“でも述べている遺伝的アルゴリズムなどとなる。ランダム化探索法は、局所解に陥る可能性に注意する必要がある。
- 最適化問題としての解法: 自動計画問題を最適化問題として定式化し、最適化手法を用いて解く手法がある。具体的には、”線形計画法の概要とアルゴリズム及び実装例について“で述べている線形計画法、整数計画法、非線形計画法などになる。これらの詳細は”機械学習における数学について“の最適化の数学の項に述べている。また、最適化問題として定式化することで、多目的最適化問題にも対応することもできる。
- 深層強化学習: 深層強化学習は、深層学習と強化学習を組み合わせた手法であり、行動決定のためのニューラルネットワークを学習することで、最適な計画を見つける手法となる。深層強化学習の自動計画への適用は、状態空間や行動空間が大きい場合に有効な手法として、近年注目されている。深層強化学習の詳細に関しては”様々な強化学習技術の理論とアルゴリズムとpythonによる実装“にて述べているので参照のこと。
自動計画問題に用いられるライブラリやプラットフォームについて
自動計画問題に取り組むために使用できるさまざまなライブラリやプラットフォームが存在する。以下にそれらのうちのいくつかについて述べる。
- PDDL (Planning Domain Definition Language): PDDLは、自動計画問題を表現するための一般的な言語となる。PDDLをサポートするライブラリやツールは、問題のモデリング、計画生成、計画の解析などのタスクを実行するのに役立つ。
- Fast Downward: Fast Downwardは、効率的なプランニングアルゴリズムを実装したオープンソースのプランニングフレームワークとなる。PDDLに対応しており、さまざまなドメインでの計画生成をサポートしている。
- STRIPS: STRIPS(Stanford Research Institute Problem Solver)は、自動計画問題を解くための古典的なフレームワークとなる。STRIPSは、アクションの前提条件と効果を定義し、計画を生成するためのアルゴリズムを提供している。
- ROS (Robot Operating System): ROSは、ロボットアプリケーション開発のための柔軟で強力なプラットフォームであり、ROSは、自動計画に関連するライブラリやツールを提供し、ロボットの移動計画、タスクのスケジューリングなどの問題を解決するために使用されている。
- PDDL4J: PDDL4Jは、Javaで書かれたPDDL(Planning Domain Definition Language)の解析および操作をサポートするライブラリとなる。PDDL4Jは、PDDLファイルの読み込み、問題の定義、計画の生成など、さまざまなPDDL関連のタスクを実行するために使用できる。
次に自動計画法の適用事例について述べる。
自動計画法の適用事例
自動計画問題は、多くの分野で活用されている。以下に、代表的な適用事例について述べる。
- スケジューリング: 自動計画問題が最もよくつか寄れているものにスケジューリング問題への適用がある。これは例えば、製造工程のスケジューリングや、オフィス内での会議のスケジューリングなどになる。
- ロボット制御: 自動計画問題は、ロボットの動作計画やタスクプランニングに応用されている。これは例えば、工場内での自律移動ロボットの動作計画や、物流センターでの搬送ロボットのタスクプランニングなどになる。
- ゲームAI: 自動計画問題は、”デジタルゲームAIの基本技術(時間認織) 過去記憶、未来(プランニング)“でも述べられているように、ゲームAIの分野でも活用されている。これは例えば、チェスや将棋などのボードゲームで、次の最適手を考える問題が自動計画問題であったり、また、リアルタイムストラテジーゲームでの、ユニットの移動や攻撃などの行動計画などになる。
- 認知ロボティクス: 自動計画問題は、認知ロボティクスの分野でも活用されている。これは例えば、視覚情報を基にして机の上の物体をつかむためのアームの動作計画や、人間との共同作業を実現するための行動計画などになる。
- 自動運転: 自動計画問題は、自動運転技術にも応用されている。これは例えば、車両の軌道計画や速度制御などになる。
pythonによる実装
自動計画法のPythonを用いた実装にはいくつかのライブラリがある。ここでは、PDDLという形式で記述された問題を解くためのライブラリであるpyperplanを使用した自動計画法のPython実装について述べる。まずは、pyperplanライブラリをインストールする。
>pip install pyperplan
次に、PDDLファイルを作成する。
PDDL(Planning Domain Definition Language)は、人工知能の分野で自動計画を行うために使用される形式言語の一つであり、計画のドメインと問題を記述するための標準的な記述言語で、多くの自動計画システムがPDDLをサポートしているものとなる。
PDDLでは、計画問題の状態、初期状態、アクション、ゴール状態などを定義することができ、ドメイン記述には、アクションや状態変数、制約条件などを定義するための言語要素がある。問題記述には、具体的な状態や目標状態、使用可能なオブジェクトなどが含まれる。
(define (problem sample)
(:domain sample-domain)
(:objects a b c)
(:init (on a b) (on b c) (clear a) (clear c))
(:goal (and (on a c) (on c b))))
上記のPDDLファイルは、サンプルのドメインという名前のドメインにおいて、a、b、cという3つのオブジェクトがあり、aがbの上に、bがcの上に、aとcがどちらも自由な状態から始まり、aがcの上に、cがbの上になるようにすることを目標としている。次に、Pythonコードを作成する。
from pyperplan import Plan
from pyperplan.planning import AbstractTask, Task
from pyperplan.search import AStar
from pyperplan.propositional_planner import PropositionalPlanner
from pyperplan.heuristics import BlindHeuristic
# PDDLファイルを読み込む
domain_file = 'sample-domain.pddl'
problem_file = 'sample-problem.pddl'
# 問題を表すオブジェクトを作成する
task = Task(domain_file, problem_file)
# 問題を解くための検索アルゴリズムを作成する
search_algorithm = AStar()
# 問題を解くためのプランナーを作成する
planner = PropositionalPlanner(task, search_algorithm, BlindHeuristic())
# 問題を解く
plan = planner.plan()
# プランを表示する
for action in plan:
print(action.name)
上記のPythonコードは、pyperplanライブラリを使用して、先ほど作成したPDDLファイルで表された問題を解き、プランを表示するものとなる。この他にも、pythonではFFやFast-Downwardといった自動計画法のためのライブラリがある。
Clojureでの実装
自動計画法は、Clojureのような関数型言語でも実装できる。Clojureには、PDDL形式の問題を解くためのライブラリであるclj-planningがある。以下で、clj-planningを使用した自動計画法のClojure実装例を示す。まずは、clj-planningライブラリをプロジェクトに追加する。
;; Leiningenを使っている場合
[clj-planning "0.4.0"]
次に、前述のpyhtonのケースと同様にPDDLファイルを作成する。
(define (problem sample)
(:domain sample-domain)
(:objects a b c)
(:init (on a b) (on b c) (clear a) (clear c))
(:goal (and (on a c) (on c b))))
上記のPDDLファイルは、サンプルのドメインという名前のドメインにおいて、a、b、cという3つのオブジェクトがあり、aがbの上に、bがcの上に、aとcがどちらも自由な状態から始まり、aがcの上に、cがbの上になるようにすることを目標としている。次に、Clojureコードを作成する。
(ns my-project.core
(:require [clj-planning.core :as planning]))
;; PDDLファイルを読み込む
(def domain-file "sample-domain.pddl")
(def problem-file "sample-problem.pddl")
;; 問題を解く
(let [task (planning/task-from-files domain-file problem-file)
plan (planning/plan task)]
;; プランを表示する
(doseq [action plan]
(println (:name action))))
上記のClojureコードは、clj-planningライブラリを使用して、先ほど作成したPDDLファイルで表された問題を解き、プランを表示するものとなる。Clojureでは他にも、STRIPSやFast Downwardといった自動計画法のためのライブラリがある。
これらの基本的な概念は古くはLISPで開発されており、それらの詳細については”実用Common Lisp 読書メモ“も参照のこと。
参考図書
基礎と体系的解説
-
Automated Planning: Theory and Practice
Malik Ghallab, Dana Nau, Paolo Traverso
Morgan Kaufmann, 2004-
自動計画の古典的かつ体系的な教科書。STRIPS, HTN, PDDLなどの形式表現やアルゴリズムを詳細に解説。
-
-
Planning Algorithms
Steven M. LaValle
Cambridge University Press, 2006(無料オンライン版あり)-
ロボット工学や経路計画まで含む幅広い計画アルゴリズムを網羅。動的環境や確率的計画にも対応。
-
-
Automated Planning and Acting
Malik Ghallab, Dana Nau, Paolo Traverso
Cambridge University Press, 2016-
上記の改訂・発展版。古典的プランニングに加え、リアクティブプランニングや実行監視を解説。
-
発展・専門分野
-
Principles of Artificial Intelligence Planning
Michael Ghallab, Craig Knoblock(編)-
古典AI計画から発展的テーマまで、特定分野の深掘りに有用。
-
-
Temporal Planning
Daniele Magazzeni, Enrico Scala-
時間制約やリソース制約を含む計画手法を扱う専門書。
-
関連・応用
-
Artificial Intelligence: A Modern Approach (3rd Edition)
Stuart Russell, Peter Norvig-
AI全般の教科書だが、自動計画の基礎(古典的計画、部分順序計画、確率的計画)もカバー。
-
コメント
[…] 自動計画問題の概要と参考図書 […]