2 Star 18 Fork 5

庵中十三居士 / C++ 遗传算法 ( C++ Genetic Algorithm )

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MIT

C++ Genetic Algorithm

这是使用 C++ 实现的遗传算法,遗传算法针对不同问题实现起来细节可能不一样,这里罗列一下当前的实现方式具有的特性:

  • 通过锦标赛算法选择个体
  • 通过从上一代中剔除低适应度个体的方式去除劣质解
  • 个体由一条染色体组成,所以程序不区分个体和染色体两个概念
  • 通过实数编码组成染色体,求解 De jong 函数 f2 在 -2.048 到 2.048 范围内的最小值
  • 通过两条染色体相同位置基因求和再平均进行染色体交叉
  • 通过高斯分布的随机数对基因进行变异操作
  • 适应度取 1 / (0.01 + f2)
  • 算法的参数可以通过修改main.cpprun方法的输入参数来改变

另外,程序通过面向对象方式实现且类名称和文件名存在严格的对应关系,命名都采用驼峰命名法,以及虽然不多但是每个方法和成员属性都有中文注释。

环境需求

  • 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.cppMainProcess.h 算法整体的执行流程在这里控制
  • PopulationFactory.cppPopulationFactory.h 需要创建种群对象时优先采用这里定义和实现的工厂类,调整种群创建方式或添加不同创建方式的话也优先考虑将逻辑放在这里面
  • Population.cppPopulation.h 种群类,与种群实例互动、通信的方法在这里面
  • ChromosomeFactory.cppChromosomeFactory.h 染色体创建的工厂类,包含创建染色体的不同方式
  • Chromosome.cppChromosome.h 染色体类(一个染色体就是种群里的一个个体),实现方式不区分染色体和个体,如果需要区分染色体和个体那么得单独拆分出个体类,如果不需要区分的话,染色体和个体的对外互动、通信的方法都在这里面

另外,GlobalCppRandomEngine.cppGlobalCppRandomEngine.h目前只是在全局提供随机数引擎。

MIT License Copyright (c) 2020 庵中十三居士(az13js) <1654602334@qq.com> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

简介

使用遗传算法求解 De jong 函数 f2,源码方法和属性有中文注释,命名和文件组织方式统一,使用面向对象实现,封装和调用上基本遵循遗传算法的逻辑 展开 收起
C++ 等 2 种语言
MIT
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
C++
1
https://gitee.com/az13js/cpp-genetic-algorithm.git
git@gitee.com:az13js/cpp-genetic-algorithm.git
az13js
cpp-genetic-algorithm
C++ 遗传算法 ( C++ Genetic Algorithm )
master

搜索帮助