PyGAD遗传算法库进阶指南:多目标优化与基因空间控制

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]

推荐使用的父代选择算子

对于多目标优化问题,建议使用以下两种父代选择算子:

  1. nsga2:基于非支配排序和拥挤距离选择父代
  2. 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版本后得到了增强。

基本用法

  1. 为每个基因指定离散值集合
gene_space = [[0.4, 12, -5, 21.2],  # 基因1可选值
              [-2, 0.3],            # 基因2可选值
              [1.2, 63.2, 7.4]]     # 基因3可选值
  1. 所有基因共享同一组离散值
gene_space = [33, 7, 0.5, 95, 6.3, 0.74]
  1. 使用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_lowinit_range_high定义的范围内随机生成
  • 变异时:从random_mutation_min_valrandom_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参数,支持两种停止条件:

  1. 达到目标值"reach_40"表示适应度≥40时停止
  2. 适应度饱和"saturate_7"表示适应度连续7代无变化时停止
ga_instance = pygad.GA(
    ...,
    stop_criteria=["reach_127.4", "saturate_15"]
)

总结

PyGAD库提供了强大的多目标优化能力和精细的基因空间控制功能,使得遗传算法的应用更加灵活和精确。通过合理设置基因空间和停止条件,可以显著提高算法的效率和优化效果。这些进阶功能为复杂优化问题的解决提供了有力工具。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诸锬泽Jemima

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值