저는 스칼라에서 EA (evolutionary alg) 프로젝트를위한 프레임 워크를 연구 중입니다. 이것에는 공통된 EA 코드를 구현하고이 형질을 구현하는 클래스에 유전자형 변환 및 체력 테스트와 같은 문제가되는 코드를 남기는 특성이 있습니다. 그러나 다른 인구 선택 프로토콜/전략을 테스트하기 때문에 실제로 실행되기 전에이 특성을 완전히 구현하기를 원하지 않습니다. 이 프로토콜/전략은 선택이 끝난되는 런타임 코드스칼라에서 리플렉션을 통해 추상 클래스 구현/인스턴스화
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
}
}
을 제공합니다
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)
}
SelectionStrategies/SelectionProtocols 객체는 EAProblem에서 다른 코드에 대한 참조 clusures이 포함되어 있습니다.
내가 원했던 것은 반사 (또는 다른 메커니즘)를 사용하여 OneMax와 같은 다른 추상 클래스를 인스턴스화하는 몇 가지 방법입니다. 의사 코드 :
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)
*/
}