41 #include "thirdparty/randutils.hpp"
47 class AdaptiveSearchValueHeuristic;
48 class AntidoteSearchValueHeuristic;
63 template<
typename ModelBuilderType>
friend class Solver;
67 friend class NullObjective;
71 friend class algorithms::AdaptiveSearchValueHeuristic;
72 friend class algorithms::AntidoteSearchValueHeuristic;
74 std::vector<Variable*> _variables;
75 std::vector<int> _variables_index;
76 std::map<int,int> _variables_position;
77 bool _is_optimization;
78 bool _is_maximization;
81 struct nanException : std::exception
83 std::vector<Variable*> variables;
86 nanException(
const std::vector<Variable*>& variables ) : variables(variables)
88 message =
"Objective required_cost returned a NaN value on variables (";
89 for(
int i = 0; i < static_cast<int>( variables.size() ) - 1; ++i )
90 message += std::to_string( variables[i]->get_value() ) +
", ";
91 message += std::to_string( variables[
static_cast<int>( variables.size() ) - 1 ]->get_value() ) +
")\n";
93 const char* what() const noexcept {
return message.c_str(); }
96 struct variableOutOfTheScope : std::exception
100 variableOutOfTheScope(
int var_id, std::string name )
102 message =
"Variable ID " + std::to_string( var_id ) +
" is not in the scope of the Objective function " + name +
".\n";
104 const char* what() const noexcept {
return message.c_str(); }
107 Objective(
const std::vector<int>& variables_index,
bool is_maximization,
const std::string& name );
108 Objective(
const std::vector<Variable>& variables,
bool is_maximization,
const std::string& name );
116 inline int heuristic_value(
int variable_index,
const std::vector<int>& possible_values, randutils::mt19937_rng& rng )
const
117 {
return expert_heuristic_value( _variables, _variables_position.at( variable_index ), possible_values, rng ); }
120 inline int heuristic_value_permutation(
int variable_index,
const std::vector<int>& bad_variables, randutils::mt19937_rng& rng )
const
124 inline double postprocess(
double best_cost )
const
145 virtual double required_cost(
const std::vector<Variable*>& variables )
const = 0;
191 const std::vector<int>& possible_values,
192 randutils::mt19937_rng& rng )
const;
216 const std::vector<int>& bad_variables,
217 randutils::mt19937_rng& rng )
const;
245 double best_cost )
const;
266 inline std::string
get_name()
const {
return _name; }
280 return os <<
"Objective name: " << o._name
289 class NullObjective :
public Objective
292 NullObjective() : Objective( std::vector<int>{0},
false,
"nullObjective" )
298 double required_cost(
const std::vector<Variable*>& variables )
const override {
return 0.0; }
323 Minimize(
const std::vector<int>& variables_index )
324 :
Objective( variables_index, false, std::string(
"Minimize" ) )
334 :
Objective( variables, false, std::string(
"Minimize" ) )
344 Minimize(
const std::vector<int>& variables_index,
const std::string& name )
345 :
Objective( variables_index, false, name )
354 Minimize(
const std::vector<Variable>& variables,
const std::string& name )
365 Minimize(
const std::vector<int>& variables_index,
const char* name )
366 :
Objective( variables_index, false, std::string( name ) )
375 Minimize(
const std::vector<Variable>& variables,
const char* name )
376 :
Objective( variables, false, std::string( name ) )
402 Maximize(
const std::vector<int>& variables_index )
403 :
Objective( variables_index, true, std::string(
"Maximize" ) )
413 :
Objective( variables, true, std::string(
"Maximize" ) )
423 Maximize(
const std::vector<int>& variables_index,
const std::string& name )
424 :
Objective( variables_index, true, name )
433 Maximize(
const std::vector<Variable>& variables,
const std::string& name )
444 Maximize(
const std::vector<int>& variables_index,
const char* name )
445 :
Objective( variables_index, true, std::string( name ) )
454 Maximize(
const std::vector<Variable>& variables,
const char* name )
455 :
Objective( variables, true, std::string( name ) )
Definition: objective.hpp:393
Maximize(const std::vector< Variable > &variables, const std::string &name)
Definition: objective.hpp:433
Maximize(const std::vector< int > &variables_index, const char *name)
Definition: objective.hpp:444
Maximize(const std::vector< int > &variables_index, const std::string &name)
Definition: objective.hpp:423
Maximize(const std::vector< Variable > &variables)
Definition: objective.hpp:412
Maximize(const std::vector< int > &variables_index)
Definition: objective.hpp:402
Maximize(const std::vector< Variable > &variables, const char *name)
Definition: objective.hpp:454
Definition: objective.hpp:314
Minimize(const std::vector< Variable > &variables, const char *name)
Definition: objective.hpp:375
Minimize(const std::vector< int > &variables_index, const char *name)
Definition: objective.hpp:365
Minimize(const std::vector< int > &variables_index, const std::string &name)
Definition: objective.hpp:344
Minimize(const std::vector< Variable > &variables, const std::string &name)
Definition: objective.hpp:354
Minimize(const std::vector< Variable > &variables)
Definition: objective.hpp:333
Minimize(const std::vector< int > &variables_index)
Definition: objective.hpp:323
Definition: model_builder.hpp:63
Definition: objective.hpp:62
friend class SearchUnit
Definition: objective.hpp:64
virtual void conditional_update_data_structures(const std::vector< Variable * > &variables, int index, int new_value)
Objective & operator=(Objective &&other)=delete
Move assignment operator disabled.
virtual int expert_heuristic_value_permutation(const std::vector< Variable * > &variables, int variable_index, const std::vector< int > &bad_variables, randutils::mt19937_rng &rng) const
std::string get_name() const
Inline accessor to get the name of the objective object.
Definition: objective.hpp:266
virtual double expert_postprocess(const std::vector< Variable * > &variables, double best_cost) const
Objective(const Objective &other)=default
Default copy contructor.
friend std::ostream & operator<<(std::ostream &os, const Objective &o)
To have a nicer stream of Objective.
Definition: objective.hpp:278
virtual double required_cost(const std::vector< Variable * > &variables) const =0
virtual int expert_heuristic_value(const std::vector< Variable * > &variables, int variable_index, const std::vector< int > &possible_values, randutils::mt19937_rng &rng) const
virtual ~Objective()=default
Default virtual destructor.
void is_not_optimization()
Definition: objective.hpp:249
Objective & operator=(const Objective &other)=delete
Copy assignment operator disabled.
bool is_optimization() const
Inline method returning if a user-defined objective function has been declared.
Definition: objective.hpp:269
Objective(Objective &&other)=default
Default move contructor.
bool is_maximization() const
Definition: objective.hpp:275
Definition: solver.hpp:110
Definition: auxiliary_data.hpp:38