5

유전 알고리즘에 ranking selection method 코드가 필요합니다. 나는 룰렛과 토너먼트 선택 방법을 만들었지 만 지금 순위가 필요하고 붙어 있습니다.유전 알고리즘 코드의 순위 선택

내 룰렛 코드 (I 유전 원자에 대한 원자 구조체를 사용하고 있습니다) 여기에 있습니다 :

const int roulette (const atom *f) 
{ 
    int i; 
    double sum, sumrnd; 

    sum = 0; 
    for (i = 0; i < N; i++) 
    sum += f[i].fitness + OFFSET; 

    sumrnd = rnd() * sum; 

    sum = 0; 
    for (i = 0; i < N; i++) { 
    sum += f[i].fitness + OFFSET; 
    if (sum > sumrnd) 
     break; 
    } 

    return i; 
} 
원자

: 이미 룰렛에 알고

typedef struct atom 
{ 
    int geno[VARS]; 
    double pheno[VARS]; 
    double fitness; 
} atom; 
+0

? 희망이 [토론] (http://stackoverflow.com/questions/10152002/building-ranking-with-genetic-algorithm) 도움이됩니다. – bonCodigo

+0

C++, 이것은 일반 C 부분이지만 Nokia QT Framework에서 개발 중입니다. –

답변

7

순위 선택이 쉽게 구현할 선택. 선택에 대한 확률로 적합성을 사용하는 대신 순위를 사용합니다. 따라서 N 개의 솔루션 인구에 대해 최상의 솔루션은 순위 N, 두 번째로 높은 순위 N-1 등을 얻습니다. 최악의 개인은 순위 1을가집니다. 이제 룰렛 휠을 사용하여 선택을 시작하십시오.

가장 좋은 개인이 선택 될 확률은 N/(N * (N + 1))/2 또는 대략 2/N이며, 최악의 개인의 경우 2/(N *)) 또는 대략 2/N^2이다.

순위가 선형 진행을 형성하기 때문에이를 선형 순위 선택이라고합니다. 예를 들어 1/2^n과 같이 기하 급수적 인 진행을 형성하는 등급을 생각할 수도 있습니다. 여기서 n은 최상의 개인의 경우 1, 최악의 경우 N입니다. 이것은 물론 최고의 개인에게 훨씬 더 높은 확률을줍니다.

HeuristicLab에서 일부 선택 방법의 구현을 볼 수 있습니다.

1

저는 C++에서 유전자 알고리즘 클래스 템플릿을 만들었습니다.

유전자 알고리즘의 라이브러리는 GeneticAlgorithm 및 GAPopulation과 구분되어 있습니다. 모든 템플릿 클래스이므로 API 문서에서 원점 코드를 볼 수 있습니다.

2

매트랩에서 순위 선택의 내 코드 : 당신이 코딩 어떤 언어

NewFitness=sort(Fitness); 
NewPop=round(rand(PopLength,IndLength)); 

for i=1:PopLength 
    for j=1:PopLength 
     if(NewFitness(i)==Fitness(j)) 
      NewPop(i,1:IndLength)=CurrentPop(j,1:IndLength); 
      break; 
     end 
    end 
end 
CurrentPop=NewPop; 

ProbSelection=zeros(PopLength,1); 
CumProb=zeros(PopLength,1); 

for i=1:PopLength 
    ProbSelection(i)=i/PopLength; 
    if i==1 
     CumProb(i)=ProbSelection(i); 
    else 
     CumProb(i)=CumProb(i-1)+ProbSelection(i); 
    end 
end 

SelectInd=rand(PopLength,1); 

for i=1:PopLength 
    flag=0; 
    for j=1:PopLength 
     if(CumProb(j)<SelectInd(i) && CumProb(j+1)>=SelectInd(i)) 
      SelectedPop(i,1:IndLength)=CurrentPop(j+1,1:IndLength); 
      flag=1; 
      break; 
     end 
    end 
    if(flag==0) 
     SelectedPop(i,1:IndLength)=CurrentPop(1,1:IndLength); 
    end 
end 
관련 문제