PyGAD遗传算法库进阶指南:多目标优化与基因空间控制
多目标优化实现
PyGAD遗传算法库从3.2.0版本开始支持基于NSGA-II算法的多目标优化功能。与单目标优化相比,多目标优化的实现差异主要体现在适应度函数的返回值上。
适应度函数设计差异
在单目标优化中,适应度函数返回单个数值:
def fitness_func(ga_instance, solution, solution_idx):
...
return fitness_value
而在多目标优化中,适应度函数需要返回以下任意一种可迭代类型:
- 列表(list)
- 元组(tuple)
- NumPy数组(numpy.ndarray)
def fitness_func(ga_instance, solution, solution_idx):
...
return [fitness1, fitness2, ..., fitnessN]
推荐使用的父代选择算子
对于多目标优化问题,建议使用以下两种父代选择算子:
nsga2
:基于非支配排序和拥挤距离选择父代tournament_nsga2
:使用锦标赛选择,结合非支配排序和拥挤距离评估解的质量
多目标优化实例
下面是一个优化两个线性函数的多目标问题示例:
import pygad
import numpy
# 定义两个函数的输入和期望输出
function_inputs1 = [4,-2,3.5,5,-11,-4.7] # 函数1输入
function_inputs2 = [-2,0.7,-9,1.4,3,5] # 函数2输入
desired_output1 = 50 # 函数1期望输出
desired_output2 = 30 # 函数2期望输出
def fitness_func(ga_instance, solution, solution_idx):
output1 = numpy.sum(solution*function_inputs1)
output2 = numpy.sum(solution*function_inputs2)
fitness1 = 1.0 / (numpy.abs(output1 - desired_output1) + 0.000001)
fitness2 = 1.0 / (numpy.abs(output2 - desired_output2) + 0.000001)
return [fitness1, fitness2]
# 遗传算法参数配置
ga_instance = pygad.GA(
num_generations=100,
num_parents_mating=10,
sol_per_pop=20,
num_genes=len(function_inputs1),
fitness_func=fitness_func,
parent_selection_type='nsga2'
)
ga_instance.run()
基因空间控制
PyGAD提供了gene_space
参数来精确控制每个基因的取值范围,这在2.11.0版本后得到了增强。
基本用法
- 为每个基因指定离散值集合:
gene_space = [[0.4, 12, -5, 21.2], # 基因1可选值
[-2, 0.3], # 基因2可选值
[1.2, 63.2, 7.4]] # 基因3可选值
- 所有基因共享同一组离散值:
gene_space = [33, 7, 0.5, 95, 6.3, 0.74]
- 使用range指定离散范围:
gene_space = [range(5), range(10, 20)] # 基因1:0-4, 基因2:10-19
连续值范围控制
从2.11.0版本开始,gene_space
支持通过字典指定连续值范围:
gene_space = {'low': 1, 'high': 5} # 基因值在[1,5)区间内
也可以添加步长参数,此时变为离散值选择:
gene_space = {'low': 1, 'high': 5, 'step': 0.5}
None值的特殊含义
将基因空间设为None表示:
- 初始化时:从
init_range_low
和init_range_high
定义的范围内随机生成 - 变异时:从
random_mutation_min_val
和random_mutation_max_val
定义的范围内随机生成
gene_space = [range(5), None, numpy.linspace(10, 20, 300)]
算法控制机制
任意代数停止
从2.4.0版本开始,可以通过在on_generation
回调函数中返回"stop"字符串来提前终止算法:
def func_generation(ga_instance):
if ga_instance.best_solution()[1] >= 70:
return "stop"
停止条件设置
2.15.0版本引入了stop_criteria
参数,支持两种停止条件:
- 达到目标值:
"reach_40"
表示适应度≥40时停止 - 适应度饱和:
"saturate_7"
表示适应度连续7代无变化时停止
ga_instance = pygad.GA(
...,
stop_criteria=["reach_127.4", "saturate_15"]
)
总结
PyGAD库提供了强大的多目标优化能力和精细的基因空间控制功能,使得遗传算法的应用更加灵活和精确。通过合理设置基因空间和停止条件,可以显著提高算法的效率和优化效果。这些进阶功能为复杂优化问题的解决提供了有力工具。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考