用c++写一段遗传算法
时间: 2023-03-19 09:24:11 浏览: 54
好的,下面是一段用C语言编写的遗传算法:
```
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define POP_SIZE 50 // 种群大小
#define CHROM_LEN 10 // 染色体长度
#define MAX_GENERATIONS 1000 // 最大迭代次数
#define MUTATION_RATE 0.1 // 变异概率
// 随机生成一个0到1之间的浮点数
double rand_double() {
return (double) rand() / RAND_MAX;
}
// 计算适应度函数
double fitness(int* chrom) {
int i, sum = 0;
for (i = 0; i < CHROM_LEN; i++) {
sum += chrom[i];
}
return (double) sum / CHROM_LEN;
}
// 交叉操作
void crossover(int* chrom1, int* chrom2) {
int i, point = rand() % CHROM_LEN;
for (i = point; i < CHROM_LEN; i++) {
int tmp = chrom1[i];
chrom1[i] = chrom2[i];
chrom2[i] = tmp;
}
}
// 变异操作
void mutation(int* chrom) {
int point = rand() % CHROM_LEN;
chrom[point] = 1 - chrom[point];
}
// 选择操作
void selection(int** pop, double* fitnesses) {
int i, j;
for (i = 0; i < POP_SIZE; i++) {
// 选择两个个体
int idx1 = rand() % POP_SIZE;
int idx2 = rand() % POP_SIZE;
double f1 = fitnesses[idx1];
double f2 = fitnesses[idx2];
// 选择适应度更高的个体
if (f1 > f2) {
for (j = 0; j < CHROM_LEN; j++) {
pop[i][j] = pop[idx1][j];
}
} else {
for (j = 0; j < CHROM_LEN; j++) {
pop[i][j] = pop[idx2][j];
}
}
}
}
int main() {
srand((unsigned int) time(NULL));
int i, j, generation;
int** pop = (int**) malloc(POP_SIZE * sizeof(int*));
for (i = 0; i < POP_SIZE; i++) {
pop[i] = (int*) malloc(CHROM_LEN * sizeof(int));
for (j = 0; j < CHROM_LEN; j++) {
pop[i][j] = rand() % 2;
}
}
double* fitnesses = (double*) malloc(POP_SIZE * sizeof(double));
for (i = 0; i < POP_SIZE; i++) {
fitnesses[i] = fitness(pop[i]);
}
for (generation = 0; generation < MAX_GENERATIONS; generation++) {
// 选择操作
selection(pop, fitnesses);
// 交叉操作
for (i = 0; i < POP_SIZE; i += 2) {
if (rand_double() < 0.8) {
crossover(pop[i], pop[i+1]);
}
}
// 变异操作
for (i = 0; i < POP_SIZE; i++) {
if (rand_double() < MUTATION_RATE
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)