idol
A C++ Framework for Optimization
Loading...
Searching...
No Matches
MostInfeasible.h
1//
2// Created by henri on 17.10.23.
3//
4
5#ifndef IDOL_IMPL_MOSTINFEASIBLE_H
6#define IDOL_IMPL_MOSTINFEASIBLE_H
7
8#include <cmath>
9#include "VariableBranching.h"
10
11namespace idol::BranchingRules {
12 template<class NodeInfoT> class MostInfeasible;
13}
14
15template<class NodeInfoT>
17protected:
18 std::list<std::pair<Var, double>> scoring_function(const std::list<Var> &t_var, const Node<NodeInfoT> &t_node) override;
19public:
20 explicit MostInfeasible(const Optimizers::BranchAndBound<NodeInfoT>& t_parent, std::list<Var> t_branching_candidates);
21};
22
23template<class NodeInfoT>
25 const idol::Optimizers::BranchAndBound<NodeInfoT> &t_parent, std::list<Var> t_branching_candidates)
26 : VariableBranching<NodeInfoT>(t_parent, std::move(t_branching_candidates)) {}
27
28template<class NodeInfoT>
29std::list<std::pair<idol::Var, double>>
30idol::BranchingRules::MostInfeasible<NodeInfoT>::scoring_function(const std::list<idol::Var> &t_variables,
31 const Node<NodeInfoT> &t_node) {
32
33 const auto& primal_solution = t_node.info().primal_solution();
34
35 std::list<std::pair<Var, double>> result;
36
37 for (const auto& var : t_variables) {
38 const double value = primal_solution.get(var);
39 const double score = std::abs(value - std::round(value));
40 result.emplace_back(var, score);
41 }
42
43 return result;
44}
45
46#endif //IDOL_IMPL_MOSTINFEASIBLE_H