请用C++写一个DE算法的例子
时间: 2024-03-23 14:36:59 浏览: 13
下面是一个简单的DE算法的C++示例代码:
```
#include <iostream>
#include <vector>
#include <random>
#include <cmath>
using namespace std;
// 目标函数
double target_func(double x, double y) {
return sin(x) * cos(y) + exp(x + y);
}
// 每个候选解的结构体
struct candidate {
double x;
double y;
double fitness;
};
// 初始化候选解
void init_candidates(vector<candidate>& pop, int pop_size, double x_min, double x_max, double y_min, double y_max) {
random_device rd;
mt19937 gen(rd());
uniform_real_distribution<double> dist_x(x_min, x_max);
uniform_real_distribution<double> dist_y(y_min, y_max);
for (int i = 0; i < pop_size; i++) {
pop[i].x = dist_x(gen);
pop[i].y = dist_y(gen);
pop[i].fitness = target_func(pop[i].x, pop[i].y);
}
}
// DE算法
void de_algorithm(vector<candidate>& pop, int pop_size, double f, double cr, int max_iter, double x_min, double x_max, double y_min, double y_max) {
random_device rd;
mt19937 gen(rd());
uniform_int_distribution<int> dist_r(0, pop_size - 1);
uniform_real_distribution<double> dist_f(0, 1);
uniform_real_distribution<double> dist_x(x_min, x_max);
uniform_real_distribution<double> dist_y(y_min, y_max);
vector<candidate> new_pop(pop_size);
for (int iter = 0; iter < max_iter; iter++) {
for (int i = 0; i < pop_size; i++) {
int r1, r2, r3;
do {
r1 = dist_r(gen);
} while (r1 == i);
do {
r2 = dist_r(gen);
} while (r2 == i || r2 == r1);
do {
r3 = dist_r(gen);
} while (r3 == i || r3 == r1 || r3 == r2);
candidate trial;
trial.x = pop[r1].x + f * (pop[r2].x - pop[r3].x);
trial.y = pop[r1].y + f * (pop[r2].y - pop[r3].y);
if (trial.x < x_min || trial.x > x_max || trial.y < y_min || trial.y > y_max) {
trial.x = dist_x(gen);
trial.y = dist_y(gen);
}
uniform_real_distribution<double> dist_cr(0, 1);
double cr_i = dist_cr(gen);
if (cr_i < cr || i == dist_r(gen)) {
trial.fitness = target_func(trial.x, trial.y);
if (trial.fitness < pop[i].fitness) {
new_pop[i] = trial;
}
else {
new_pop[i] = pop[i];
}
}
else {
new_pop[i] = pop[i];
}
}
pop = new_pop;
}
}
int main() {
int pop_size = 100;
double f = 0.8;
double cr = 0.5;
int max_iter = 100;
double x_min = -10, x_max = 10;
double y_min = -10, y_max = 10;
vector<candidate> pop(pop_size);
init_candidates(pop, pop_size, x_min, x_max, y_min, y_max);
de_algorithm(pop, pop_size, f, cr, max_iter, x_min, x_max, y_min, y_max);
double min_fitness = pop[0].fitness;
int min_index = 0;
for (int i = 1; i < pop_size; i++) {
if (pop[i].fitness < min_fitness) {
min_fitness = pop[i].fitness;
min_index = i;
}
}
cout << "Minimum point: (" << pop[min_index].x << ", " << pop[min_index].y << ")" << endl;
cout << "Minimum fitness: " << min_fitness << endl;
return 0;
}
```
这个例子中,我们实现了一个求解二元函数的DE算法。首先,我们定义了目标函数 `target_func`,它接受两个变量 x 和 y,并返回一个实数值。然后,我们定义了一个结构体 `candidate`,用于存储每个候选解的 x、y 值和适应度值。在 `init_candidates` 函数中,我们使用随机数生成器初始化了一组候选解。在 `de_algorithm` 函数中,我们按照DE算法的流程,对每个候选解进行变异、交叉和选择,不断更新候选解的位置和适应度值。最后,在主函数中,我们输出了最优的解和适应度值。
需要注意的是,这只是一个简单的DE算法示例,实际应用中可能需要进行更多的优化和改进。