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

如何在PyGAD中为遗传算法指定各基因的取值范围?

PyGAD中多基因自定义取值范围的解决方法

PyGAD确实没有直接为每个基因单独指定取值范围的参数,你提到的归一化到0-1区间后在适应度函数中硬编码转换是最常用且有效的方案,同时能自然处理约束条件,具体操作如下:

  • 步骤1:初始化种群时统一用0-1范围
    无需额外配置,PyGAD默认生成的浮点型基因值就在0-1区间内;如果是整数基因,也可以先按0-1生成后再转换。

  • 步骤2:在适应度函数中反归一化到实际范围
    对每个基因单独做线性映射,转换为对应变量的实际取值:

    • 车速(0-200km/h):speed = solution[0] * 200
    • 车重(0.5-3tons):weight = 0.5 + solution[1] * (3 - 0.5)
    • 车价(假设范围为10000-100000$):price = 10000 + solution[2] * 90000
  • 步骤3:约束处理
    若转换后的值违反约束(比如突变导致超出范围),直接在适应度函数中给该个体极低的适应度值(比如负的大数),让算法自动淘汰这类无意义解。

代码示例

import pygad

def fitness_func(ga_instance, solution, solution_idx):
    # 反归一化到实际变量范围
    speed = solution[0] * 200  # 映射到0-200 km/h
    weight = 0.5 + solution[1] * 2.5  # 映射到0.5-3 tons
    price = 10000 + solution[2] * 90000  # 映射到10000-100000 $

    # 约束检查与惩罚
    if not (0 <= speed <= 200) or not (0.5 <= weight <= 3):
        return -10000  # 违反约束则返回极低适应度

    # 替换为你的实际适应度计算逻辑
    # 示例:假设优化目标是最大化车速、最小化车重和车价的加权和
    fitness = speed - 0.5 * weight - 0.0001 * price
    return fitness

# 初始化遗传算法实例
ga = pygad.GA(
    num_generations=100,
    num_parents_mating=2,
    fitness_func=fitness_func,
    sol_per_pop=15,
    num_genes=3,
    mutation_type="random",
    mutation_percent_genes=15
)

# 运行算法
ga.run()

# 输出最优解
best_solution, best_fitness, _ = ga.best_solution()
best_speed = best_solution[0] * 200
best_weight = 0.5 + best_solution[1] * 2.5
best_price = 10000 + best_solution[2] * 90000
print(f"最优解:车速={best_speed:.2f}km/h,车重={best_weight:.2f}tons,车价=${best_price:.2f}")

这种方法的优势是灵活适配任意变量范围,同时完全兼容PyGAD的所有内置操作(选择、交叉、突变),不会影响算法的优化逻辑。

内容的提问来源于stack exchange,提问作者Felipe Matilde

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 11:11:08