22
33#include " packingsolver/box/algorithm_formatter.hpp"
44#include " packingsolver/box/instance_builder.hpp"
5- #include " box/branching_scheme .hpp"
6- #include " box/branching_scheme_maximal_spaces .hpp"
5+ #include " box/tree_search .hpp"
6+ #include " box/tree_search_maximal_spaces .hpp"
77#include " algorithms/dichotomic_search.hpp"
88#include " algorithms/sequential_value_correction.hpp"
99#include " algorithms/column_generation.hpp"
1010
11- #include " treesearchsolver/iterative_beam_search_2.hpp"
12- #include " treesearchsolver/iterative_beam_search.hpp"
1311
1412#include < thread>
1513
@@ -19,217 +17,7 @@ using namespace packingsolver::box;
1917namespace
2018{
2119
22- void optimize_tree_search (
23- const Instance& instance,
24- const OptimizeParameters& parameters,
25- AlgorithmFormatter& algorithm_formatter)
26- {
27- std::vector<GuideId> guides;
28- if (!parameters.tree_search_guides .empty ()) {
29- guides = parameters.tree_search_guides ;
30- } else if (instance.objective () == Objective::Knapsack) {
31- guides = {4 , 5 };
32- } else {
33- guides = {0 , 1 };
34- }
35- // guides = {4};
36-
37- std::vector<Direction> directions;
38- if (instance.objective () == Objective::OpenDimensionX) {
39- directions = {Direction::X};
40- } else if (instance.objective () == Objective::OpenDimensionY) {
41- directions = {Direction::Y};
42- } else if (instance.objective () == Objective::OpenDimensionZ) {
43- directions = {Direction::Z};
44- } else if (instance.number_of_bin_types () == 1 ) {
45- directions = {Direction::X, Direction::Y, Direction::Z};
46- } else {
47- directions = {Direction::Any};
48- }
49- // directions = {Direction::Z};
50-
51- std::vector<double > growth_factors = {1.5 };
52- if (guides.size () * directions.size () * 2 <= 4 )
53- growth_factors = {1.33 , 1.5 };
54- if (parameters.optimization_mode != OptimizationMode::Anytime)
55- growth_factors = {1.5 };
56-
57- std::vector<BranchingScheme> branching_schemes;
58- std::vector<treesearchsolver::IterativeBeamSearch2Parameters<BranchingScheme>> ibs_parameters_list;
59- std::vector<box::Output> outputs;
60- for (double growth_factor: growth_factors) {
61- for (GuideId guide_id: guides) {
62- for (Direction direction: directions) {
63- // std::cout << growth_factor << " " << guide_id << " " << direction << std::endl;
64- BranchingScheme::Parameters branching_scheme_parameters;
65- branching_scheme_parameters.guide_id = guide_id;
66- branching_scheme_parameters.direction = direction;
67- branching_schemes.push_back (BranchingScheme (instance, branching_scheme_parameters));
68- treesearchsolver::IterativeBeamSearch2Parameters<BranchingScheme> ibs_parameters;
69- ibs_parameters.verbosity_level = 0 ;
70- ibs_parameters.timer = parameters.timer ;
71- ibs_parameters.timer .add_end_boolean (&algorithm_formatter.end_boolean ());
72- ibs_parameters.growth_factor = growth_factor;
73- if (parameters.optimization_mode != OptimizationMode::Anytime) {
74- ibs_parameters.minimum_size_of_the_queue = 1 ;
75- ibs_parameters.growth_factor
76- = parameters.not_anytime_tree_search_queue_size ;
77- ibs_parameters.maximum_size_of_the_queue
78- = parameters.not_anytime_tree_search_queue_size ;
79- }
80- if (!parameters.json_search_tree_path .empty ()) {
81- ibs_parameters.json_search_tree_path = parameters.json_search_tree_path
82- + " _guide_" + std::to_string (branching_scheme_parameters.guide_id )
83- + " _d_" + std::to_string ((int )branching_scheme_parameters.direction );
84- }
85- ibs_parameters_list.push_back (ibs_parameters);
86- outputs.push_back (box::Output (instance));
87- }
88- }
89- }
90-
91- std::vector<std::thread> threads;
92- std::forward_list<std::exception_ptr> exception_ptr_list;
93- for (Counter i = 0 ; i < (Counter)branching_schemes.size (); ++i) {
94- if (parameters.optimization_mode != OptimizationMode::NotAnytimeDeterministic) {
95- ibs_parameters_list[i].new_solution_callback
96- = [&algorithm_formatter, &branching_schemes, i](
97- const treesearchsolver::Output<BranchingScheme>& tss_output)
98- {
99- const treesearchsolver::IterativeBeamSearch2Output<BranchingScheme>& tssibs_output
100- = static_cast <const treesearchsolver::IterativeBeamSearch2Output<BranchingScheme>&>(tss_output);
101- Solution solution = branching_schemes[i].to_solution (
102- tssibs_output.solution_pool .best ());
103- std::stringstream ss;
104- ss << " TS g " << branching_schemes[i].parameters ().guide_id
105- << " d " << branching_schemes[i].parameters ().direction
106- << " q " << tssibs_output.maximum_size_of_the_queue ;
107- algorithm_formatter.update_solution (solution, ss.str ());
108-
109- if (tssibs_output.optimal ) {
110- if (solution.instance ().objective () == packingsolver::Objective::BinPacking) {
111- algorithm_formatter.update_bin_packing_bound (
112- solution.number_of_bins ());
113- }
114- }
115- };
116- } else {
117- ibs_parameters_list[i].new_solution_callback
118- = [&outputs, &branching_schemes, i](
119- const treesearchsolver::Output<BranchingScheme>& tss_output)
120- {
121- const treesearchsolver::IterativeBeamSearch2Output<BranchingScheme>& tssibs_output
122- = static_cast <const treesearchsolver::IterativeBeamSearch2Output<BranchingScheme>&>(tss_output);
123- Solution solution = branching_schemes[i].to_solution (
124- tssibs_output.solution_pool .best ());
125- outputs[i].solution_pool .add (solution);
126- };
127- }
128- if (parameters.optimization_mode != OptimizationMode::NotAnytimeSequential) {
129- exception_ptr_list.push_front (std::exception_ptr ());
130- threads.push_back (std::thread (
131- wrapper<decltype (&treesearchsolver::iterative_beam_search_2<BranchingScheme>), treesearchsolver::iterative_beam_search_2<BranchingScheme>>,
132- std::ref (exception_ptr_list.front ()),
133- std::ref (branching_schemes[i]),
134- ibs_parameters_list[i]));
135- } else {
136- treesearchsolver::iterative_beam_search_2<BranchingScheme>(
137- branching_schemes[i],
138- ibs_parameters_list[i]);
139- }
140- }
141- for (Counter i = 0 ; i < (Counter)threads.size (); ++i)
142- threads[i].join ();
143- for (const std::exception_ptr& exception_ptr: exception_ptr_list)
144- if (exception_ptr)
145- std::rethrow_exception (exception_ptr);
146- if (parameters.optimization_mode == OptimizationMode::NotAnytimeDeterministic) {
147- for (Counter i = 0 ; i < (Counter)branching_schemes.size (); ++i) {
148- std::stringstream ss;
149- ss << " TS g " << branching_schemes[i].parameters ().guide_id
150- << " d " << branching_schemes[i].parameters ().direction ;
151- algorithm_formatter.update_solution (outputs[i].solution_pool .best (), ss.str ());
152- }
153- }
154- }
155-
156- void optimize_tree_search_maximal_spaces (
157- const Instance& instance,
158- const OptimizeParameters& parameters,
159- AlgorithmFormatter& algorithm_formatter)
160- {
161- MaxReachableLengths max_reachable_lengths = compute_max_reachable_lengths (instance);
162- std::vector<std::vector<Block>> all_blocks = compute_blocks (instance);
163-
164- std::vector<BranchingSchemeMaximalSpaces> branching_schemes;
165- std::vector<treesearchsolver::IterativeBeamSearchParameters<BranchingSchemeMaximalSpaces>> ibs_parameters_list;
166- std::vector<box::Output> outputs;
167- {
168- BranchingSchemeMaximalSpaces::Parameters branching_scheme_parameters;
169- branching_schemes.push_back (BranchingSchemeMaximalSpaces (instance, all_blocks, max_reachable_lengths, branching_scheme_parameters));
170- treesearchsolver::IterativeBeamSearchParameters<BranchingSchemeMaximalSpaces> ibs_parameters;
171- ibs_parameters.verbosity_level = 0 ;
172- ibs_parameters.timer = parameters.timer ;
173- ibs_parameters.timer .add_end_boolean (&algorithm_formatter.end_boolean ());
174- ibs_parameters.global_history = true ;
175- ibs_parameters_list.push_back (ibs_parameters);
176- outputs.push_back (box::Output (instance));
177- }
17820
179- std::vector<std::thread> threads;
180- std::forward_list<std::exception_ptr> exception_ptr_list;
181- for (Counter i = 0 ; i < (Counter)branching_schemes.size (); ++i) {
182- if (parameters.optimization_mode != OptimizationMode::NotAnytimeDeterministic) {
183- ibs_parameters_list[i].new_solution_callback
184- = [&algorithm_formatter, &branching_schemes, i](
185- const treesearchsolver::Output<BranchingSchemeMaximalSpaces>& tss_output)
186- {
187- const treesearchsolver::IterativeBeamSearchOutput<BranchingSchemeMaximalSpaces>& tssibs_output
188- = static_cast <const treesearchsolver::IterativeBeamSearchOutput<BranchingSchemeMaximalSpaces>&>(tss_output);
189- Solution solution = branching_schemes[i].to_solution (
190- tssibs_output.solution_pool .best ());
191- std::stringstream ss;
192- ss << " TSMS n " << tssibs_output.maximum_size_of_the_queue ;
193- algorithm_formatter.update_solution (solution, ss.str ());
194- };
195- } else {
196- ibs_parameters_list[i].new_solution_callback
197- = [&outputs, &branching_schemes, i](
198- const treesearchsolver::Output<BranchingSchemeMaximalSpaces>& tss_output)
199- {
200- const treesearchsolver::IterativeBeamSearchOutput<BranchingSchemeMaximalSpaces>& tssibs_output
201- = static_cast <const treesearchsolver::IterativeBeamSearchOutput<BranchingSchemeMaximalSpaces>&>(tss_output);
202- Solution solution = branching_schemes[i].to_solution (
203- tssibs_output.solution_pool .best ());
204- outputs[i].solution_pool .add (solution);
205- };
206- }
207- if (parameters.optimization_mode != OptimizationMode::NotAnytimeSequential) {
208- exception_ptr_list.push_front (std::exception_ptr ());
209- threads.push_back (std::thread (
210- wrapper<decltype (&treesearchsolver::iterative_beam_search<BranchingSchemeMaximalSpaces>), treesearchsolver::iterative_beam_search<BranchingSchemeMaximalSpaces>>,
211- std::ref (exception_ptr_list.front ()),
212- std::ref (branching_schemes[i]),
213- ibs_parameters_list[i]));
214- } else {
215- treesearchsolver::iterative_beam_search<BranchingSchemeMaximalSpaces>(
216- branching_schemes[i],
217- ibs_parameters_list[i]);
218- }
219- }
220- for (Counter i = 0 ; i < (Counter)threads.size (); ++i)
221- threads[i].join ();
222- for (const std::exception_ptr& exception_ptr: exception_ptr_list)
223- if (exception_ptr)
224- std::rethrow_exception (exception_ptr);
225- if (parameters.optimization_mode == OptimizationMode::NotAnytimeDeterministic) {
226- for (Counter i = 0 ; i < (Counter)branching_schemes.size (); ++i) {
227- std::stringstream ss;
228- ss << " TSMS" ;
229- algorithm_formatter.update_solution (outputs[i].solution_pool .best (), ss.str ());
230- }
231- }
232- }
23321
23422void optimize_sequential_single_knapsack (
23523 const Instance& instance,
@@ -448,6 +236,53 @@ void optimize_column_generation(
448236 columngenerationsolver::limited_discrepancy_search (cgs_model, cgslds_parameters);
449237}
450238
239+ void optimize_tree_search (
240+ const Instance& instance,
241+ const OptimizeParameters& parameters,
242+ AlgorithmFormatter& algorithm_formatter)
243+ {
244+ TreeSearchParameters ts_parameters;
245+ ts_parameters.verbosity_level = 0 ;
246+ ts_parameters.timer = parameters.timer ;
247+ ts_parameters.timer .add_end_boolean (&algorithm_formatter.end_boolean ());
248+ ts_parameters.guides = parameters.tree_search_guides ;
249+ ts_parameters.optimization_mode = parameters.optimization_mode ;
250+ ts_parameters.not_anytime_tree_search_queue_size = parameters.not_anytime_tree_search_queue_size ;
251+ ts_parameters.json_search_tree_path = parameters.json_search_tree_path ;
252+ ts_parameters.new_solution_callback = [&algorithm_formatter](
253+ const packingsolver::Output<Instance, Solution>& ts_output)
254+ {
255+ const TreeSearchOutput& ts_out = static_cast <const TreeSearchOutput&>(ts_output);
256+ algorithm_formatter.update_solution (ts_out.solution_pool .best (), ts_out.current_label );
257+ if (ts_out.is_optimal
258+ && ts_out.solution_pool .best ().instance ().objective () == packingsolver::Objective::BinPacking) {
259+ algorithm_formatter.update_bin_packing_bound (
260+ ts_out.solution_pool .best ().number_of_bins ());
261+ }
262+ };
263+ tree_search (instance, ts_parameters);
264+ }
265+
266+ void optimize_tree_search_maximal_spaces (
267+ const Instance& instance,
268+ const OptimizeParameters& parameters,
269+ AlgorithmFormatter& algorithm_formatter)
270+ {
271+ TreeSearchMaximalSpacesParameters ts_ms_parameters;
272+ ts_ms_parameters.verbosity_level = 0 ;
273+ ts_ms_parameters.timer = parameters.timer ;
274+ ts_ms_parameters.timer .add_end_boolean (&algorithm_formatter.end_boolean ());
275+ ts_ms_parameters.optimization_mode = parameters.optimization_mode ;
276+ ts_ms_parameters.not_anytime_tree_search_queue_size = parameters.not_anytime_tree_search_queue_size ;
277+ ts_ms_parameters.new_solution_callback = [&algorithm_formatter](
278+ const packingsolver::Output<Instance, Solution>& ts_output)
279+ {
280+ const TreeSearchMaximalSpacesOutput& ts_out = static_cast <const TreeSearchMaximalSpacesOutput&>(ts_output);
281+ algorithm_formatter.update_solution (ts_out.solution_pool .best (), ts_out.current_label );
282+ };
283+ tree_search_maximal_spaces (instance, ts_ms_parameters);
284+ }
285+
451286}
452287
453288packingsolver::box::Output packingsolver::box::optimize (
0 commit comments