14#ifndef ORTOOLS_SET_COVER_SET_COVER_HEURISTICS_H_
15#define ORTOOLS_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
bool NextSolution(absl::Span< const SubsetIndex > focus) final
bool NextSolution() final
BoolVectorBasedSolutionGenerator(SetCoverInvariant *inv, SetCoverInvariant::ConsistencyLevel consistency_level, absl::string_view class_name, absl::string_view name)
ElementDegreeSolutionGenerator(SetCoverInvariant *inv)
bool NextSolution() final
ElementDegreeSolutionGenerator(SetCoverInvariant *inv, absl::string_view name)
bool NextSolution() final
GreedySolutionGenerator(SetCoverInvariant *inv, absl::string_view name)
GreedySolutionGenerator(SetCoverInvariant *inv)
GuidedLocalSearch(SetCoverInvariant *inv)
GuidedLocalSearch(SetCoverInvariant *inv, absl::string_view name)
bool NextSolution() final
void SetTabuListSize(int size)
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)
void SetEpsilon(double r)
GuidedTabuSearch(SetCoverInvariant *inv)
bool NextSolution() final
LazyElementDegreeSolutionGenerator(SetCoverInvariant *inv)
LazyElementDegreeSolutionGenerator(SetCoverInvariant *inv, absl::string_view name)
LazySteepestSearch(SetCoverInvariant *inv, absl::string_view name)
bool NextSolution() final
LazySteepestSearch(SetCoverInvariant *inv)
bool NextSolution() final
RandomSolutionGenerator(SetCoverInvariant *inv, absl::string_view name)
RandomSolutionGenerator(SetCoverInvariant *inv)
BaseInt num_subsets() const
void SetName(const absl::string_view name)
double run_time_in_seconds() const
virtual SetCoverSolutionGenerator & ResetLimits()
double run_time_in_microseconds() const
SetCoverInvariant::ConsistencyLevel consistency_level_
BaseInt num_subsets() const
int64_t max_iterations() const
virtual ~SetCoverSolutionGenerator()=default
virtual bool NextSolution()=0
SetCoverModel * model() const
SetCoverInvariant * inv() const
virtual bool NextSolution(absl::Span< const SubsetIndex > focus)=0
absl::Duration run_time() const
SetCoverSolutionGenerator & SetTimeLimitInSeconds(double seconds)
virtual bool NextSolution(const SubsetBoolVector &in_focus)=0
double time_limit_in_seconds() const
std::string class_name() const
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)
SteepestSearch(SetCoverInvariant *inv, absl::string_view name)
bool NextSolution() final
SteepestSearch(SetCoverInvariant *inv)
bool NextSolution() final
SubsetListBasedSolutionGenerator(SetCoverInvariant *inv, SetCoverInvariant::ConsistencyLevel consistency_level, absl::string_view class_name, absl::string_view name)
bool NextSolution(const SubsetBoolVector &in_focus) final
bool NextSolution(absl::Span< const SubsetIndex > _) override
bool NextSolution() final
TrivialSolutionGenerator(SetCoverInvariant *inv)
TrivialSolutionGenerator(SetCoverInvariant *inv, absl::string_view name)
util_intops::StrongVector< SubsetIndex, Cost > SubsetCostVector
std::vector< SubsetIndex > ClearRandomSubsets(BaseInt num_subsets, SetCoverInvariant *inv)
util_intops::StrongVector< SubsetIndex, BaseInt > SubsetToIntVector
util_intops::StrongVector< SubsetIndex, bool > SubsetBoolVector
std::vector< SubsetIndex > ClearMostCoveredElements(BaseInt max_num_subsets, SetCoverInvariant *inv)