最適化の失敗のトラブルシューティング
最適化の失敗をトラブルシューティングする場合、検討を必要とする問題がいくつかあります。
最適化反復履歴のログファイルの調査
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
目標値、その勾配、および最大制約違反はすべて、反復の継続に伴って減少する必要があります。この減少が最適化の進捗状況を示します。
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
コスト関数と制約関数の確認
- いくつかの時点でコスト関数を評価して、正しい値が返されていることを確認します。
- 不等式の制約条件のそれぞれの符号を確認します。
- 最大化を実行する場合には、必ずコストを無効にします。
解析に堅牢性がない場合
非線形問題では、設計空間のサイズと範囲が解析の安定化に重要な役割を果たすことがあります。最適化エンジンは、各設計変数によって目的関数と制約関数に同じ効果が得られる場合に最も高い信頼性で実行されています。
この問題を解決するには、さまざまなコスト関数と制約関数にほぼ同じ効果が得られるように設計変数を再定義します。最適化エンジンではスケーリング機能を使用できます。ユーザー独自の手法が良好に機能しない場合は、自動スケーリングが効果的なこともあります。詳細については、最適化問題のスケーリングをご参照ください。
最適化エンジンが実現不可能なポイントに到達した場合
最適化エンジンが実現不可能な領域に踏み込むことは少なくありません。これは、選択した設計の近傍では、どうしても満足できない制約または設計上の制限が存在するためです。MotionSolveには、こうした状況から回復するための方法が組み込まれています。この方法では、直前の実現可能な設計に戻り、さらに小さい設計ステップを選択するように最適化エンジンに指示します。通常、この動作は良好に機能しますが、MotionSolveが回復できない状況が発生することもあります。
- いくつかの設計変数の値の範囲を狭くします。下限bUを大きくし、上限bLを小さくします。これにより最適化エンジンが実現不可能な領域に迷い込まなくなります。
- 初期の設計を変更し、最適化エンジンが設計空間の別の部分から始まるようにします。非線形問題を処理していることから、初期設計を変更することで最適化エンジンで解を見つけやすくなります。
- コスト関数をゼロに設定します。
- 最適化エンジンを実行します。これにより設計が変更され、すべての制約が満足された状態になります。
- この新しい設計を開始点として使用します。