如何使用PyGAD实现遗传算法求解双变量函数最大值
PyGAD双变量目标函数最大值优化实现
PyGAD的种群个体本质是和待优化参数一一对应的向量,你需要优化x、y两个变量,只需要把单个体的基因长度设为2,第一个基因位映射x取值,第二个基因位映射y取值,直接代入目标函数计算的结果就可以作为适应度值——因为PyGAD默认筛选适应度最高的个体,刚好匹配求目标函数最大值的需求,不需要额外做适应度翻转。
核心配置要点
- 基因范围配置:通过
gene_space参数指定每个变量的取值区间,x和y范围都是[-4,4],直接传入两个相同的区间约束即可,PyGAD会自动保证所有个体的基因值不会超出范围,不需要额外写边界惩罚逻辑 - 适应度函数写法:PyGAD要求适应度函数固定接收3个入参:GA实例对象、当前个体的基因向量、当前个体在种群中的索引,只需要从基因向量里拆出x、y值代入公式计算返回即可
- 算子选择:连续值优化场景用随机交叉、随机变异算子即可,不需要额外改造适配
完整可运行代码示例
import pygad # 定义适应度函数 def fitness_func(ga_instance, solution, solution_idx): x = solution[0] y = solution[1] # 代入目标公式计算Z值 Z = (3 * (x**2 - y)**2 + (100 - x)**2) + (y - x) return Z # 初始化遗传算法实例 ga_instance = pygad.GA( num_generations=150, num_parents_mating=6, fitness_func=fitness_func, sol_per_pop=80, num_genes=2, # 对应x、y两个待优化变量 gene_space=[[-4, 4], [-4, 4]], # 两个变量的取值范围 mutation_type="random", mutation_percent_genes=30, random_seed=42 # 固定随机种子方便复现结果 ) # 启动迭代优化 ga_instance.run() # 输出最优结果 best_sol, best_fitness, best_idx = ga_instance.best_solution() print(f"最优x取值:{best_sol[0]:.4f}") print(f"最优y取值:{best_sol[1]:.4f}") print(f"目标函数最大值:{best_fitness:.4f}")
结果验证
你给定的目标函数在[-4,4]区间内的极值点出现在边界x=-4、y=-4处,代入公式计算可得理论最大值为12016,上述代码运行后得到的结果会和这个理论值基本一致,误差来自浮点数精度和迭代收敛程度,调高迭代代数、种群规模可以进一步缩小误差。
内容的提问来源于stack exchange,提问作者Thorsen
相关产品推荐
相关产品推荐

