LocalSolver快速入门指南(连载三十七) --Black-Box Optimization黑盒优化(概述)

谨慎!

如果该函数的计算成本不高并且可以在求解过程中进行数千次评估,那么使用黑盒函数可能不是最佳选择。考虑使用LocalSolver外部函数.

注意:

请注意,此功能在 LSP 语言中不可用

注意:

此功能当前不支持集合变量。在本节中,我们将详细介绍如何在 LocalSolver 支持的每种编程语言(C++Java.NETPython)中优化黑盒函数。为了说明这个描述,我们将通过一个黑盒界面来最小化 Branin 函数。演示目的,评估次数将限制在 20 次。

Branin函数的定义为 f(x)=a(x2-b*x1²+c*x1-r)²+s(1-t)cos(x1)+s ; 其中a=1b=5.1/(4π²)c=5/πs=10 t=1/(8π). x1  x2 的域分别为 [-5,10]  [0,15]

LocalSolver快速入门指南(连载三十七) --Black-Box Optimization黑盒优化(概述)_第1张图片

如需了解该函数的更多细节,请参考页面 branin.html

Local Solver 黑盒优化使用Python代码

Python 中,黑盒函数只是传递给 LocalSolver 的函数或方法。此方法必须采用 LSBlackBoxArgumentValues 类型的单个参数。该方法使用此对象访问当前点的决策值进行评估并返回该点的函数值:

def branin_eval(args):
    x = args[0]
    y = args[1]
    return math.pow(y - (5.1 / (4.0 * math.pi * math.pi)) * x * x
        + 5.0 / math.pi * x - 6, 2)
        + 10 * (1 - 1 / (8.0 * math.pi)) * math.cos(x) + 10

然后创建一个 LocalSolver 模型来优化这个黑盒函数。使用方法 LSModel.double_blackbox_function() 将函数转换为 LSExpression表达式。决策变量与使用 CALL 类型的 LSExpression表达式 的函数相关联。然后通过 LSBlackBoxContext,求解器被告知对函数执行 20 次的评估。此上下文还可用于为函数提供边界。使用 LSSolution 解析后可以得到解的值:

with localsolver.LocalSolver() as ls:
   model = ls.model
   x = model.float(-5, 10)
   y = model.float(0, 15)
   f = model.double_blackbox_function(branin_eval)
   call = model.call()
   call.add_operand(f)
   call.add_operand(x)
   call.add_operand(y)
   model.minimize(call)
   model.close()
   f.blackbox_context.set_evaluation_limit(20)
   ls.solve()
   sol = ls.solution
   print("x = {}".format(sol.get_value(x)))
   print("y = {}".format(sol.get_value(y)))
   print("obj = {}".format(sol.get_value(call)))

下一章节:LOCAL SOLVER黑盒优化使用 C++代码 未完待续。。更多问题请咨询LOCAL SOLVER中国区独家代理商 无锡迅合信息科技有限公司数学工程师(2012-2022)。

你可能感兴趣的:(localsolver入门系列,localsolver数学求解,localsolver求解器,localsolver黑盒优化,localsolver学习应用,localsolver实施方,LOCALSOLVER高级排程)