For the OptimalityChecker of the OptimizerPool, rather than an ambiguous isOptimal(), we should consider both cases of isLocalOptimum() and isGlobalOptimum(). The returned value should be true if it surely an optimum, false if it is surely not, and null otherwise. By the way, as a local optimum is relative to a mutator, maybe isLocalOptimum() should be delegated to the mutator.
More generally, any information (generator, optimality checker, etc.) could correspond to a generic interface Informator, and each kind of Informator could be provided to the incubator to provide (algorithm-independent but domain-dependent) knowledge which can be exploited in the algorithm. Richer information can be provided by more specialized and combined interfaces.
For the OptimalityChecker of the OptimizerPool, rather than an ambiguous isOptimal(), we should consider both cases of isLocalOptimum() and isGlobalOptimum(). The returned value should be true if it surely an optimum, false if it is surely not, and null otherwise. By the way, as a local optimum is relative to a mutator, maybe isLocalOptimum() should be delegated to the mutator.
More generally, any information (generator, optimality checker, etc.) could correspond to a generic interface Informator, and each kind of Informator could be provided to the incubator to provide (algorithm-independent but domain-dependent) knowledge which can be exploited in the algorithm. Richer information can be provided by more specialized and combined interfaces.