常见算法思想——遗传算法

常见算法思想——遗传算法

简单介绍

遗传算法(Genetic Algorithm)是一种基于模拟生物进化过程的优化算法。它模拟了生物进化的过程中的选择、交叉和变异等操作,通过不断地迭代演化来搜索问题的最优解。遗传算法通常适用于优化问题,尤其是在搜索空间较大、连续或离散性较高的问题中具有较好的效果。

应用示例

下面是一个用C++语言实现的遗传算法的示例,演示了如何使用遗传算法来解决简单的最大化函数的优化问题。

#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>

const int POPULATION_SIZE = 50;       // 种群大小
const int CHROMOSOME_LENGTH = 10;     // 染色体长度
const int MAX_GENERATIONS = 100;      // 最大迭代次数
const double CROSSOVER_RATE = 0.8;    // 交叉概率
const double MUTATION_RATE = 0.1;     // 变异概率

// 表示一个个体(染色体)
struct Individual {
    
    
    std::vector<int> genes;
    double fitness;

    Individual() {
    
    
        genes.resize(CHROMOSOME_LENGTH, 0);
        fitness = 0.0;
    }
};

// 初始化种群
void initializePopulation(std::vector<Individual>& population) {
    
    
    for (int i = 0; i < POPULATION_SIZE; ++i) {
    
    
        for (int j = 0; j < CHROMOSOME_LENGTH; ++j) {
    
    
            population[i].genes[j] = rand() % 2;  // 随机生成0或1
        }
    }
}

// 计算个体的适应度
double calculateFitness(const Individual& individual) {
    
    
    // 这里以一个简单的函数作为示例,目标是最大化函数 f(x) = x^2
    int x = 0;
    for (int i = 0; i < CHROMOSOME_LENGTH; ++i) {
    
    
        x = (x << 1) | individual.genes[i];
    }
    return x * x;
}

// 选择操作
void selection(std::vector<Individual>& population) {
    
    
    std::vector<Individual> newPopulation(POPULATION_SIZE);

    // 轮盘赌选择
    double totalFitness = 0.0;
    for (const Individual& individual : population) {
    
    
        totalFitness += individual.fitness;
    }

    for (int i = 0; i < POPULATION_SIZE; ++i) {
    
    
        double r = static_cast<double>(rand()) / RAND_MAX * totalFitness;
        double sum = 0.0;
        for (const Individual& individual : population) {
    
    
            sum += individual.fitness;
            if (sum >= r) {
    
    
                newPopulation[i] = individual;
                break;
            }
        }
    }

    population = newPopulation;
}

// 交叉操作
void crossover(std::vector<Individual>& population) {
    
    
    for (int i = 0; i < POPULATION_SIZE - 1; i += 2) {
    
    
        if (static_cast<double>(rand()) / RAND_MAX < CROSSOVER_RATE) {
    
    
            int point = rand() % (CHROMOSOME_LENGTH - 1) + 1;
            for (int j = point; j < CHROMOSOME_LENGTH; ++j) {
    
    
                std::swap(population[i].genes[j], population[i + 1].genes[j]);
            }
        }
    }
}

// 变异操作
void mutation(std::vector<Individual>& population) {
    
    
    for (int i = 0; i < POPULATION_SIZE; ++i) {
    
    
        for (int j = 0; j < CHROMOSOME_LENGTH; ++j) {
    
    
            if (static_cast<double>(rand()) / RAND_MAX < MUTATION_RATE) {
    
    
                population[i].genes[j] = 1 - population[i].genes[j];
            }
        }
    }
}

// 打印种群中最优个体的适应度
void printBestFitness(const std::vector<Individual>& population) {
    
    
    double bestFitness = population[0].fitness;
    for (int i = 1; i < POPULATION_SIZE; ++i) {
    
    
        if (population[i].fitness > bestFitness) {
    
    
            bestFitness = population[i].fitness;
        }
    }
    std::cout << "Best Fitness: " << bestFitness << std::endl;
}

int main() {
    
    
    srand(static_cast<unsigned int>(time(nullptr)));

    std::vector<Individual> population(POPULATION_SIZE);

    initializePopulation(population);

    for (int generation = 0; generation < MAX_GENERATIONS; ++generation) {
    
    
        for (int i = 0; i < POPULATION_SIZE; ++i) {
    
    
            population[i].fitness = calculateFitness(population[i]);
        }

        printBestFitness(population);

        selection(population);
        crossover(population);
        mutation(population);
    }

    return 0;
}

该示例使用遗传算法优化了一个简单的函数,其中 x 是一个二进制数(长度为10位)。 f ( x ) = x 2 f(x) = x^2 f(x)=x2

文章小结

遗传算法的主要步骤包括初始化种群、计算适应度、选择、交叉和变异。程序迭代执行这些步骤,并输出每一代中最优个体的适应度。实际应用中可能需要根据具体问题进行适当的调整和改进。

Guess you like

Origin blog.csdn.net/qq_45902301/article/details/131668954