Skip to content

Commit 7b6fc6a

Browse files
committed
Rename branching_scheme* to tree_search* and add tree_search() functions
Each module's branching_scheme.{hpp,cpp} is renamed to tree_search.{hpp,cpp} and gains a tree_search() function (with TreeSearchOutput/TreeSearchParameters structs) following the same pattern as rectangleguillotine/column_generation_2. The optimize_tree_search helper that previously lived in each optimize.cpp anonymous namespace is eliminated; optimize.cpp now calls tree_search() directly. For box, branching_scheme_maximal_spaces.* becomes tree_search_maximal_spaces.* with a tree_search_maximal_spaces() function.
1 parent 25c10a7 commit 7b6fc6a

37 files changed

Lines changed: 1501 additions & 1022 deletions

src/box/CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ target_sources(PackingSolver_box PRIVATE
99
optimize.cpp
1010
post_process.cpp
1111
block.cpp
12-
branching_scheme.cpp
13-
branching_scheme_maximal_spaces.cpp)
12+
tree_search.cpp
13+
tree_search_maximal_spaces.cpp)
1414
target_include_directories(PackingSolver_box PUBLIC
1515
${PROJECT_SOURCE_DIR}/include)
1616
target_include_directories(PackingSolver_box PRIVATE

src/box/optimize.cpp

Lines changed: 49 additions & 214 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,12 @@
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;
1917
namespace
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

23422
void 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

453288
packingsolver::box::Output packingsolver::box::optimize(

0 commit comments

Comments
 (0)