This project includes skeletons for the classes and functions needed to solve deterministic logistics planning problems for an Air Cargo transport system using a planning search agent. With progression search algorithms like those in the navigation problem from lecture, optimal plans for each problem will be computed. Unlike the navigation problem, there is no simple distance heuristic to aid the agent. Instead, you will implement domain-independent heuristics.
my_air_cargo_problems.py
my_air_cargo_problems.py
my_planning_graph.py
“Artificial Intelligence: A Modern Approach” 3rd edition chapter 10 or 2nd edition Chapter 11 on Planning, available on the AIMA book site sections:
All problems are in the Air Cargo domain. They have the same action schema defined, but different initial states and goals.
Action(Load(c, p, a),
PRECOND: At(c, a) ∧ At(p, a) ∧ Cargo(c) ∧ Plane(p) ∧ Airport(a)
EFFECT: ¬ At(c, a) ∧ In(c, p))
Action(Unload(c, p, a),
PRECOND: In(c, p) ∧ At(p, a) ∧ Cargo(c) ∧ Plane(p) ∧ Airport(a)
EFFECT: At(c, a) ∧ ¬ In(c, p))
Action(Fly(p, from, to),
PRECOND: At(p, from) ∧ Plane(p) ∧ Airport(from) ∧ Airport(to)
EFFECT: ¬ At(p, from) ∧ At(p, to))
Init(At(C1, SFO) ∧ At(C2, JFK)
∧ At(P1, SFO) ∧ At(P2, JFK)
∧ Cargo(C1) ∧ Cargo(C2)
∧ Plane(P1) ∧ Plane(P2)
∧ Airport(JFK) ∧ Airport(SFO))
Goal(At(C1, JFK) ∧ At(C2, SFO))
Init(At(C1, SFO) ∧ At(C2, JFK) ∧ At(C3, ATL)
∧ At(P1, SFO) ∧ At(P2, JFK) ∧ At(P3, ATL)
∧ Cargo(C1) ∧ Cargo(C2) ∧ Cargo(C3)
∧ Plane(P1) ∧ Plane(P2) ∧ Plane(P3)
∧ Airport(JFK) ∧ Airport(SFO) ∧ Airport(ATL))
Goal(At(C1, JFK) ∧ At(C2, SFO) ∧ At(C3, SFO))
Init(At(C1, SFO) ∧ At(C2, JFK) ∧ At(C3, ATL) ∧ At(C4, ORD)
∧ At(P1, SFO) ∧ At(P2, JFK)
∧ Cargo(C1) ∧ Cargo(C2) ∧ Cargo(C3) ∧ Cargo(C4)
∧ Plane(P1) ∧ Plane(P2)
∧ Airport(JFK) ∧ Airport(SFO) ∧ Airport(ATL) ∧ Airport(ORD))
Goal(At(C1, JFK) ∧ At(C3, JFK) ∧ At(C2, SFO) ∧ At(C4, SFO))
my_air_cargo_problems.py
AirCargoProblem.get_actions
method including load_actions
and unload_actions
sub-functionsAirCargoProblem.actions
methodAirCargoProblem.result
methodair_cargo_p2
functionair_cargo_p3
functionair_cargo_p1
, air_cargo_p2
, and air_cargo_p3
; provide metrics on number of node expansions required, number of goal tests, time elapsed, and optimality of solution for each search algorithm. Include the result of at least three of these searches, including breadth-first and depth-first, in your write-up (breadth_first_search
and depth_first_graph_search
).run_search
script for your data collection: from the command line type python run_search.py -h
to learn more.Why are we setting the problems up this way?
Progression planning problems can be solved with graph searches such as breadth-first, depth-first, and A*, where the nodes of the graph are “states” and edges are “actions”. A “state” is the logical conjunction of all boolean ground “fluents”, or state variables, that are possible for the problem using Propositional Logic. For example, we might have a problem to plan the transport of one cargo, C1, on a single available plane, P1, from one airport to another, SFO to JFK. In this simple example, there are five fluents, or state variables, which means our state space could be as large as . Note the following:
- While the initial state defines every fluent explicitly, in this case mapped to TTFFF, the goal may be a set of states. Any state that is
True
for the fluentAt(C1,JFK)
meets the goal.- Even though PDDL uses variable to describe actions as “action schema”, these problems are not solved with First Order Logic. They are solved with Propositional logic and must therefore be defined with concrete (non-variable) actions and literal (non-variable) fluents in state descriptions.
- The fluents here are mapped to a simple string representing the boolean value of each fluent in the system, e.g. TTFFTT…TTF. This will be the state representation in the
AirCargoProblem
class and is compatible with theNode
andProblem
classes, and the search methods in the AIMA library.
“Artificial Intelligence: A Modern Approach” 3rd edition chapter 10 or 2nd edition Chapter 11 on Planning, available on the AIMA book site section:
my_air_cargo_problems.py
AirCargoProblem.h_ignore_preconditions
methodmy_planning_graph.py
PlanningGraph.add_action_level
methodPlanningGraph.add_literal_level
methodPlanningGraph.inconsistent_effects_mutex
methodPlanningGraph.interference_mutex
methodPlanningGraph.competing_needs_mutex
methodPlanningGraph.negation_mutex
methodPlanningGraph.inconsistent_support_mutex
methodPlanningGraph.h_levelsum
methodair_cargo_p1
, air_cargo_p2
and air_cargo_p3
. Provide metrics on number of node expansions required, number of goal tests, time elapsed, and optimality of solution for each search algorithm and include the results in your report.run_search
script for this purpose: from the command line type python run_search.py -h
to learn more.Why a Planning Graph?
The planning graph is somewhat complex, but is useful in planning because it is a polynomial-size approximation of the exponential tree that represents all possible paths. The planning graph can be used to provide automated admissible heuristics for any domain. It can also be used as the first step in implementing GRAPHPLAN, a direct planning algorithm that you may wish to learn more about on your own (but we will not address it here).
Planning Graph example from the AIMA book
example_have_cake
module as an example.tests
directory includes unittest
test cases to evaluate your implementations. All tests should pass before you submit your project for review. From the AIND-Planning directory command line:
python -m unittest tests.test_my_air_cargo_problems
python -m unittest tests.test_my_planning_graph
run_search
script is provided for gathering metrics for various search methods on any or all of the problems and should be used for this purpose.Before submitting your solution to a reviewer, you are required to submit your project to Udacity’s Project Assistant, which will provide some initial feedback.
The setup is simple. If you have not installed the client tool already, then you may do so with the command pip install udacity-pa
.
To submit your code to the project assistant, run udacity submit
from within the top-level directory of this project. You will be prompted for a username and password. If you login using google or facebook, visit this link for alternate login instructions.
This process will create a zipfile in your top-level directory named cargo_planning-
The exercises in this project can take a long time to run (from several seconds to a several hours) depending on the heuristics and search algorithms you choose, as well as the efficiency of your own code. (You may want to stop and profile your code if runtimes stretch past a few minutes.) One option to improve execution time is to try installing and using pypy3 – a python JIT, which can accelerate execution time substantially. Using pypy is not required (and thus not officially supported) – an efficient solution to this project runs in very reasonable time on modest hardware – but working with pypy may allow students to explore more sophisticated problems than the examples included in the project.