Get desktop application:
View/edit binary Protocol Buffers messages
Method used to optimize a solution in Bop. NEXT TAG: 16
Used in:
Used in:
Contains the definitions for all the bop algorithm parameters and their default values. NEXT TAG: 42
Maximum time allowed in seconds to solve a problem. The counter will starts as soon as Solve() is called.
Maximum time allowed in deterministic time to solve a problem. The deterministic time should be correlated with the real time used by the solver, the time unit being roughly the order of magnitude of a second. The counter will starts as soon as SetParameters() or SolveWithTimeLimit() is called.
The max deterministic time given to the LP solver each time it is called. If this is not enough to solve the LP at hand, it will simply be called again later (and the solve will resume from where it stopped).
Maximum number of consecutive optimizer calls without improving the current solution. If this number is reached, the search will be aborted. Note that this parameter only applies when an initial solution has been found or is provided. Also note that there is no limit to the number of calls, when the parameter is not set.
Limit used to stop the optimization as soon as the relative gap is smaller than the given value. The relative gap is defined as: abs(solution_cost - best_bound) / max(abs(solution_cost), abs(best_bound)).
Maximum number of cascading decisions the solver might use to repair the current solution in the LS.
Abort the LS search tree as soon as strictly more than this number of constraints are broken. The default is a large value which basically disable this heuristic.
Whether the solver should log the search progress to LOG(INFO).
Compute estimated impact at each iteration when true; only once when false.
Avoid exploring both branches (b, a, ...) and (a, b, ...).
Sort constraints by increasing total number of terms instead of number of contributing terms.
Use the random Large Neighborhood Search instead of the exhaustive one.
The seed used to initialize the random generator. TODO(user): Some of our client test fail depending on this value! we need to fix them and ideally randomize our behavior from on test to the next so that this doesn't happen in the future.
Number of variables to relax in the exhaustive Large Neighborhood Search.
The number of conflicts the SAT solver has to solve a random LNS subproblem.
Number of tries in the random lns.
Maximum number of backtracks times the number of variables in Local Search, ie. max num backtracks == max_number_of_backtracks_in_ls / num variables.
Use Large Neighborhood Search based on the LP relaxation.
Whether we use sat propagation to choose the lns neighbourhood.
The number of conflicts the SAT solver has to solve a random LNS subproblem for the quick check of infeasibility.
If true, find and exploit the eventual symmetries of the problem. TODO(user): turn this on by default once the symmetry finder becomes fast enough to be negligeable for most problem. Or at least support a time limit.
If true, find and exploit symmetries in proving satisfiability in the first problem. This feature is experimental. On some problems, computing symmetries may run forever. You may also run into unforseen problems as this feature was not extensively tested.
The number of conflicts the SAT solver has to generate a random solution.
The maximum number of assignments the Local Search iterates on during one try. Note that if the Local Search is called again on the same solution it will not restart from scratch but will iterate on the next max_number_of_explored_assignments_per_try_in_ls assignments.
Whether we use an hash set during the LS to avoid exploring more than once the "same" state. Note that because the underlying SAT solver may learn information in the middle of the LS, this may make the LS slightly less "complete", but it should be faster.
Whether we keep a list of variable that can potentially repair in one flip all the current infeasible constraints (such variable must at least appear in all the infeasible constraints for this to happen).
Whether we use the learned binary clauses in the Linear Relaxation.
The number of solvers used to run Bop. Note that one thread will be created per solver. The type of communication between solvers is specified by the synchronization_type parameter.
List of set of optimizers to be run by the solvers. Note that the i_th solver will run the min(i, solver_optimizer_sets_size())_th optimizer set. The default is defined by default_solver_optimizer_sets (only one set).
Use strong branching in the linear relaxation optimizer. The strong branching is a what-if analysis on each variable v, i.e. compute the best bound when v is assigned to true, compute the best bound when v is assigned to false, and then use those best bounds to improve the overall best bound. This is useful to improve the best_bound, but also to fix some variables during search. Note that using probing might be time consuming as it runs the LP solver 2 * num_variables times.
Only try to decompose the problem when the number of variables is greater than the threshold.
The number of BopSolver created (thread pool workers) used by the integral solver to solve a decomposed problem. TODO(user): Merge this with the number_of_solvers parameter.
HACK. To avoid spending too little time on small problems, spend at least this time solving each of the decomposed sub-problem. This only make sense if num_bop_solvers_used_by_decomposition is greater than 1 so that the overhead can be "absorbed" by the other threads.
The first solutions based on guided SAT will work in chunk of that many conflicts at the time. This allows to simulate parallelism between the different guiding strategy on a single core.
The maximum number of time the LP solver will run to feasibility for pure feasibility problems (with a constant-valued objective function). Set this to a small value, e.g., 1, if fractional solutions offer useful guidance to other solvers in the portfolio. A negative value means no limit.
Defines how the different solvers are synchronized during the search. Note that the synchronization (if any) occurs before each call to an optimizer (the smallest granularity of the solver in a parallel context).
Used in:
No synchronization. The solvers run independently until the time limit is reached; Then learned information from each solver are aggregated. The final solution is the best of all found solutions. Pros: - No need to wait for another solver to complete its task, - Adding a new solver always improves the final solution (In the current implementation it still depends on the machine load and the time limit). Cons: - No learning between solvers.
Synchronize all solvers. Each solver waits for all other solvers to complete the previous optimizer run, before running again. The final solution is the best of all found solutions. Pros: - Full learning between solvers. Cons: - A lot of waiting time when solvers don't run at the exact same speed, - The quality of the final solution depends on the number of solvers, adding one more solver might lead to poorer results because the search goes on a different path.
Solver i synchronizes with solvers 0..i-1. This is a good tradeoff between NO_SYNCHRONIZATION and SYNCHRONIZE_ALL: communication while keeping a relative determinism on the result even when the number of solvers increases. The final solution is the best of all found solutions. Pros: - Solver i learns from i different solvers, - Adding a new solver always improves the final solution (In the current implementation it still depends on the machine load and the time limit). Cons: - No full learning, - Some solvers need to wait for synchronization.
Set of optimizer methods to be run by an instance of the portfolio optimizer. Note that in the current implementation, all the methods specified in the repeated field methods will run on the same solver / thread.
Used in: