以下是一个简单的遗传算法示例代码,使用 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;
}

代码包含以下几个部分:

  1. 函数定义:定义目标函数 f(x),在本例中为 f(x) = x^2
  2. 结构体定义:定义个体结构体 Individual,包含 xfitness 属性,分别代表个体对应的 x 值和适应度值。定义种群结构体 Population,包含 populationtotal_fitness 属性,分别代表种群中的所有个体和种群的总适应度。
  3. 随机数生成函数:定义 random_double 函数,用于生成指定范围内的随机数。
  4. 种群初始化:定义 initialize_population 函数,用于初始化种群,为每个个体随机生成 x 值,并计算其适应度值。
  5. 锦标赛选择:定义 tournament_selection 函数,用于从种群中进行锦标赛选择,返回适应度最高的个体。
  6. 变异操作:定义 mutate 函数,用于对个体进行变异操作,以一定概率随机修改个体的 x 值。
  7. 交叉操作:定义 crossover 函数,用于对两个父代个体进行交叉操作,生成一个新的子代个体。
  8. 进化种群:定义 evolve_population 函数,用于进化种群,包含选择、交叉、变异等操作,并更新种群中的所有个体。
  9. 寻找最优个体:定义 find_best_individual 函数,用于在种群中寻找适应度最高的个体。
  10. 主函数main 函数用于调用上述函数,进行遗传算法的整个流程,并输出每一代的最优解。

该示例代码实现了遗传算法的基本框架,可以用于求解各种函数的最大值或最小值。您可以根据自己的需求修改目标函数、参数设置、选择策略、交叉策略、变异策略等,以适应不同的问题。

遗传算法求解函数最大值示例代码(C语言)

原文地址: https://www.cveoy.top/t/topic/n2ds 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录