В предыдущем
выпуске были закончены все подготовительные
операции для генетического алгоритма. Сам алгоритм приведен в выпуске 2. Выпуск 4
посвящен некоторым частным операциям, применяемым в ГА. Во-первых, кроссовер может
быть как одноточечным так и двухточечным и многоточечным (описание такого не встречалось, но теоретически
вполне возможно, причем вариантов алгоритма - множество). Вероятности выбора родительских пар
тоже могут определяться по-разному. Известны следующие способы [7]:
- панмиксия, когда родители выбираются из популяции случайным образом, так что один родитель
может составлять пару с самим собой или участвовать в нескольких парах;
- селекция, когда значения функции приспособленности родителей выше среднего значения
по популяции;
- инбридинг, когда первый родитель выбирается случайным образом, а вторым родителем с большей
вероятностью является член популяции ближайший к первому;
- аутбридинг, когда первый родитель выбирается случайным образом, а вторым родителем с большей
вероятностью является член популяции наиболее далекий от первого;
- пропорциональный, когда родители выбираются с вероятностями, пропорциональными их значениям
функции приспособленности.
Инбридинг и аутбридинг бывает генотипным и фенотипным. Существует также два механизма отбора
членов новой популяции: элитный и отбор с вытеснением. В первом случае новая популяция состоит
из наилучших членов репродукционной группы, которая объединяет в себе родителей, детей и мутантов.
При отборе с вытеснением то, будет ли член репродукционной группы вноситься в новую популяцию,
определяется не только величиной ее приспособленности, но и тем, есть ли в новой популяции особь
с аналогичным набором хромосом. Вариантов алгоритмов ГА существует множество, но каждый год
появляются новые и новые. Но появление лучшего все еще впереди. Может и Вы захотите поучаствовать
в этом процессе. Больше информации, также программные фрагменты на сайте (здесь>>>).
{Процедура мутации. P-вероятность мутации, Str_Mut1- начальная бинарная строка, Str_Mut2
- результат мутации, raz - размер бинарной строки}
Procedure Tgenetic.Mutation(var Str_Mut1,Str_Mut2:string;raz:integer);
var r1:real;sm1,s3:string;k:integer;
begin
r1:=random; sm1:=Str_Mut1;
if r1<P_mutation then begin
k:=random(raz-1)+1;
s3:=copy(sm1,k,1);
delete(sm1,k,1);
if s3='0' then insert('1',sm1,k) else insert('0',sm1,k);
Str_Mut2:=sm1;
end
else Str_Mut2:=Str_Mut1;
end;
{Процедура кроссовера. Par_1,Par_2 - родители-генотипы, Son - потомок, raz - размер бинарной строки,
kk - случайное число, указывающее на точку деления} Procedure Tgenetic.Crossover(var
Par_1,Par_2,Son:string;var raz:integer;var kk:byte);
var l:integer;c1,c2,P_1,P_2:string;r1:real;
begin
l:=length(Par_1);
kk:=random(raz-1)+1;
P_1:=Par_1;
P_2:=Par_2;
c1:=copy(P_1,kk,l-kk+1);
c2:=copy(P_2,1,kk-1);
delete(P_1,kk,l-kk+1);
delete(P_2,1,kk-1);
P_2:=concat(P_1,P_2);
P_1:=concat(c2,c1);
r1:=random;
if r1<0.5 then Son:=P_1 else Son:=P_2;
end;