Constrained optimization utilities#

A number of utilities to compute quantities that are of relevance to constrained optimization tasks.


std::vector<pop_size_t> pagmo::sort_population_con(const std::vector<vector_double>&, vector_double::size_type, const vector_double&)#

Sorts a population in a single-objective, constrained, case (from a vector of tolerances)

Sorts a population (intended here as an std::vector<vector_double> containing single objective fitness vectors) with respect to the following strict ordering:

  • \(f_1 \prec f_2\) if \(f_1\) is feasible and \(f_2\) is not.

  • \(f_1 \prec f_2\) if \(f_1\) is they are both infeasible, but \(f_1\) violates fewer constraints than \(f_2\), or in case they both violate the same number of constraints, if the \(L_2\) norm of the overall constraint violation is smaller.

  • \(f_1 \prec f_2\) if both fitness vectors are feasible and the objective value in \(f_1\) is smaller than the objective value in \(f_2\)

Note

The fitness vectors are assumed to contain exactly one objective, neq equality constraints and the rest (if any) inequality constraints

Parameters
  • input_f – an std::vector of fitness vectors (containing objectives and constraints)

  • neq – number of equality constraints

  • tol – a vector_double containing tolerances to be accounted for in the constraints

Throws
  • std::invalid_argument – If the input fitness vectors do not have all the same size \(n >=1\)

  • std::invalid_argument – If neq is larger than \(n - 1\) (too many constraints)

  • std::invalid_argument – If the size of the tol is not \(n - 1\)

Returns

an std::vector of indexes containing the sorted population


std::vector<pop_size_t> pagmo::sort_population_con(const std::vector<vector_double> &input_f, vector_double::size_type neq, double tol)#

Sorts a population in a single-objective, constrained, case (from a scalar tolerance)

Parameters
  • input_f – an std::vector of fitness vectors (containing objectives and constraints)

  • neq – number of equality constraints

  • tol – scalar tolerance to be accounted for in the constraints

Throws
  • std::invalid_argument – If the input fitness vectors do not have all the same size \(n >=1\)

  • std::invalid_argument – If neq is larger than \(n - 1\) (too many constraints)

Returns

an std::vector of indexes containing the sorted population


bool pagmo::compare_fc(const vector_double&, const vector_double&, vector_double::size_type, const vector_double&)#

Compares two fitness vectors in a single-objective, constrained, case (from a vector of tolerances)

Comparison between two fitness vectors (assuming a single-objective optimization) with respect to the following strict ordering:

  • \(f_1 \prec f_2\) if \(f_1\) is feasible and \(f_2\) is not.

  • \(f_1 \prec f_2\) if \(f_1\) is they are both infeasible, but \(f_1\) violates fewer constraints than \(f_2\), or in case they both violate the same number of constraints, if the \(L_2\) norm of the overall constraint violation is smaller.

  • \(f_1 \prec f_2\) if both fitness vectors are feasible and the objective value in \(f_1\) is smaller than the objective value in \(f_2\)

Note

The fitness vectors are assumed to contain exactly one objective, neq equality constraints and the rest (if any) inequality constraints

Parameters
  • f1 – first fitness vector

  • f2 – second fitness vector

  • neq – number of equality constraints

  • tol – a vector_double containing the tolerances to be accounted for in the constraints

Throws
  • std::invalid_argument – If f1 and f2 do not have equal size \(n\)

  • std::invalid_argument – If f1 does not have at least size 1

  • std::invalid_argument – If neq is larger than \(n - 1\) (too many constraints)

  • std::invalid_argument – If the size of the tol is not exactly the size of f1 - 1

Returns

true if f1 is “better” than f2


bool pagmo::compare_fc(const vector_double&, const vector_double&, vector_double::size_type, double)#

Compares two fitness vectors in a single-objective, constrained, case (from a scalar tolerance)

Parameters
  • f1 – first fitness vector

  • f2 – second fitness vector

  • neq – number of equality constraints

  • tol – a vector_double containing the tolerances to be accounted for in the constraints

Throws
  • std::invalid_argument – If f1 and f2 do not have equal size \(n\)

  • std::invalid_argument – If f1 does not have at least size 1

  • std::invalid_argument – If neq is larger than \(n - 1\) (too many constraints)

Returns

true if f1 is “better” than f2