Adding a Search Step

Implementation

Implementing a custom search strategy is relatively simple. It requires the implementation of a type that configures the step, and a corresponding function that implements it. The configuration type should inherit from AbstractSearch, and the function should be an implementation of the GenerateSearchPoints function that takes a DSProblem and your custom type as arguments, and returns a vector of vectors.

For example, a very simple random search around the current incumbent point could be defined with the struct:

struct RandomLocalSearch <: AbstractSearch
    # Number of points to generate
    N::Int 
    # Maximum distance to explore
    d::Float64
end

And then the corresponding implementation with a method of the function GenerateSearchPoints:

function GenerateSearchPoints(p::DSProblem{T}, s::RandomLocalSearch)::Vector{Vector{T}} where T
    points = []
    # Generating s.N points
    for i in 1:s.N
        # Generate offset vector
        offset = zeros(p.N)
        offset[rand(1:p.N)] = rand(-s.d:s.d)
        # Append to points list
        push!(points, p.x + offset)
    end
    # Return list
    return points
end

This can then be used as with any other search method:

p = DSProblem(3; poll=LTMADS(), search=RandomLocalSearch(5, 0.1));

(Note that this search method it is unlikely to give good results due to not adapting the direction variable d to the current mesh size.)

Organisation

Unless it is very simple (ie, fits within a single function) please implement your search method in its own file. This ensures that extra functions that are part of the method are kept in a relevant place.

If a custom search method may be useful to other people, please consider contributing it back to the package.