Je travaille sur un framework pour un projet EA (evolutional alg) dans Scala. En cela, j'ai un trait qui implémente le code EA commun et laisse le code spécifique au problème comme la conversion du génotype et les tests de fitness aux classes qui implémentent ce trait. Cependant, je ne veux pas implémenter complètement le trait avant qu'il ne soit réellement exécuté à cause de tester différents protocoles/stratégies de sélection de population. Cela donne le codeImplémenter/instancier une classe abstraite par réflexion dans Scala
trait EAProblem{
// common code ...
def fitness(ind:Individual):Double
def selectionStrategy(p: Population): List[(Individual, Double)]
def nextGeneration(p: Population): Population
}
/* Silly test problem */
abstract class OneMax(logPath: String) extends EAProblem {
def phenotype(ind:Individual) = {
ind.genotype
}
def fitness(ind: Individual): Double = {
ind.genotype.size.toFloat/ind.genotype.capacity
}
}
Lors de l'exécution du protocole/stratégie CHOISI:
object EASelectionStrategyProtocolDemo {
def main(args: Array[String]) {
val problem_impl = List[EAProblem](
// Full replacement
new OneMax("sigma_strat_full-rep_prot_onemax.log.dat") {
def selectionStrategy(p: Population): List[(Individual, Double)] =
SelectionStrategies.sigmaScalingMatingSelection(p)
def nextGeneration(p: Population): Population = SelectionProtocols.fullReplacement(p)
},
new OneMax("boltz_strat_full-rep_prot_onemax.log.dat") {
def selectionStrategy(p: Population): List[(Individual, Double)] =
SelectionStrategies.boltzmannSelection(p)
def nextGeneration(p: Population): Population = SelectionProtocols.fullReplacement(p)
})
for(problem <- problem_impl)
new Simulator(problem)
}
Les objets SelectionStrategies/SelectionProtocols contient clusures avec des références à d'autres codes dans EAProblem. Ce que je veux maintenant, c'est d'instancier d'autres classes abstraites comme OneMax (j'en ai beaucoup) en utilisant la réflexion (ou un autre mécanisme). Pseudocode:
val listOfClassNames = List("OneMax", "classA", "classB", ...)
for(className <- listOfClassNames){
class_sigma = Class.forname(className)
/*
Implement class_class with this code and instantiate it
def selectionStrategy(p: Population): List[(Individual, Double)] =
SelectionStrategies.sigmaScalingMatingSelection(p)
def nextGeneration(p: Population): Population = SelectionProtocols.fullReplacement(p)
*/
class_boltz = Class.forname(className)
/*
Implement class_boltz with this code and instantiate it
def selectionStrategy(p: Population): List[(Individual, Double)] =
SelectionStrategies.boltzmannSelection(p)
def nextGeneration(p: Population): Population = SelectionProtocols.fullReplacement(p)
*/
}