You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用PyGAD对适应度值进行缩放?

可以用PyGAD的on_fitness方法实现Sigma Scaling等适应度缩放吗?

完全可以。PyGAD的on_fitness方法正是为这类需求设计的——它会在所有个体的原始适应度计算完成后、选择操作执行前被调用,刚好是适应度缩放介入的关键节点,能用来实现Sigma Scaling、线性缩放等策略,从而缓解遗传算法过早收敛到局部最优的问题。

具体实现思路

在on_fitness回调中,你可以基于原始适应度值计算缩放后的结果,直接替换PyGAD实例的population_fitness属性,后续的选择、交叉、变异操作都会使用缩放后的适应度来评估个体优先级。

Sigma Scaling代码示例

以下是一个完整的PyGAD集成Sigma Scaling的示例:

import pygad
import numpy as np

# 原始适应度函数(示例:求二进制数组的元素和最大值)
def original_fitness(solution, solution_idx):
    return np.sum(solution)

# 实现Sigma Scaling的on_fitness回调
def sigma_scaling_callback(ga_instance, raw_fitness):
    # 计算原始适应度的均值与标准差
    mean_fit = np.mean(raw_fitness)
    std_fit = np.std(raw_fitness)
    
    # Sigma Scaling核心公式:避免负适应度,将适应度向均值-标准差的位置偏移
    scaled_fit = np.maximum(0, raw_fitness - (mean_fit - std_fit))
    
    # 替换为缩放后的适应度,供后续选择操作使用
    ga_instance.population_fitness = scaled_fit

# 初始化遗传算法实例
ga = pygad.GA(
    num_generations=60,
    num_parents_mating=5,
    fitness_func=original_fitness,
    on_fitness=sigma_scaling_callback,  # 绑定缩放回调
    sol_per_pop=15,
    num_genes=8,
    gene_type=int,
    gene_space=[0, 1]
)

# 运行算法
ga.run()

# 查看结果
print("最优解适应度:", ga.best_solution()[1])

关键注意事项

  • 必须直接修改ga_instance.population_fitness,这是PyGAD后续流程读取适应度的核心属性。
  • 除了Sigma Scaling,你也可以在该回调中实现其他缩放策略(如线性缩放、幂次缩放),只需替换缩放逻辑即可。
  • 验证效果时,可对比开启/关闭缩放后的收敛曲线,观察是否减少了过早收敛的情况。

内容的提问来源于stack exchange,提问作者yna ponte

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 08:42:37