首页 > 解决方案 > openmdao 简单遗传算法驱动程序不起作用

问题描述

我有一个物理模块,它接受 14 个输入并产生 6 个输出 - 1 个在目标函数(适应度)中,其他是约束(惩罚)。物理模块有点复杂,但我通过独立的随机游走找到了满足我要求的解决方案。但是,当我在 Openmdao 上使用 Simple GA 运行相同的程序时,我既没有得到最优值,也没有惩罚函数(约束)似乎起作用。结果甚至没有产生接近随机游走产生的数据集。我尝试将人口规模从 140-2000 改变,惩罚参数从 1-20,惩罚指数 1-2.5,Pm 从 0.02-0.08。Pc 一直保持在 0.5。我已经让代码运行了 2000 多代,但优化似乎不起作用。我也创建了一个带有 6 个输入的简单模型,一个约束和一个目标函数,那么这些约束也不满足。请提出解决方案。使用 COBYLA 驱动程序的相同物理模型无法优化。

编辑 - 1:

我已将 OpenMDAO 的以下实现与正在运行的物理模块附加在一起。

此外,当我说 COBYLA 驱动程序未能“优化”时,这意味着每次我使用不同的初始设计变量运行优化时,我最终得到的输出都会略有不同。最优值必须每次都相同。是因为 COBYLA 的数学公式吗?

使用 GA,我发现人口的平均适应度确实在有效的移动时间窗口内有效地增加(尽管非常轻微)。但它并没有停止。我的意思是我的优化器现在运行了 80 多个小时。

使用 SLSQP,优化器仅在第一次迭代后结束。我将公差值降低到 1e-40 然后它也没有超出第一次迭代。不过,COBYLA 能够为我提供与随机游走实验相同的可行设计。

from openmdao.api import Problem, Group, SimpleGADriver, ExplicitComponent,ExecComp, IndepVarComp, ScipyOptimizeDriver

class Obj_Prod(ExplicitComponent):

    def setup(self):
        self.add_input('ln',val=0.0)           
        self.add_input('lfc',val=0.0)       
        self.add_input('df',val=0.0)        
        self.add_input('dp',val=0.0)        
        self.add_input('tf',val=0.0)        
        self.add_input('hf',val=0.0)        
        self.add_input('lt',val=0.0)        
        self.add_input('delf1',val=0.0)     
        self.add_input('delf2',val=0.0)     
        self.add_input('delf3',val=0.0)     
        self.add_input('delf4',val=0.0)     
        self.add_input('delf5',val=0.0)     
        self.add_input('co',val=0.0)           
        self.add_input('front',val=0.0)

        self.add_output('geR',val=0.0)
        self.add_output('FCP',val=0.0)
        self.add_output('FS',val=0.0)
        self.add_output('vlres',val=0.0)
        self.add_output('diff_bre',val=0.0)
        self.add_output('diff_sets',val=0.0)

    def compute(self, inputs, outputs):

        ln                      = inputs['ln'][0]               
        lfc                     = inputs['lfc'][0]              
        df                      = inputs['df'][0]                 
        dp                      = inputs['dp'][0]                
        tf                      = inputs['tf'][0]                
        hf                      = inputs['hf'][0]                
        lt                      = inputs['lt'][0]                
        delf1                   = inputs['delf1'][0]              
        delf2                   = inputs['delf2'][0]              
        delf3                   = inputs['delf3'][0]              
        delf4                   = inputs['delf4'][0]              
        delf5                   = inputs['delf5'][0]              
        co                      = inputs['co'][0]                                  
        front                   = inputs['front'][0]

        equation_inputs = numpy.array([[ln,lfc,df,dp,tf,hf,lt,delf1,delf2,delf3,delf4,delf5,co,front]])

        Physics_obj             = Physics_Module()
        out                     = Physics_obj.main(equation_inputs)
        outputs['geR']          = -out[0][0]*1e-3
        outputs['FCP']          = out[0][1] - 1.1
        outputs['FS']           = out[0][2] - 1.1
        outputs['vlres']        = out[0][3]
        outputs['diff_bre']     = out[0][4]
        outputs['diff_sets']    = out[0][5]
        gc.collect()


Single_Opt_iter = 0

init_ln           = random.uniform(20.,35.,1)[0] 
init_lfc          = random.uniform(15.,30.,1)[0]
init_df           = random.uniform(5.,10.,1)[0]
init_dp           = random.uniform (11.,16.,1)[0]
init_tf           = random.uniform(1.,5.,1)[0]
init_hf           = random.uniform(4.,14.,1)[0]
init_lt           = random.uniform(8.,13.,1)[0]
init_delf1        = random.uniform(10.,30.,1)[0]
init_delf2        = random.uniform(7.,15.,1)[0]
init_delf3        = random.uniform(10.,30.,1)[0]
init_delf4        = random.uniform(5.,10.,1)[0]
init_delf5        = random.uniform(10.,30.,1)[0]
init_co           = random.uniform(10.,30.,1)[0]
init_front        = random.uniform(10.,30.,1)[0]
equation_inputs = numpy.array([[init_ln, init_lfc, init_df, init_dp, init_tf, init_hf, init_lt, init_delf1, init_delf2, init_delf3, init_delf4, init_delf5, init_co, init_front]])
ff2=open("input1.csv","a")
dump = equation_inputs
numpy.savetxt(ff2, dump, delimiter=",")
ff2.close()

if __name__ == "__main__":
    global counter
    counter = 0

    prob = Problem()
    model = prob.model = Group()

    model.add_subsystem('p1', IndepVarComp('ln',init_ln))
    model.add_subsystem('p2', IndepVarComp('lfc', init_lfc))
    model.add_subsystem('p3', IndepVarComp('df', init_df))
    model.add_subsystem('p4', IndepVarComp('dp', init_dp))
    model.add_subsystem('p5', IndepVarComp('tf', init_tf))
    model.add_subsystem('p6', IndepVarComp('hf', init_hf))
    model.add_subsystem('p7', IndepVarComp('lt', init_lt))
    model.add_subsystem('p8', IndepVarComp('delf1', init_delf1))
    model.add_subsystem('p9', IndepVarComp('delf2', init_delf2))
    model.add_subsystem('p10', IndepVarComp('delf3', init_delf3))
    model.add_subsystem('p11', IndepVarComp('delf4', init_delf4))
    model.add_subsystem('p12', IndepVarComp('delf5', init_delf5))
    model.add_subsystem('p13', IndepVarComp('co', init_co))
    model.add_subsystem('p14', IndepVarComp('front', init_front))

    model.add_subsystem('Obj_Prod', Obj_Prod())

    model.connect('p1.ln', 'Obj_Prod.ln')
    model.connect('p2.lfc', 'Obj_Prod.lfc')
    model.connect('p3.df', 'Obj_Prod.df')
    model.connect('p4.dp', 'Obj_Prod.dp')
    model.connect('p5.tf', 'Obj_Prod.tf')
    model.connect('p6.hf', 'Obj_Prod.hf')
    model.connect('p7.lt', 'Obj_Prod.lt')
    model.connect('p8.delf1', 'Obj_Prod.delf1')
    model.connect('p9.delf2', 'Obj_Prod.delf2')
    model.connect('p10.delf3', 'Obj_Prod.delf3')
    model.connect('p11.delf4', 'Obj_Prod.delf4')
    model.connect('p12.delf5', 'Obj_Prod.delf5')
    model.connect('p13.co', 'Obj_Prod.co')
    model.connect('p14.front', 'Obj_Prod.front')

    model.add_design_var('p1.ln', lower=20., upper=35.)       #15
    model.add_design_var('p2.lfc', lower=15., upper=30.)      #15
    model.add_design_var('p3.df', lower=5., upper=10.)        #5
    model.add_design_var('p4.dp', lower=11., upper=16.)       #5
    model.add_design_var('p5.tf', lower=1., upper=5.)         #5
    model.add_design_var('p6.hf', lower=4., upper=14.)        #10
    model.add_design_var('p7.lt', lower=8., upper=13.)        #5
    model.add_design_var('p8.delf1', lower=10., upper=30.)    #20
    model.add_design_var('p9.delf2', lower=7., upper=15.)     #5
    model.add_design_var('p10.delf3', lower=10., upper=30.)   #20
    model.add_design_var('p11.delf4', lower=5., upper=10.)   #5
    model.add_design_var('p12.delf5', lower=10., upper=30.)   #20
    model.add_design_var('p13.co', lower=10., upper=30.)      #20
    model.add_design_var('p14.front', lower=10., upper=30.)   #20
    model.add_objective('Obj_Prod.geR')

    prob.driver = SimpleGADriver()
    prob.driver.options['bits'] = {'p1.ln': 22}
    prob.driver.options['bits'] = {'p2.lfc': 22}
    prob.driver.options['bits'] = {'p3.df': 14}
    prob.driver.options['bits'] = {'p4.dp': 18}
    prob.driver.options['bits'] = {'p5.tf': 12}
    prob.driver.options['bits'] = {'p6.hf': 17}
    prob.driver.options['bits'] = {'p7.lt': 16}
    prob.driver.options['bits'] = {'p8.delf1': 22}
    prob.driver.options['bits'] = {'p9.delf2': 18}
    prob.driver.options['bits'] = {'p10.delf3': 22}
    prob.driver.options['bits'] = {'p11.delf4': 14}
    prob.driver.options['bits'] = {'p12.delf5': 22}
    prob.driver.options['bits'] = {'p13.co': 22}
    prob.driver.options['bits'] = {'p14.front': 22}
    prob.driver.options['max_gen'] = 10000
    prob.driver.options['pop_size'] = 140
    prob.driver.options['run_parallel'] = False
    prob.driver.options['procs_per_model'] = 3
    prob.driver.options['Pm'] = 0.08
    prob.driver.options['Pc'] = 0.5
    prob.driver.options['elitism'] = True
    prob.driver.options['penalty_parameter'] = 10.
    prob.driver.options['penalty_exponent'] = 1.
    prob.model.add_constraint('Obj_Prod.FCP', lower=0.)
    prob.model.add_constraint('Obj_Prod.FS', lower=0.)
    prob.model.add_constraint('Obj_Prod.vlres', lower=0.)
    prob.model.add_constraint('Obj_Prod.diff_bre', lower=0.)
    prob.model.add_constraint('Obj_Prod.diff_sets', lower=0.)

    prob.setup()
    prob.run_driver()
    prob.cleanup()

标签: optimizationgenetic-algorithmopenmdao

解决方案


推荐阅读