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;
1820namespace
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+
2165void 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