14#ifndef OR_TOOLS_ALGORITHMS_SET_COVER_HEURISTICS_H_
15#define OR_TOOLS_ALGORITHMS_SET_COVER_HEURISTICS_H_
19#include "absl/types/span.h"
86 bool NextSolution(
const std::vector<SubsetIndex>& focus);
224 bool NextSolution(absl::Span<const SubsetIndex> focus,
int num_iterations);
237 void UpdatePriorities(absl::Span<const SubsetIndex> impacted_subsets);
249 array_.resize(
size.value(), T(-1));
253 int size()
const {
return array_.size(); }
257 array_.resize(
size, T(-1));
264 const int size = array_.size();
267 if (index_ >=
size) {
277 for (
int i = 0; i < fill_; ++i) {
278 if (t == array_[i]) {
286 std::vector<T> array_;
319 lagrangian_factor_(kDefaultLagrangianFactor),
320 penalty_factor_(kDefaultPenaltyFactor),
321 epsilon_(kDefaultEpsilon),
324 tabu_list_(SubsetIndex(kDefaultTabuListSize)) {
337 bool NextSolution(absl::Span<const SubsetIndex> focus,
int num_iterations);
359 void UpdatePenalties(absl::Span<const SubsetIndex> focus);
365 static constexpr double kDefaultLagrangianFactor = 100.0;
366 double lagrangian_factor_;
369 static constexpr double kPenaltyUpdateEpsilon = 1e-1;
372 static constexpr double kDefaultPenaltyFactor = 0.3;
373 double penalty_factor_;
376 static constexpr double kDefaultEpsilon = 1e-6;
390 static constexpr int kDefaultTabuListSize = 17;
412 : inv_(inv), epsilon_(kDefaultEpsilon), alpha_(kDefaultAlpha) {
425 bool NextSolution(absl::Span<const SubsetIndex> focus,
int num_iterations);
434 void SetEpsilon(
double r) { epsilon_ = r; }
436 double GetEpsilon()
const {
return epsilon_; }
438 void SetAlpha(
double r) { alpha_ = r; }
440 double GetAlpha()
const {
return alpha_; }
444 static constexpr double kDefaultEpsilon = 1e-8;
449 static constexpr double kDefaultAlpha = 0.5;
453 double penalization_factor_;
459 Cost ComputeDelta(SubsetIndex subset)
const;
463 AdjustableKAryHeap<float, SubsetIndex::ValueType, 2, true> priority_heap_;
467 AdjustableKAryHeap<float, SubsetIndex::ValueType, 2, true> utility_heap_;
498 absl::Span<const SubsetIndex> focus,
BaseInt num_subsets,
ElementDegreeSolutionGenerator(SetCoverInvariant *inv)
bool NextSolution()
GreedySolutionGenerator.
GreedySolutionGenerator(SetCoverInvariant *inv)
GuidedLocalSearch(SetCoverInvariant *inv)
bool NextSolution(const SubsetBoolVector &in_focus, int num_iterations)
void Initialize()
Initializes the Guided Local Search algorithm.
bool NextSolution(int num_iterations)
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
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(const SubsetBoolVector &in_focus, int num_iterations)
bool NextSolution(int num_iterations)
LazyElementDegreeSolutionGenerator(SetCoverInvariant *inv)
bool NextSolution()
Returns true if a solution was found.
RandomSolutionGenerator(SetCoverInvariant *inv)
bool NextSolution(int num_iterations)
SteepestSearch(SetCoverInvariant *inv)
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.
TrivialSolutionGenerator(SetCoverInvariant *inv)
bool NextSolution()
TrivialSolutionGenerator.
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%.