From 5bd52e414d5245cbf473aa2afe78b5d2c4d36ab4 Mon Sep 17 00:00:00 2001 From: NotXia <35894453+NotXia@users.noreply.github.com> Date: Thu, 30 Nov 2023 18:14:27 +0100 Subject: [PATCH] Add FAIKR1 Graphplan --- .../module1/img/_graphplan.drawio | 496 ++++++++++++++++++ .../module1/img/_graphplan.pdf | Bin 0 -> 35739 bytes .../module1/sections/_planning.tex | 252 ++++++++- 3 files changed, 746 insertions(+), 2 deletions(-) create mode 100644 src/fundamentals-of-ai-and-kr/module1/img/_graphplan.drawio create mode 100644 src/fundamentals-of-ai-and-kr/module1/img/_graphplan.pdf diff --git a/src/fundamentals-of-ai-and-kr/module1/img/_graphplan.drawio b/src/fundamentals-of-ai-and-kr/module1/img/_graphplan.drawio new file mode 100644 index 0000000..743e7f2 --- /dev/null +++ b/src/fundamentals-of-ai-and-kr/module1/img/_graphplan.drawio @@ -0,0 +1,496 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/fundamentals-of-ai-and-kr/module1/img/_graphplan.pdf b/src/fundamentals-of-ai-and-kr/module1/img/_graphplan.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6c25f8af3cd3eabba19a67ed0ac32876705df8a5 GIT binary patch literal 35739 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 YnCuorrUV`Kr>d@Y4#6uYXNX1r3-Q>OSO5S3 literal 0 HcmV?d00001 diff --git a/src/fundamentals-of-ai-and-kr/module1/sections/_planning.tex b/src/fundamentals-of-ai-and-kr/module1/sections/_planning.tex index 751b937..9902615 100644 --- a/src/fundamentals-of-ai-and-kr/module1/sections/_planning.tex +++ b/src/fundamentals-of-ai-and-kr/module1/sections/_planning.tex @@ -40,7 +40,7 @@ \item[Correctness] \marginnote{Correct planner} The planner always finds a solution that leads from the initial state to the goal. \item[Completeness] \marginnote{Complete planner} - The planner always finds a plan when it exits (planning is semi-decidable). + The planner always finds a plan when it exists (planning is semi-decidable). \end{descriptionlist} \item[Execution] \marginnote{Execution} @@ -777,4 +777,252 @@ The steps the algorithm does are: \item Checks the pre-conditions and post-conditions of the action it is going to execute. \item Backtracks the effects of an action in case of a failure. \item Corrects the plan if external events occur. -\end{itemize} \ No newline at end of file +\end{itemize} + + + +\section{Graphplan} +\marginnote{Graphplan} +Graphplan is an off-line, least-commitment planner (closed-world assumption) that +constructs a partially ordered set of actions through a planning graph based on time steps. + +The planner is correct, complete, optimal and computationally efficient. + + +\begin{description} + \item[Action] \marginnote{Actions} + An action, as in STRIPS, has: + \begin{itemize} + \item Preconditions. + \item Add list. + \item Delete list. + \end{itemize} + + \begin{description} + \item[\texttt{NO-OP}] + Action that does not change the state (to solve the frame problem). + Can be seen as an action with the same proposition as precondition and add list. + \end{description} + + \item[State] \marginnote{State} + A state is represented by a set of propositions that are true in that time step. + + \item[Planning graph] \marginnote{Planning graph} + Directed leveled graph where edges connect nodes of adjacent levels. + + There are two possible levels that are alternated during construction: + \begin{descriptionlist} + \item[Proposition level] + Contains propositions that describe the state. + Note that interfering propositions can appear. + \item[Action level] + Contains all the possible actions that have as preconditions the propositions in the previous level. + Note that interfering actions can appear. + \end{descriptionlist} + The first level of the graph is a proposition level containing the initial state. + + Edges can be: + \begin{descriptionlist} + \item[Precondition arcs] proposition $\rightarrow$ action. + \item[Add arcs] action $\rightarrow$ proposition. + \item[Delete arcs] action $\rightarrow$ proposition. + \end{descriptionlist} + + \item[Inconsistency] \marginnote{Inconsistency} + Actions and propositions can be inconsistent in the same time step. + Possible causes are: + \begin{descriptionlist} + \item[Inconsistent effects] \marginnote{Inconsistent effects} + An action negates the effects of another one. + + \item[Interference] \marginnote{Interference} + An action deletes the preconditions of another one. + + \item[Competing needs] \marginnote{Competing needs} + Propositions that cannot appear together either + because one negates the other or + because they can be reached only through mutually exclusive paths. + (i.e. two actions have mutually exclusive preconditions). + + \item[Domain dependent] + \end{descriptionlist} + + \item[Plan extraction] \marginnote{Plan extraction} + Once a proposition level containing the goal as non-mutually exclusive propositions has been reached, + the algorithm can attempt to extract a plan. + A valid plan has the following properties: + \begin{itemize} + \item Actions in the same time step do not interfere and can be executed in any order. + \item Propositions at the same time step are non-mutually exclusive. + \item The last step contains the goal as non-mutually exclusive propositions. + \end{itemize} + Even if the last step is a superset of the goal, planning may still fail. + In this case, the algorithm has to continue generating levels. + % Loop detection can be used to stop when a plan cannot be found. + + \item[Memoization] \marginnote{Memoization} + At each step, if the goal is not satisfiable, the result is saved and + when the same state is encountered in the future it will automatically fail. +\end{description} + + +\begin{theorem} + The following statements hold: + \begin{itemize} + \item If a valid plan exists, it can be found as a subgraph of the planning graph. + + \item In a planning graph, two actions in a time step are mutually exclusive + if a valid plan containing both does not exist. + + \item In a planning graph, two propositions are mutually exclusive if they are inconsistent. + \end{itemize} +\end{theorem} + +\begin{corollary} + Inconsistencies found during the planning graph construction + prune paths in the search tree. +\end{corollary} + + +\begin{algorithm}[H] +\caption{Graphplan} +\begin{lstlisting}[mathescape=true] +def graphplan(initial_state, actions, goal): + graph = PlanningGraph() + graph.addPropositionLevel(initial_state) + while True: + if (goal in graph.lastPropositionLevel and + not mutexPropositions(goal, graph.lastPropositionLevel)): + plan = extractSolution(graph, goal) + if plan is not FAIL: return plan + graph.addActionLevel( selectActions(graph) ) + graph.addPropositionLevel( selectPreconditions(graph, actions) ) + +def selectActions(graph, actions): + new_action_level = Level() + for action in actions.unify(graph.lastPropositionLevel): + preconds = action.preconditions + if not mutexPropositions(preconds, graph.lastPropositionLevel): + new_action_level.add(preconds, action) + for proposition in graph.lastPropositionLevel: + new_action_level.add(NO_OP(proposition)) + new_action_level.findInconsistencies() + return new_action_level + +def selectPreconditions(graph): + new_props_level = Level() + for action in graph.lastActionLevel: + for prop in action.add_list: + new_props_level.add(action, prop, "add") + for prop in action.delete_list: + new_props_level.add(action, prop, "delete") + new_props_level.findInconsistencies() + return new_props_level + +def extractSolution(graph, goal): + plan = Plan() + actions = graph.lastActionLevel.getActionsWithEffect(goal) + if mutexActions(actions, graph.lastActionLevel): return FAIL + plan.addLevel(actions) + graph = graph.popLastActionLevel() + return plan.merge(extractSolution(graph, actions.preconditions)) +\end{lstlisting} +\end{algorithm} + + +\begin{example}[Moving objects with a cart] + Given the actions: + \begin{descriptionlist} + \item[\texttt{MOVE(R, PosA, PosB)}] \phantom{} + \begin{description} + \item[Preconditions] $\texttt{at(R, PosA)}$, $\texttt{hasFuel(R)}$ + \item[Add list] $\texttt{at(R, PosB)}$ + \item[Delete list] $\texttt{at(R, PosA)}$, $\texttt{hasFuel(R)}$ + \end{description} + \end{descriptionlist} + + \begin{minipage}{0.5\textwidth} + \begin{descriptionlist} + \item[\texttt{LOAD(Obj, Pos)}] \phantom{} + \begin{description} + \item[Preconds] $\texttt{at(R, Pos)}$, $\texttt{at(Obj, Pos)}$ + \item[Add list] $\texttt{in(R, Obj)}$ + \item[Delete list] $\texttt{at(Obj, Pos)}$ + \end{description} + \end{descriptionlist} + \end{minipage} + \begin{minipage}{0.5\textwidth} + \begin{descriptionlist} + \item[\texttt{UNLOAD(Obj, Pos)}] \phantom{} + \begin{description} + \item[Preconds] $\texttt{in(R, Obj)}$, $\texttt{at(R, Pos)}$ + \item[Add list] $\texttt{at(Obj, Pos)}$ + \item[Delete list] $\texttt{in(R, Obj)}$ + \end{description} + \end{descriptionlist} + \end{minipage} + + Given a scenario where: + \begin{itemize} + \item \texttt{r} is a cart. + \item \texttt{a} and \texttt{b} are objects. + \item \texttt{l} and \texttt{p} are locations. + \end{itemize} + and the initial state is: + \begin{center} + \texttt{at(a, l)} $\cdot$ \texttt{at(b, l)} $\cdot$ \texttt{at(r, l)} $\cdot$ \texttt{hasFuel(r)} + \end{center} + + The first four time steps of the planning graph are: + \begin{center} + \includegraphics[width=\textwidth]{img/_graphplan.pdf} + \end{center} + + The inconsistencies at $t=1$ are: + \begin{descriptionlist} + \item[Inconsistent effects] \phantom{}\\[0.5em] + $\begin{cases}\texttt{NO-OP} \\ \texttt{LOAD(a, r)}\end{cases} \text{for } \texttt{at(a, l)}$, + $\begin{cases}\texttt{NO-OP} \\ \texttt{LOAD(b, r)}\end{cases} \text{for } \texttt{at(b, l)}$,\\[0.3em] + $\begin{cases}\texttt{NO-OP} \\ \texttt{MOVE(r, l, p)}\end{cases} \text{for } \texttt{at(r, l)}$, + $\begin{cases}\texttt{NO-OP} \\ \texttt{MOVE(r, l, p)}\end{cases} \text{for } \texttt{hasFuel(r)}$ + + \item[Interference] \phantom{}\\[0.5em] + $\begin{cases}\texttt{MOVE(r, l, p)} \\ \texttt{LOAD(a, r)}\end{cases} \text{for } \texttt{at(r, l)}$, + $\begin{cases}\texttt{MOVE(r, l, p)} \\ \texttt{LOAD(b, r)}\end{cases} \text{for } \texttt{at(r, l)}$ + \end{descriptionlist} + + The inconsistencies of at $t=2$ are: + \begin{descriptionlist} + \item[Competing needs] \phantom{}\\[0.5em] + Consequence of the add and delete list of each action:\\[0.3em] + $\begin{cases}\texttt{at(a, l)} \\ \texttt{in(r, a)}\end{cases}$, + $\begin{cases}\texttt{at(b, l)} \\ \texttt{in(r, b)}\end{cases}$, + $\begin{cases}\texttt{at(r, l)} \\ \texttt{at(r, p)}\end{cases}$, + $\begin{cases}\texttt{at(r, p)} \\ \texttt{hasFuel(r)}\end{cases}$\\[0.5em] + Consequence of the add list of interfering actions (mutual exclusion):\\[0.3em] + $\begin{cases}\texttt{in(r, a)} \\ \texttt{at(r, p)}\end{cases}$, + $\begin{cases}\texttt{in(r, b)} \\ \texttt{at(r, p)}\end{cases}$ + \end{descriptionlist} + + Note that because of the mutually exclusive propositions at $t=2$, + at $t=3$ the actions \texttt{UNLOAD($\cdot$, p)} cannot be performed. +\end{example} + + +\subsection{Fast forward} +\marginnote{Fast forward} +Heuristic planner based on Graphplan, hill climbing and A$^*$. + +\begin{description} + \item[Heuristic] + Given a problem $P$, the algorithm considers a relaxation $P^+$ + where delete effects are ignored. + $P^+$ is solved using Graphplan and the number of actions required to solve it is used as lower bound heuristic for $P$. + + \item[Algorithm] \phantom{} + \begin{enumerate} + \item From a state $S$, examine the successors. + \item If there is a successor $S'$ better than $S$, move into it and return to point 1. + \item Otherwise, run a complete A$^*$ search. + \end{enumerate} +\end{description} \ No newline at end of file