遗传算法简单c语言代码
时间: 2024-09-18 14:10:54 浏览: 35
遗传算法是一种模拟自然选择过程的优化搜索技术,它通常用于解决复杂的问题求解。以下是使用C语言实现一个简单的遗传算法的一个基本框架示例,这里我们以解决“旅行商问题”为例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// 定义城市结构体
typedef struct {
int id;
double x, y; // 坐标
} City;
// 适应度函数(距离最短优先)
double fitness(City* cities, int n, int tour[]) {
double distance = 0;
for(int i=0; i<n; i++) {
int next = (tour[(i+1)%n] + 1) % n; // 防止边界溢出
distance += hypot(cities[tour[i]].x - cities[next].x, cities[tour[i]].y - cities[next].y);
}
return 1 / distance;
}
// 初始化种群
City* initialize_population(int n, int size) {
City* pop = malloc(size * sizeof(City));
for(int i=0; i<size; i++) {
pop[i].id = i;
pop[i].x = rand() % n;
pop[i].y = rand() % n;
}
return pop;
}
// 交叉操作
void crossover(City* parent1, City* parent2, City* offspring) {
int crossover_point = rand() % 20; // 交叉点随机选择
for(int i=0; i<20; i++) {
offspring[i] = parent1[i];
}
for(int i=crossover_point; i<20; i++) {
offspring[i] = parent2[i];
}
}
// 变异操作
void mutate(City* individual) {
int index = rand() % 20;
individual[index].x = rand() % 100; // 假设坐标范围是0到99
individual[index].y = rand() % 100;
}
int main() {
srand(time(NULL)); // 设置随机种子
// 初始化参数
int n_cities = 10; // 城市数量
int population_size = 50; // 种群大小
int generations = 100; // 迭代次数
// 初始化种群
City* pop = initialize_population(n_cities, population_size);
for(int gen=0; gen<generations; gen++) {
double* fitness_scores = malloc(population_size * sizeof(double));
// 计算当前种群的适应度
for(int i=0; i<population_size; i++) {
fitness_scores[i] = fitness(pop, n_cities, pop[i].id);
}
// 排序并选择下一代
for(int i=0; i<population_size; i++) {
int best_idx = i;
for(int j=i+1; j<population_size; j++) {
if(fitness_scores[j] > fitness_scores[best_idx]) {
best_idx = j;
}
}
City temp = pop[i];
pop[i] = pop[best_idx];
pop[best_idx] = temp;
}
// 生成下一代
City* new_pop = malloc(population_size * sizeof(City));
for(int i=0; i<population_size; i++) {
City* parent1 = pop[rand() % population_size];
City* parent2 = pop[rand() % population_size];
crossover(parent1, parent2, &new_pop[i]);
mutate(&new_pop[i]);
}
free(new_pop); // 释放旧一代内存
// 更新种群
free(pop);
pop = initialize_population(n_cities, population_size);
for(int i=0; i<population_size; i++) {
pop[i] = new_pop[i];
}
free(fitness_scores);
}
printf("最优解:\n");
for(int i=0; i<n_cities; i++) {
printf("%d (%f,%f)\n", pop[0].id, pop[0].x, pop[0].y);
}
free(pop);
return 0;
}
```
这个例子非常基础,实际应用中可能需要根据问题的具体需求调整适应度函数、交叉和变异等部分。运行此程序将得到一个近似于旅行商问题解决方案的路线。
阅读全文