Тестова функція №7 (Schwefel)

© 1998 К. В. Махотіло

Вихідний Delphi-код бібліотеки користувача задачі оптимізації наведено далі. Він може бути відкомпільований як у Delphi, так і у FreePascal.

Опис демонстраційного прикладу

Тестова функція №7 (Schwefel):

У заданій області зміни аргументів функція має близько 106 локальних мінімумів.

Глобальний мінімум розташований у точці xi = 420,9687, i = 1..10.

Для оцінки складність поставленої задачі мінімізації нижче наведено графік її двомірного варіанту.

При правильно вибраних параметрах генетичного алгоритму задача глобальної оптимізації вирішується за 500-3000 епох.

У цьому прикладі для кодування кожної координати пошукової точки використовується 14 біт, отже точність знаходження рішення e < 0,062.

Вихідний Delphi-код бібліотеки задачі оптимізації

library sample;const {Розмірність пошукового простору} Dimension = 10;
type TParVector = array[1..Dimension] of double;
const {Нижні межі діапазонів зміни координат вектора рішення} min: TParVector = (-500,-500,-500,-500,-500,-500,-500,-500,-500,-500);
{Верхні межі діапазонів зміни координат вектора рішення} max: TParVector = (500,500,500,500,500,500,500,500,500,500);
{Кількість біт, що кодують координати вектора рішення} map: TParVector = (14,14,14,14,14,14,14,14,14,14);
{= Обов'язкові функції =} {Обчислення цільової функції задачі оптимізації та умови. parameters - посилання на масив типу double; condition - ознака виконання умови Якщо умова не виконана, то condition = false. За умовчанням умова вважається виконаною. result - значення цільової функції типу double} function FitnessFunction(parameters: pointer; var condition: boolean): double; var i: integer; p: ^TParVector; begin p := parameters; result := 0; for i := 1 to Dimension do result := result - (p^[i]*sin(sqrt(abs(p^[i])))); end;
{Службова функція передачі в Mendel параметрів задачі} procedure InitTask(var TaskName: PAnsiChar; var MinimizationTask: boolean; var TaskDim: integer; var pMin,pMax,pMap,pEp,pRcN: pointer); begin {Назва задачі} TaskName := 'Тестова функція №7 (Schwefel)'; {Задача мінімізації - true; Задача максимізації - false} MinimizationTask := true; TaskDim := Dimension; pMin := Addr(min); pMax := Addr(max); pMap := Addr(map); end;
EXPORTS {= Обов'язкові функції =} FitnessFunction, InitTask;
BEGINEND.

Порядок роботи із демонстраційним прикладом

  1. Скопіюйте наведений код до файла з ім'ям sample.dpr і відкомпілюйте його у Delphi або скопіюйте до файла з ім'ям sample.pp і відкомпілюйте у FreePascal (у налаштуваннях вкажіть діалект Delphi).

  2. Запустіть Mendel і створіть новий проєкт, вказавши в ньому як бібліотеку задачі файл sample.dll. Запустіть задачу.

  3. Коли значення цільової функції наблизиться до -4189,8, зупиніть обчислення. Координати рішення можна переглянути на закладці 'Рішення' або у файлі звіту.