pub struct Problem<'suite> { /* private fields */ }
Expand description
A specific problem instance.
Instances can be optained using Suite::next_problem and Suite::problem_by_function_dimension_instance.
Implementations§
source§impl Problem<'_>
impl Problem<'_>
sourcepub fn id(&self) -> &str
pub fn id(&self) -> &str
Returns the ID of the problem.
For the toy
suite this is
{function-name}_d{dimension}
For bbob
it is
- bbob_f{function-index}_i{instance}_d{dimension}
sourcepub fn function_index(&self) -> usize
pub fn function_index(&self) -> usize
Returns the index of the problem.
sourcepub fn dimension_index(&self) -> usize
pub fn dimension_index(&self) -> usize
Returns the dimension index of the problem.
sourcepub fn instance_index(&self) -> usize
pub fn instance_index(&self) -> usize
Returns the instance of the problem.
sourcepub fn evaluate_function(&mut self, x: &[f64], y: &mut [f64])
pub fn evaluate_function(&mut self, x: &[f64], y: &mut [f64])
Evaluates the problem at x
and returns the result in y
.
The length of x
must match Problem::dimension and the
length of y
must match Problem::number_of_objectives.
Examples found in repository?
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
fn my_random_search(problem: &mut Problem, max_budget: usize, random_generator: &mut RandomState) {
let dimension = problem.dimension();
let number_of_objectives = problem.number_of_objectives();
let numver_of_constraints = problem.number_of_constraints();
let number_of_integer_variables = problem.number_of_integer_variables();
let bounds = problem.get_ranges_of_interest();
let x = &mut vec![0.0; dimension];
let y = &mut vec![0.0; number_of_objectives];
let c = &mut vec![0.0; numver_of_constraints];
problem.initial_solution(x);
problem.evaluate_function(x, y);
for _ in 0..max_budget {
for (i, xi) in x.iter_mut().enumerate() {
let (lower, upper) = bounds[i].clone().into_inner();
*xi = lower + random_generator.uniform() * (upper - lower);
if i < number_of_integer_variables {
*xi = xi.round();
}
}
if numver_of_constraints > 0 {
problem.evaluate_constraint(x, c);
}
problem.evaluate_function(x, y);
}
}
sourcepub fn evaluate_constraint(&mut self, x: &[f64], y: &mut [f64])
pub fn evaluate_constraint(&mut self, x: &[f64], y: &mut [f64])
Evaluates the problem constraints in point x and save the result in y.
The length of x
must match Problem::dimension and the
length of y
must match Problem::number_of_constraints.
Examples found in repository?
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
fn my_random_search(problem: &mut Problem, max_budget: usize, random_generator: &mut RandomState) {
let dimension = problem.dimension();
let number_of_objectives = problem.number_of_objectives();
let numver_of_constraints = problem.number_of_constraints();
let number_of_integer_variables = problem.number_of_integer_variables();
let bounds = problem.get_ranges_of_interest();
let x = &mut vec![0.0; dimension];
let y = &mut vec![0.0; number_of_objectives];
let c = &mut vec![0.0; numver_of_constraints];
problem.initial_solution(x);
problem.evaluate_function(x, y);
for _ in 0..max_budget {
for (i, xi) in x.iter_mut().enumerate() {
let (lower, upper) = bounds[i].clone().into_inner();
*xi = lower + random_generator.uniform() * (upper - lower);
if i < number_of_integer_variables {
*xi = xi.round();
}
}
if numver_of_constraints > 0 {
problem.evaluate_constraint(x, c);
}
problem.evaluate_function(x, y);
}
}
sourcepub fn final_target_hit(&self) -> bool
pub fn final_target_hit(&self) -> bool
Returns true if a previous evaluation hit the target value.
Examples found in repository?
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
fn example_experiment(
suite_name: SuiteName,
suite_options: &str,
observer_name: ObserverName,
observer_options: &str,
random_generator: &mut RandomState,
) {
let suite = &mut Suite::new(suite_name, "", suite_options).unwrap();
let observer = &mut Observer::new(observer_name, observer_options).unwrap();
while let Some(problem) = &mut suite.next_problem(Some(observer)) {
let dimension = problem.dimension();
for _ in 1..=INDEPENDENT_RESTARTS {
let evaluations_done = problem.evaluations() + problem.evaluations_constraints();
let evaluations_remaining =
(dimension * BUDGET_MULTIPLIER).saturating_sub(evaluations_done as usize);
if problem.final_target_hit() || evaluations_remaining == 0 {
break;
}
my_random_search(problem, evaluations_remaining, random_generator);
}
}
}
sourcepub fn final_target_value(&self) -> f64
pub fn final_target_value(&self) -> f64
Returns the optimal function value + delta of the problem
sourcepub fn best_value(&self) -> f64
pub fn best_value(&self) -> f64
Returns the optimal function value of the problem
To check whether the target has been reached use [Problem::final_target_value] or [Problem::final_target_hit] instead.
sourcepub fn dimension(&self) -> usize
pub fn dimension(&self) -> usize
Returns the dimension of the problem.
Examples found in repository?
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
fn example_experiment(
suite_name: SuiteName,
suite_options: &str,
observer_name: ObserverName,
observer_options: &str,
random_generator: &mut RandomState,
) {
let suite = &mut Suite::new(suite_name, "", suite_options).unwrap();
let observer = &mut Observer::new(observer_name, observer_options).unwrap();
while let Some(problem) = &mut suite.next_problem(Some(observer)) {
let dimension = problem.dimension();
for _ in 1..=INDEPENDENT_RESTARTS {
let evaluations_done = problem.evaluations() + problem.evaluations_constraints();
let evaluations_remaining =
(dimension * BUDGET_MULTIPLIER).saturating_sub(evaluations_done as usize);
if problem.final_target_hit() || evaluations_remaining == 0 {
break;
}
my_random_search(problem, evaluations_remaining, random_generator);
}
}
}
fn my_random_search(problem: &mut Problem, max_budget: usize, random_generator: &mut RandomState) {
let dimension = problem.dimension();
let number_of_objectives = problem.number_of_objectives();
let numver_of_constraints = problem.number_of_constraints();
let number_of_integer_variables = problem.number_of_integer_variables();
let bounds = problem.get_ranges_of_interest();
let x = &mut vec![0.0; dimension];
let y = &mut vec![0.0; number_of_objectives];
let c = &mut vec![0.0; numver_of_constraints];
problem.initial_solution(x);
problem.evaluate_function(x, y);
for _ in 0..max_budget {
for (i, xi) in x.iter_mut().enumerate() {
let (lower, upper) = bounds[i].clone().into_inner();
*xi = lower + random_generator.uniform() * (upper - lower);
if i < number_of_integer_variables {
*xi = xi.round();
}
}
if numver_of_constraints > 0 {
problem.evaluate_constraint(x, c);
}
problem.evaluate_function(x, y);
}
}
sourcepub fn number_of_objectives(&self) -> usize
pub fn number_of_objectives(&self) -> usize
Returns the number of objectives of the problem.
Examples found in repository?
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
fn my_random_search(problem: &mut Problem, max_budget: usize, random_generator: &mut RandomState) {
let dimension = problem.dimension();
let number_of_objectives = problem.number_of_objectives();
let numver_of_constraints = problem.number_of_constraints();
let number_of_integer_variables = problem.number_of_integer_variables();
let bounds = problem.get_ranges_of_interest();
let x = &mut vec![0.0; dimension];
let y = &mut vec![0.0; number_of_objectives];
let c = &mut vec![0.0; numver_of_constraints];
problem.initial_solution(x);
problem.evaluate_function(x, y);
for _ in 0..max_budget {
for (i, xi) in x.iter_mut().enumerate() {
let (lower, upper) = bounds[i].clone().into_inner();
*xi = lower + random_generator.uniform() * (upper - lower);
if i < number_of_integer_variables {
*xi = xi.round();
}
}
if numver_of_constraints > 0 {
problem.evaluate_constraint(x, c);
}
problem.evaluate_function(x, y);
}
}
sourcepub fn number_of_constraints(&self) -> usize
pub fn number_of_constraints(&self) -> usize
Returns the number of constraints of the problem.
Examples found in repository?
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
fn my_random_search(problem: &mut Problem, max_budget: usize, random_generator: &mut RandomState) {
let dimension = problem.dimension();
let number_of_objectives = problem.number_of_objectives();
let numver_of_constraints = problem.number_of_constraints();
let number_of_integer_variables = problem.number_of_integer_variables();
let bounds = problem.get_ranges_of_interest();
let x = &mut vec![0.0; dimension];
let y = &mut vec![0.0; number_of_objectives];
let c = &mut vec![0.0; numver_of_constraints];
problem.initial_solution(x);
problem.evaluate_function(x, y);
for _ in 0..max_budget {
for (i, xi) in x.iter_mut().enumerate() {
let (lower, upper) = bounds[i].clone().into_inner();
*xi = lower + random_generator.uniform() * (upper - lower);
if i < number_of_integer_variables {
*xi = xi.round();
}
}
if numver_of_constraints > 0 {
problem.evaluate_constraint(x, c);
}
problem.evaluate_function(x, y);
}
}
sourcepub fn number_of_integer_variables(&self) -> usize
pub fn number_of_integer_variables(&self) -> usize
Returns the numver of integer variables of the problem.
The first n
variables will be integers then.
Returns 0
if all variables are continuous.
Examples found in repository?
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
fn my_random_search(problem: &mut Problem, max_budget: usize, random_generator: &mut RandomState) {
let dimension = problem.dimension();
let number_of_objectives = problem.number_of_objectives();
let numver_of_constraints = problem.number_of_constraints();
let number_of_integer_variables = problem.number_of_integer_variables();
let bounds = problem.get_ranges_of_interest();
let x = &mut vec![0.0; dimension];
let y = &mut vec![0.0; number_of_objectives];
let c = &mut vec![0.0; numver_of_constraints];
problem.initial_solution(x);
problem.evaluate_function(x, y);
for _ in 0..max_budget {
for (i, xi) in x.iter_mut().enumerate() {
let (lower, upper) = bounds[i].clone().into_inner();
*xi = lower + random_generator.uniform() * (upper - lower);
if i < number_of_integer_variables {
*xi = xi.round();
}
}
if numver_of_constraints > 0 {
problem.evaluate_constraint(x, c);
}
problem.evaluate_function(x, y);
}
}
sourcepub fn get_ranges_of_interest(&self) -> Vec<RangeInclusive<f64>>
pub fn get_ranges_of_interest(&self) -> Vec<RangeInclusive<f64>>
Returns the upper and lover bounds of the problem.
Examples found in repository?
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
fn my_random_search(problem: &mut Problem, max_budget: usize, random_generator: &mut RandomState) {
let dimension = problem.dimension();
let number_of_objectives = problem.number_of_objectives();
let numver_of_constraints = problem.number_of_constraints();
let number_of_integer_variables = problem.number_of_integer_variables();
let bounds = problem.get_ranges_of_interest();
let x = &mut vec![0.0; dimension];
let y = &mut vec![0.0; number_of_objectives];
let c = &mut vec![0.0; numver_of_constraints];
problem.initial_solution(x);
problem.evaluate_function(x, y);
for _ in 0..max_budget {
for (i, xi) in x.iter_mut().enumerate() {
let (lower, upper) = bounds[i].clone().into_inner();
*xi = lower + random_generator.uniform() * (upper - lower);
if i < number_of_integer_variables {
*xi = xi.round();
}
}
if numver_of_constraints > 0 {
problem.evaluate_constraint(x, c);
}
problem.evaluate_function(x, y);
}
}
sourcepub fn evaluations(&self) -> u64
pub fn evaluations(&self) -> u64
Returns how often this instance has been evaluated.
Examples found in repository?
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
fn example_experiment(
suite_name: SuiteName,
suite_options: &str,
observer_name: ObserverName,
observer_options: &str,
random_generator: &mut RandomState,
) {
let suite = &mut Suite::new(suite_name, "", suite_options).unwrap();
let observer = &mut Observer::new(observer_name, observer_options).unwrap();
while let Some(problem) = &mut suite.next_problem(Some(observer)) {
let dimension = problem.dimension();
for _ in 1..=INDEPENDENT_RESTARTS {
let evaluations_done = problem.evaluations() + problem.evaluations_constraints();
let evaluations_remaining =
(dimension * BUDGET_MULTIPLIER).saturating_sub(evaluations_done as usize);
if problem.final_target_hit() || evaluations_remaining == 0 {
break;
}
my_random_search(problem, evaluations_remaining, random_generator);
}
}
}
sourcepub fn evaluations_constraints(&self) -> u64
pub fn evaluations_constraints(&self) -> u64
Returns how often this instances constrants have been evaluated.
Examples found in repository?
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
fn example_experiment(
suite_name: SuiteName,
suite_options: &str,
observer_name: ObserverName,
observer_options: &str,
random_generator: &mut RandomState,
) {
let suite = &mut Suite::new(suite_name, "", suite_options).unwrap();
let observer = &mut Observer::new(observer_name, observer_options).unwrap();
while let Some(problem) = &mut suite.next_problem(Some(observer)) {
let dimension = problem.dimension();
for _ in 1..=INDEPENDENT_RESTARTS {
let evaluations_done = problem.evaluations() + problem.evaluations_constraints();
let evaluations_remaining =
(dimension * BUDGET_MULTIPLIER).saturating_sub(evaluations_done as usize);
if problem.final_target_hit() || evaluations_remaining == 0 {
break;
}
my_random_search(problem, evaluations_remaining, random_generator);
}
}
}
sourcepub fn initial_solution(&self, x: &mut [f64])
pub fn initial_solution(&self, x: &mut [f64])
Writes a feasible initial solution into x
.
If the problem does not provide a specific solution, it will be the center of the problem’s region of interest.
Examples found in repository?
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
fn my_random_search(problem: &mut Problem, max_budget: usize, random_generator: &mut RandomState) {
let dimension = problem.dimension();
let number_of_objectives = problem.number_of_objectives();
let numver_of_constraints = problem.number_of_constraints();
let number_of_integer_variables = problem.number_of_integer_variables();
let bounds = problem.get_ranges_of_interest();
let x = &mut vec![0.0; dimension];
let y = &mut vec![0.0; number_of_objectives];
let c = &mut vec![0.0; numver_of_constraints];
problem.initial_solution(x);
problem.evaluate_function(x, y);
for _ in 0..max_budget {
for (i, xi) in x.iter_mut().enumerate() {
let (lower, upper) = bounds[i].clone().into_inner();
*xi = lower + random_generator.uniform() * (upper - lower);
if i < number_of_integer_variables {
*xi = xi.round();
}
}
if numver_of_constraints > 0 {
problem.evaluate_constraint(x, c);
}
problem.evaluate_function(x, y);
}
}