каємо біти для обміну}:=1 + Random (flchrom);
jcross1:=1 + Random (flchrom);
{Цикл до тих пір, поки не будуть обрані різні гени}
while jcross=jcross1 do:=1 + Random (flchrom);
{Обмінюємо}:=a [jcross]; [jcross]:=a [jcross1]; [jcross1]:=d ;;;
Однак мутація відбувається тільки з імовірністю PMutation т.к. в природі мутації наступають не часто. Імовірність мутації в програмі встановлена ??згідно методичному посібнику в 1%.
Процедура Crossover реалізує оператор схрещування. Схрещування відбувається з деякою ймовірністю PCross.
Кожна обрана таким чином пара рядків схрещується таким чином: якщо схрещування має статися, то нарощується лічильник схрещувань і нащадки успадковують гени шляхом обміну усіма елементами. Нащадки з імовірністю 50% успадковують гени або одного, або другого батька.
Після цього нащадки заміщають батьківські особини в проміжній популяції. Після схрещування може наступити мутація. Якщо ж схрещування не відбувається, то нащадками стають самі батьки.
Дана процедура використовує наступні змінні :, parent2 - хромосоми батьків;, child2 - хромосоми нащадків; - довжина хромосоми (кількість генів) ;, nmutation - лічильники кількості схрещувань і мутацій;
Код процедури: Crossover (var Parent1, Parent2, Child1, Child2: Chromosome ;: integer; var NCross, NMutation: integer); j: integer; Flip (PCross) then {Схрещування з імовірністю PCross} (NCross); {Нарощуємо лічильник схрещувань} j:=1 to flchrom do
{Виробляємо схрещування} Flip (0.5) then
child1 [j]:=parent1 [j]; [j]:=parent2 [j]; [j]:=parent2 [j]; [j]:=parent1 [j] ;;;
{двоточкову мутація} (Child1, NMutation, flchrom); (Child2, NMutation, flchrom) ;;
Процедура Generation використовується для генерації нового покоління за допомогою операторів відбору, схрещування і мутації.
Для декодування рядки бітів в дійсне число використовується процедура Decode.
На першому етапі зазвичай робиться припущення, що змінні, що представляють параметри, можуть бути представлені бітовими рядками. Це означає, що змінні попередньо дискретизируются деяким чином і що область дискретних значень відповідає деякій мірі 2. Наприклад, з 20 бітами на параметр ми отримуємо область з 220=1048576 дискретних значень. Якщо параметри неперервні, то проблема дискретизації не заслуговує особливої ??уваги. Зрозуміло, передбачається, що дискретизація забезпечує достатнє дозвіл, щоб зробити можливим регулювання отримання результату з бажаним рівнем точності. Передбачається також, що дискретизація в деякому розумінні представляє основну функцію. Бітову рядок довжини N можна розглядати як ціле двійкове число I, якому відповідає деякий дійсне значення r із заданого діапазону. Це відповідність встановлюється формулою
.
У нашому випадку n=20.
Для отримання статистичних даних: мінімального, максимального і середнього значень цільової функції (у програмі задана у вигляді функції ObjFunc) використовується процедура Statistics. За допомогою даної процедури знаходяться статистичні дані. В основній програмі вона використовується наступним чином: по всій популяції вважається функція придатності, знаходиться максимальне і мінімальне значення цільової функції а також її середнє.
procedure Statistics (var Max, Avg, Min: double; Pop: Population); j: integer ;: double;:=Pop [1] .Fitness;:=Pop [1] .Fitness; :=Pop [1] .Fitness; j:=2 to PopSize do
with Pop [j] do
{Накопичення суми значень функції придатності}
SumFitness:=SumFitness + Fitness; Fitness gt; Max then Max:=Fitness; {Нове значення Max} Fitness lt; Min then Min:=Fitness; {Нове значення Min};:=SumFitness/PopSize; {Розрахунок середнього}
end;
Каркасом для побудови рішення задачі була програма реалізована в методичному посібнику. Вона була вивчена, узагальнена і модифікована під поточну задачу.
У порівнянні із запропонованою програмою внесені наступні зміни:
. Змінено простір пошуку і одновимірного випадку на двовимірний.
. Змінено процедури схрещування і мутації відповідно до варіанта.
. Програма виконує по 30 прогонів з метою поліпшення достовірності результату.
. Змінено цільова функція і межі пошуку мінімуму.
Більше змін немає.
Тестування
У процесі тестування програми були отримані наступні результати:
Кількість поколенійРазмер популяцііСреднее значення мінімумаЛучшее значення мінімума4084.010E + 00001.079E + 0000121.080E + 00006.346E - 0001201.069...