달력

07

« 2018/07 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  •  
  •  
  •  
  •  
2010.08.24 17:01

watchmaker strings example 분석(2) Watchmaker2010.08.24 17:01

다시한번 실행코드를 보자.
    public static String evolveString(String target)
    {
        StringFactory factory = new StringFactory(ALPHABET, target.length());
        List> operators = new ArrayList>(2);
        operators.add(new StringMutation(ALPHABET, new Probability(0.02d)));
        operators.add(new StringCrossover());
        EvolutionaryOperator pipeline = new EvolutionPipeline(operators);
        EvolutionEngine engine = new GenerationalEvolutionEngine(factory,
                                                                                 pipeline,
                                                                                 new StringEvaluator(target),
                                                                                 new RouletteWheelSelection(),
                                                                                 new MersenneTwisterRNG());
        engine.addEvolutionObserver(new EvolutionLogger());
        return engine.evolve(100, // 100 individuals in the population.
                             5, // 5% elitism.
                             new TargetFitness(0, false));
    }

한줄씩 해석해 보자.


        StringFactory factory = new StringFactory(ALPHABET, target.length());

이것은, factory의 속성에 알파벳 27자를 담고, 추출하려는 10개의 숫자를 저장한다.


        List> operators = new ArrayList>(2);
        operators.add(new StringMutation(ALPHABET, new Probability(0.02d)));
        operators.add(new StringCrossover());

operators 컬렉션 첫번째에 돌연변이 표현 객체인 StringMutation을 넣고, 알파벳27자와 돌연변이 확율값 0.02를 넣는다. 두번째엔, 교배객체로 교배포인트 변수엔 1는 넣는데, 이는 '1점교배'를 한다는 뜻이고, 하나의 부모개체를 교배할때, 한번의 분할점만 사용한다는 뜻이다. 가능성(probability)는 1.0 이므로 100%를 뜻한다.


        EvolutionaryOperator pipeline = new EvolutionPipeline(operators);

operators를 저장하고 있다가, 이후 진화과정에서 다시 연결한다.


        EvolutionEngine engine = new GenerationalEvolutionEngine(factory,
                                                                                 pipeline,
                                                                                 new StringEvaluator(target),
                                                                                 new RouletteWheelSelection(),
                                                                                 new MersenneTwisterRNG());

EvolutionEngine 을 생성하는데, 위에서 생성한 factory, pipeline 변수를 넘기고, 추가로  StringEvaluator 객체를 생성하는데 이는, 'WATCHMAKER'를 저장하고, 각 글자를 배열에 담아서 진화적합도에 쓰인다. RouletteWheelSelection는 진화 선택 메커니즘으로 ' RouletteWheelSelection'을 쓰겠다는 것을 선언한 것이고, MersenneTwisterRNG 는 Mersenne Twister 알고리즘을 이용해서 랜덤하게 대상객체(10자리 스트링)를 생성하겠다는 뜻이다.
이러한 변수들로 EvolutionEngine 객체를 생성한 것이다.


    return engine.evolve(100, 5, new TargetFitness(0, false));

실행결과를 리턴하는데, 엔진에서 evolve()메서드를 실행한다. 이때 인자로 100은 모집단(전체수)를 '100'으로 한정하고, '5'는 엘리티즘을 5%로 지정한 것이고,  TargetFitness(0, false)는 대상 적합도를 확정적으로 정하는 것이다.(예제는 알파벳-'WATCHMAKER'-이라는 확정적인 적합도 목적을 달성하는 100% 적합도 예제이다.)

이렇게 해서, 진화 메서드를 실행한다. 이 실행자(StringExample.java)는 이렇게 진화를 실행하기 위한 환경을 설정하는게 전부다. 더 핵심적인 내용은 이러한 조건으로 부터 진화를 행하는 실제 코드인데 이는 은닉되어 있다. 결국 engine.evolve()메서드는 내부적으로 evolvePopulation()메서드를 실행하면서 루프를 돌며 진화 메커니즘을 실행한다.

그 메서드 인자는 다음과 같이 받으며, 해당 소스코드는 다음에 계속 한다.
    public List> evolvePopulation(int populationSize,
                                                        int eliteCount,
                                                        Collection seedCandidates,
                                                        TerminationCondition... conditions)

Posted by summerwars


티스토리 툴바