最適化の失敗のトラブルシューティング

最適化の失敗をトラブルシューティングする場合、検討を必要とする問題がいくつかあります。

最適化反復履歴のログファイルの調査

4節リンク最適化のログファイルの一部を以下に示します。

Iteration #   Cost #    Objective       Mag (Slope)
--------------------------------------------------
   1             1      1.1368e+04      5.9417e+02
   2             3      2.1944e+03      7.9392e+01

...
...
...

  29            39      2.3447e+00      1.9977e-01
  30            40      2.3199e+00      4.2502e-02
  31            41      2.3041e+00      3.9178e-02

目標値、その勾配、および最大制約違反はすべて、反復の継続に伴って減少する必要があります。この減少が最適化の進捗状況を示します。

コスト関数、勾配、最大制約違反が減少しているものの、指定した精度に達していない場合、次に示す4節リンク最適化のログファイルの例のようにmaxit(最適化で許容される反復回数)の値を大きくします。maxitのデフォルト値は50です。

def optimize (self):
  obj = [self.a2x, self.a2y, self.a2psi]
  wt  = [1,1,1]
  opt = Optimizer ( 
          label     = "Optimize RMS2",  # Label
          objective = obj,              # Objectives
          weights   = wt,               # Weights
          type      = "KINEMATICS",     # Simulation Type
          end       = 2,                # End Time
          dtout     = 0.01,             # No. of steps
          plot      = True,             # Display plots
         )
        
  # Now do the optimization
  x = opt.optimize (maxit=100, accuracy=1e-3)  # Was maxit=50  
        
    return x
上記が該当しない場合は、解析のトレランスを緩くしてみます。トレランスの緩和は、最適化エンジンが収束するうえで効果的です。
    
    # Now do the optimization
    x = opt.optimize (maxit=100, accuracy=1e-2)    # Was accuracy=1e-3

コスト関数と制約関数の確認

コスト関数と制約関数が正しいことを確認します。このタスクには、Responseのデバッグ機能が役立ちます。
  • いくつかの時点でコスト関数を評価して、正しい値が返されていることを確認します。
  • 不等式の制約条件のそれぞれの符号を確認します。
  • 最大化を実行する場合には、必ずコストを無効にします。

解析に堅牢性がない場合

非線形問題では、設計空間のサイズと範囲が解析の安定化に重要な役割を果たすことがあります。最適化エンジンは、各設計変数によって目的関数と制約関数に同じ効果が得られる場合に最も高い信頼性で実行されています。

この問題を解決するには、さまざまなコスト関数と制約関数にほぼ同じ効果が得られるように設計変数を再定義します。最適化エンジンではスケーリング機能を使用できます。ユーザー独自の手法が良好に機能しない場合は、自動スケーリングが効果的なこともあります。詳細については、最適化問題のスケーリングをご参照ください。

最適化エンジンが実現不可能なポイントに到達した場合

最適化エンジンが実現不可能な領域に踏み込むことは少なくありません。これは、選択した設計の近傍では、どうしても満足できない制約または設計上の制限が存在するためです。MotionSolveには、こうした状況から回復するための方法が組み込まれています。この方法では、直前の実現可能な設計に戻り、さらに小さい設計ステップを選択するように最適化エンジンに指示します。通常、この動作は良好に機能しますが、MotionSolveが回復できない状況が発生することもあります。

最適化エンジンが実現可能なポイントで開始されたものの、実現不可能なポイントに収束した場合は、以下の手法を試してみます。
  • いくつかの設計変数の値の範囲を狭くします。下限bUを大きくし、上限bLを小さくします。これにより最適化エンジンが実現不可能な領域に迷い込まなくなります。
  • 初期の設計を変更し、最適化エンジンが設計空間の別の部分から始まるようにします。非線形問題を処理していることから、初期設計を変更することで最適化エンジンで解を見つけやすくなります。
上記の手段がどれも機能しない場合、実現可能な領域に戻すために以下の方法を試してみます:
  • コスト関数をゼロに設定します。
  • 最適化エンジンを実行します。これにより設計が変更され、すべての制約が満足された状態になります。
  • この新しい設計を開始点として使用します。