Ранжирование выбора в коде генетического алгоритма
Мне нужен код для метода выбора рейтинга по генетическому алгоритму. У меня есть метод выбора рулетки и турниров, но теперь мне нужен рейтинг, и я застрял.
Мой код рулетки здесь (я использую атомную структуру для генетических атомов):
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;
3 ответа
Выбор ранга легко осуществить, если вы уже знаете, как выбрать колесо рулетки. Вместо того, чтобы использовать пригодность в качестве вероятности для выбора, вы используете ранг. Таким образом, для совокупности из N решений наилучшее решение получает ранг N, второе наилучшее ранг N-1 и т. Д. Наихудший индивид имеет ранг 1. Теперь используйте колесо рулетки и начинайте выбирать.
Вероятность выбора лучшего человека составляет N/( (N * (N+1))/2) или примерно 2 / N, для худшего - 2 / (N*(N+1)) или примерно 2 / N^2.
Это называется линейным выбором рангов, потому что ранги образуют линейную прогрессию. Вы также можете думать о рангах, образующих геометрическую прогрессию, например, например, 1 / 2^n, где n варьируется от 1 для лучшего человека до N для худшего. Это, конечно, дает гораздо большую вероятность для лучшего человека.
Вы можете посмотреть на реализацию некоторых методов выбора в HeuristicLab.
Мой код выбора ранга в MatLab:
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
Я создал шаблон класса генетического алгоритма в C++.
Моя библиотека генетического алгоритма отделена от GeneticAlgorithm и GAPopulation. Это все классы шаблонов, так что вы можете увидеть их исходный код в Документах API.