2016-12-19 11 views
0

現在、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が失敗した整数を定義する方法を示します例の問題です。

整数を最適化する方法を教えてください。

+0

問題を表示する小さなテストスクリプトを投稿してください。 –

+0

@JustinGray Done – Tim

+0

あなたの例では、整数変数に連続オプティマイザを使用しています。あなたが得ているエラーメッセージはあまり明確ではありませんが、これはうまくいきません。整数変数が必要な場合は、別の種類の最適化アルゴリズムを完全に使用する必要があります。オプティマイザを選択しただけでエラーを出すか、実際の問題に実際に使用することを期待していますか? –

答えて

1

整数変数を使用する場合は、別の種類のオプティマイザを選択する必要があります。あなたはCOBYLAに完全性を尊重するように強制することはできません。さらに、分析で不連続性を引き起こす何らかの整数の丸めがあると、実際にCOBYLA(または他の連続オプティマイザ)を使用することはできません。それらはすべてあなたが違反している機能の滑らかさについて基本的な前提をしています。

パーティクルや遺伝的アルゴリズムを使用することをお勧めします。あるいは、分析をスムーズかつ微分可能にすることに重点を置いて、より合理的な解決策を得るために入力の一部を拡大することができます。オプティマイザのコンバージェンス許容値を緩めて、設計変数の物理的な意味合いを下回ると反復処理を停止することもできます。

+0

ありがとうございます、それは問題の原因を説明しています。オプティマイザの目的/制約機能によってどの基準を満たす必要があるかの概要はありますか? – Tim

+0

また、私は窓で作業する必要がありますが、まだそこにpyoptsparseをインストールすることはできませんでした。 'ScipyOptimizer'のソースから、私はCOBYLAとSLSQPが制約を扱うことができる唯一の2つのオプティマイザであると仮定します(これは整数を使うことができないということです)。これは正しいです? – Tim

+0

pyoptsparseには、NSGA-IIを除いて整数を扱えるように設定されたオプティマイザはありません。確かにCOBYLAとSLSQPはできません。あなたはNSGA-IIを使い、目的関数のペナルティとして制約を定式化することができます。これは一般的なアプローチですが、慎重に扱う必要があるいくつかの課題があります。 –

関連する問題