pygad.GA 类的构造函数的重要参数
PyGAD中可用的第一个模块名为pygad
,它包含一个名为GA的类,用于构造遗传算法。本文将讨论类中的构造函数,方法,函数和属性。
_init_()
为了创建pygad.GA
类的实例,构造函数接受几个参数,允许用户自定义遗传算法到不同类型的程序中。
pygad.GA类构造函数支持以下参数:
num_generations
:种群代数。num_parents_mating
:要选择作为父项的解决方案的数量。fitness_func
:接受一个评估函数,该函数必须接受2个参数(单个解,以及其在总体中的索引)并返回解的评估值。查看Preparing the “fitness_func” Parameter 部分以获取有关创建此类函数的信息。initial_population
:用户定义的初始种群。当用户想要使用自定义初始种群开始世代时,它很有用。当默认为None时意味着用户没有指定初始种群数。在这种情况下,PyGAD使用sol_per_pop
以及num_gens
参数创建初始种群。如果initial_popilation
为None,并且sol_per_pop
和num_genes
两个参数的任一个为也为None时,则会引起异常。sol_per_pop
:种群中的解决方案(如染色体)的数量。当参数initial_population
存在时该参数失效。num_genes
:解决方案中的基因数。当参数initial_population
存在时该参数失效。gene_type=float
:控制基因类型。它可以分配给适用于所有基因的单一数据类型,也可以指定每个基因的数据类型。它默认为float
即表示所有基因为float
数据类型。从PyGAD 2.90开始,gene_type
可以被定义为任一数值类型:int
,float
,以及numpy.int/uint/float(8-64)
。从PyGAD 2.14.0开始,它可定义为list
,tuple
或numpy.ndarray
用以保存每个基因的数据类型(如gene_type=[int,float,numpy.int8
]),这有助于控制每个单独基因的数据类型。在PyGAD 2.15.0中可以指定float
数据类型的精度(如gene_type=[float,2]
)。init_range_low=-4
:选择初始群体中基因值的随机范围的较小值。init_range_low
默认为-4。当’initial_population`参数存在时该参数无效。init_range_high=4
:选择初始群体中基因值的随机范围的较大值。init_range_high
默认为4。当’initial_population`参数存在时该参数无效。parent_selection_type="sss"
:夫选择类型。支持类型有sss
(steady-state selection稳态选择),rws
( roulette wheel selection轮盘赌轮选择),sus
(stochastic universal selection随机普遍选择),rank
(rank selection排名选择),random
(random selection随机选择),以及tournament
(tournament selection锦标赛选择)。keep_parents=-1
:当前种群中保持的父母数量。默认值-1表示将所有父母保持在下一种群中。0意味着没有父母在下一种群中。一个大于0的值表示将指定数量的父母保持在下一代种群中。注意,keep_parents
的值不能小于-1或大于种群中的解决方案数sol_per_pop
。K_tournament=3
:如果父选择类型为锦标赛,则K_tournament
指定参与锦标赛选择的父母数。它默认为3。crossover_type="single_point"
:交叉操作类型。支持类型有single_point
(单点交叉),two_point
(两点交叉),uniform
(均匀交叉),以及scattered
(分散交叉)。其默认值为single_point
。如果crossover_type
=None,则绕过交叉步骤,这意味着不应用交叉,因此不会在下一代中创建后代。下一代将使用当前种群中的解决方案。crossover_probability=None
:选择父项以应用交叉操作的概率。它的值必须介于 0.0 和 1.0 之间(包括 0.0 和 1.0)。对于每个父项,会生成一个介于 0.0 和 1.0 之间的随机值。如果此随机值小于或等于分配给crossover_probability
参数的值,则选择父项。mutation_type="random"
:变异操作的类型。支持类型有random
(随机变异),swap
(交换变异),inversion
(反演变异),scramble
(争夺变异)以及adaptive
(适应性变异)。其默认值为random
。如果mutation_type=None
,即绕过突变步骤,这意味着不应用突变,因此不会对使用交叉操作创建的后代应用任何更改,其后代将在下一代中不变地使用。mutation_probability=None
:选择基因进行变异操作的概率。它的值必须介于 0.0 和 1.0 之间(包括 0.0 和 1.0)。对于解决方案中的每个基因,都会生成一个介于 0.0 和 1.0 之间的随机值。如果此随机值小于或等于分配给mutation_probability
参数的值,则选择该基因。如果这个参数存在,那么就不需要mutation_percent_genes
和mutation_num_genes
这2个参数。mutation_by_replacement=False
:可选的布尔参数。它仅在所选突变类型为随机(mutation_type="random"
)时有效。在该情况下,mutation_by_replacement=True
意味着用随机生成的值替换基因。如果为假,则无效,随机突变通过向基因添加随机值起作用。mutation_percent_genes="default"
:基因突变的百分比。其默认字符串"default"
随后将其转化为整数10,意味着10%的基因将发生突变。它的值必须大于0小于等于100。在这个百分比中,将推导出要突变的基因数量,该数量分配给mutation_num_genes
参数。如果存在mutation_probability
或mutation_num_genes
参数,则mutation_percent_genes
参数将无效。当mutation_type
参数为None时,该参数无效。mutation_num_genes=None
:要突变的基因数,默认为None,表示未指定任何数。如果参数mutation_num_genes
存在,则mutation_num_genes
不起作用。random_mutation_min_val=-1.0
:对于random
变异,random_mutation_min_val
参数指定从中选择随机值添加到基因的范围的起始值。默认值为-1.当mutation_type=None
时,该参数无效。random_mutation_max_val=1.0
:对于random
变异,random_mutation_max_val
参数指定从中选择随机值添加到基因的范围的起始值。默认值为+1.当mutation_type=None
时,该参数无效。gene_space=None
:它用于指定每个基因的可能值,以防用户想要限制基因值。如果基因空间被限制在某个范围内或离散值内,这是有用的。它接受一个list
,tuple
,range
或者numpy.ndarray
。当所有基因具有相同的全局空间时,将其值指定为list
/tuple
/range
/numpy.ndarray
。例如,gene_space=[0.3, 5.2, -4, 8]
.将基因值限制为4个指定值。如果每个基因有其空间,则gene_space
可以嵌套为如[[0.4, -5], [0.5, -3.2, 8.2, -9], ...]
,其中第一个子列表确定第一个基因的值,第二个子列表确定第二个基因的值,依此类推。如果嵌套list/tuple有一个None
值,则从两个参数init_range_low
和init_range_high
指定的范围内随机选择基因的初始值,并从两个参数random_mutation_min_val
和random_mutation_max_val
指定的范围内随机选择其突变值。on_start=None
:在遗传算法开始进化之前只接受调用一次的函数。此函数必须接受表示遗传算法实例的单个参数。on_fitness=None
:接受在计算总体中所有解决方案的适应度值后调用的函数。此函数必须接受2个参数:第一个参数表示遗传算法的实例,第二个参数是所有解的适应值列表。on_parents=None
:在选择交配的双亲后接受要调用的函数。此函数必须接受两个参数:第一个代表遗传算法的实例,第二个代表所选的父代。on_crossover=None
:接受每次应用交叉操作时调用的函数。此函数必须接两个参数:第一个代表遗传算法的实例,第二个代表使用交叉生成的后代。on_mutation=None
:接受每次应用变异操作时调用的函数。此函数必须接受两个参数:第一个代表遗传算法的实例,第二个代表应用变异后的后代。callback_generation=None
:接受在每次生成后调用的函数。此函数必须接受表示遗传算法实例的单个参数。on_generation=None
:接受在每次生成后调用的函数。此函数必须接受表示遗传算法实例的单个参数。如果函数返回字符串stop
,则run()
方法将停止,而不会完成其他代。on_stop=None
:只接受在遗传算法停止之前或完成所有代之前调用一次的函数。此函数必须接受两个参数:第一个参数表示遗传算法的实例,第二个参数是最后一个总体解的适应值列表。delay_after_gen=0.0
:它接受一个非负数,以秒为单位指定一代完成后和进入下一代之前的等待时间。它默认为0.0,这意味着生成后没有延迟。save_best_solutions=False
:如果为True
,则每次生成后的最佳解决方案将保存到名为best_solutions
的属性中。如果为False
(默认),则不保存任何解决方案,并且“best_solutions”属性将为空。save_solutions=False
:如果为True
,则每一代中的所有解决方案都将附加到名为solutions
的属性中,该属性为NumPy数组。suppress_warnings=False
:bool参数,用于控制是否打印警告消息。它默认为False
。allow_duplicate_genes=True
:如果为True
,则溶液/染色体可能具有重复的基因值。如果为False
,则每个基因在其解决方案中都有唯一的值。stop_criteria=None
:阻止进化的一些条件。每个条件都作为str
传递,str
有一个停止字。当前支持的两个字是reach
和saturate
。如果适应度值等于或大于给定的适应度值,reach
将停止run()
方法。reach
的一个例子是"reach_40"
,如果适合度大于等于40,它将停止进化。饱和意味着如果适应度在给定数量的连续世代中饱和,则停止进化。saturate
的一个例子是"saturate_7",这意味着如果连续7代的适应度没有改变,就停止run(
)方法。
用户不必在创建GA类的实例时指定所有这些参数。必须关心的一个非常重要的参数是fitness_func
,它定义了适应度函数。
可以将两个参数init_range_low
和init_range_high
的值设置为相等、高于或低于其他参数(即init_range_low
不需要低于init_range_high
)。random_mutation_min_val
和random_mutation_max_val
参数也是如此。
如果两个参数mutation_type
和crossover_type
均为None
,则会禁用遗传算法可以进行的任何类型的进化。因此,遗传算法无法在初始种群中找到比最优解更好的解。
参数在构造函数中进行验证。如果至少有一个参数不正确,将引发异常。