遗传算法求解函数最大值示例代码(C语言)
以下是一个简单的遗传算法示例代码,使用 C 语言实现,用于求解函数 f(x)=x^2 在区间 [0, 10] 上的最大值。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#define POP_SIZE 100
#define MAX_GENERATIONS 1000
#define TOURNAMENT_SIZE 5
#define MUTATION_RATE 0.01
double f(double x) {
return x * x;
}
typedef struct {
double x;
double fitness;
} Individual;
typedef struct {
Individual population[POP_SIZE];
double total_fitness;
} Population;
double random_double(double min, double max) {
return ((double) rand() / RAND_MAX) * (max - min) + min;
}
void initialize_population(Population *pop) {
int i;
for (i = 0; i < POP_SIZE; i++) {
pop->population[i].x = random_double(0, 10);
pop->population[i].fitness = f(pop->population[i].x);
pop->total_fitness += pop->population[i].fitness;
}
}
Individual tournament_selection(Population *pop) {
int i, idx, best_idx;
double best_fitness = -1;
for (i = 0; i < TOURNAMENT_SIZE; i++) {
idx = rand() % POP_SIZE;
if (pop->population[idx].fitness > best_fitness) {
best_fitness = pop->population[idx].fitness;
best_idx = idx;
}
}
return pop->population[best_idx];
}
void mutate(Individual *ind) {
if (rand() / (double) RAND_MAX < MUTATION_RATE) {
ind->x = random_double(0, 10);
ind->fitness = f(ind->x);
}
}
Individual crossover(Individual parent1, Individual parent2) {
Individual child;
double alpha = random_double(0, 1);
child.x = alpha * parent1.x + (1 - alpha) * parent2.x;
child.fitness = f(child.x);
return child;
}
void evolve_population(Population *pop) {
Population new_pop;
int i, j;
for (i = 0; i < POP_SIZE; i++) {
Individual parent1 = tournament_selection(pop);
Individual parent2 = tournament_selection(pop);
Individual child = crossover(parent1, parent2);
mutate(&child);
new_pop.population[i] = child;
new_pop.total_fitness += child.fitness;
}
*pop = new_pop;
}
Individual find_best_individual(Population *pop) {
int i, best_idx;
double best_fitness = -1;
for (i = 0; i < POP_SIZE; i++) {
if (pop->population[i].fitness > best_fitness) {
best_fitness = pop->population[i].fitness;
best_idx = i;
}
}
return pop->population[best_idx];
}
int main() {
srand(time(NULL));
Population pop;
pop.total_fitness = 0;
initialize_population(&pop);
int generation;
for (generation = 0; generation < MAX_GENERATIONS; generation++) {
evolve_population(&pop);
Individual best_individual = find_best_individual(&pop);
printf("Generation %d: x=%f, fitness=%f\n", generation, best_individual.x, best_individual.fitness);
}
return 0;
}
代码包含以下几个部分:
- 函数定义:定义目标函数
f(x),在本例中为f(x) = x^2。 - 结构体定义:定义个体结构体
Individual,包含x和fitness属性,分别代表个体对应的 x 值和适应度值。定义种群结构体Population,包含population和total_fitness属性,分别代表种群中的所有个体和种群的总适应度。 - 随机数生成函数:定义
random_double函数,用于生成指定范围内的随机数。 - 种群初始化:定义
initialize_population函数,用于初始化种群,为每个个体随机生成 x 值,并计算其适应度值。 - 锦标赛选择:定义
tournament_selection函数,用于从种群中进行锦标赛选择,返回适应度最高的个体。 - 变异操作:定义
mutate函数,用于对个体进行变异操作,以一定概率随机修改个体的 x 值。 - 交叉操作:定义
crossover函数,用于对两个父代个体进行交叉操作,生成一个新的子代个体。 - 进化种群:定义
evolve_population函数,用于进化种群,包含选择、交叉、变异等操作,并更新种群中的所有个体。 - 寻找最优个体:定义
find_best_individual函数,用于在种群中寻找适应度最高的个体。 - 主函数:
main函数用于调用上述函数,进行遗传算法的整个流程,并输出每一代的最优解。
该示例代码实现了遗传算法的基本框架,可以用于求解各种函数的最大值或最小值。您可以根据自己的需求修改目标函数、参数设置、选择策略、交叉策略、变异策略等,以适应不同的问题。
原文地址: https://www.cveoy.top/t/topic/n2ds 著作权归作者所有。请勿转载和采集!