14#ifndef OR_TOOLS_SET_COVER_SET_COVER_HEURISTICS_H_
15#define OR_TOOLS_SET_COVER_SET_COVER_HEURISTICS_H_
22#include "absl/strings/string_view.h"
23#include "absl/time/time.h"
24#include "absl/types/span.h"
65 time_limit_in_seconds_(
std::numeric_limits<double>::infinity()),
66 max_iterations_(
std::numeric_limits<int64_t>::max()) {}
76 time_limit_in_seconds_ = std::numeric_limits<double>::infinity();
77 max_iterations_ = std::numeric_limits<int64_t>::max();
92 time_limit_in_seconds_ = seconds;
105 return absl::ToInt64Microseconds(
run_time_);
109 std::string
name()
const {
return name_; }
150 std::string class_name_;
157 double time_limit_in_seconds_;
160 int64_t max_iterations_;
179 bool NextSolution(absl::Span<const SubsetIndex> _)
override {
return false; }
191 absl::Span<const SubsetIndex> MakeSubsetIndexSpan(
193 std::vector<SubsetIndex> result;
194 result.reserve(in_focus.size());
196 for (
const auto bit : in_focus) {
201 return absl::MakeConstSpan(result);
233 for (
const SubsetIndex subset : focus) {
234 result[subset] =
true;
253 "TrivialGenerator",
name) {}
256 bool NextSolution(absl::Span<const SubsetIndex> focus)
final;
274 "RandomGenerator",
name) {}
277 bool NextSolution(absl::Span<const SubsetIndex> focus)
final;
309 "GreedyGenerator",
name) {}
312 bool NextSolution(absl::Span<const SubsetIndex> focus)
final;
332 "ElementDegreeGenerator",
name) {}
354 absl::string_view
name)
357 "LazyElementDegreeGenerator",
name) {}
379 "SteepestSearch",
name) {}
398 "LazySteepestSearch",
name) {}
410 array_.resize(
size.value(), T(-1));
414 int size()
const {
return array_.size(); }
418 array_.resize(
size, T(-1));
425 const int size = array_.size();
428 if (index_ >=
size) {
438 for (
int i = 0; i < fill_; ++i) {
439 if (t == array_[i]) {
447 std::vector<T> array_;
484 "GuidedTabuSearch",
name),
485 lagrangian_factor_(kDefaultLagrangianFactor),
486 penalty_factor_(kDefaultPenaltyFactor),
487 epsilon_(kDefaultEpsilon),
490 tabu_list_(SubsetIndex(kDefaultTabuListSize)) {
498 bool NextSolution(absl::Span<const SubsetIndex> focus)
final;
518 void UpdatePenalties(absl::Span<const SubsetIndex> focus);
521 static constexpr double kDefaultLagrangianFactor = 100.0;
522 double lagrangian_factor_;
525 static constexpr double kPenaltyUpdateEpsilon = 1e-1;
528 static constexpr double kDefaultPenaltyFactor = 0.3;
529 double penalty_factor_;
532 static constexpr double kDefaultEpsilon = 1e-6;
548 static constexpr int kDefaultTabuListSize = 17;
576 "GuidedLocalSearch",
name),
577 epsilon_(kDefaultEpsilon),
578 alpha_(kDefaultAlpha) {
586 bool NextSolution(absl::Span<const SubsetIndex> focus)
final;
590 void SetEpsilon(
double r) { epsilon_ = r; }
592 double GetEpsilon()
const {
return epsilon_; }
594 void SetAlpha(
double r) { alpha_ = r; }
596 double GetAlpha()
const {
return alpha_; }
600 static constexpr double kDefaultEpsilon = 1e-8;
605 static constexpr double kDefaultAlpha = 0.5;
609 double penalization_factor_;
615 Cost ComputeDelta(SubsetIndex subset)
const;
619 AdjustableKAryHeap<float, SubsetIndex::ValueType, 2, true> priority_heap_;
623 AdjustableKAryHeap<float, SubsetIndex::ValueType, 2, true> utility_heap_;
654 absl::Span<const SubsetIndex> focus,
BaseInt num_subsets,
bool NextSolution(const SubsetBoolVector &_) override
Same as above, but with a vector of Booleans as focus.
bool NextSolution(absl::Span< const SubsetIndex > focus) final
bool NextSolution() final
Virtual methods that must be implemented by derived classes.
BoolVectorBasedSolutionGenerator(SetCoverInvariant *inv, SetCoverInvariant::ConsistencyLevel consistency_level, absl::string_view class_name, absl::string_view name)
ElementDegreeSolutionGenerator(SetCoverInvariant *inv)
bool NextSolution() final
Virtual methods that must be implemented by derived classes.
ElementDegreeSolutionGenerator(SetCoverInvariant *inv, absl::string_view name)
bool NextSolution() final
Virtual methods that must be implemented by derived classes.
GreedySolutionGenerator(SetCoverInvariant *inv, absl::string_view name)
GreedySolutionGenerator(SetCoverInvariant *inv)
GuidedLocalSearch(SetCoverInvariant *inv)
void Initialize()
Initializes the Guided Local Search algorithm.
GuidedLocalSearch(SetCoverInvariant *inv, absl::string_view name)
bool NextSolution() final
Virtual methods that must be implemented by derived classes.
void SetTabuListSize(int size)
void Initialize()
Initializes the Guided Tabu Search algorithm.
void SetLagrangianFactor(double factor)
int GetTabuListSize() const
double GetLagrangianFactor() const
double GetEpsilon() const
GuidedTabuSearch(SetCoverInvariant *inv, absl::string_view name)
double GetPenaltyFactor() const
void SetPenaltyFactor(double factor)
Setters and getters for the Guided Tabu Search algorithm parameters.
void SetEpsilon(double r)
GuidedTabuSearch(SetCoverInvariant *inv)
bool NextSolution() final
Virtual methods that must be implemented by derived classes.
LazyElementDegreeSolutionGenerator(SetCoverInvariant *inv)
LazyElementDegreeSolutionGenerator(SetCoverInvariant *inv, absl::string_view name)
LazySteepestSearch(SetCoverInvariant *inv, absl::string_view name)
bool NextSolution() final
Virtual methods that must be implemented by derived classes.
LazySteepestSearch(SetCoverInvariant *inv)
bool NextSolution() final
Virtual methods that must be implemented by derived classes.
RandomSolutionGenerator(SetCoverInvariant *inv, absl::string_view name)
RandomSolutionGenerator(SetCoverInvariant *inv)
Main class for describing a weighted set-covering problem.
BaseInt num_subsets() const
void SetName(const absl::string_view name)
double run_time_in_seconds() const
Returns the total elapsed runtime in seconds.
virtual SetCoverSolutionGenerator & ResetLimits()
Resets the limits to their default values.
double run_time_in_microseconds() const
Returns the total elapsed runtime in microseconds.
SetCoverInvariant::ConsistencyLevel consistency_level_
The consistency needed by the solution generator.
BaseInt num_subsets() const
int64_t max_iterations() const
Returns the maximum number of iterations.
virtual ~SetCoverSolutionGenerator()=default
virtual bool NextSolution()=0
Virtual methods that must be implemented by derived classes.
absl::Duration run_time_
run_time_ is an abstract duration for the time spent in NextSolution().
SetCoverModel * model() const
Accessors.
SetCoverInvariant * inv() const
virtual bool NextSolution(absl::Span< const SubsetIndex > focus)=0
std::string name() const
Returns the name of the heuristic.
Cost cost() const
Returns the current cost of the solution in the invariant.
absl::Duration run_time() const
SetCoverSolutionGenerator & SetTimeLimitInSeconds(double seconds)
Sets the time limit in seconds.
virtual bool NextSolution(const SubsetBoolVector &in_focus)=0
Same as above, but with a vector of Booleans as focus.
double time_limit_in_seconds() const
The time limit in seconds.
std::string class_name() const
Returns the name of the class.
SetCoverSolutionGenerator(SetCoverInvariant *inv, SetCoverInvariant::ConsistencyLevel consistency_level, absl::string_view class_name, absl::string_view name)
bool CheckInvariantConsistency() const
SetCoverSolutionGenerator & SetMaxIterations(int64_t max_iterations)
Sets the maximum number of iterations.
SteepestSearch(SetCoverInvariant *inv, absl::string_view name)
bool NextSolution() final
Virtual methods that must be implemented by derived classes.
SteepestSearch(SetCoverInvariant *inv)
bool NextSolution() final
Virtual methods that must be implemented by derived classes.
SubsetListBasedSolutionGenerator(SetCoverInvariant *inv, SetCoverInvariant::ConsistencyLevel consistency_level, absl::string_view class_name, absl::string_view name)
bool NextSolution(const SubsetBoolVector &in_focus) final
Same as above, but with a vector of Booleans as focus.
bool NextSolution(absl::Span< const SubsetIndex > _) override
void Init(int size)
Initializes the array of the Tabu list.
bool Contains(T t) const
Returns true if t is in the array. This is O(size), but small.
int size() const
Returns the size of the array.
void Add(T t)
Adds t to the array. When the end of the array is reached, re-start at 0.
bool NextSolution() final
Virtual methods that must be implemented by derived classes.
TrivialSolutionGenerator(SetCoverInvariant *inv)
TrivialSolutionGenerator(SetCoverInvariant *inv, absl::string_view name)
In SWIG mode, we don't want anything besides these top-level includes.
util_intops::StrongVector< SubsetIndex, Cost > SubsetCostVector
std::vector< SubsetIndex > ClearRandomSubsets(BaseInt num_subsets, SetCoverInvariant *inv)
The consistency level is maintained up to kCostAndCoverage.
util_intops::StrongVector< SubsetIndex, BaseInt > SubsetToIntVector
std::vector< SubsetIndex > ClearMostCoveredElements(BaseInt max_num_subsets, SetCoverInvariant *inv)
The consistency level is maintained up to kCostAndCoverage.
util_intops::StrongVector< SubsetIndex, bool > SubsetBoolVector
double Cost
Basic non-strict type for cost. The speed penalty for using double is ~2%.