【发布时间】: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