用 c++写一个遗传算法带注释
时间: 2023-04-08 16:02:58 浏览: 58
好的,我可以回答这个问题。以下是一个简单的遗传算法的 C 代码,带有注释:
```
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define POP_SIZE 10 // 种群大小
#define CHROMO_LEN 5 // 染色体长度
#define MUTATION_RATE 0.1 // 变异率
// 生成随机数
double rand_double(double min, double max) {
return ((double)rand() / RAND_MAX) * (max - min) + min;
}
// 初始化种群
void init_population(double population[][CHROMO_LEN]) {
int i, j;
for (i = 0; i < POP_SIZE; i++) {
for (j = 0; j < CHROMO_LEN; j++) {
population[i][j] = rand_double(-5.0, 5.0);
}
}
}
// 计算适应度
double fitness(double chromo[]) {
double x = chromo[0];
double y = chromo[1];
double z = chromo[2];
double w = chromo[3];
double u = chromo[4];
return x * x + y * y + z * z + w * w + u * u;
}
// 选择
void selection(double population[][CHROMO_LEN], double fitnesses[]) {
int i, j;
double total_fitness = 0.0;
double roulette[POP_SIZE];
double new_population[POP_SIZE][CHROMO_LEN];
// 计算总适应度
for (i = 0; i < POP_SIZE; i++) {
fitnesses[i] = fitness(population[i]);
total_fitness += fitnesses[i];
}
// 计算轮盘赌概率
for (i = 0; i < POP_SIZE; i++) {
roulette[i] = fitnesses[i] / total_fitness;
if (i > 0) {
roulette[i] += roulette[i - 1];
}
}
// 选择
for (i = 0; i < POP_SIZE; i++) {
double r = rand_double(0.0, 1.0);
for (j = 0; j < POP_SIZE; j++) {
if (r <= roulette[j]) {
break;
}
}
for (j = 0; j < CHROMO_LEN; j++) {
new_population[i][j] = population[j][j];
}
}
// 更新种群
for (i = 0; i < POP_SIZE; i++) {
for (j = 0; j < CHROMO_LEN; j++) {
population[i][j] = new_population[i][j];
}
}
}
// 变异
void mutation(double population[][CHROMO_LEN]) {
int i, j;
for (i = 0; i < POP_SIZE; i++) {
for (j = 0; j < CHROMO_LEN; j++) {
double r = rand_double(0.0, 1.0);
if (r < MUTATION_RATE) {
population[i][j] = rand_double(-5.0, 5.0);
}
}
}
}
// 主函数
int main() {
srand(time(NULL));
double population[POP_SIZE][CHROMO_LEN];
double fitnesses[POP_SIZE];
int i, j;
// 初始化种群
init_population(population);
// 迭代
for (i = 0; i < 100; i++) {
// 选择
selection(population, fitnesses);
// 变异
mutation(population);
}
// 输出最优解
double best_fitness = fitness(population[0]);
int best_index = 0;
for (i = 1; i < POP_SIZE; i++) {
double f = fitness(population[i]);
if (f < best_fitness) {
best_fitness = f;
best_index = i;
}
}
printf("Best solution: ");
for (j = 0; j < CHROMO_LEN; j++) {
printf("%f ", population[best_index][j]);
}
printf("(fitness = %f)\n", best_fitness);
return 0;
}
```