如何在OpenMDAO

时间:2016-12-19 13:40:49

标签: openmdao

我目前正在尝试使用OpenMDAO 1.7.2对地图上的位置进行一些优化。执行计算的(预先存在的)模块仅支持整数坐标(分辨率为1米)。

目前我正在使用IndepVarComp优化每个方向,每个方向都包含float向量。然后在使用它们之前对这些值进行舍入,但这是非常低效的,因为求解器主要尝试小于1的变化。

当我尝试使用整数向量初始化IndepVarComp时,第一次迭代正常工作(使用初始值),但在第二次迭代失败时,因为IndepVarComp中的数据设置为空ndarray

通过OpenMDAO源代码,我发现这是因为

indep_var_comp._init_unknowns_dict['x']['size'] == 0

只要数据类型不可区分,就会在Component的{​​{1}}方法中发生。

这是一个示例问题,说明了如何定义整数_add_variable()失败:

IndepVarComp

哪个失败

from openmdao.api import Component, Group, IndepVarComp, Problem, ScipyOptimizer

INITIAL_X = 1

class ResultCalculator(Component):
    def __init__(self):
        super(ResultCalculator, self).__init__()
        self.add_param('x', INITIAL_X)
        self.add_output('y', 0.)

    def solve_nonlinear(self, params, unknowns, resids):
        unknowns['y'] = (params['x'] - 3) ** 2 - 4

problem = Problem()
problem.root = Group()
problem.root.add('indep_var_comp', IndepVarComp('x', INITIAL_X))
problem.root.add('calculator', ResultCalculator())
problem.root.connect('indep_var_comp.x', 'calculator.x')

problem.driver = ScipyOptimizer()
problem.driver.options['optimizer'] = 'COBYLA'
problem.driver.add_desvar('indep_var_comp.x')
problem.driver.add_objective('calculator.y')

problem.setup()
problem.run()

请注意,如果我设置ValueError: setting an array element with a sequence. ,那么每件事都可以正常工作。

我应该如何针对整数进行优化?

1 个答案:

答案 0 :(得分:1)

如果要使用整数变量,则需要选择不同类型的优化器。你无法强迫COBYLA尊重完整性。此外,如果您确实有某种整数舍入导致分析中出现不连续性,那么您根本就无法使用COBYLA(或任何其他连续优化器)。它们都是关于你将要违反的函数的平滑性的基本假设。

听起来你应该考虑使用粒子群或遗传算法来解决你的问题。或者,您可以专注于使分析平滑和可微分,并扩展您的一些输入以获得更合理的分辨率。您还可以放松优化器的收敛容差,使其在设计变量中低于物理意义时停止迭代。