23#include "absl/random/bit_gen_ref.h"
38 std::vector<double> relaxation_values(
43 const IntegerVariable positive_var = lp_var.
positive_var;
44 if (integer_trail->IsCurrentlyIgnored(positive_var))
continue;
56std::vector<double> GetLPRelaxationValues(
57 const SharedLPSolutionRepository*
lp_solutions, absl::BitGenRef random) {
58 std::vector<double> relaxation_values;
61 return relaxation_values;
65 const SharedSolutionRepository<double>::Solution lp_solution =
68 for (
int model_var = 0; model_var < lp_solution.variable_values.size();
70 relaxation_values.push_back(lp_solution.variable_values[model_var]);
72 return relaxation_values;
75std::vector<double> GetGeneralRelaxationValues(
77 absl::BitGenRef random) {
78 std::vector<double> relaxation_values;
82 return relaxation_values;
84 const SharedSolutionRepository<int64_t>::Solution relaxation_solution =
87 for (
int model_var = 0;
88 model_var < relaxation_solution.variable_values.size(); ++model_var) {
89 relaxation_values.push_back(relaxation_solution.variable_values[model_var]);
91 return relaxation_values;
94std::vector<double> GetIncompleteSolutionValues(
96 std::vector<double> empty_solution_values;
100 return empty_solution_values;
112 absl::BitGenRef random) {
115 const bool use_only_relaxation_values =
116 (response_manager ==
nullptr ||
119 if (use_only_relaxation_values &&
lp_solutions ==
nullptr &&
123 return rins_neighborhood;
126 std::vector<double> relaxation_values;
130 relaxation_values = GetLPRelaxationValues(
lp_solutions, random);
133 <<
"No relaxation solutions repository or lp solutions repository "
138 if (relaxation_values.empty())
return rins_neighborhood;
140 const double tolerance = 1e-6;
142 use_only_relaxation_values
146 for (
int model_var = 0; model_var < relaxation_values.size(); ++model_var) {
147 const double relaxation_value = relaxation_values[model_var];
149 if (relaxation_value == std::numeric_limits<double>::infinity()) {
153 if (use_only_relaxation_values) {
160 const int64_t domain_lb =
161 static_cast<int64_t
>(std::floor(relaxation_value + tolerance));
162 const int64_t domain_ub =
163 static_cast<int64_t
>(std::ceil(relaxation_value - tolerance));
164 if (domain_lb == domain_ub) {
165 rins_neighborhood.
fixed_vars.push_back({model_var, domain_lb});
168 {model_var, {domain_lb, domain_ub}});
172 const IntegerValue best_solution_value =
173 IntegerValue(solution.variable_values[model_var]);
174 if (std::abs(best_solution_value.value() - relaxation_value) < 1e-4) {
176 {model_var, best_solution_value.value()});
181 return rins_neighborhood;
double GetSolutionValue(IntegerVariable variable) const
Class that owns everything related to a particular optimization model.
std::vector< double > GetNewSolution()
bool HasNewSolution() const
void NewLPSolution(std::vector< double > lp_solution)
const SharedSolutionRepository< int64_t > & SolutionsRepository() const
Solution GetRandomBiasedSolution(absl::BitGenRef random) const
SharedRelaxationSolutionRepository * relaxation_solutions
SharedLPSolutionRepository * lp_solutions
SharedIncompleteSolutionManager * incomplete_solutions
void RecordLPRelaxationValues(Model *model)
RINSNeighborhood GetRINSNeighborhood(const SharedResponseManager *response_manager, const SharedRelaxationSolutionRepository *relaxation_solutions, const SharedLPSolutionRepository *lp_solutions, SharedIncompleteSolutionManager *incomplete_solutions, absl::BitGenRef random)
Collection of objects used to extend the Constraint Solver library.
IntegerVariable positive_var
LinearProgrammingConstraint * lp
std::vector< LPVariable > vars
std::vector< std::pair< int, int64_t > > fixed_vars
std::vector< std::pair< int, std::pair< int64_t, int64_t > > > reduced_domain_vars