現在、OpenMDAO 1.7.2を使用してマップ上の場所の最適化を行っています。計算を行う(既存の)モジュールは、整数座標(1メートルの分解能)しかサポートしていません。OpenMDAOで整数パラメータを最適化する方法
今のところ私はそれぞれfloat
ベクトルを含む方向ごとにIndepVarComp
を使用して最適化しています。これらの値は、使用する前に丸められますが、ソルバーは主に1より小さい変化を試みるため、これは非常に非効率的です。
Iは、整数ベクトルIndepVarComp
内のデータが空のndarray
に設定されているので、最初の反復は、正常に動作(inital値を使用)が、第2の反復で失敗とIndepVarComp
を初期化することを試みます。私はデータ型が微分可能ではないときはいつでも
indep_var_comp._init_unknowns_dict['x']['size'] == 0
Component
の_add_variable()
方法で行われるためであると判明OpenMDAOソースコードを探し
。
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()
何もかもが私はINITIAL_X = 0.
を設定した場合、罰金うまくいく
ValueError: setting an array element with a sequence.
注意して失敗します。ここでは
はIndepVarComp
が失敗した整数を定義する方法を示します例の問題です。
整数を最適化する方法を教えてください。
問題を表示する小さなテストスクリプトを投稿してください。 –
@JustinGray Done – Tim
あなたの例では、整数変数に連続オプティマイザを使用しています。あなたが得ているエラーメッセージはあまり明確ではありませんが、これはうまくいきません。整数変数が必要な場合は、別の種類の最適化アルゴリズムを完全に使用する必要があります。オプティマイザを選択しただけでエラーを出すか、実際の問題に実際に使用することを期待していますか? –