static coco_problem_t *f_weierstrass_bbob_problem_allocate(const size_t function, const size_t dimension, const size_t instance, const long rseed, const char *problem_id_template, const char *problem_name_template) { double *xopt, fopt; coco_problem_t *problem = NULL; size_t i, j, k; double *M = coco_allocate_vector(dimension * dimension); double *b = coco_allocate_vector(dimension); double *current_row, **rot1, **rot2; const double condition = 100.0; const double penalty_factor = 10.0 / (double) dimension; xopt = coco_allocate_vector(dimension); fopt = bbob2009_compute_fopt(function, instance); bbob2009_compute_xopt(xopt, rseed, dimension); rot1 = bbob2009_allocate_matrix(dimension, dimension); rot2 = bbob2009_allocate_matrix(dimension, dimension); bbob2009_compute_rotation(rot1, rseed + 1000000, dimension); bbob2009_compute_rotation(rot2, rseed, dimension); for (i = 0; i < dimension; ++i) { b[i] = 0.0; current_row = M + i * dimension; for (j = 0; j < dimension; ++j) { current_row[j] = 0.0; for (k = 0; k < dimension; ++k) { const double base = 1.0 / sqrt(condition); const double exponent = 1.0 * (int) k / ((double) (long) dimension - 1.0); current_row[j] += rot1[i][k] * pow(base, exponent) * rot2[k][j]; } } } problem = f_weierstrass_allocate(dimension); problem = f_transform_obj_shift(problem, fopt); problem = f_transform_vars_affine(problem, M, b, dimension); problem = f_transform_vars_oscillate(problem); bbob2009_copy_rotation_matrix(rot1, M, b, dimension); problem = f_transform_vars_affine(problem, M, b, dimension); problem = f_transform_vars_shift(problem, xopt, 0); problem = f_transform_obj_penalize(problem, penalty_factor); bbob2009_free_matrix(rot1, dimension); bbob2009_free_matrix(rot2, dimension); coco_problem_set_id(problem, problem_id_template, function, instance, dimension); coco_problem_set_name(problem, problem_name_template, function, instance, dimension); coco_problem_set_type(problem, "4-multi-modal"); coco_free_memory(M); coco_free_memory(b); coco_free_memory(xopt); return problem; }
/** * @brief Creates the BBOB Griewank-Rosenbrock problem. */ static coco_problem_t *f_griewank_rosenbrock_bbob_problem_allocate(const size_t function, const size_t dimension, const size_t instance, const long rseed, const char *problem_id_template, const char *problem_name_template) { double fopt; coco_problem_t *problem = NULL; size_t i, j; double *M = coco_allocate_vector(dimension * dimension); double *b = coco_allocate_vector(dimension); double *shift = coco_allocate_vector(dimension); double scales, **rot1; fopt = bbob2009_compute_fopt(function, instance); for (i = 0; i < dimension; ++i) { shift[i] = -0.5; } rot1 = bbob2009_allocate_matrix(dimension, dimension); bbob2009_compute_rotation(rot1, rseed, dimension); scales = coco_double_max(1., sqrt((double) dimension) / 8.); for (i = 0; i < dimension; ++i) { for (j = 0; j < dimension; ++j) { rot1[i][j] *= scales; } } problem = f_griewank_rosenbrock_allocate(dimension); problem = transform_obj_shift(problem, fopt); problem = transform_vars_shift(problem, shift, 0); bbob2009_copy_rotation_matrix(rot1, M, b, dimension); problem = transform_vars_affine(problem, M, b, dimension); bbob2009_free_matrix(rot1, dimension); coco_problem_set_id(problem, problem_id_template, function, instance, dimension); coco_problem_set_name(problem, problem_name_template, function, instance, dimension); coco_problem_set_type(problem, "4-multi-modal"); coco_free_memory(M); coco_free_memory(b); coco_free_memory(shift); return problem; }