遗传算法C代码示例并且解释代码逻辑
时间: 2023-05-19 08:05:11 浏览: 74
以下是一个简单的遗传算法C代码示例,它用于解决一个简单的优化问题:
```
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define POP_SIZE 100
#define CHROMO_SIZE 10
#define MAX_GENERATIONS 1000
#define MUTATION_RATE 0.01
typedef struct {
int genes[CHROMO_SIZE];
double fitness;
} Chromosome;
Chromosome population[POP_SIZE];
void init_population() {
int i, j;
for (i = 0; i < POP_SIZE; i++) {
for (j = 0; j < CHROMO_SIZE; j++) {
population[i].genes[j] = rand() % 2;
}
}
}
double evaluate_fitness(Chromosome *chromo) {
int i;
double fitness = 0.0;
for (i = 0; i < CHROMO_SIZE; i++) {
fitness += chromo->genes[i];
}
chromo->fitness = fitness;
return fitness;
}
void mutate(Chromosome *chromo) {
int i;
for (i = 0; i < CHROMO_SIZE; i++) {
if ((double) rand() / RAND_MAX < MUTATION_RATE) {
chromo->genes[i] = 1 - chromo->genes[i];
}
}
}
void crossover(Chromosome *parent1, Chromosome *parent2, Chromosome *child) {
int i, crossover_point;
crossover_point = rand() % CHROMO_SIZE;
for (i = 0; i < crossover_point; i++) {
child->genes[i] = parent1->genes[i];
}
for (i = crossover_point; i < CHROMO_SIZE; i++) {
child->genes[i] = parent2->genes[i];
}
}
void evolve() {
int i, j, k;
Chromosome *parent1, *parent2, child;
for (i = 0; i < MAX_GENERATIONS; i++) {
for (j = 0; j < POP_SIZE; j++) {
evaluate_fitness(&population[j]);
}
for (j = 0; j < POP_SIZE; j++) {
parent1 = &population[rand() % POP_SIZE];
parent2 = &population[rand() % POP_SIZE];
crossover(parent1, parent2, &child);
mutate(&child);
evaluate_fitness(&child);
k = rand() % POP_SIZE;
if (child.fitness > population[k].fitness) {
population[k] = child;
}
}
}
}
int main() {
srand(time(NULL));
init_population();
evolve();
printf("Best solution found:\n");
int i;
for (i = 0; i < CHROMO_SIZE; i++) {
printf("%d ", population[0].genes[i]);
}
printf("\nFitness: %f\n", population[0].fitness);
return 0;
}
```
这个遗传算法的目标是最大化一个二进制字符串的1的数量。每个染色体都是一个长度为10的二进制字符串,每个基因可以是0或1。算法的流程如下:
1. 初始化一个由100个随机生成的染色体组成的种群。
2. 对于每个染色体,计算它的适应度,适应度定义为染色体中1的数量。
3. 重复以下步骤1000次:
1. 随机选择两个父代染色体。
2. 通过交叉和变异生成一个子代染色体。
3. 计算子代染色体的适应度。
4. 随机选择种群中的一个染色体,如果子代染色体的适应度比这个染色体的适应度更好,就用子代染色体替换这个染色体。
4. 输出适应度最高的染色体。
这个遗传算法的核心是交叉和变异操作。交叉操作随机选择两个父代染色体,然后从一个染色体中选择一个交叉点,将这个交叉点之前的基因复制到子代染色体中,将另一个染色体中交叉点之后的基因复制到子代染色体中。变异操作随机选择染色体中的一个基因,将它的值取反。这些操作的目的是增加种群的多样性,从而更有可能找到最优解。
阅读全文