我有一个物理模块,该模块接受14个输入并产生6个输出-目标函数(适应性)为1,其他为约束(惩罚)。物理模块有点复杂,但是我发现通过独立的随机游走可以满足我的要求的解决方案。但是,当我在Openmdao上使用Simple GA进行相同操作时,我既没有获得最佳值,也没有惩罚函数(约束)起作用。结果甚至不会产生接近随机游走所产生的数据集。我尝试过将人口规模从140-2000更改为,惩罚参数从1-20更改,惩罚指数为1-2.5,Pm更改为0.02-0.08。电脑保持在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()