【发布时间】:2015-12-05 07:03:20
【问题描述】:
我正在尝试优化一个数学模型,我使用 scipy.optimize.minimize 来尝试一组不同的输入值 x,以便我的模型返回 输出值 F 尽可能接近目标值 F_experimental。
在我的程序中,我观察到 scipy.optimize.minimize 回调选项的奇怪行为。可重现的测试器代码(部分基于here)是:
import numpy as np
from scipy.optimize import minimize,rosen, rosen_der
Nfeval = 1
def rosen(X): #Rosenbrock function
global Nfeval
print('pass rosen',str(Nfeval))
#Nfeval += 1
return (1.0 - X[0])**2 + 100.0 * (X[1] - X[0]**2)**2 + \
(1.0 - X[1])**2 + 100.0 * (X[2] - X[1]**2)**2
def callbackF(Xi):
global Nfeval
print('pass callback',str(Nfeval))
#print(Nfeval, Xi[0], Xi[1], Xi[2], rosen(Xi))
Nfeval += 1
x0 = np.array([1.1, 1.1, 1.1])
optXvalues=minimize(rosen, x0, method='Nelder-Mead',callback=callbackF)
运行此代码将在屏幕上返回一个非常奇怪的结果,尽管最小化器会收敛。其中的一部分,是:
pass rosen 66
pass rosen 66
pass callback 66
pass rosen 67
pass callback 67
pass rosen 68
pass callback 68
pass rosen 69
pass rosen 69
pass callback 69
pass rosen 70
pass rosen 70
pass callback 70
pass rosen 71
pass rosen 71
pass callback 71
问题是为什么最小化器恰好通过了 2 次目标函数罗森? 为什么不一致? 在迭代 67 和 68 中只通过了一次.
如果我停用回调选项并在 Rosen 函数中添加计数器(只需取消注释它),最小化器只会通过一次。
如果我在 callbackF 函数中激活一个打印函数(只是取消注释它)以获取每次迭代的值,程序将再次通过 rosen 函数。
问题是我需要:
最小化器只通过函数一次,因为在我的实际问题中,我调用了一个模拟器来获得建议的优化器值 (x) 的结果 (F)。 p>
一种打印/保存每次迭代、迭代次数、x 值和 F 值的方法。
你认为问题是什么?可能是回调选项中的错误、我的代码中的错误或我不正确理解的东西吗?
提前致谢, 迈克尔
【问题讨论】:
-
您不能期望每个步骤中只有一个函数评估。每个迭代步骤中的函数评估次数取决于线搜索策略。这对我来说似乎是预期的行为。
-
但是考虑到我不能在每次传递中运行相同的模拟,你知道是否有正确的方法来打印每次迭代的结果吗?或者,我可以添加一个触发变量和一个条件来检查每次是否是第一次通过。
-
我不明白在这种情况下
simulation是什么。 -
而不是将分析表达式作为目标函数,例如Rosenbrock 函数,我有一个分子动力学模拟,它基于作为输入的 x 值,返回不同的结果 F 作为输出。它类似于航空优化行业中典型的设计问题。问题是每次模拟至少持续几分钟,所以我不能在每次通过时重新运行它。
标签: numpy optimization scipy python-3.4 minimize