BasicBBOptions

Declared in bnb/BranchAndBound.h; the same struct on the site of Doxygen.

template<class V = double>
struct BasicBBOptions

the options of a B&B with values of type V

A node is pruned when its bound cannot improve the incumbent \( z \) by more than the tolerance \( \max \{ \tau_a , \tau_r |z| \} \), \( \tau_a \) being abs_gap and \( \tau_r \) rel_gap, and the search ends when no open node can. With Selection::plunging, the best child of the node just branched is extracted next (a dive) if its bound is at most \( \underline{\beta} + \gamma ( z - \underline{\beta} ) \), \( \gamma \) being plunge_gap and \( \underline{\beta} \) the least open bound, and always while there is no incumbent. With keep_frontier, the Solution holds the leaves of the tree explored [see BBSolution], from which a later search can start again [see BranchAndBoundSearch::solve()].

Public Members

Selection selection = Selection::best_first

the order of the nodes

V abs_gap = V(0)

the absolute tolerance on the gap

double rel_gap = 0

the relative tolerance on the gap

double plunge_gap = 0.5

how far from the best bound a dive goes

std::optional<V> incumbent

a known feasible value, if any

std::function<V(void)> shared_incumbent

a value that the search reads at each extraction and prunes by when it is better than its incumbent, e.g., the incumbent of other searches running at the same time; the Solution has only the feasible values that the search itself finds (or incumbent), so that it is infeasible when none of them is better than the values read, and its bound is still that of the subtrees searched

std::size_t node_limit = 0

evaluated nodes (0 = no limit)

double time_limit = 0

seconds (0 = no limit)

bool keep_frontier = false

keep the leaves of the tree explored

std::function<void(V)> on_incumbent

called with every new incumbent value (in a parallel search, by the worker that finds it, under a lock)