Skip to content

Commit b31c068

Browse files
committed
Refactor examples
1 parent f7110fd commit b31c068

File tree

45 files changed

+1300
-1729
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+1300
-1729
lines changed

CMakeLists.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ cmake_minimum_required(VERSION 3.15.0)
22

33
project(LocalSearchSolver LANGUAGES CXX)
44

5+
# Options.
6+
option(LOCALSEARCHSOLVER_BUILD_EXAMPLES "Build examples" ON)
7+
58
# Avoid FetchContent warning.
69
cmake_policy(SET CMP0135 NEW)
710

@@ -15,3 +18,6 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
1518
add_subdirectory(extern)
1619
add_subdirectory(src)
1720
add_subdirectory(test)
21+
if(LOCALSEARCHSOLVER_BUILD_EXAMPLES)
22+
add_subdirectory(examples)
23+
endif()

README.md

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -82,64 +82,64 @@ In case the `GlobalCost global_cost_concatenate(SequenceData&, const SequenceDat
8282

8383
#### Single sequence
8484

85-
[Sequential ordering problem](include/localsearchsolver/examples/sequential_ordering.hpp)
85+
[Sequential ordering problem](examples/sequencing/sequential_ordering_main.cpp)
8686

87-
[Single machine scheduling problem with sequence-dependent setup times, total weighted tardiness](include/localsearchsolver/examples/scheduling_with_sdst_twt.hpp)
87+
[Single machine scheduling problem with sequence-dependent setup times, total weighted tardiness](examples/sequencing/scheduling_with_sdst_twt_main.cpp)
8888

89-
[Permutation flow shop scheduling problem, total completion time](include/localsearchsolver/examples/permutation_flowshop_scheduling_tct.hpp)
89+
[Permutation flow shop scheduling problem, total completion time](examples/sequencing/permutation_flowshop_scheduling_tct_main.cpp)
9090

91-
[Permutation flow shop scheduling problem, total tardiness](include/localsearchsolver/examples/permutation_flowshop_scheduling_tt.hpp)
91+
[Permutation flow shop scheduling problem, total tardiness](examples/sequencing/permutation_flowshop_scheduling_tt_main.cpp)
9292

9393
#### Single sub-sequence
9494

95-
[Single machine order acceptance and scheduling problem with time windows and sequence-dependent setup times, total weighted tardiness](include/localsearchsolver/examples/order_acceptance_and_scheduling.hpp)
95+
[Single machine order acceptance and scheduling problem with time windows and sequence-dependent setup times, total weighted tardiness](examples/sequencing/order_acceptance_and_scheduling_main.cpp)
9696

97-
[Time-dependent orienteering problem](include/localsearchsolver/examples/time_dependent_orienteering.hpp)
97+
[Time-dependent orienteering problem](examples/sequencing/time_dependent_orienteering_main.cpp)
9898

9999
#### Multiple sequences
100100

101-
[Distributed permutation flow shop scheduling problem, total completion time](include/localsearchsolver/examples/distributed_pfss_tct.hpp)
101+
[Distributed permutation flow shop scheduling problem, total completion time](examples/sequencing/distributed_pfss_tct_main.cpp)
102102

103103
#### Single sequence, modes
104104

105-
[Traveling salesman problem with release dates](include/localsearchsolver/examples/traveling_salesman_with_release_dates.hpp)
105+
[Traveling salesman problem with release dates](examples/sequencing/traveling_salesman_with_release_dates_main.cpp)
106106

107-
[Single machine batch scheduling problem, total weighted tardiness](include/localsearchsolver/examples/batch_scheduling_total_weighted_tardiness.hpp)
107+
[Single machine batch scheduling problem, total weighted tardiness](examples/sequencing/batch_scheduling_total_weighted_tardiness_main.cpp)
108108

109109
#### Single sequence, `sequence_data_init/concatenate`
110110

111-
[Traveling repairman problem](include/localsearchsolver/examples/traveling_repairman.hpp)
111+
[Traveling repairman problem](examples/sequencing/traveling_repairman_main.cpp)
112112

113113
#### Multiple sequences, `sequence_data_init/concatenate`
114114

115-
[Capacitated vehicle routing problem](include/localsearchsolver/examples/capacitated_vehicle_routing.hpp)
115+
[Capacitated vehicle routing problem](examples/sequencing/capacitated_vehicle_routing_main.cpp)
116116

117-
[Vehicle routing problem with time windows](include/localsearchsolver/examples/vehicle_routing_with_time_windows.hpp)
117+
[Vehicle routing problem with time windows](examples/sequencing/vehicle_routing_with_time_windows_main.cpp)
118118

119119
#### Multiple sub-sequences, `sequence_data_init/concatenate`
120120

121-
[Team orienteering problem](include/localsearchsolver/examples/team_orienteering.hpp)
121+
[Team orienteering problem](examples/sequencing/team_orienteering_main.cpp)
122122

123123

124124
## Other examples
125125

126126
Data can be downloaded from [fontanf/orproblems](https://github.com/fontanf/orproblems)
127127

128-
[Multidimensional multiple-choice knapsack problem](include/localsearchsolver/examples/multidimensional_multiple_choice_knapsack.hpp)
128+
[Multidimensional multiple-choice knapsack problem](examples/multidimensional_multiple_choice_knapsack_main.cpp)
129129
* Straightforward example for a genetic local search: single neighborhood, basic operators
130130
* Algorithm:
131131
* Local search neighborhoods:
132132
* Add item `j` in the knapsack
133133
* Crossover algorithm
134134

135-
[Quadratic assignment problem](include/localsearchsolver/examples/quadratic_assignment.hpp)
135+
[Quadratic assignment problem](examples/quadratic_assignment_main.cpp)
136136
* Example which implements a problem specific acceleration strategy to compute the move costs
137137
* Algorithm:
138138
* Local search neighborhood: swap two assignments
139139
* Perturbation: ejection chain
140140
* Crossover algorithm: UX crossover
141141

142-
[Knapsack problem with conflicts](include/localsearchsolver/examples/knapsack_with_conflicts.hpp)
142+
[Knapsack problem with conflicts](examples/knapsack_with_conflicts_main.cpp)
143143
* Example with multiple neigborhoods
144144
* Algorithm:
145145
* Local search neighborhoods:
@@ -155,13 +155,13 @@ Data can be downloaded from [fontanf/orproblems](https://github.com/fontanf/orpr
155155
* Local search neighborhoods: shift item `j` to agent `i`
156156
* Perturbation: shift 8 random jobs
157157

158-
[Permutation flow shop scheduling problem, makespan](include/localsearchsolver/examples/permutation_flowshop_scheduling_makespan.hpp)
158+
[Permutation flow shop scheduling problem, makespan](examples/permutation_flowshop_scheduling_makespan_main.cpp)
159159
* This one is not considered as a sequencing problem since the dedicated acceleration strategy makes it possible to explore the neighborhoods more efficiently
160160
* Algorithm:
161161
* Local search neighborhood: move a block of `k` consecutive jobs, `k = 1..4`
162162
* Perturbation: swap two blocks (double-bridge)
163163

164-
[Maximum-weight independent set problem](https://github.com/fontanf/stablesolver/blob/master/stablesolver/stable/algorithms/local_search.cpp) and [maximum-weight clique problem](https://github.com/fontanf/stablesolver/blob/master/stablesolver/clique/algorithms/local_search.cpp) from [fontanf/stablesolver](https://github.com/fontanf/stablesolver)
164+
[Maximum-weight independent set problem](https://github.com/fontanf/stablesolver/blob/master/src/stable/algorithms/local_search.cpp) and [maximum-weight clique problem](https://github.com/fontanf/stablesolver/blob/master/src/clique/algorithms/local_search.cpp) from [fontanf/stablesolver](https://github.com/fontanf/stablesolver)
165165
* Algorithm:
166166
* Local search neighborhoods:
167167
* Move vertex `v` in/out of the solution (and remove conflicting vertices)

examples/CMakeLists.txt

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
add_subdirectory(sequencing)
2+
3+
add_executable(LocalSearchSolver_example_knapsack_with_conflicts_main)
4+
target_sources(LocalSearchSolver_example_knapsack_with_conflicts_main PRIVATE
5+
knapsack_with_conflicts_main.cpp)
6+
target_include_directories(LocalSearchSolver_example_knapsack_with_conflicts_main INTERFACE
7+
${PROJECT_SOURCE_DIR}/include)
8+
target_link_libraries(LocalSearchSolver_example_knapsack_with_conflicts_main PUBLIC
9+
LocalSearchSolver_localsearchsolver
10+
ORProblems::knapsack_with_conflicts
11+
Boost::program_options)
12+
set_target_properties(LocalSearchSolver_example_knapsack_with_conflicts_main PROPERTIES OUTPUT_NAME "localsearchsolver_knapsack_with_conflicts")
13+
install(TARGETS LocalSearchSolver_example_knapsack_with_conflicts_main)
14+
15+
add_executable(LocalSearchSolver_example_multidimensional_multiple_choice_knapsack_main)
16+
target_sources(LocalSearchSolver_example_multidimensional_multiple_choice_knapsack_main PRIVATE
17+
multidimensional_multiple_choice_knapsack_main.cpp)
18+
target_include_directories(LocalSearchSolver_example_multidimensional_multiple_choice_knapsack_main INTERFACE
19+
${PROJECT_SOURCE_DIR}/include)
20+
target_link_libraries(LocalSearchSolver_example_multidimensional_multiple_choice_knapsack_main PUBLIC
21+
LocalSearchSolver_localsearchsolver
22+
ORProblems::multidimensional_multiple_choice_knapsack
23+
Boost::program_options)
24+
set_target_properties(LocalSearchSolver_example_multidimensional_multiple_choice_knapsack_main PROPERTIES OUTPUT_NAME "localsearchsolver_multidimensional_multiple_choice_knapsack")
25+
install(TARGETS LocalSearchSolver_example_multidimensional_multiple_choice_knapsack_main)
26+
27+
add_executable(LocalSearchSolver_example_permutation_flowshop_scheduling_makespan_main)
28+
target_sources(LocalSearchSolver_example_permutation_flowshop_scheduling_makespan_main PRIVATE
29+
permutation_flowshop_scheduling_makespan_main.cpp)
30+
target_include_directories(LocalSearchSolver_example_permutation_flowshop_scheduling_makespan_main INTERFACE
31+
${PROJECT_SOURCE_DIR}/include)
32+
target_link_libraries(LocalSearchSolver_example_permutation_flowshop_scheduling_makespan_main PUBLIC
33+
LocalSearchSolver_localsearchsolver
34+
ORProblems::permutation_flowshop_scheduling_makespan
35+
Boost::program_options)
36+
set_target_properties(LocalSearchSolver_example_permutation_flowshop_scheduling_makespan_main PROPERTIES OUTPUT_NAME "localsearchsolver_permutation_flowshop_scheduling_makespan")
37+
install(TARGETS LocalSearchSolver_example_permutation_flowshop_scheduling_makespan_main)
38+
39+
add_executable(LocalSearchSolver_example_quadratic_assignment_main)
40+
target_sources(LocalSearchSolver_example_quadratic_assignment_main PRIVATE
41+
quadratic_assignment_main.cpp)
42+
target_include_directories(LocalSearchSolver_example_quadratic_assignment_main INTERFACE
43+
${PROJECT_SOURCE_DIR}/include)
44+
target_link_libraries(LocalSearchSolver_example_quadratic_assignment_main PUBLIC
45+
LocalSearchSolver_localsearchsolver
46+
ORProblems::quadratic_assignment
47+
Boost::program_options)
48+
set_target_properties(LocalSearchSolver_example_quadratic_assignment_main PROPERTIES OUTPUT_NAME "localsearchsolver_quadratic_assignment")
49+
install(TARGETS LocalSearchSolver_example_quadratic_assignment_main)

include/localsearchsolver/examples/knapsack_with_conflicts.hpp renamed to examples/knapsack_with_conflicts_main.cpp

Lines changed: 56 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,19 +26,15 @@
2626
*
2727
*/
2828

29-
#pragma once
29+
#include "read_args.hpp"
3030

3131
#include "localsearchsolver/common.hpp"
3232

3333
#include "orproblems/packing/knapsack_with_conflicts.hpp"
3434

3535
#include "optimizationtools//utils//utils.hpp"
3636

37-
namespace localsearchsolver
38-
{
39-
namespace knapsack_with_conflicts
40-
{
41-
37+
using namespace localsearchsolver;
4238
using namespace orproblems::knapsack_with_conflicts;
4339

4440
class LocalScheme
@@ -780,6 +776,58 @@ class LocalScheme
780776

781777
};
782778

783-
}
784-
}
779+
int main(int argc, char *argv[])
780+
{
781+
// Create command line options.
782+
boost::program_options::options_description desc = setup_args();
783+
boost::program_options::variables_map vm;
784+
boost::program_options::store(boost::program_options::parse_command_line(argc, argv, desc), vm);
785+
if (vm.count("help")) {
786+
std::cout << desc << std::endl;;
787+
throw "";
788+
}
789+
try {
790+
boost::program_options::notify(vm);
791+
} catch (const boost::program_options::required_option& e) {
792+
std::cout << desc << std::endl;;
793+
throw "";
794+
}
785795

796+
// Create instance.
797+
InstanceBuilder instance_builder;
798+
instance_builder.read(
799+
vm["input"].as<std::string>(),
800+
vm["format"].as<std::string>());
801+
const Instance instance = instance_builder.build();
802+
803+
// Create local scheme.
804+
LocalScheme::Parameters parameters;
805+
LocalScheme local_scheme(instance, parameters);
806+
807+
// Run algorithm.
808+
std::string algorithm = "best-first-local-search";
809+
if (vm.count("algorithm"))
810+
algorithm = vm["algorithm"].as<std::string>();
811+
auto output =
812+
(algorithm == "multi-start-local-search")?
813+
run_multi_start_local_search(local_scheme, vm):
814+
(algorithm == "iterated-local-search")?
815+
run_iterated_local_search(local_scheme, vm):
816+
(algorithm == "best-first-local-search")?
817+
run_best_first_local_search(local_scheme, vm):
818+
run_genetic_local_search(local_scheme, vm);
819+
820+
// Run checker.
821+
if (vm["print-checker"].as<int>() > 0
822+
&& vm["certificate"].as<std::string>() != "") {
823+
std::cout << std::endl
824+
<< "Checker" << std::endl
825+
<< "-------" << std::endl;
826+
instance.check(
827+
vm["certificate"].as<std::string>(),
828+
std::cout,
829+
vm["print-checker"].as<int>());
830+
}
831+
832+
return 0;
833+
}

include/localsearchsolver/examples/multidimensional_multiple_choice_knapsack.hpp renamed to examples/multidimensional_multiple_choice_knapsack_main.cpp

Lines changed: 53 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,13 @@
55
* See https://github.com/fontanf/orproblems/blob/main/orproblems/multidimensional_multiple_choice_knapsack.hpp
66
*/
77

8-
#pragma once
8+
#include "read_args.hpp"
99

1010
#include "localsearchsolver/common.hpp"
1111

1212
#include "orproblems/packing/multidimensional_multiple_choice_knapsack.hpp"
1313

14-
namespace localsearchsolver
15-
{
16-
namespace multidimensional_multiple_choice_knapsack
17-
{
18-
14+
using namespace localsearchsolver;
1915
using namespace orproblems::multidimensional_multiple_choice_knapsack;
2016

2117
class LocalScheme
@@ -299,5 +295,55 @@ class LocalScheme
299295

300296
};
301297

302-
}
298+
int main(int argc, char *argv[])
299+
{
300+
// Create command line options.
301+
boost::program_options::options_description desc = setup_args();
302+
boost::program_options::variables_map vm;
303+
boost::program_options::store(boost::program_options::parse_command_line(argc, argv, desc), vm);
304+
if (vm.count("help")) {
305+
std::cout << desc << std::endl;;
306+
throw "";
307+
}
308+
try {
309+
boost::program_options::notify(vm);
310+
} catch (const boost::program_options::required_option& e) {
311+
std::cout << desc << std::endl;;
312+
throw "";
313+
}
314+
315+
// Create instance.
316+
InstanceBuilder instance_builder;
317+
instance_builder.read(
318+
vm["input"].as<std::string>(),
319+
vm["format"].as<std::string>());
320+
const Instance instance = instance_builder.build();
321+
322+
// Create local scheme.
323+
LocalScheme local_scheme(instance);
324+
325+
// Run algorithm.
326+
std::string algorithm = vm["algorithm"].as<std::string>();
327+
auto output =
328+
(algorithm == "multi-start-local-search")?
329+
run_multi_start_local_search(local_scheme, vm):
330+
//(algorithm == "iterated-local-search")?
331+
//run_iterated_local_search(local_scheme, vm):
332+
//(algorithm == "best-first-local-search")?
333+
//run_best_first_local_search(local_scheme, vm):
334+
run_genetic_local_search(local_scheme, vm);
335+
336+
// Run checker.
337+
if (vm["print-checker"].as<int>() > 0
338+
&& vm["certificate"].as<std::string>() != "") {
339+
std::cout << std::endl
340+
<< "Checker" << std::endl
341+
<< "-------" << std::endl;
342+
instance.check(
343+
vm["certificate"].as<std::string>(),
344+
std::cout,
345+
vm["print-checker"].as<int>());
346+
}
347+
348+
return 0;
303349
}

0 commit comments

Comments
 (0)