optimization - 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()
解决方案
推荐阅读
- docker - Azure Devops Microsoft 托管的 Ubuntu 代理集成测试无法调用 Docker Rest Api
- reactjs - Storybook main.ts:不能在模块外使用 import 语句
- php - PHP数组获取不同的数字
- python - 继承验证类的直观方法
- python - 找到孩子和父母之间所有可能的联系
- c# - 正确处理参数
- python - 为什么 xml 文件中的 .findall 无法正确读取?
- amazon-dynamodb - 如何计算 DynamoDB 项目大小?
- android - 您的设备与 Google Play 中的此版本不兼容,但使用其 apk 可以正常工作
- javascript - 如何搜索表格的第二列而不是第一列