The FastDownward Benchmark

Task: select heuristics for the FastDownward planner
Cost: number of optimization steps
Number of hyperparameters to control: one categorical
State Information: average value, max value, min value, number of open list entries and variance for each heuristic
Noise Level: fairly large
Instance space: either specifically desigd easy toy instances with ground truth or common planning competition instance sets

This benchmark is an interface to the Fast Downward AI planner, controlling its heuristic hyperparameter. In each step until the algorithm finishes or is terminated via the cutoff, the DAC controller selects one of either two (toy case) or four heuristiccs for the planner to use. The goal is to reduce the runtime of the planner, so every step that is taken in the benchmark incurs a cost of 1.

Out of our real-world benchmarks, FastDownward is likely the fastest running and it has been shown to be suitable to dynamic configuration. Though the noise level is fairly high, most DAC controllers should be able to learn functional policies in a comparatively short time frame.

The FastDownward benchmark was constructed by Speck et al. for the paper `”Learning Heuristic Selection with Dynamic Algorithm Configuration” <https://arxiv.org/pdf/2006.08246.pdf>`_ at ICAPS 2021

Planning environment from “Learning Heuristic Selection with Dynamic Algorithm Configuration” by David Speck, André Biedenkapp, Frank Hutter, Robert Mattmüller und Marius Lindauer. Original environment authors: David Speck, André Biedenkapp.

class dacbench.envs.fast_downward.FastDownwardEnv(config)[source]

Bases: AbstractEnv

Environment to control Solver Heuristics of FastDownward.

close()[source]

Close Env.

Returns:

bool

Closing confirmation

kill_connection()[source]

Kill the connection.

property port

Port function.

recv_msg()[source]

Recieve a whole message. The message has to be prepended with its total size Based on comment from SO see [1].

Returns:

bytes

The message as byte

recvall(n: int)[source]

Given we know the size we want to recieve, we can recieve that amount of bytes. Based on comment from SO see [1].

Parameters:
  • n (int) – Number of bytes to expect in the data

  • Returns

  • ----------

  • bytes – The message as byte

render(mode: str = 'human') None[source]

Required by gym.Env but not implemented.

Parameters:

mode (str) – Rendering mode

reset(seed=None, options=None)[source]

Reset environment.

Returns:

np.array

State after reset

dict

Meta-info

send_msg(msg: bytes)[source]

Send message and prepend the message size.

Based on comment from SO see [1] [1] https://stackoverflow.com/a/17668009

Parameters:

msg (bytes) – The message as byte

step(action: int | list[int])[source]

Environment step.

Parameters:
  • action (Union[int, List[int]]) – Parameter(s) to apply

  • Returns

  • ----------

  • np.array – state, reward, terminated, truncated, info

  • float – state, reward, terminated, truncated, info

  • bool – state, reward, terminated, truncated, info

  • bool – state, reward, terminated, truncated, info

  • dict – state, reward, terminated, truncated, info

class dacbench.envs.fast_downward.StateType(value)[source]

Bases: Enum

Class to define numbers for state types.