Revision 9 as of 2014-01-27 21:06:41

Clear message

A* search (eager)

A* is a special case of eager best first search that uses g+h as f-function. We break ties using the evaluator. Closed nodes are re-opened.

astar(eval, pathmax=false, mpd=false, cost_type=NORMAL, bound=infinity)

mpd option: This option is currently only present for the A* algorithm and not for the more general eager search, because the current implementation of multi-path depedence does not support general open lists.

--search astar(evaluator)

is equivalent to

--heuristic h=evaluator
--search eager(tiebreaking([sum([g(), h]), h], unsafe_pruning=false),
               reopen_closed=true, pathmax=false, progress_evaluator=sum([g(), h]))

eager(open, reopen_closed=false, pathmax=false, f_eval=None, preferred=[], cost_type=NORMAL, bound=infinity)

Greedy search (eager)

eager_greedy(evals, preferred=[], boost=0, cost_type=NORMAL, bound=infinity)

Open list: In most cases, eager greedy best first search uses an alternation open list with one queue for each evaluator. If preferred operator heuristics are used, it adds an extra queue for each of these evaluators that includes only the nodes that are generated with a preferred operator. If only one evaluator and no preferred operator heuristic is used, the search does not use an alternation open list but a standard open list with only one queue.

Closed nodes: Closed node are not re-opened

Equivalent statements using general eager search

--heuristic h2=eval2
--search eager_greedy([eval1, h2], preferred=h2, boost=100)

is equivalent to

--heuristic h1=eval1 --heuristic h2=eval2
--search eager(alt([single(h1), single(h1, pref_only=true), single(h2), 
                    single(h2, pref_only=true)], boost=100),
               preferred=h2)


--search eager_greedy([eval1, eval2])

is equivalent to

--search eager(alt([single(eval1), single(eval2)]))


--heuristic h1=eval1
--search eager_greedy(h1, preferred=h1)

is equivalent to

--heuristic h1=eval1
--search eager(alt([single(h1), single(h1, pref_only=true)]),
               preferred=h1)


--search eager_greedy(eval1)

is equivalent to

--search eager(single(eval1))

Enforced hill-climbing

ehc(h, bfs_use_cost=false, preferred_usage=PRUNE_BY_PREFERRED, preferred=[], cost_type=NORMAL, bound=infinity)

iterated(engine_configs, pass_bound=true, repeat_last=false, continue_on_fail=false, continue_on_solve=true, plan_counter=0, cost_type=NORMAL, bound=infinity)

Note 1: We do no cache values between search iterations at the moment. If you perform a LAMA-style iterative search, heuristic values will be computed multiple times. Adding heuristic caching is issue108.

Note 2: Running this

./downward --search "iterated([lazy_wastar(merge_and_shrink(),w=10), lazy_wastar(merge_and_shrink(),w=5), lazy_wastar(merge_and_shrink(),w=3), lazy_wastar(merge_and_shrink(),w=2), lazy_wastar(merge_and_shrink(),w=1)])"

would perform the preprocessing phase of the merge and shrink heuristic 5 times (once before each iteration).

To avoid this, use heuristic predefinition, which avoids duplicate preprocessing, as follows:

./downward --heuristic "h=merge_and_shrink()" --search "iterated([lazy_wastar(h,w=10), lazy_wastar(h,w=5), lazy_wastar(h,w=3), lazy_wastar(h,w=2), lazy_wastar(h,w=1)])"

Note 3: If you reuse the same landmark count heuristic (using heuristic predefinition) between iterations, the path data (that is, landmark status for each visited state) will be saved between iterations.

lazy(open, reopen_closed=false, preferred=[], cost_type=NORMAL, bound=infinity)

Greedy search (lazy)

lazy_greedy(evals, preferred=[], reopen_closed=false, boost=1000, cost_type=NORMAL, bound=infinity)

Open lists: In most cases, lazy greedy best first search uses an alternation open list with one queue for each evaluator. If preferred operator heuristics are used, it adds an extra queue for each of these evaluators that includes only the nodes that are generated with a preferred operator. If only one evaluator and no preferred operator heuristic is used, the search does not use an alternation open list but a standard open list with only one queue.

(Weighted) A* search (lazy)

Weighted A* is a special case of lazy best first search.

lazy_wastar(evals, preferred=[], reopen_closed=true, boost=1000, w=1, cost_type=NORMAL, bound=infinity)

Open lists: In the general case, it uses an alternation open list with one queue for each evaluator h that ranks the nodes by g + w * h. If preferred operator heuristics are used, it adds for each of the evaluators another such queue that only inserts nodes that are generated by preferred operators. In the special case with only one evaluator and no preferred operator heuristics, it uses a single queue that is ranked by g + w * h.