【遗传算法c语言代码】遗传算法(Genetic Algorithm, GA)是一种基于自然选择和生物进化机制的优化算法,广泛应用于解决复杂问题,如函数优化、路径规划、机器学习等。本文将对遗传算法的基本原理进行简要总结,并提供一个简单的C语言实现示例。
一、遗传算法概述
模块 | 内容 |
定义 | 遗传算法是一种模拟生物进化过程的随机搜索算法,通过选择、交叉、变异等操作逐步优化解集。 |
核心思想 | 基于“适者生存”原则,通过模仿自然界中生物进化的机制来寻找最优解。 |
主要步骤 | 初始化种群 → 计算适应度 → 选择 → 交叉 → 变异 → 迭代直到满足终止条件 |
二、遗传算法流程图
```
开始
↓
初始化种群
↓
计算适应度
↓
选择个体
↓
交叉操作
↓
变异操作
↓
更新种群
↓
是否满足终止条件?
↓
是 → 输出结果
↓
否 → 返回计算适应度
↓
结束
```
三、C语言实现简介
以下是一个简单的遗传算法实现框架,用于求解单变量函数的最小值问题(例如:`f(x) = x^2`)。
1. 定义参数
```c
define POP_SIZE 50// 种群大小
define CHROM_SIZE 16// 染色体长度(表示二进制数)
define MAX_GEN 100// 最大迭代次数
define MUT_RATE 0.01// 突变率
```
2. 定义染色体结构
```c
typedef struct {
int gene[CHROM_SIZE]; // 染色体基因
double fitness; // 适应度值
} Individual;
```
3. 初始化种群
```c
void init_population(Individual pop[POP_SIZE]) {
for (int i = 0; i < POP_SIZE; i++) {
for (int j = 0; j < CHROM_SIZE; j++) {
pop[i].gene[j] = rand() % 2;
}
}
}
```
4. 计算适应度
```c
double calculate_fitness(Individual ind) {
int decimal = binary_to_decimal(ind.gene, CHROM_SIZE);
return (double)(decimal decimal); // 示例函数 f(x)=x²
}
```
5. 选择操作(轮盘赌选择)
```c
Individual select_parent(Individual pop[POP_SIZE], double total_fit) {
double r = (double)rand() / RAND_MAX total_fit;
for (int i = 0; i < POP_SIZE; i++) {
r -= pop[i].fitness;
if (r <= 0) return pop[i];
}
return pop[0]; // 默认返回第一个
}
```
6. 交叉操作
```c
void crossover(Individual parent1, Individual parent2, Individual child1, Individual child2) {
int point = rand() % CHROM_SIZE;
for (int i = 0; i < point; i++) {
child1.gene[i] = parent1.gene[i];
child2.gene[i] = parent2.gene[i];
}
for (int i = point; i < CHROM_SIZE; i++) {
child1.gene[i] = parent2.gene[i];
child2.gene[i] = parent1.gene[i];
}
}
```
7. 变异操作
```c
void mutate(Individual ind) {
for (int i = 0; i < CHROM_SIZE; i++) {
if ((double)rand() / RAND_MAX < MUT_RATE) {
ind->gene[i] ^= 1; // 异或操作,翻转0/1
}
}
}
```
8. 主函数逻辑
```c
int main() {
Individual population[POP_SIZE];
init_population(population);
for (int gen = 0; gen < MAX_GEN; gen++) {
// 计算适应度
double total_fit = 0;
for (int i = 0; i < POP_SIZE; i++) {
population[i].fitness = calculate_fitness(population[i]);
total_fit += population[i].fitness;
}
// 生成下一代
Individual new_pop[POP_SIZE];
for (int i = 0; i < POP_SIZE; i += 2) {
Individual p1 = select_parent(population, total_fit);
Individual p2 = select_parent(population, total_fit);
crossover(p1, p2, &new_pop[i], &new_pop[i + 1]);
mutate(&new_pop[i]);
mutate(&new_pop[i + 1]);
}
// 替换种群
for (int i = 0; i < POP_SIZE; i++) {
population[i] = new_pop[i];
}
}
// 找到最优解
double best_fit = INFINITY;
Individual best_ind;
for (int i = 0; i < POP_SIZE; i++) {
if (population[i].fitness < best_fit) {
best_fit = population[i].fitness;
best_ind = population[i];
}
}
printf("最佳解: %.2f\n", binary_to_decimal(best_ind.gene, CHROM_SIZE));
return 0;
}
```
四、总结
遗传算法是一种强大的优化工具,尤其适用于非线性、多峰函数的优化问题。其核心在于模拟生物进化过程,通过不断迭代改进种群中的个体,最终找到接近最优的解。
在C语言中实现遗传算法虽然需要较多的代码量,但可以通过模块化设计提高可读性和可维护性。对于更复杂的应用,还可以结合多种选择策略、交叉方式以及自适应变异率等方法进一步提升性能。
关键词:遗传算法、C语言、优化算法、编程实现、进化计算