我目前正在尝试使用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.
,那么每件事都可以正常工作。
我应该如何针对整数进行优化?
答案 0 :(得分:1)
如果要使用整数变量,则需要选择不同类型的优化器。你无法强迫COBYLA尊重完整性。此外,如果您确实有某种整数舍入导致分析中出现不连续性,那么您根本就无法使用COBYLA(或任何其他连续优化器)。它们都是关于你将要违反的函数的平滑性的基本假设。
听起来你应该考虑使用粒子群或遗传算法来解决你的问题。或者,您可以专注于使分析平滑和可微分,并扩展您的一些输入以获得更合理的分辨率。您还可以放松优化器的收敛容差,使其在设计变量中低于物理意义时停止迭代。