Troubleshoot Optimization Failures
There are several issues for you to consider when troubleshooting an optimization failure.
Examine the log file for the optimization iteration history
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
The objective, its slope, and the maximum constraint violation must all decrease with the iteration count. A decrease indicates progress.
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
Check your cost and constraint functions
- Evaluate the cost function at a few points to make sure it is returning the correct value.
- Check the sign of each inequality constraint.
- If you are performing a maximization, make sure to negate the cost.
The solution is not robust
For nonlinear problems, the size and range of the design space can play an important role in stabilizing the solution. Optimizers run most reliably when each of the design variables has about the same effect on the objective and constraint functions.
The solution for this issue is to redefine the design variables, such that they have roughly the same impact on the various cost and constraint functions. You can use the scaling features in the Optimizer. Automatic scaling could help if your own strategy doesn’t work. See Scaling Optimization Problem for more details.
Optimizer reaches an infeasible point
Often, the optimizer may go into an infeasible domain. Essentially, in the vicinity of the chosen design, one or more constraints or design limits are violated. MotionSolve has built-in methods to recover from such situations. It will instruct the optimizer to go back to the last feasible design and choose a smaller design step. Usually, this works quite well, but you may encounter a situation where MotionSolve is unable to recover.
- Tighten the bounds for some of the design variables. Increase the lower bound bU and decrease the upper bound bL. This prevents the optimizer from wandering off into an infeasible region.
- Change the initial design so that the optimizer is starting out from a different part of the design space. Since you are dealing with a nonlinear problem, changing the initial design can help the optimizer find a solution.
- Set the cost function to zero.
- Run the optimizer – it will change the design so that all the constraints are satisfied.
- Use this new design as your starting point.