我有一个带有多个输入和several objectives的黑匣子功能。我正在寻找一个可以帮助我优化输入参数的框架。
执行该功能大约需要两秒钟。因此,总体运行时间不应过多。
我开始看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}