为何scipy.optimize.differential_evolution不返回最后一代种群及如何保留
保留scipy差分进化最后一代全种群的实现方法
scipy顶层的differential_evolution函数默认只返回最优精英个体,要获取最后一代完整种群信息,最稳定的实现方案是直接调用其底层求解器类,具体操作如下:
实现步骤
- 导入
DifferentialEvolutionSolver底层求解器,该类的入参与顶层differential_evolution函数完全兼容,原有算法配置不需要修改 - 手动初始化求解器并执行迭代,迭代结束后可直接读取求解器内置的种群属性获取全量信息
- 除了最后一代种群,还可同时获取所有个体的适应度值、收敛状态等衍生信息
代码示例
import numpy as np from scipy.optimize import differential_evolution # 示例目标函数,可替换为自定义目标函数 def objective(x): return np.sum(x**2) # 变量边界,格式和`differential_evolution`的bounds参数完全一致 bounds = [(-5, 5), (-5, 5)] # 获取底层求解器类,避免不同版本导入路径不一致的问题 DifferentialEvolutionSolver = differential_evolution.DifferentialEvolutionSolver # 初始化求解器,可传入popsize、mutation、recombination等所有差分进化参数 solver = DifferentialEvolutionSolver( objective, bounds, popsize=15, mutation=0.5, recombination=0.7, maxiter=100 ) # 执行求解 solve_result = solver.solve() # 读取最后一代完整种群,每一行对应一个种群个体 last_generation_population = solver.population # 读取最后一代所有个体对应的适应度值,顺序和种群个体顺序一一对应 last_generation_fitness = solver.population_energies
补充说明
如果需要获取每一代的全种群信息,可遍历求解器的迭代过程,每执行一步迭代就存储一次当前种群即可:
pop_history = [] fitness_history = [] solver = DifferentialEvolutionSolver(objective, bounds, popsize=15, maxiter=100) for step in solver: pop_history.append(solver.population.copy()) fitness_history.append(solver.population_energies.copy()) # 最后一代种群为pop_history[-1]
内容的提问来源于stack exchange,提问作者Appo
相关产品推荐
相关产品推荐

