Python 批适应度评价
我的目标是使用执行参数估计(模型校准)。我的模型将是一个外部“黑色斑点”模型(c代码),输出目标函数Python 批适应度评价,python,optimization,parallel-processing,pygmo,Python,Optimization,Parallel Processing,Pygmo,我的目标是使用执行参数估计(模型校准)。我的模型将是一个外部“黑色斑点”模型(c代码),输出目标函数J,以最小化(在这种情况下,J将是模型输出和测量数据之间的“标准化均方根误差”(NRMSE)。加快优化(校准)我想在多个内核/线程上并行运行我的模型/模拟。因此,我想在PyGMO中使用批处理适应度评估器(bfe)。我准备了一个使用简单问题类但使用纯python(无外部模型)和rosenbrock问题的最小示例: #!/usr/bin/env python # coding: utf-8 impo
J
,以最小化(在这种情况下,J将是模型输出和测量数据之间的“标准化均方根误差”(NRMSE)。加快优化(校准)我想在多个内核/线程上并行运行我的模型/模拟。因此,我想在PyGMO中使用批处理适应度评估器(bfe)。我准备了一个使用简单问题类但使用纯python(无外部模型)和rosenbrock问题的最小示例:
#!/usr/bin/env python
# coding: utf-8
import numpy as np
from fmpy import read_model_description, extract, simulate_fmu, freeLibrary
from fmpy.fmi2 import FMU2Slave
import pygmo as pg
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib import cm
import time
#-------------------------------------------------------
def main():
# Optimization
# Define problem
class my_problem:
def __init__(self, dim):
self.dim = dim
def fitness(self, x):
J = np.zeros((1,))
for i in range(len(x) - 1):
J[0] += 100.*(x[i + 1]-x[i]**2)**2+(1.-x[i])**2
return J
def get_bounds(self):
return (np.full((self.dim,),-5.),np.full((self.dim,),10.))
def get_name(self):
return "My implementation of the Rosenbrock problem"
def get_extra_info(self):
return "\nDimensions: " + str(self.dim)
def batch_fitness(self, dvs):
J = [123] * len(dvs)
return J
prob = pg.problem(my_problem(30))
print('\n----------------------------------------------')
print('\nProblem description: \n')
print(prob)
#-------------------------------------------------------
dvs = pg.batch_random_decision_vector(prob, 1)
print('\n----------------------------------------------')
print('\nBarch fitness evaluation:')
print('\ndvs length:' + str(len(dvs)))
print('\ndvs:')
print(dvs)
udbfe = pg.default_bfe()
b = pg.bfe(udbfe=udbfe)
print('\nudbfe:')
print(udbfe)
print('\nbfe:')
print(b)
fvs = b(prob, dvs)
print(fvs)
#-------------------------------------------------------
pop_size = 50
gen_size = 1000
algo = pg.algorithm(pg.sade(gen = gen_size)) # The algorithm (a self-adaptive form of Differential Evolution (sade - jDE variant)
algo.set_verbosity(int(gen_size/10)) # We set the verbosity to 100 (i.e. each 100 gen there will be a log line)
print('\n----------------------------------------------')
print('\nOptimization:')
start = time.time()
pop = pg.population(prob, size = pop_size) # The initial population
pop = algo.evolve(pop) # The actual optimization process
best_fitness = pop.get_f()[pop.best_idx()] # Getting the best individual in the population
print('\n----------------------------------------------')
print('\nResult:')
print('\nBest fitness: ', best_fitness) # Get the best parameter set
best_parameterset = pop.get_x()[pop.best_idx()]
print('\nBest parameter set: ',best_parameterset)
print('\nTime elapsed for optimization: ', time.time() - start, ' seconds\n')
if __name__ == '__main__':
main()
当我尝试运行此代码时,出现以下错误:
发生异常:ValueError
功能:bfe\U检查\U输出\U fvs
其中:C:\projects\pagmo2\src\detail\bfe\u impl.cpp,103
内容:批适应度评估产生无效结果:产生的适应度向量数30与输入决策向量数1不同
删除或用逗号划掉这两行:
fvs = b(prob, dvs)
print(fvs)
脚本可以在没有错误的情况下运行
我的问题是:
batch\u fitness()
方法。但是,我的建议是注释掉batch\u fitness()
方法,并尝试使用pagmo提供的一个通用批适应度计算器。最简单的方法是默认构造bfe
类的实例,然后将其传递给可以使用bfe机制的算法之一。此类算法之一是nspso:
比如说:
b = pg.bfe() # Construct a default BFE
uda = pg.nspso(gen = gen_size) # Construct the algorithm
uda.set_bfe(b) # Tell the UDA to use the BFE machinery
algo = pg.algorithm(uda) # Construct a pg.algorithm from the UDA
new_pop = algo.evolve(pop) # Evolve the population
这应该使用多个进程在nspso算法的循环中并行地评估适应度函数
如果您需要更多帮助,请访问我们的公共用户/devs聊天室,在那里您应该很快获得帮助(通常):