Методы оптимизации, используемые в scipy.optimize для пакета nlopt - PullRequest
0 голосов
/ 14 апреля 2020

У меня сейчас черный ящик с функцией цели. Он успешно использовался в scipy.optimize как 'status = op.basinhopping (obj, sp, ...)', однако, когда я пытаюсь использовать тот же объект obj для пакета NLOPT, он выдает сообщение

TypeError: <lambda>() takes exactly 1 argument (2 given). 

Я полагаю, что у obj для scipy.optimize есть два аргумента: один - сама функция, а другой - дифференцирование каждого измерения, в то время как для obj, используемого в методах NLOPT, требуется только сама функция. Если я прав, как мне изменить obj, чтобы он мог использоваться в NLOPT? Мой код использования NLOPT

    sys.path.insert(0,os.path.join(os.getcwd(),"build/R_ulp"))
    import foo as foo_square
    reload(foo_square)
    sp=np.zeros(foo_square.dim)+args.startPoint
    obj=lambda X:foo_square.R(* X)
    opt = nlopt.opt(nlopt.GN_CRS2_LM, foo_square.dim)
    opt.set_min_objective(obj)
    opt.set_lower_bounds(-1e9)
    opt.set_upper_bounds(1e9)
    opt.set_stopval(0)
    opt.set_xtol_rel(1e-9)
    opt.set_initial_step(1)
    opt.set_population(0)
    opt.set_maxeval(100000) 
    status = opt.optimize([0.111111111]*foo_square.dim)

1 Ответ

0 голосов
/ 14 апреля 2020

Оптимизаторы SciPy и NLopt имеют разные соглашения для подписи целевой функции. Документация для целевой функции в NLopt гласит:

Функция f должна иметь вид:

def f(x, grad):
   if grad.size > 0:

et c.

Так что вам нужно создать целевую функцию, которая принимает два аргумента, x и grad. Если grad.size > 0, функция должна заполнить массив градиентом.

...