Skip to content

Commit ceb6066

Browse files
committed
Update column generation algorithm
1 parent 290a5da commit ceb6066

File tree

3 files changed

+26
-13
lines changed

3 files changed

+26
-13
lines changed

extern/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ endif()
4545
FetchContent_Declare(
4646
columngenerationsolver
4747
GIT_REPOSITORY https://github.com/fontanf/columngenerationsolver.git
48-
GIT_TAG 1414cd0ca3185f301664c9e840aeda20a72e1844
48+
GIT_TAG 17af477eb1ff576ce09b3d9a9c3369bdc7463c62
4949
#SOURCE_DIR "${PROJECT_SOURCE_DIR}/../columngenerationsolver/"
5050
EXCLUDE_FROM_ALL)
5151
FetchContent_MakeAvailable(columngenerationsolver)

src/algorithms/column_generation.cpp

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,9 @@
4242

4343
using namespace generalizedassignmentsolver;
4444

45-
typedef columngenerationsolver::RowIdx RowIdx;
46-
typedef columngenerationsolver::ColIdx ColIdx;
47-
typedef columngenerationsolver::Value Value;
48-
typedef columngenerationsolver::Column Column;
45+
using Value = columngenerationsolver::Value;
46+
using Column = columngenerationsolver::Column;
47+
using PricingOutput = columngenerationsolver::PricingSolver::PricingOutput;
4948

5049
class PricingSolver: public columngenerationsolver::PricingSolver
5150
{
@@ -61,7 +60,7 @@ class PricingSolver: public columngenerationsolver::PricingSolver
6160
virtual std::vector<std::shared_ptr<const Column>> initialize_pricing(
6261
const std::vector<std::pair<std::shared_ptr<const Column>, Value>>& fixed_columns);
6362

64-
virtual std::vector<std::shared_ptr<const Column>> solve_pricing(
63+
virtual PricingOutput solve_pricing(
6564
const std::vector<Value>& duals);
6665

6766
private:
@@ -164,10 +163,12 @@ std::vector<std::shared_ptr<const Column>> PricingSolver::initialize_pricing(
164163
return {};
165164
}
166165

167-
std::vector<std::shared_ptr<const Column>> PricingSolver::solve_pricing(
166+
PricingOutput PricingSolver::solve_pricing(
168167
const std::vector<Value>& duals)
169168
{
170-
std::vector<std::shared_ptr<const Column>> columns;
169+
PricingOutput output;
170+
Value reduced_cost_bound = 0.0;
171+
171172
for (AgentIdx agent_id = 0;
172173
agent_id < instance_.number_of_agents();
173174
++agent_id) {
@@ -222,9 +223,14 @@ std::vector<std::shared_ptr<const Column>> PricingSolver::solve_pricing(
222223
column.objective_coefficient += instance_.cost(item_id, agent_id);
223224
}
224225
}
225-
columns.push_back(std::shared_ptr<const Column>(new Column(column)));
226+
output.columns.push_back(std::shared_ptr<const Column>(new Column(column)));
227+
reduced_cost_bound = (std::min)(
228+
reduced_cost_bound,
229+
columngenerationsolver::compute_reduced_cost(column, duals));
226230
}
227-
return columns;
231+
232+
output.overcost = instance_.number_of_agents() * std::min(0.0, reduced_cost_bound);
233+
return output;
228234
}
229235

230236
////////////////////////////////////////////////////////////////////////////////
@@ -244,7 +250,7 @@ const ColumnGenerationOutput generalizedassignmentsolver::column_generation(
244250
columngenerationsolver::ColumnGenerationParameters cgs_parameters;
245251
cgs_parameters.verbosity_level = 0;
246252
cgs_parameters.timer = parameters.timer;
247-
cgs_parameters.linear_programming_solver
253+
cgs_parameters.solver_name
248254
= columngenerationsolver::s2lps(parameters.linear_programming_solver);
249255
cgs_parameters.internal_diving = true;
250256
cgs_parameters.self_adjusting_wentges_smoothing = true;
@@ -273,7 +279,7 @@ const ColumnGenerationHeuristicGreedyOutput generalizedassignmentsolver::column_
273279
columngenerationsolver::GreedyParameters cgsg_parameters;
274280
cgsg_parameters.verbosity_level = 0;
275281
cgsg_parameters.timer = parameters.timer;
276-
cgsg_parameters.column_generation_parameters.linear_programming_solver
282+
cgsg_parameters.column_generation_parameters.solver_name
277283
= columngenerationsolver::s2lps(parameters.linear_programming_solver);
278284
cgsg_parameters.internal_diving = true;
279285
cgsg_parameters.column_generation_parameters.self_adjusting_wentges_smoothing = true;
@@ -308,7 +314,7 @@ const ColumnGenerationHeuristicLimitedDiscrepancySearchOutput generalizedassignm
308314
columngenerationsolver::LimitedDiscrepancySearchParameters cgslds_parameters;
309315
cgslds_parameters.verbosity_level = 0;
310316
cgslds_parameters.timer = parameters.timer;
311-
cgslds_parameters.column_generation_parameters.linear_programming_solver
317+
cgslds_parameters.column_generation_parameters.solver_name
312318
= columngenerationsolver::s2lps(parameters.linear_programming_solver);
313319
cgslds_parameters.column_generation_parameters.self_adjusting_wentges_smoothing = true;
314320
cgslds_parameters.column_generation_parameters.automatic_directional_smoothing = true;

src/main.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,14 +139,20 @@ Output run(
139139
} else if (algorithm == "column-generation") {
140140
ColumnGenerationParameters parameters;
141141
read_args(parameters, vm);
142+
if (vm.count("linear-programming-solver"))
143+
parameters.linear_programming_solver = vm["linear-programming-solver"].as<std::string>();
142144
return column_generation(instance, parameters);
143145
} else if (algorithm == "column-generation-heuristic-greedy") {
144146
ColumnGenerationParameters parameters;
145147
read_args(parameters, vm);
148+
if (vm.count("linear-programming-solver"))
149+
parameters.linear_programming_solver = vm["linear-programming-solver"].as<std::string>();
146150
return column_generation_heuristic_greedy(instance, parameters);
147151
} else if (algorithm == "column-generation-heuristic-limited-discrepancy-search") {
148152
ColumnGenerationParameters parameters;
149153
read_args(parameters, vm);
154+
if (vm.count("linear-programming-solver"))
155+
parameters.linear_programming_solver = vm["linear-programming-solver"].as<std::string>();
150156
return column_generation_heuristic_limited_discrepancy_search(instance, parameters);
151157

152158
#if GECODE_FOUND
@@ -204,6 +210,7 @@ int main(int argc, char *argv[])
204210

205211
("desirability,", po::value<std::string>(), "set desirability")
206212
("maximum-number-of-nodes,", po::value<Counter>(), "set maximum number of nodes")
213+
("linear-programming-solver,", po::value<std::string>(), "set linear programming solver")
207214
;
208215
po::variables_map vm;
209216
po::store(po::parse_command_line(argc, argv, desc), vm);

0 commit comments

Comments
 (0)