0

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

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

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 

问题:

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

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

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

感谢您抽出宝贵的时间,您的经验可能会帮助我解决这个问题。

4

1 回答 1

1

这是一个非常广泛的问题,优化是一个非常复杂的话题!所以简单说几句:

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

正如您所说的那样,由于您没有提供雅可比,因此每次迭代都会调用该函数多次。SLSQP 将使用数值微分来推断它将采取的步长方向(以及它的长度)!

如果是,我编码的方式是在求解器的每次迭代中返回我的目标函数和黑盒函数评估的适当方式吗?

不,可能不是!

第一个明显的事情是模拟的基于进程的调用,它会产生开销。如果您的模拟在时间方面占主导地位,那么这不太相关,但在这种情况下,这通常是错误的方法。

其他备注

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

因此,尽管您的问题没有太多细节(细节/假设很重要!),但 scipy 并不是实现您想要的最有用的库!有关于全局/无导数优化概述替代方案的调查论文(示例)。一个例子(任意选择;开源)是 CoinOR 的RBFOpt,它的页面从上面总结了我们的问题:

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

于 2018-02-20T22:57:41.837 回答