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