Python 批适应度评价

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

我的目标是使用执行参数估计(模型校准)。我的模型将是一个外部“黑色斑点”模型(c代码),输出目标函数
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)
脚本可以在没有错误的情况下运行

我的问题是:

  • 如何使用批量适合度评估?(我知道这是一个新的 PyGMO的能力,他们仍在开发 文档…)有人能给出一个关于如何实现这一点的最小示例吗
  • 这是加速我的模型校准问题的正确方法吗?还是我应该使用岛屿和群岛?如果我做对了,群岛中的岛屿不会相互通信,对吗?因此如果一个人执行例如粒子群优化,并希望同时(并行)评估多个目标函数调用那么批量适应性评估器是正确的选择吗
  • 在这个例子中,我是否需要关心群岛和岛屿?它们的确切含义是什么?是否值得使用不同的初始x(目标函数的输入)运行多个优化,然后采取最佳解决方案?这是遗传算法优化中的常见方法吗
  • 我对优化和PyGMO领域非常了解,谢谢您的帮助

    这是加速我的模型校准问题的正确方法吗?还是我应该使用岛屿和群岛?如果我做对了,群岛中的岛屿不会相互通信,对吗?因此如果一个人执行例如粒子群优化,并希望同时(并行)评估多个目标函数调用那么批量适应性评估器是正确的选择吗

    pagmo中有两种并行模式:孤岛模式(即粗粒度并行)和BFE机制(即细粒度并行)

    孤岛模型适用于任何问题/算法组合,它基于多个优化并行运行的思想,同时交换信息以加速全局收敛到解决方案

    取而代之的是,BFE机制并行化了单个优化,它需要解算器中的明确支持才能工作。目前在pagmo中,只有少数解算器能够利用BFE机制。BFE机制还可用于并行化个体群体的初始化,这可以是seful是你的健身功能特别重的

    哪种并行化方法最适合您取决于问题的性质。根据我的经验,如果适应度函数非常重(例如,计算需要几分钟或更长时间),用户倾向于使用BFE机制(细粒度并行化),因为在这种情况下,适应度评估的成本非常高,为了利用孤岛模型,需要等待太长时间。从某种意义上说,BFE也更容易理解,因为您不必深入研究群岛、拓扑等的细节。另一方面,BFE只适用于某些解算器(尽管随着时间的推移,我们正在尝试将BFE支持扩展到其他解算器)

    如何使用批量适合度评估?(我知道这是PyGMO的一项新功能,他们仍在编写文档…)有人能给出一个如何实现这一功能的最小示例吗

    使用BFE的一种方法是您在示例中所做的,即通过在问题中实现
    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聊天室,在那里您应该很快获得帮助(通常):