Python: передача аргументов в функцию - PullRequest
0 голосов
/ 13 июня 2018

Я использую функцию dlib find_min_global, алгоритм оптимизации, который помогает находить значения, минимизирующие вывод функции.Например,

import dlib
def holder_table(x0,x1):
    return -abs(sin(x0)*cos(x1)*exp(abs(1-sqrt(x0*x0+x1*x1)/pi)))

x,y = dlib.find_min_global(holder_table, 
                           [-10,-10],  # Lower bound constraints on x0 and x1 respectively
                           [10,10],    # Upper bound constraints on x0 and x1 respectively
                           80)         # The number of times find_min_global() will call holder_table()

Здесь функция holder_table возвращает значение, которое необходимо минимизировать для различных значений x0 и x1.

Здесь функция holder_table принимает только значения, которые необходимо оптимизировать, то есть x0 и x1.Но функция, которую я хочу использовать с функцией dlib, занимает больше, чем x0 и x1.Определение функции выглядит так:

def holder_table(a,b,x0,x1):
    return -abs(sin(b*x0/a)*cos(x1)*exp(abs(1-sqrt(x0*x0+x1*x1)/pi)))

Значения a, b не являются фиксированными и являются выходами другой функции.Теперь я могу напрямую вызывать функцию return a, b внутри holder_table, но я не хочу в конечном итоге пересчитывать их, потому что каждый раз, когда вызывается holder_table, a, b пересчитывается и процесс занимает много времени.,

Как передать a, b в функцию holder_table?

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Если исходить только из представления спецификации, holder_table - это функция, которая принимает два аргумента и возвращает окончательный результат, который может использоваться для помощи в шаге оптимизации.Кроме того, если я правильно понимаю, a и b являются компонентами объективной формулы, но для их вычисления может потребоваться некоторое время, и вы не хотите, чтобы вычисления их логики вызывались чаще, чем необходимо, - например, включаяих вывод внутри holder_table кажется неэффективным.

Как насчет чего-то вроде:

def build_objective_function(a,b):
    def holder_table(x0,x1):
        return -abs(sin(b*x0/a)*cos(x1)*exp(abs(1-sqrt(x0*x0+x1*x1)/pi)))
    return holder_table

И вы бы назвали это следующим образом:

a = <compute a>
b = <compute b>
holder_table = build_objective_function(a,b)  # holder_table will be a function

x,y = dlib.find_min_global(holder_table, 
                           [-10,-10],  # Lower bound constraints on x0 and x1 respectively
                           [10,10],    # Upper bound constraints on x0 and x1 respectively
                           80)         # The number of times find_min_global() will call holder_table()
0 голосов
/ 13 июня 2018

Ваш вопрос не на 100% ясен, но похоже, что вы хотите частичное заявление .В Python это может быть сделано с использованием выделенного объекта functools.partial или просто с помощью замыкания (с использованием внутренней функции или лямбда-выражения)

def holder_table(a,b,x0,x1):
    return -abs(sin(b*x0/a)*cos(x1)*exp(abs(1-sqrt(x0*x0+x1*x1)/pi)))


def main():
    a, b = some_heavy_function(...)
    holder_table_partial = lambda ax, ay: holder_table(a, b, ax, ay)
    x, y = dlib.find_min_global(
        holder_table_partial, [-10,-10], [10,10], 80
        )    
...