Solis-Wets Local Search

Overview

The class SWOpt provides a framework for implementing the stochastic direct search algorithms described by Solis and Wets [SolWet81]. Figure SW-1 provides pseudo-code for the main loop of SWOpt. These algorithms generate a new iterate using coordinate-wise steps. If the new iterate is better than the current iterate then it is accepted and the algorithm repeats. Otherwise the algorithm considers a step in the opposite direction. If this new point is also worse that then current iterate then a new iterate is again generated in the neighborhood of the current iterate. SWOpt also defines mechanisms for expanding and contracting the step size of the offsets used to generate the new iterate.

best = INFTY
bias = 0
n_succ = 0
n_fail = 0

while (rho > rho_lower_bound)
  generate dx
  curr = f(x + dx + bias)
  if (curr < best)
     bias = 0.2 * bias + 0.4 * (dx + bias)
     x += dx + bias
     n_succ++
     n_fail=0
  else
     curr = f(x - dx - bias)
     if (curr < best)
        bias = bias - 0.4 * (dx + bias)
        x -= dx + bias
        n_succ++
        n_fail=0
     else
        bias = bias/2
        n_fail++
        n_succ=0
     endif
  endif
  
  if (n_succ >= max_succ)
     n_succ=0
     rho = ex_factor * rho
  endif
  if (n_fail >= max_fail)
     n_fail=0
     rho = ct_factor * rho
  endif
endwhile

SW-1: Pseudo-code for the Solis-Wets algorithms.

Classes SWOpt1 and SWOpt2 differ in their definition of the private method gen_new_point, which is used to generate a new iterate. SWOpt1 generates a iterate using normally distributed deviates with standard deviation rho. SWOpt2 generates a new iterate using uniformly distributed deviates from the range $[-$ rho , rho $]$.

Current Status

These classes are stable.