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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 07:15:06