Skip to content

Commit f0b82c6

Browse files
committed
Use dual feasible functions in rectangleguillotine
1 parent 2778c6a commit f0b82c6

File tree

2 files changed

+55
-0
lines changed

2 files changed

+55
-0
lines changed

src/rectangleguillotine/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ target_include_directories(PackingSolver_rectangleguillotine PRIVATE
1717
target_link_libraries(PackingSolver_rectangleguillotine PUBLIC
1818
PackingSolver_algorithms
1919
PackingSolver_onedimensional
20+
PackingSolver_rectangle
2021
TreeSearchSolver::treesearchsolver
2122
Threads::Threads)
2223
add_library(PackingSolver::rectangleguillotine ALIAS PackingSolver_rectangleguillotine)

src/rectangleguillotine/optimize.cpp

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
#include "packingsolver/rectangleguillotine/instance_builder.hpp"
55
#include "rectangleguillotine/branching_scheme.hpp"
66
#include "rectangleguillotine/column_generation_2.hpp"
7+
#include "rectangle/dual_feasible_functions.hpp"
8+
#include "packingsolver/rectangle/instance_builder.hpp"
79
#include "algorithms/dichotomic_search.hpp"
810
#include "algorithms/sequential_value_correction.hpp"
911
#include "algorithms/column_generation.hpp"
@@ -18,6 +20,48 @@ using namespace packingsolver::rectangleguillotine;
1820
namespace
1921
{
2022

23+
void optimize_dual_feasible_functions(
24+
const Instance& instance,
25+
const OptimizeParameters& parameters,
26+
AlgorithmFormatter& algorithm_formatter)
27+
{
28+
rectangle::InstanceBuilder rectangle_instance_builder;
29+
rectangle_instance_builder.set_objective(instance.objective());
30+
for (BinTypeId bin_type_id = 0;
31+
bin_type_id < instance.number_of_bin_types();
32+
++bin_type_id) {
33+
BinType bin_type = instance.bin_type(bin_type_id);
34+
rectangle_instance_builder.add_bin_type(
35+
bin_type.rect.w,
36+
bin_type.rect.h,
37+
bin_type.cost,
38+
bin_type.copies);
39+
}
40+
for (ItemTypeId item_type_id = 0;
41+
item_type_id < instance.number_of_item_types();
42+
++item_type_id) {
43+
ItemType item_type = instance.item_type(item_type_id);
44+
rectangle_instance_builder.add_item_type(
45+
item_type.rect.w,
46+
item_type.rect.h,
47+
item_type.profit,
48+
item_type.copies);
49+
}
50+
rectangle::Instance rectangle_instance = rectangle_instance_builder.build();
51+
52+
rectangle::DualFeasibleFunctionsParameters dff_parameters;
53+
dff_parameters.verbosity_level = 0;
54+
dff_parameters.timer = parameters.timer;
55+
dff_parameters.new_solution_callback
56+
= [&algorithm_formatter](
57+
const packingsolver::Output<rectangle::Instance, rectangle::Solution>& dff_output)
58+
{
59+
algorithm_formatter.update_bin_packing_bound(
60+
dff_output.bin_packing_bound);
61+
};
62+
rectangle::dual_feasible_functions(rectangle_instance, dff_parameters);
63+
}
64+
2165
void optimize_tree_search(
2266
const Instance& instance,
2367
const OptimizeParameters& parameters,
@@ -538,6 +582,16 @@ packingsolver::rectangleguillotine::Output packingsolver::rectangleguillotine::o
538582
}
539583
}
540584

585+
if (instance.objective() == Objective::BinPacking) {
586+
if (instance.number_of_bin_types() == 1
587+
&& instance.number_of_items() <= 100) {
588+
optimize_dual_feasible_functions(
589+
instance,
590+
parameters,
591+
algorithm_formatter);
592+
}
593+
}
594+
541595
int last_algorithm =
542596
(use_column_generation)? 5:
543597
(use_dichotomic_search)? 4:

0 commit comments

Comments
 (0)