Neighborhood Operator: the user must provide parameter-overriding declarations and definitions of two methods for the basic class NeighborOp, as well as all of its derived operators such as Swap. They are:
Technically, we could commit the mutation in gen_neighbor_element() and
eliminate commit(). However, commit allows several neighbors of a solution
s to exist at the same time, specified only by a mutation and a
pointer to the physical solution structure of s without actually
possessing it. This implementation boots efficiency if we later discard most
neighbors and choose only one of them.
These two methods define the essence of a neighborhood structure
in a local search search setting. Paired with objective functions and a
search method, they traverse the search space from one solution to another.
Objective Function: the user must provide parameter-overriding declarations of cost, delta_cost, correctness, delta_correctness member functions of ObjectiveFunction class. These will be used when a new problem is added to the system.