# C++ 遗传算法 ( C++ Genetic Algorithm ) **Repository Path**: az13js/cpp-genetic-algorithm ## Basic Information - **Project Name**: C++ 遗传算法 ( C++ Genetic Algorithm ) - **Description**: 使用遗传算法求解 De jong 函数 f2,源码方法和属性有中文注释,命名和文件组织方式统一,使用面向对象实现,封装和调用上基本遵循遗传算法的逻辑 - **Primary Language**: C++ - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 25 - **Forks**: 4 - **Created**: 2020-11-08 - **Last Updated**: 2025-05-06 ## Categories & Tags **Categories**: mathlibs **Tags**: None ## README # C++ Genetic Algorithm 这是使用 C++ 实现的遗传算法,遗传算法针对不同问题实现起来细节可能不一样,这里罗列一下当前的实现方式具有的特性: - 通过锦标赛算法选择个体 - 通过从上一代中剔除低适应度个体的方式去除劣质解 - 个体由一条染色体组成,所以程序不区分个体和染色体两个概念 - 通过实数编码组成染色体,求解 De jong 函数 f2 在 -2.048 到 2.048 范围内的最小值 - 通过两条染色体相同位置基因求和再平均进行染色体交叉 - 通过高斯分布的随机数对基因进行变异操作 - 适应度取 1 / (0.01 + f2) - 算法的参数可以通过修改`main.cpp`中`run`方法的输入参数来改变 另外,程序通过面向对象方式实现且类名称和文件名存在严格的对应关系,命名都采用驼峰命名法,以及虽然不多但是每个方法和成员属性都有中文注释。 ## 环境需求 - `Cmake` 推荐使用版本3.10以上的,否则参考`CMakeLists.txt`中的注释修改版本。 - `GCC` 推荐使用支持 C++ 17 的 GCC 编译器,否则参考`CMakeLists.txt`中的注释修改 C++ 的版本需求。程序的源码没有使用更高级的语言特性,但是至少需要 C++ 11 才能运行起来。 *注:仓库代码在 GNU Linux 环境下能使用, C++ 源码编写时没有用到标准库以外的 API ,因此源码是支持跨平台使用的。理论上 Cmake 配置可以在 Windows 和苹果电脑上使用,但是我没有试过。* ## 使用 我只在`GNU Linux`操作系统上使用,如果需要在别的系统上使用需要自己想办法…… 这是使用`Cmake`工具管理的 C++ 项目,所以按照正常使用`CMake`的方法构建就行,下面是构建示例: $ cmake -S src -B build $ cmake --build build 然后在`build`目录下会产生一堆文件,包括可执行程序`GeneticAlgorithm.out`。执行程序: $ ./GeneticAlgorithm.out 代数=0, 最大适应度=21.2265, 个体信息=Fitness=21.2265,v1=1.16928,v2=1.35803 代数=1, 最大适应度=21.2265, 个体信息=Fitness=21.2265,v1=1.16928,v2=1.35803 代数=2, 最大适应度=34.1127, 个体信息=Fitness=34.1127,v1=0.881568,v2=0.784435 代数=3, 最大适应度=75.6878, 个体信息=Fitness=75.6878,v1=0.943324,v2=0.88987 代数=4, 最大适应度=98.7995, 个体信息=Fitness=98.7995,v1=1.01102,v2=1.02211 结束。 ## 修改源码 如果需要针对别的问题调整算法,那么需要修改源码。这里假设你知道遗传算法的原理且能使用 C++ ,那么根据需要你可能会修改下面列举的文件: - `main.cpp` 程序入口在这里,算法参数也在这里 - `MainProcess.cpp`和`MainProcess.h` 算法整体的执行流程在这里控制 - `PopulationFactory.cpp`和`PopulationFactory.h` 需要创建种群对象时优先采用这里定义和实现的工厂类,调整种群创建方式或添加不同创建方式的话也优先考虑将逻辑放在这里面 - `Population.cpp`和`Population.h` 种群类,与种群实例互动、通信的方法在这里面 - `ChromosomeFactory.cpp`和`ChromosomeFactory.h` 染色体创建的工厂类,包含创建染色体的不同方式 - `Chromosome.cpp`和`Chromosome.h` 染色体类(一个染色体就是种群里的一个个体),实现方式不区分染色体和个体,如果需要区分染色体和个体那么得单独拆分出个体类,如果不需要区分的话,染色体和个体的对外互动、通信的方法都在这里面 另外,`GlobalCppRandomEngine.cpp`和`GlobalCppRandomEngine.h`目前只是在全局提供随机数引擎。