The basic interface that marks all move operators.
Remarks: A group of move operators that belong together should derive an interface from this one and implement the interface in each operator.
In an algorithm one can thus find out all move operators that belong together, by grouping operators according to the most specific interface derived from this interface that they implement.
A practical example:
You have a solution representation MyRep and you have a move MyRepMove that you want to make available to the friendly GUIs. So in MyRep you derive an interface IMyRepMoveOperator.
Now you need to implement at least three operators that handle these moves: A MoveGenerator, a MoveMaker, and a MoveEvaluator.
Note: The MoveEvaluator should be implemented in the problem plugin if you choose to separate representation and problem.
In each of these operators you implement IMyRepMoveOperator as well as the appropriate operator specific interface.
For a MoveGenerator that would be one of
- ISingleMoveGenerator or
For a MoveMaker that would be
For a MoveEvaluator that would either be
- ISingleObjectiveMoveEvaluator or
If you have this you need to make sure that an instance of all your operators are loaded in the Operators collection of your IProblem and you can select them in the respective algorithms.
For Tabu Search support you will need two additional operators: A TabuChecker and a TabuMaker.
If you decide later that you want another move, e.g. MyRepMove2, you would do as before and group them under the interface IMyRepMove2Operator If you want to make use of multiple different moves, all your operators would need to know about all the moves that you plan to use.
Take a look at the Permutation and TSP plugin to see how this looks like in real code.