【问题标题】:How to optimize with integer parameters in OpenMDAO如何在 OpenMDAO 中使用整数参数进行优化
【发布时间】:2016-12-21 22:18:19
【问题描述】:

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

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

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

翻看OpenMDAO源码发现这是因为

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

只要数据类型不可区分,就会在 Component_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.

请注意,如果我设置INITIAL_X = 0.,一切都会正常工作。

我应该如何优化整数?

【问题讨论】:

  • 请发布一个显示问题的小测试脚本
  • 在您的示例中,您使用的是整数变量的连续优化器。尽管您收到的错误消息不是很清楚,但这根本行不通。如果您想要整数变量,则需要完全使用不同类型的优化算法。您选择优化器只是为了让示例给出错误,还是您希望实际使用这个优化器来解决真正的问题?
  • @JustinGray 实际上是的,这是我正在考虑的问题。我曾是。不知道它严格用于连续问题。我只是在寻找一个允许约束且不使用渐变的优化器。
  • 我的问题理论上是连续的,但实际上位置变化只会导致分辨率约为 10m 的显着变化。这就是为什么约定我们通常以整数指定位置的原因。我试图在优化器中也使用一个整数,因为 a) 优化器似乎浪费了很多时间,即使在开始时也会以非常小的数量改变位置(远非最佳) b) 我不是 100% 确定有在相当复杂的计算中(从一个甚至不是用 Python 编写的工具重用)中的某处没有四舍五入到整数。

标签: openmdao


【解决方案1】:

如果你想使用整数变量,你需要选择一种不同的优化器。您将无法强迫 COBYLA 尊重完整性。此外,如果您确实有某种整数舍入导致分析不连续,那么您真的根本不能使用 COBYLA(或任何其他连续优化器)。他们都对您将违反的函数的平滑度做出了基本假设。

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

【讨论】:

  • 谢谢,这解释了问题的原因。是否概述了优化器的目标/约束函数必须满足哪些标准?
  • 我还需要在 Windows 上工作,但还没有设法在那里安装 pyoptsparse。从ScipyOptimizer 的来源,我假设 COBYLA 和 SLSQP 是仅有的两个可以处理约束的优化器(这意味着不可能使用整数)。这是正确的吗?
  • 据我所知,除了 NSGA-II 之外,pyoptsparse 中没有设置用于处理整数的优化器。当然 COBYLA 和 SLSQP 不能。您可以使用 NSGA-II 并将您的约束制定为对目标函数的附加惩罚。这是一种常见的方法,尽管它有一些需要仔细解决的挑战。
猜你喜欢
  • 1970-01-01
  • 2018-05-25
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
  • 2021-11-23
  • 2018-09-01
  • 2018-08-01
  • 1970-01-01
相关资源
最近更新 更多