introduction to artificial intelligence lecture 13 : advanced planning

Post on 19-Jan-2016

36 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

Introduction to Artificial Intelligence LECTURE 13 : Advanced Planning. Motivation: least commitment principle Partial-order planning ( POP) Planning with partially instantiated operators Hierarchical decomposition Other extensions - PowerPoint PPT Presentation

TRANSCRIPT

Intro to AI Fall 2002 © L. Joskowicz 1

Introduction to Artificial Intelligence LECTURE 13: Advanced Planning

• Motivation: least commitment principle

• Partial-order planning (POP)

• Planning with partially instantiated operators

• Hierarchical decomposition

• Other extensions “An Introduction to Least Commitment Planning” D. Weld,

Artificial Intelligence Magazine, Winter 1994, pp 27-61.

Intro to AI Fall 2002 © L. Joskowicz 2

Least commitment principle• Make choices only when necessary, leaving

the decision for the time it is required– variable binding: most-general unifier is a least

commitment strategy

Prefer buy(Store,drill) to buy(store55,drill)– partial ordering: assume operators can be

performed simultaneously unless there is a requirement to do otherwise

if S1 deletes precondition c and c is needed by S2, perform S2 before S1

Intro to AI Fall 2002 © L. Joskowicz 3

Example: putting on shoes• Start: {}• Goal: {RightShoeOn, LeftShoeOn} • Operators:

Op(Action: RightShoeOn, Precond: RightSockOn, Effect: RightShoeOn)Op(Action: LeftShoeOn Precond: LeftSockOn, Effect: LeftShoeOn)Op(Action: RightSockOn

Effect: RightSockOn) Op(Action: LeftSockOn,

Effect: LeftSockOn)

Intro to AI Fall 2002 © L. Joskowicz 4

Partial vs. total order plans

Intro to AI Fall 2002 © L. Joskowicz 5

Operator representation

• Operator name, precondition, effect (both add and delete lists)Op(Action: action-name,

Precond: conjunction of literals (positive)

Effect: conjuction of literals (positive and negative)

• Graphically

action-name

p1 p2 .... pn

e1 e2 .... em

preconditions

effects

Intro to AI Fall 2002 © L. Joskowicz 6

Plan representation (1)• Plan steps: a sequence of operators

<S1, S2, …., Sn>

• Step ordering constraints: indicate step precedence relations Si

< Sj “Si must be executed sometime before Sj”

• Variable binding constraints: indicate variable assignments X = a, Y b, etc

• Causal links: record the purpose of the step Si

-- c --> Sj “Si achieves precondition c for Sj”

Intro to AI Fall 2002 © L. Joskowicz 7

Plan representation (2)• Initially, the plan consists of two steps, Start and

Finish, with null actions associated to them, with ordering Start < Finish and with the desired goal (g1 /\ g2 /\ … /\ gn) as precondition

Plan(Steps:{S1: Op(Action: Start), S2: Op(Action: Finish, Precond: (g1 /\ g2 … /\gn))}Orderings: {Si < Sj },Bindings: {},

Links: {})

Intro to AI Fall 2002 © L. Joskowicz 8

Example of plan representation

Start

Finish

LeftShoeOn /\ RightShoeOn

Ordering:Left Sock < Left ShoeRight Sock < Right ShoeStart < all, Finish > “all”

links

Intro to AI Fall 2002 © L. Joskowicz 9

Complete plans

A plan is complete iff each precondition of each step is achieved by some other step. A step achieves a precondition if the condition is one of the effects of the step and if no other step can cancel out the condition:

Si achieves precondition c of Sj iff

1. (Si < Sj) /\ (c in Effects(Si))

2. ~Sk (~c in Effects(Sk)) /\ (Si < Sk < Sj)

Intro to AI Fall 2002 © L. Joskowicz 10

Consistent plans

A plan is consistent iff there are no contradictions in the ordering or binding constraints. A contradiction occurs when:

1. (Si < Sj) and (Sj < Si)

or

2. (X = a) /\ (X = b) or (X=a) /\ (X a)

Intro to AI Fall 2002 © L. Joskowicz 11

Solutions as plans

• A solution is a complete and consistent plan that achieves the desired goal.

• Any linearization of a partial plan is also a solution

• Partially ordered plans are better solutions than totally ordered plans because:– no arbitrary choice of ordering– parallel execution of branches– easier to combine plan fragments

Intro to AI Fall 2002 © L. Joskowicz 12

Partial Order Planner: Overview• Regression planning: work from goal to start

• Start from the initial plan, add one step (operator) in each iteration

• Add only steps that serve to achieve a precondition that has not been achieved yet.

• Keep track of interactions with causal links. When a conflict occurs, resolve it by imposing an order between steps

• Keep track of all choice points and backtrack as necessary

Intro to AI Fall 2002 © L. Joskowicz 13

Example: shopping for groceriesSM = SupermarketHWS = Hardware Store

Steps: {Start: Op(Action: Start, Effect: At(Home) /\ Sells(HWS,Drill)/\ Sells(SM,Milk) /\ Sells(SM,Banana),

Finish: Op(Action: Finish, Precond: At(Home) /\ Have(Drill)/\ Have(Milk) /\ Have(Banana)}

Intro to AI Fall 2002 © L. Joskowicz 14

Actions: Go and Buy• Op(Action: Go(there) Precond: At(here)

Effect: At(there) /\ ~At(here))

• Op(Action: Buy(x)

Precond: At(store) /\ Sells(store,x)

Effect: Have(x)

Go(there)

At(here)

At(there) ~At(here)

Buy(x)

At(store) Sells(store(x)

Have(x)

Intro to AI Fall 2002 © L. Joskowicz 15

Plan to achieve three preconditions

Have(Milk) Have(Ban.)Have(Drill)

At(Home) Sells(HWS,Drill) Sells(SM,Milk) Sells(SM,Ban.)

Bold links are causal linksLight links are ordering links

Intro to AI Fall 2002 © L. Joskowicz 16

Instantiation and causal links

{s/SM} {s/SM}{s/HWS}

Causal links can be added because there is no conflict! No ordering is necessary

At(Home) Sells(HWS,Drill) Sells(SM,Milk) Sells(SM,Ban.)

Have(Milk) Have(Ban.)Have(Drill)

Intro to AI Fall 2002 © L. Joskowicz 17

Next step: get to the store

At(Home) Sells(HWS,Drill) Sells(SM,Milk) Sells(SM,Ban.)

At(HWS) ~At(x) At(SM) ~At(x)

Have(Milk) Have(Ban.)Have(Drill)

Intro to AI Fall 2002 © L. Joskowicz 18

Instantiation and causal links

{x/Home}{x/Home}

At(Home) Sells(HWS,Drill) Sells(SM,Milk) Sells(SM,Ban.)

At(HWS) ~At(Home) At(SM) ~At(Home)

Have(Milk) Have(Ban.)Have(Drill)

Flawed plan! Causal links conflict: cannot be in two places simultaneously ! Re-ordering is necessary

Intro to AI Fall 2002 © L. Joskowicz 19

Soving causal link conflicts

cc c

Promotion and demotion sequentialize actions

Intro to AI Fall 2002 © L. Joskowicz 20

After threat resolution (demotion)

At(Home) Sells(HWS,Drill) Sells(SM,Milk) Sells(SM,Ban.)

At(HWS) At(SM)

Have(Milk) Have(Ban.) At(Home)Have(Drill)

Intro to AI Fall 2002 © L. Joskowicz 21

FinalSolution

Have(Milk) Have(Ban.)

At(SM)

At(Home)

Have(Drill)

At(HWS)

At(Home) Sells(HWS,Drill) Sells(SM,Milk) Sells(SM,Ban.)

Intro to AI Fall 2002 © L. Joskowicz 22

POP algorithm (1)function POP(initial,goal,operators) returns plan

plan := Make-Minimal-Plan(initial,goal)

loop do if Solution?(plan) then return plan (S-need,c) := Select-Sub-Goal(plan) Choose-Operator(plan,operators,S-need,c) Resolve-Threats(plan) end

function Select-Subgoal(plan) returns (S-need,c) pick a plan step S-need from STEPS(plan) with a precondition c that has not been achievedreturns (S-need,c)

Intro to AI Fall 2002 © L. Joskowicz 23

POP algorithm (2)procedure Choose-Operator(plan,operators,S-need,c)

choose (a step S-add from operators) or

(STEPS(plan) that has c as an effect) if there is no such step then fail add causal link (S-add -- c --> S-need) to LINKS(plan) add ordering constraint S-add < S-need to ORDERINGS(plan) if S-add is a newly added step from operators then

add S-add to STEPS(plan) add Start < S-add < Finish to ORDERINGS(plan)

procedure Resolve-Threats(plan) for each S-threat that threatens a link (Si -- c --> Sj) in

LINKS(plan) do choose either Promotion: add S-threat < Si to ORDERINGS(plan) Demotion: add Sj < S-threat to ORDERINGS(plan) if not Consistent(plan) then fail

Intro to AI Fall 2002 © L. Joskowicz 24

POP is sound and complete• POP constructs a proof that each

precondition of the goal step is achieved:– Choose-Operator selects an action to get subgoal– Resolve-Threats sequentializes to ensure no

interference between operations

• POP is sound and complete: every plan it returns is a solution, and if there is a solution, it will be found (assuming complete search -- BFS or iterative deepening search)

• It is also sound and complete with partially instantiated operators (see next slides)

Intro to AI Fall 2002 © L. Joskowicz 25

• Resolving conflicts with partially instantiated operators: is At(x) a threat to ~At(Home)? It is a possible threat, which can be dealt with by1. resolve now with an equality constraint

add binding x = HWS

2. resolve now with an inequality constraint

add the clause x Home

3. resolve later: do nothing. It is not a threat until x becomes instantiated. When it does, use promotion and demotion to resolve the conflict.

Partially instantiated operators

Intro to AI Fall 2002 © L. Joskowicz 26

Extended notion of achievingA step achieves a precondition if the condition is

one of the effects of the step, and if no other step can cancel out the condition for all instantiations.

Si achieves precondition c of Sj iff

1. (Si < Sj) and Si has an effect c’ that necessarily unifies with c

2. ~Sk (Si < Sk < Sj) in some linearization of the plan and Sk has an effect c’ that possibly unifies with ~c.

Si

Sj

cc’

Intro to AI Fall 2002 © L. Joskowicz 27

Modified Choose-Operator*

procedure Choose-Operator(plan,operators,S-need,c)

choose (a step S-add from operators) or

(STEPS(plan) that has c-add as an effect)

such that u = Unify(c,c-add,Bindings(plan)) if there is no such step then fail add u to Bindings(plan) add causal link (S-add -- c --> S-need) to LINKS(plan) add ordering constraint S-add < S-need to ORDERINGS(plan) if S-add is a newly added step from operators then

add S-add to STEPS(plan) add Start < S-add < Finish to ORDERINGS(plan)

* for resolving later -- least commitment strategy

Intro to AI Fall 2002 © L. Joskowicz 28

Modified Resolve-Threats*procedure Resolve-Threats(plan) for each (Si -- c --> Sj) in LINKS(plan) do for each S-threat in STEPS(plan) do for each c’ in EFFECTS(S-threat) do if Subst(Bindings(plan),c) = Subst(Bindings(plan),~c’)

then choose either

Promotion: add S-threat < Si to ORDERINGS(plan) Demotion: add Sj < S-threat to ORDERINGS(plan) if not Consistent(plan) then fail end end end

* for resolving later -- least commitment strategy

Intro to AI Fall 2002 © L. Joskowicz 29

Blocks world revisited

b

c

a

a

c

b

Follow POP on blocks world examples!

Intro to AI Fall 2002 © L. Joskowicz 30

Advanced planning topics

• Hierarchical planssteps at different levels of resolution

• More complex conditionsuniversal quantification, conditionals

• Dealing with time constraintsincorporate time intervals an deadlines

• Resources and costschoose the plan that satisfies resource

and cost constraints

Intro to AI Fall 2002 © L. Joskowicz 31

Hierarchical decomposition

• POP does not distinguish between different levels of abstraction of operators:

go(home,airport) vs. go(bed,living_room)

Typical plans usually have many steps!

Figure out first how to get to the airport, then find out how to exit the house!

• Operators should describe actions at different levels of abstraction, so “big” goals get solved first

Intro to AI Fall 2002 © L. Joskowicz 32

Example

Intro to AI Fall 2002 © L. Joskowicz 33

Abstract operators

• Decompose operators into a group of more detailed operators that form a plan to implement it.

• The decomposition ends with primitive operators which are not decomposedBuild(House) is decomposed into Build(Foundation), Build(Floor), Build(Walls), Build(Roof), …..

Intro to AI Fall 2002 © L. Joskowicz 34

Decomposition methods (1)• Specify that a nonprimitive operator that unifies

with it can be decomposed into a plan

• Decompose(operation,p) is a new structure akin to a subroutine or a macro for operators:Decompose(Construction,

Plan(Steps:{S1: Build(Foundation), S2: Build(Frame), S3: Build(Roof), S4: Build(Walls), S5: Build(Interior)}

Orderings:{S1<S2; S2<S3; S2<S4; S3<S5 ; S4<S5, ..... }, Bindings: {},

Foundation Frame Frame Roof Walls

Links: {S1 --->S2 , S2 ---->S3, S2 --->S4, S3 --->S5, S4 --->S5 }))

Intro to AI Fall 2002 © L. Joskowicz 35

Decomposition methods (2)• Plan p correctly implements an operator o if it

is a complete and consistent plan for the problem of achieving the effects of o given the preconditions of o:– p must be consistent (no ordering or assignment

contradiction).– every effect of o must be asserted by at least one

step of p and not denied by a later step.– every precondition of steps in p must be achieved

by a step in p or be one of the preconditions of o.

Intro to AI Fall 2002 © L. Joskowicz 36

Hierarchical POP algorithm

function HD-POP(plan,operators,methods) returns plan

loop do if Solution?(plan) then return plan (S-need,c) := Select-Sub-Goal(plan) Choose-Operator(plan,operators,S-need,c) S-nonprimitive := Select-Nonprimitive(plan) Choose-Decomposition(plan,methods,S-nonprimitive) Resolve-Threats(plan) end

Intro to AI Fall 2002 © L. Joskowicz 37

HD-POP subroutines• Solution? must check that every step of the plan

is primitive • Select-Nonprimitive arbitrarily selects a non-

primitive step of the plan (no backtracking)• Choose-Decomposition: when a method is

chosen:1. Steps: add all method steps, remove S-nonprimitive2. Bindings: add all bindings of method3. Orderings: place new constraints latest or earliest4. Links: explicitly add all links

Fail if 1 or 2 introduce a contradiction!

Intro to AI Fall 2002 © L. Joskowicz 38

Detailed decomposition of a step

Intro to AI Fall 2002 © L. Joskowicz 39

Analysis of hierarchical decomposition• HD helps prune branches in the search tree.

Two useful properties of solutions are: – Downward solution property: if p is an abstract

solution, then there is a primitive solution of which p is an abstraction.

Once an abstract solution is found, all other branches can be pruned!

– Upward solution property: if p is an inconsistent abstract plan, then there is no primitive solution of which it is an abstraction

Prune away all descendants of inconsistent plans!

Intro to AI Fall 2002 © L. Joskowicz 40

Solution space properties

Bold boxes are solutionsDotted boxes are inconsistentBoxes marked with “X” can be pruned

abstract

primitive

plan

Intro to AI Fall 2002 © L. Joskowicz 41

Complexity of hierarchical decomp.• For a plan with n steps and an average of b

choices at each step (branching factor), the complexity of search is O(bn)

• Let d be the depth of the hierarchical plan, and s average number of decomposition steps. When only searching for abstract solutions, one of every b decompositions is a solution. If each decomposition has s steps, the planner looks at bsi steps at depth d =i. The complexity is O(bsd) << O(bn)

Intro to AI Fall 2002 © L. Joskowicz 42

Quantitative example

abstract

primitive

Intro to AI Fall 2002 © L. Joskowicz 43

Is completeness preserved?• The upward and downward solution properties

are not necessary correctness conditions for decompositions!

• To avoid loosing completeness, no pruning can take place -- still can be used to guide search

• There is an abstract solution that is inconsistent, but the decomposition solves the problem.

“a couple has two possesions: he a gold watch and her beautiful hair. They each plan to buy presents to make each other happy. He wants to trade the watch for a comb, she wants to trade her hair for a watch chain. Can they execute their plans?

Intro to AI Fall 2002 © L. Joskowicz 44

Ex: no upward solution property

Cannot be ordered!

Intro to AI Fall 2002 © L. Joskowicz 45

Solution: unique main subaction

• To guarantee the upward solution property, require that there is one step of the decomposed plan to which all preconditions and effects of the abstract operator are attached

• In the previous example, the unique main subaction condition does not hold!

Intro to AI Fall 2002 © L. Joskowicz 46

Approximation• Another way of guiding the search is to rank

goals by order of importance (criticality level).

Op(Action: Buy(x)Effect: Have(x) /\ Have(MoneyAmount)

Precond: 1. Sells(store,x) /\ 2. At(store) /\ 3. Have(MoneyAmount)

• Solve the problem by considering ONLY preconditions with criticality less or equal than 1, than 2, etc.

Intro to AI Fall 2002 © L. Joskowicz 47

Other extensions

• More expressive operator descriptions– conditional effects: add when conditions– universal quantification: preconditions with

“forall” quantifier

• Resource constraints: consider costs of each action -- leads to optimization problems

• Time constraints: can be handled as resources

Intro to AI Fall 2002 © L. Joskowicz 48

Conditional effects• Previous scheme sometimes forces premature

commitment that can lead to inefficiencies• Solution: extend the operator language to include

conditional effects: “condition c must hold when p holds”. Such type of clauses will be added to the effects of an action.

• If later p appears, the condition c will be added and handled.

• Extend Select-SubGoal and Resolve-Threats to deal with this new type of conditionals

Intro to AI Fall 2002 © L. Joskowicz 49

Conditionals: example• Two different actions for picking a block:

Op(Action: move(B,X,Y),

Precond: on(B,X) /\ clear(B) /\ clear(Y)

Effect: on(B,Y) /\ ~on(B,X) /\ clear(X) /\ clear(B) /\

~clear(Y))

Op(Action: movetotable(B,X),

Precond: on(B,X) /\ clear(B)

Effect: on(B,table) /\ ~on(B,X) /\ clear(X) /\ clear(B)

• Start: on(a,b)

• Goal: clear(b)

• Problem: two operators for the same type of action!

Intro to AI Fall 2002 © L. Joskowicz 50

Conditionals: solution • One operator with conditional effect:

Op(Action: move(B,X,Y),Precond: on(B,X) /\ clear(X) /\ clear(Y)

Effect: on(B,Y) /\ ~on(B,X) /\ clear(X) /\ clear(B)

/\ (~clear(Y)) when Y table)

• When Y gets instantiated, the condition ~clear(Y) will be added if appropriate.

• To resolve threats: if a step has the effect (~c’ when p) is a possible threat to the causal link Si

-- c --> Sj when c’ and c unify. Resolve threat by

confrontation: ensuring that p does not hold.

Intro to AI Fall 2002 © L. Joskowicz 51

Resolve-Threats with conditionalsprocedure Resolve-Threats(plan) for each (Si -- c --> Sj) in LINKS(plan) do for each S-threat in STEPS(plan) do for each c’ in EFFECTS(S-threat) do if Subst(Bindings(plan),c) = Subst(Bindings(plan),~c’)

then choose either

Promotion: add S-threat < Si to ORDERINGS(plan) Demotion: add Sj < S-threat to ORDERINGS(plan)

Confrontation: if c’ is of the form (c’ when p) thenChoose-Operator(plan,operators,S-threat,~p)Resolve-Threats(plan)

if not Consistent(plan) then fail end end end~

Intro to AI Fall 2002 © L. Joskowicz 52

Negated and disjuctive preconditions• Choose-Operator introduced a negated literal• Can be handled by checking for effects that

match the goal, and ensure that unification between p and ~~p is possible. Also, must deal with special “closed-world assumption” requirements for start, where no negative literals are present.

• Disjunctive preconditions p \/ q introduce nondeterministic choices.

• Disjunctive effects are harder to deal with... Ex: Flip(coin)

Intro to AI Fall 2002 © L. Joskowicz 53

Universal quantification (1)• Extend the language and algorithms to handle

general statements

• In preconditions: instead of clear(b), writeX block(X) => ~on(X,B) “no block is on top of b”

• In effects:Op(Action: carry(Bag,X,Y),

Precond: bag(Bag) /\ at(Bag,X), Effect: at(Bag,Y) /\ ~at(Bag,X) /\

I item(I) => (at(I,Y) /\ ~at(I,X)) when in(Y,Bag))

“all objects that are in a bag are in location Y after the bag has been carried from location X to location Y”

Intro to AI Fall 2002 © L. Joskowicz 54

Universal quantification (2)

• Note that adding universal quantification does NOT turn the language into FOL. The restrictions are:– worlds with finite, static, typed universe– universally quantified conditions satisfied by simple

enumeration

X t(X) => c(X) is c(x1) when t(x1) /\

c(x2) when t(x2) /\

.....

c(xn) when t(xn)

Intro to AI Fall 2002 © L. Joskowicz 55

Universal quantification (3)• The planner must expand universally quantified

preconditions to eliminate the quantifier (possibly inefficient, but no better solution…)

• Universally quantified effects need not be expanded, since it might be that many literals are irrelevant. Instead, leave as is but make sure that Resolve-Threats and Choose-Operator are properly modified.

• Modified routines for POP-DUNC (POP with disjunction, universal quantification, negation, and conditionals). It is sound and complete.

Intro to AI Fall 2002 © L. Joskowicz 56

Extended-POP Select-Subgoal

function Select-Subgoal(plan) returns (plan,precondition conjunct)

pick a plan step S-need from STEPS(plan) with a precondition c that has not been achieved if c is a universally quantified expression then

return (S-need, Expansion(c)) else if c is a disjunction c1 \/ c2 .. \/ cn then

return (S-need, choose(c1,c2,…,cn)) else returns (S-need,c)

Intro to AI Fall 2002 © L. Joskowicz 57

Extended-POP Choose-Operatorprocedure Choose-Operator(plan,operators,S-need,c)

choose (a step S-add from operators) or

(STEPS(plan) that has c-add as an effect

such that u = Unify(c,c-add,Bindings(plan)) if there is no such step then fail u’ := u without universally quantified variables of c-add add u’ to Bindings(plan) add causal link (S-add -- c --> S-need) to LINKS(plan) add ordering constraint S-add < S-need to ORDERINGS(plan) if S-add is a newly added step from operators then

add S-add to STEPS(plan) add Start < S-add < Finish to ORDERINGS(plan)

Intro to AI Fall 2002 © L. Joskowicz 58

Extended-POP Resolve-Threatsprocedure Resolve-Threats(plan) for each (Si -- c --> Sj) in LINKS(plan) do for each S-threat in STEPS(plan) do for each c’ in EFFECTS(S-threat) do if Subst(Bindings(plan),c) = Subst(Bindings(plan),~c’)

then choose either

Promotion: add S-threat < Si to ORDERINGS(plan) Demotion: add Sj < S-threat to ORDERINGS(plan)

Confrontation: if c’ is of the form (c’ when p) thenChoose-Operator(plan,operators,S-threat,~p)Resolve-Threats(plan)

if not Consistent(plan) then fail end end end

Intro to AI Fall 2002 © L. Joskowicz 59

Resource constraints• Need to deal with quantities: cost, time, etc.

• Ex: buying an object decreases the amount of cash we have:

• New construct: measures, which are global variables that can be compared and updated

• Check inequality constrains each time an operator is chosen ==> a CSP problem!

buy(X,Store)

have(X) /\ Cash := Cash - price(X,Store)

at(Store) /\ sells(Store,X) /\ Cash > price(X,Store)

Intro to AI Fall 2002 © L. Joskowicz 60

Planning and acting• Up to now, we assumed that we first plan,

and then execute the plan. All the necessary knowledge is available to do the plan.

• Sometimes, we need gather additional information: to see if the bus station is open, we need to go there first!

• Conditional or contingency planning: generate plan alternatives that account for each possible outcome of a contingency. Include sensing operators (see Chapter 13).

Intro to AI Fall 2002 © L. Joskowicz 61

Conditional plan for fixing flat tireFixing a flat tire by either inflating it or replacing withthe spare tire. Since we don’t know why the tire is flat, we need to generate two contingency plans

Intro to AI Fall 2002 © L. Joskowicz 62

Planning in practice• Job shop scheduling: Plan

production and assembly schedule Hitachi’s Tosca: 350 products, 35 assembly machines, 2,000

operations. Plan 30-day schedule for three 8-hour shifts. Follows a partial-order, least commitment approach

• Space mission scheduling: plans order of experiments and resource use

used for Hubble space telescope, Voyager, etc.

• SIPE planner: planning maintenance and materials logistics military operations for US Air Force.

top related