У меня есть функция черного ящика с несколькими входами и несколькими задачами .Я ищу структуру, которая помогает мне оптимизировать входные параметры.
Выполнение функции займет примерно две секунды.Поэтому общее время выполнения не должно быть слишком большим.
Я начал смотреть на platypus-opt .
Я создал небольшой скрипт для проверки количества обращенийк моей функции черного ящика через библиотеку (для простоты, только с одной целью).Что касается моих входных параметров, то, похоже, слишком много обращений.И только когда много обращений сделано, ожидаемый результат (0
, 0
) доставляется.
Как я могу уменьшить количество обращений к моей функции?
Или есть какие-то другие рамки, более подходящие для моей проблемы?
from platypus import Problem, Integer, NSGAII
accessCounter = 0
def my_function(x):
global accessCounter
accessCounter += 1
return -x[0] ** 2 - x[1] ** 2
problem = Problem(2, 1) # define 2 inputs and 1 objective (and no constraints)
problem.directions[:] = Problem.MAXIMIZE
int0 = Integer(-2, 2)
int1 = Integer(-2, 2)
problem.types[:] = [int0, int1]
problem.function = my_function
algorithm = NSGAII(problem)
myLengths = [10, 100, 1_000]
for myLength in myLengths:
algorithm.run(myLength)
uniqueResults0 = set([int0.decode(x.variables[0]) for x in algorithm.result])
uniqueResults1 = set([int1.decode(x.variables[1]) for x in algorithm.result])
print('-----------------')
print("myLength:", myLength)
print("accessCounter:", accessCounter)
print("uniqueResults0:", uniqueResults0)
print("uniqueResults1:", uniqueResults1)
Результат:
-----------------
myLength: 10
accessCounter: 100
uniqueResults0: {0, 1, 2, -2, -1}
uniqueResults1: {0, 1, 2, -1, -2}
-----------------
myLength: 100
accessCounter: 273
uniqueResults0: {0, 1, -1}
uniqueResults1: {0, 1, -1}
-----------------
myLength: 1000
accessCounter: 1314
uniqueResults0: {0}
uniqueResults1: {0}