无论使用何种算法,优化求解器的目标函数(黑盒函数)评估?

时间:2018-02-20 18:40:57

标签: python optimization black-box

这里的主要思想是了解在目标函数定义中如何使用黑盒函数以及优化算法如何调用这些函数。

让'假设我们有一个定义如下的函数:

f是针对给定问题最小化的目标函数。让我们说:

f(Xi,Yi)=(Ai.Xi)+(Bi.Xi.Yi)i = 1,2 ... n

其中Yi = N(X1,X2,... Xn)是一个黑盒函数(模拟),其分析形式未知,将所有Xi作为输入

N指的是正在模拟的网络。

Ai和Bi是常数

问题有以下限制:

X1 + X2 + ... + Xn = C

以下功能定义只是为了展示我如何调用我的模拟结果并将其用于我的优化目标。如果可以做得更好,我也愿意接受建议。 (但我的主要问题是我的函数定义)

def fun(X): 
   sim_inpfile(X)  # function that has been already defined which is called now by taking x as arguments to write the input file to a simulation
   Popen('python Test02.py')  # running a python code to execute the simulation       
   jn.output.Results  # Extracting results of simulation by importing a custom made python module called jn 
   Y=[] # Simulation Result
   for i in range(len(jn.output.Results.res)):
      if jn.output.Results.res[i].name in nodes:
          y += [(jn.output.Results.res[i].pr)]  # extracting y as a list from the simulation results
   sum = 0 # optimization objective
   for i in range(len(a)):  # len[a]=len[b]=len[X]=len[Y]
      sum += a[i]*X[i]+ b[i]*X[i]*Y[i] #a and b are constants which are lists with the same size as x and y
  return sum   #the ultimate objective function that takes y(simulation results) as arguments to return the optimization objective value

我现在调用python优化求解器。

res = scipy.optimize.minimize(fun, x0, method='SLSQP', bounds=bnds, constraints=cons)    # x0=initial x values, bounds= Variable bounds on X, Constraint =equality constraint 

Qns:

  • 对于算法的每次迭代,目标函数都是 要求评估?

  • 如果是的话,是我编码的方式,是回归目标的适当方式 在每次迭代时使用黑盒函数评估函数 求解器?

  • 如果任何python优化包或类似问题和示例中存在或类似问题,请分享他们的链接或主题。

感谢您的时间和经验可以帮助我解决这个问题。

1 个答案:

答案 0 :(得分:0)

这是一个非常广泛的问题,优化是一个非常复杂的话题!所以只是一些评论:

  

对于算法的每次迭代,是否会调用目标函数进行评估?

当你调用它时,由于你没有提供jacobian,该函数每次迭代会多次调用 。 SLSQP将使用数值微分来推断它将采取的步进方向(以及它的长度)!

  

如果是,那就是我编码的方式,这是回归目标的合适方式   在求解器的每次迭代中使用黑盒函数评估函数?

不,可能不是!

第一个显而易见的事情是基于流程的模拟调用会导致开销。如果你的模拟在时间方面占主导地位,那就不那么重要了,但在这种情况下,这通常是错误的方法。

其他评论

  • 大多数scipy的优化器都假设一个平滑且确定的优化问题。你的两个都可能会失效(很多坏事都会发生)。平滑可能很难推理,但是当你理解你的优化(随机数?)时,可以分析确定性/随机性
    • 请记住,如果是在没有任何正式收敛标准的x迭代后停止的迭代模拟,那么随机性甚至可能更为关键
    • 在数值微分的情况下,所有这些事情都更加引人注目(简化示例:使用x调用x与使用x + 1e-15调用;如果模拟错误在某种程度上或更高级别:错误)
  • 那些一阶/二阶优化器(如SLSQP)在功能评估方面的设计并不高效
    • 数字差异使事情变得更糟
  • 全局优化/无衍生优化通常使用其他方法,然后使用scipy中的方法
    • 通常是零级方法(不是基于梯度的)
    • 经常引入一些代理丢失/假设,如RBF-kernels和co。
    • 它们在函数调用方面效率更高,并且通常也设计为在非平滑性和非确定性行为的情况下不会中断
    • 但是:全局优化/无衍生优化通常比平滑确定性优化更难(理论上已经很难)

所以尽管你的问题没有太多具体细节(细节/假设很重要!),scipy并不是最有用的库来实现你想要的!有关于全球/无衍生品优化概述替代方案的调查报告(example)。一个例子(任意选择;开源)将是CoinOR的RBFOpt,其页面总结了我们上面的问题:

  

它不假设f(x)以分析形式已知:f(x)只是一个黑盒子,给定输入值产生输出值。假设变量x_L,x_U的边界是有限的。 RBFOpt特别针对目标函数f(x)的每个评估都很昂贵(在计算时间,成本或其他一些测量方面)的问题,并且我们希望找到具有尽可能少的函数的全局最小值评估尽可能。由于这是一类非常困难的问题(我们不假设一阶导数的可用性),RBFOpt最适用于尺寸相对较小的问题(最多20个变量,理想情况下小于10)并且边界框不是太大了。