1.无法导入Geatpy2

解决办法:检查本机安装的Geatpy版本,用强制版本号的方法安装最新版Geatpy,比如:
pip install geatpy==2.5.1

2.无法进行绘图,抛出matplotlib中的一些异常

解决办法:找到python所在的路径,找到Lib文件夹下的site-packages文件夹,把matplotlib相关的文件夹及文件彻底删除。如果是Windows用户,有时候matplotlib会被安装在系统盘/用户/[用户名]/AppData/Roaming/Python的文件夹下,在里面找到matplotlib的文件夹及相关文件,彻底删除。然后控制台重新定位到python所在的路径下的Scripts文件夹,执行pip install matplotlib进行安装。

3.染色体经过recsbx等重组算子后,得到的新染色体的元素有时会超出所设的边界范围。

解决办法:这里就体现了传统意义的重组和值互换的重组(称之为交叉)的区别。“交叉”是纯粹地交换父代交配个体的染色体片段,而传统意义的重组会带有一定的“变异”的特性,它往往会得到与父代染色体不一样的值,因此它有可能会超出所设边界的范围。在Geatpy中并不会对重组的结果进行越界检查以及修复。而在变异中则会进行越界检查和修复。因此如果想让重组结果全部落在边界范围内,则需要额外调用“boundfix”算子进行边界修复(详见help(ea.boundfix))。如果您在重组算子之后使用了变异算子,那么可以不使用“boundfix”。

4.什么是决策变量的“上下界”和“上下边界”?

答:Geatpy在定义问题类时,决策变量需要“上下界”和“上下边界”,其中“上下界”是俗称的决策变量的最大值和最小值;“上下边界”是俗称的决策变量范围的“开闭区间”。例如如果上边界设为1,表示变量区间范围是“右闭”的,如果上边界设为0,表示变量区间范围是“右开”的。

5.如何进行并行计算?

答:Geatpy中的并行分为并行计算目标函数和并行执行内核函数两种:
(1)对于自定义问题类中的目标函数aimFunc(),如果这一部分的计算非常耗时,那么可以使用PYthon的一些并行/并发库或者一些知名的分布式框架来进行分布式计算。相关案例详见:
https://github.com/geatpy-dev/geatpy/tree/master/geatpy/demo/soea_demo/soea_demo6
https://github.com/geatpy-dev/geatpy/tree/master/geatpy/demo/soea_demo/soea_demo7
(2)对于并行执行内核函数,假如所要调用的内核函数支持并行计算(如mutpolyn等),那么在调用时设置输入参数Parallel为True即可。

6.找不到getBest()函数。

答:getBest()是v2.3.0版本以前的Problem类的成员函数,用于获取全局最优解的目标函数值的函数。v2.3.0开始,把getBest()更名为getReferObjV(),功能不变。

7.变异概率如何设置?

答:v2.3.0开始对Geatpy中的变异概率作了统一的规范,变异概率定义为“变异算子所发生作用的最小片段发生变异的概率”,详见文档:http://geatpy.com/index.php/2019/07/28/%E7%AC%AC%E5%85%AD%E7%AB%A0%EF%BC%9A%E5%8F%98%E5%BC%82/

8.每次运行结果差异较大怎么办?

答:说明所采用的进化算法求解问题还没有收敛抑或是算法多次陷入了局部最优解,可以用以下三种方法尝试解决问题:
(1)调整进化算法所调用的重组、变异等算子的参数。
(2)尝试调用不同的进化算法模板进行求解。
(3)查阅与待优化的模型有关的文献,自定义更加适合特定问题的改进型进化算法进行求解。第三种方法尤其适合于超长染色体的进化优化、超高维多目标进化优化、超复杂约束优化、大规模组合优化、多模态问题的求解等。

9.运行结果显示“有效进化代数为0,没找到可行解。”怎么办?

答:首先检查目标函数值是否计算正确,当目标函数值全为nan时,就会导致无法有效地进化。另外如果有较多的等式约束,也可能会导致找不到可行解,此时方法有四:(1)对带约束模型进行进一步简化(利用等式消元),消去等式约束,使之转化为不等式约束。(2)自定义更加适合求解所研究的问题的进化算法模板来求解。(3)调用变异算子的时候设置更高的变异精度。推荐使用差分进化算法以方便调参。(4)在初始化种群染色体的时候采用累积可行解的方式,即反复初始化染色体,把满足约束条件的染色体保留,直到保留下来的染色体数目达到所设值为止。另外值得注意的是目前的进化算法对于求解含等式约束的问题依旧是比较鸡肋的,甚至不及一些传统的数学优化算法,很容易退化为盲目的随机搜索,此时不妨考虑不用进化算法,而改用传统的数学优化算法。
如果决策变量是连续型的实数,那么最好是采用上面的第一种方法。

10.什么时候开源内核?现阶段如何引用geatpy?

答:近年来geatpy工具箱正在朝向一个宏伟的目标而不断演变,因此投稿论文的计划被一再延后了,以至已经出现不少具有相似功能的框架且投稿成功了。即便如此,geatpy工具箱在目前来说依旧是保持领先优势的,其模块化程度、执行速度、易用程度、可扩展性以及让用户二次开发(自定义新的进化算法和算子等)的能力均领先于这些已经发了论文的相似框架。然而由于尚未达成宏伟目标,因此关于整个工具箱的介绍论文仍未投稿。此外,为了在完成宏伟目标和投稿之前能够保障高性能内核的领先优势,geatpy的内核将继续闭源。我们承诺:将会尽快完成既定的宏伟目标,届时将推出一个革命性版本,并且完成论文投稿、全面开源。因此在目前,如果您的论文需要引用geatpy的话,可以这样引用:
@misc{geatpy,
title={geatpy: The genetic and evolutionary algorithm toolbox with high performance in python},
author={Jazzbin, et.al.},
year={2020},
website={http://www.geatpy.com/}
}

11.Geatpy代码的函数、参数命名等不符合Python规范。

答:这个是历史遗留问题,在第一代Geatpy的设计伊始并没有严格遵循Python的命名规范,而是设计了一套工具箱内统一的命名规则,让命名方式向知名的进化算法工具箱先驱者“GEATbx”致敬,采用的是英文短语缩写的形式,使得命名风格尽量接近于“GEATbx”,以便让使用过“GEATbx”的用户可以近乎无障碍地使用Geatpy。例如内核函数“bs2real”、"bs2int"、"mutbga"等。

12.Geatpy发行版什么时候支持GPU计算?

答:近期已经向国际知名期刊投稿与之有关的文章,发行版需要在文章最终录用后才予以支持,届时Geatpy将不需要安装额外的第三方Python工具包便可调度GPU进行计算。

13.Geatpy在某些情况下会出现染色体超出所设边界的情况,尽管已经使用了边界修复函数。

答:在某些情况下,由于编程语言存在浮点数精度问题,会出现染色体超出所设边界一点点的情况。例如设置了下界为0,但染色体的元素却出现-1e-6这样的情况。这个是难以避免的,因为无论是Python还是C/C++,都会存在这样的问题。在一般情况下上述问题带来的影响是几乎没有的,但在少数情况下,例如求开平方:sqrt(x),假如x的下限为0,但在进化过程中出现了-1e-6的负数值,那么就会给结果带来很大的影响。此时的解决办法为把sqrt(x)修改为sqrt(abs(x)),即先取绝对值,然后开平方。

14.在进化过程中打印当前的代数,发现一直是第0代或者是一直卡在某一代。

答:这种情况说明触发了算法模板的“遗忘策略”,详见Algorithm.py的stat()函数。当某一代进化中没有进化出满足约束条件的个体时,“遗忘策略”就会将这一代“遗忘掉”,因此进化代数不会增加。当连续“遗忘”了一定的次数后(达到所设的最大值),进化就会自动终止。如果想不启动“遗忘策略”,可以自定义一个算法模板,把父类的stat()函数给修改覆盖掉即可。

15.传入重组算子的染色体矩阵有什么编码要求?

答:与变异算子不同,大部分重组算子都没有对染色体的编码作特定的限制。也就是说传入重组算子的染色体矩阵满足Geatpy数据结构即可,因此不需要像变异算子那样传入Encoding参数。某些如“部分匹配交叉xovpmx”、“顺序交叉xovox”,它们需要传入的染色体满足排列编码的特征,并在交叉前会对其进行检查,假如不满足排列编码的特征,便会抛出异常提示。

16.计算目标函数的时候受模型限制而无法利用Numpy矩阵同时计算所有个体的目标函数值,怎么办?

答:可以用循环、并行/并发、分布式等方式分别计算每个个体的目标函数值,最后把结果拼接得到一个ObjV(目标函数值矩阵)即可。可参考案例:soea_demo3、soea_demo6、soea_demo7等。在这过程中最关键的步骤是取出种群表现型矩阵Phen的每一行得到每个个体的决策变量。比如Phen是一个10*20的矩阵,根据Geatpy数据结构,这意味着有10个个体,每个个体都有20个决策变量,用Phen[0, :]即可取出第1个个体的决策变量,用Phen[1, :]即可取出第2个个体的决策变量,以此类推。

17.对自定义问题类中的“决策变量维数”的设置存疑。

答:自定义问题类里面所设置的“决策变量维数”Dim表示的是种群染色体矩阵Chrom根据三种基本编码方式:"BG", "RI" 和 "P"解码后得到的种群表现型矩阵Phen的列数。此时如果模型里面采用了间接编码,需要将Phen进一步解码才能得到最终的决策变量,则Dim并不代表最终的决策变量维数,Dim仅仅等于对染色体Chrom只进行一次解码(不含后续可能要做的多次解码)得到的表现型(非最终决策变量)的维数。在后面的版本中会对这个概念进行规范,把问题类的Dim的含义规范为“表现型的维数”。

18. Mac os Python无法import geatpy,提示"image not found"。

答:macos所使用的clang缺失libomp时就会出现该问题。执行brew install libomp即可解决该问题。如果在执行brew install libomp时卡住,可以切换brew的镜像源进行安装。该问题将会在下一个发行版里得到彻底解决,届时不再需要进行上面所说的额外操作便可正常import。

Geatpy2.5.1累积更新

新增“化繁为简”教程文档

新增“辅助参考资料”

Geatpy2交流群

采用自研高性能矩阵库,体验极速的进化之旅!