scipy.optimize differential_evolution 似乎忽略了人口规模限制
scipy.optimize differential_evolution seems to ignore population size limit
我正在使用以下代码进行实验并开始学习如何使用 DE 来优化更复杂的问题。我需要一个可以处理整数的优化器。
from scipy.optimize import differential_evolution
def objfun(x):
print('N')
return x[0]+2*x[1]**-4*x[2]
solution=differential_evolution(objfun,bounds=((1,10000),(1,200000),(1,50000)),popsize=0,maxiter=3,polish=False,disp=True)
设置popsize时出现问题。我得到的人口比预期的要多,如果我将它设置为 0,它会为第一个人口继续提供 10 个元素,然后为其他人口提供 5 个元素,直到达到最大值。
这是我使用上述代码得到的输出示例
runfile('D:/PYTHON/untitled0.py', wdir='D:/PYTHON')
N
N
N
N
N
N
N
N
N
N
differential_evolution step 1: f(x)= 318.074
N
N
N
N
N
differential_evolution step 2: f(x)= 169.667
N
N
N
N
N
differential_evolution step 3: f(x)= 169.667
我真的不明白我做错了什么,至少我预计 popsize=0 会报错。此外,是否还有任何其他隐藏参数来设置必须编辑的初始种群大小?
我还是个初学者,我几周前才开始使用 python,所以非常感谢您提供简单的解释。
非常感谢所有花时间回答我的人。
史蒂夫
问题有几个部分,所以我将有几个部分来回答这个问题。
为什么 popsize=0
不抛出错误?
这是在 differential_evolution
的 scipy 实现中,因为它不会引发错误。您可以看到第一次调用将产生 10 次调用,而第二次和第三次调用只会产生 5 次。这是因为随机种子。
当您调用 differential_evolution
时,有一个参数 seed
决定函数中的 "randomness"。从第一个时间点开始,它可能会非常偏离真实值,它会调用它 10 次,而在 1 步中,函数可以优化到真实值。
如果设置seed且popsize为0:
如果您确实设置了种子,那么您可以重现代码并查看它是否正确。
这里是seed的地方0
(没有优化更多):
>>> soln = differential_evolution(objfun, bounds=((1,10000),(1,200000),(1,50000)),popsize=0,maxiter=3,polish=False,disp=True, seed=0)
differential_evolution step 1: f(x)= 1098.52
differential_evolution step 2: f(x)= 1098.52
differential_evolution step 3: f(x)= 1098.52
popsize > 0 的种子:
第一次迭代调用函数的次数可能比最后一次多,这可能是由于函数的优化方式及其随机性所致。
differential_evolution step 1: f(x)= 183.92
differential_evolution step 2: f(x)= 183.92
differential_evolution step 3: f(x)= 5.81206
如果我们将 popsize 更改为大于 10 的值,我们将更接近最小值。
>>> soln = differential_evolution(objfun, bounds=((1,10000),(1,200000),(1,50000)),popsize=100,maxiter=3,polish=False,disp=True, seed=0)
differential_evolution step 1: f(x)= 10.3284
differential_evolution step 2: f(x)= 8.35376
differential_evolution step 3: f(x)= 2.65333
在differential_evolution
中,人口中的成员总数设置为here。计算方式为:
self.num_population_members = max(5, popsize * self.parameter_count)
这意味着您可以拥有的最小人口数量为 5,最大数量为 popsize * self.parameter_count
。最小数量 5 是因为 best2bin
策略需要至少 5 个人口成员。
人口规模在最小化过程中没有改变。初始化种群后,必须评估初始种群的每个成员(总大小 np
)。在最小化循环的第一次迭代中,还有一个
np
条 objective 条评价。在第一次迭代结束时,打印更新。因此,在打印第一个更新之前,将打印 2 * np
次 N
。每个后续迭代将只有 np
打印 N
.
我正在使用以下代码进行实验并开始学习如何使用 DE 来优化更复杂的问题。我需要一个可以处理整数的优化器。
from scipy.optimize import differential_evolution
def objfun(x):
print('N')
return x[0]+2*x[1]**-4*x[2]
solution=differential_evolution(objfun,bounds=((1,10000),(1,200000),(1,50000)),popsize=0,maxiter=3,polish=False,disp=True)
设置popsize时出现问题。我得到的人口比预期的要多,如果我将它设置为 0,它会为第一个人口继续提供 10 个元素,然后为其他人口提供 5 个元素,直到达到最大值。
这是我使用上述代码得到的输出示例
runfile('D:/PYTHON/untitled0.py', wdir='D:/PYTHON')
N
N
N
N
N
N
N
N
N
N
differential_evolution step 1: f(x)= 318.074
N
N
N
N
N
differential_evolution step 2: f(x)= 169.667
N
N
N
N
N
differential_evolution step 3: f(x)= 169.667
我真的不明白我做错了什么,至少我预计 popsize=0 会报错。此外,是否还有任何其他隐藏参数来设置必须编辑的初始种群大小?
我还是个初学者,我几周前才开始使用 python,所以非常感谢您提供简单的解释。
非常感谢所有花时间回答我的人。
史蒂夫
问题有几个部分,所以我将有几个部分来回答这个问题。
为什么 popsize=0
不抛出错误?
这是在 differential_evolution
的 scipy 实现中,因为它不会引发错误。您可以看到第一次调用将产生 10 次调用,而第二次和第三次调用只会产生 5 次。这是因为随机种子。
当您调用 differential_evolution
时,有一个参数 seed
决定函数中的 "randomness"。从第一个时间点开始,它可能会非常偏离真实值,它会调用它 10 次,而在 1 步中,函数可以优化到真实值。
如果设置seed且popsize为0:
如果您确实设置了种子,那么您可以重现代码并查看它是否正确。
这里是seed的地方0
(没有优化更多):
>>> soln = differential_evolution(objfun, bounds=((1,10000),(1,200000),(1,50000)),popsize=0,maxiter=3,polish=False,disp=True, seed=0)
differential_evolution step 1: f(x)= 1098.52
differential_evolution step 2: f(x)= 1098.52
differential_evolution step 3: f(x)= 1098.52
popsize > 0 的种子:
第一次迭代调用函数的次数可能比最后一次多,这可能是由于函数的优化方式及其随机性所致。
differential_evolution step 1: f(x)= 183.92
differential_evolution step 2: f(x)= 183.92
differential_evolution step 3: f(x)= 5.81206
如果我们将 popsize 更改为大于 10 的值,我们将更接近最小值。
>>> soln = differential_evolution(objfun, bounds=((1,10000),(1,200000),(1,50000)),popsize=100,maxiter=3,polish=False,disp=True, seed=0)
differential_evolution step 1: f(x)= 10.3284
differential_evolution step 2: f(x)= 8.35376
differential_evolution step 3: f(x)= 2.65333
在differential_evolution
中,人口中的成员总数设置为here。计算方式为:
self.num_population_members = max(5, popsize * self.parameter_count)
这意味着您可以拥有的最小人口数量为 5,最大数量为 popsize * self.parameter_count
。最小数量 5 是因为 best2bin
策略需要至少 5 个人口成员。
人口规模在最小化过程中没有改变。初始化种群后,必须评估初始种群的每个成员(总大小 np
)。在最小化循环的第一次迭代中,还有一个
np
条 objective 条评价。在第一次迭代结束时,打印更新。因此,在打印第一个更新之前,将打印 2 * np
次 N
。每个后续迭代将只有 np
打印 N
.