In a local search, it is often the case that several neighbors of a
given solution are generated, evaluated to select of a few and discard the
rest. To take advantage of this characteristic, we design a Solution
object that contains a pointer to Combinatorial object and a
Mutation object.
An unmutated solution s has an empty mutation, and a pointer to a
combinatorial object. Neighbors of s have non-empty mutation objects,
and their combinatorial object point to that of s. The discarded
neighbors are simply deleted, while the selected ones will now copy the
combinatorial object to which they point, and individualize them by
committing their own mutations.
The saving in copying the actual combinatorial object is usually
significant. The improvement depends on the improvement ratio of
the delta_objective and objective functions. This in turn
depends on the continuity of objective function acting on the neighborhood
defined by the neighborhood operator. The smoother on the search space the
objective function, the better: small difference in structural solution,
small difference in value.
In a more sophisticated implementation, we can have higher order of referencing: a mutated solution of a mutated solution. However, I don't think that the implementation complexity justifies the saving.