Первая страница
Наша команда
Контакты
О нас

    Головна сторінка



Дипломна робота на здобуття ступеня бакалавра з напряму підготовки 050102 «Комп'ютерна інженерія»

Скачати 225.09 Kb.

Дипломна робота на здобуття ступеня бакалавра з напряму підготовки 050102 «Комп'ютерна інженерія»




Скачати 225.09 Kb.
Дата конвертації30.03.2019
Розмір225.09 Kb.
ТипДиплом

Національний технічний університет України

«Київський політехнічний інститут

імені ІГОРЯ СІКОРСЬКОГО»

ФАКУЛЬТЕТ ПРИКЛАДНОЇ ІНФОРМАТИКИ

Кафедра системного програмування і спеціалізованих комп‘ютерних систем

«До захисту допущено»

Завідувач кафедри

__________ Тарасенко В.П.



(підпис) (ініціали, прізвище)

“___”_____________2017 р.



Дипломна робота

на здобуття ступеня бакалавра

з напряму підготовки 6.050102 «Комп'ютерна інженерія»


на тему: Метаеврестичний алгоритм оптимізації в неперервному просторі.

Виконав: студент IV курсу, групи КВ-31


Місік Дмитро Сергійович _________

(підпис)

Керівник доц., к.т.н. Зорін Ю.М. ________



(підпис)

Рецензент ст. викладач, Темнікова О.Л.



(підпис)

Засвідчую, що у цьому дипломному проекті немає запозичень з праць інших авторів без відповідних посилань.

Студент _____________

(підпис)
Київ – 2017 року

НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ УКРАЇНИ



«КИЇВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ
імені ІГОРЯ СІКОРСЬКОГО»

ФАКУЛЬТЕТ ПРИКЛАДНОЇ МАТЕМАТИКИ
Кафедра системного програмування і спеціалізованих комп‘ютерних систем
Рівень вищої освіти – перший (бакалаврський)
Напрям підготовки 6.050102 «Комп’ютерна інженерія»

ЗАТВЕРДЖУЮ

Завідувач кафедри

__________ Тарасенко В.П.



(підпис) (ініціали, прізвище)

«___» червня 2017 р.



ЗАВДАННЯ

на дипломну роботу студенту

Місіку Дмитру Сергійовичу



(прізвище, ім’я, по батькові)

1. Тема роботи Метаеврестичний алгоритм оптимізації в неперервному просторі,

керівник роботи доц., к.т.н. Зорін Юрій Михайлович,
затверджені наказом по університету від «19» травня 2017 р. №1574-с

2. Термін подання студентом роботи

3. Вихідні дані до роботи: оригінальний алгоритм квіткового запилення

4. Зміст пояснювальної записки



  • Аналіз існуючих рішень для розв’язання задачі глобальної оптимізації та обґрунтування теми дипломної роботи

  • Алгоритм квіткового запилення оптимізації в неперервному просторі

  • Опис програмних засобів

  • Аналіз отриманих результатів

5. Перелік графічного матеріалу (із зазначенням обов’язкових креслеників, плакатів, презентацій тощо)

  • Основні правила алгоритму.

  • Блок-схема модифікованого алгоритму. Схема алгоритму.

  • Діаграма класів. Схема алгоритму.

  • Таблиця результатів.

  • Презентація за темою роботи.

6. Дата видачі завдання

Календарний план

№ з/п

Назва етапів роботи та питань, які мають бути розроблені відповідно до завдання

Термін

виконання



Позначки керівника про виконання завдань

1.

Вивчення літератури та публікацій за тематикою роботи

10.12.2016




2.

Розроблення загальної структури алгоритму

15.01.2017




3.

Розроблення програмної реалізації алгоритму

16.02.2017




4.

Розробка схеми тестування алгоритму

13.03.2017




5.

Тестування та порівняльний аналіз алгоритму

30.03.2017




6.

Оптимізація та доробка програмної реалізації алгоритму

16.04.2017




7.

Підготовка матеріалів дипломної роботи

01.05.2017




8.

Оформлення документації дипломної роботи

15.05.2017




Студент ____________ ____________________



(підпис) (ініціали, прізвище)

Керівник роботи ____________ ____________________



(підпис) (ініціали, прізвище)


  1. ВИБІР ПРОГРАМНИХ ЗАСОБІВ

    1. Середовище та компоненти розробки


Visual Studio IDE – середовище розробки створене компанією Microsoft. Цей продукт дозволяє створювати програми мовою C#, C, C++, Python, F#, JavaScript та інші. Також в Visual Studio IDE можна створювати не лише консольні додатки, а також додатки, що містять десктопний графічний інтерфейс, наприклад, додатки з підтримкою Windows Forms, Windows Presentation Foundation, Universal Windows Platform. Також середовище розробки дозволяє створювати та підтримувати веб-сервіси, веб-сайти, веб-додатки та веб-служби.

Перша версія була розроблена в 1997 році та називалась Visual Studio 97. Була випущена в двох версіях – Enterprise та Professional. На той час середовище розробки не включало компонентів для розробки програм мовою C#.

Visual Studio IDE включає в себе багато засобів для розробки програм: редактор коду, компілятори та інтерпретатори різних мов програмування, засоби для відлагодження програм, засоби для роботи з SQL базами даних та інші засоби. Вбудований відлагоджувач дозволяє працювати не лише з високорівневим кодом, а і з машинними кодом, а також з проміжним кодом, що генерує компілятор мови C# - intermediate language (IL).

Також середовище розробки включає в собі засоби для візуального редагування форм, що значно спрощує створення десктопного графічного інтерфейсу програм.

Visual Studio дозволяє створювати та додавати плагіни, наприклад, для роботи з системами контролю версій, таких як Git, TFS.

Середовище розробки включає в себе декілька основних компонентів, які встановлюються разом з IDE:



  • Visual C++.

  • Visual C#.

  • Visual F#.

  • Visual Basic .NET.

Остання версій Visual Studio випущена у 2017 році і має назву Visual Studio 2017. Випущена у декількох виданнях: Community, Professional, Enterprise, Test Professional, Express.

Visual Studio Code – це редактору коду, що підтримує базові можливості середовища розробки, створений компанією Microsoft. Створений як легкий кросплатформений редактор веб-додатків. Поширюється безкоштовно і доступний для Windows, Linux та MacOS.

Створений цей редактор коду в 2016 році. Редактор підтримує створення та встановлення плагінів, тому редактор підтримує багато мов програмування, серед яких C#, JavaScript, TypeScript, PHP, C++/C, F#, CoffeeScript, Java, R, CSS, HTML, LESS, SASS, Objective C та інші. Остання версія Visual Studio Code випущена в березні 2017 року.

.NET Framework – програмна платформа, яку випустила компанія Microsoft в 2002 році. Основою платформи є платформа виконання програм Common Language Runtime (CLR). .NET Framework призначений для виконання програм написаних на різних мовах програмування. Платформа схожа на платформу Java компанії Sun Microsystems, що отримала велику популярність у кінці 1990-х [11].

Платформа .NET є технологією, що розрахована на роботу під операційною системою Microsoft Windows. Існують інші проекти, створенні не компанією Microsoft, що дозволяють запускати програми написанні на .NET Framework під іншими ОС, такими як Linux, MacOS – Mono, Portable.NET. На сьогоднішній день компанія Microsoft займається активною розробкою продовження цієї платформи, що отримало назву .NET Core, що створювалась з цілями кросплатформеної розробки програм.

Розробка .NET Framework розпочалась в 1999 році. Ціллю розробки було створити єдину платформу розробки під операційну систему Windows.

Архітектура .NET Framework описана в специфікації Common Language Infrastructure (CLI), що затверджена ISO та ECMA. Остання версія цього стандарту є CLI 3.5 [11].

Рис. 3.1.1. Стек технологій .NET Framework

Остання версія .NET Framework є 4.7, випущена 5 квітня 2017 року, встановлюється разом з Visual Studio 2017.

Мови, які підтримує .NET Framework:



  • C#

  • JScript .NET

  • F#

  • J#

  • Visual Basic .NET

Програма для .NET Framework, що написана на будь-якій мові програмування і підтримує цю платформу, спочатку переводиться в байт код, який називається Common Intermediate Language (CIL). Отриманий код називається збіркою (assembly). Далі код виконується віртуальною машиною Common Language Runtime (CLR). В основі віртуальної машини лежить JIT-компілятор (just in time), що відразу переводить байт-код у машині інструкції.

.NET Core є кросплатформеною реалізацією .NET Framework з відкритим кодом, розроблена компанією Microsoft. Перша версій цієї платформи випущена 27 червня 2016 року [12].

Для реалізації алгоритму обрано .NET Core через те, що програма, написана на .NET Core є кросплатформеною. Для побудови програми потрібно лише завантажити компілятор Roslyn, що є у відкритому коді на GitHub за посиланням https://github.com/dotnet/roslyn. Також програми, написанні на .NET Core займають менше місця, ніж на .NET Framework.

Збірка включає в себе інструкції, написанні IL та метадані. Збірка – це файл що включає в себе скомпільований код для платформи .NET. Виконувана збірка – це файл з розширенням EXE, звичайна збірка – це файл з розширенням DLL. Також збірки включають в себе метадані, що описують типи і дані, які використовуються в коді. Існує декілька видів збірок: приватні і роздільні; однофайлові і багатофайлові.

Приватна збірка – це найпростіший вид збірки. Вони призначенні для використання в межах одного програмного забезпечення. Тобто лише одна виконувана програма має доступ до певної приватної збірки. Код цієї збірки може бути використаним лише в межах цієї програми.

Процес розгортання приватних збірок дуже простий – треба лише покласти всі збірки програми в одну папку з виконуваним файлом.

Система дає гарантію, що приватні збірки не використає інша програма та не перезапише їх код.

Роздільні збірки – це іншими словами, бібліотеки загального призначення, що можуть бути використані іншим програмним забезпеченням. В зв’язку з цим виникає необхідність виключити певні ситуації, такі як колізія імен в різних збірках та ризик перезапису збірки на версію, що буде несумісна з програмним забезпеченням або іншим клієнтським кодом, що використовує цю збірку.

Перша проблема вирішується так: кожній збірці призначається унікальне ім’я, що встановлюється виконуваною програмою. Це ім’я називається строге ім’я, яке буде унікальним. До імені в збірці додається це строге ім’я і тоді кожне ім’я буде унікальним в рамках виконуваної програми.

Проблеми пов’язанні з перезаписом збірки вирішуються вказанням версії в маніфесті збірки. Виконувана програма, отримуючи ці дані вирішує, чи буде ця збірка сумісна с іншими збірками і виконуваною програмою.

Однофайлова збірка – це вид збірки, де в одному файлі знаходиться маніфест збірки, метадані і всі дані про типи і реалізації. Щоб створити однофайлову збірку, необхідно лише використати компілятор, викликавши його з командної строки або скористатися засобами середовища розробки Visual Studio 2005 або новішої версії.

Для того щоб створити збірку, використавши лише компілятор, необхідно викликати наступну команду – csc <ім`я модуля>. Наприклад, csc Hello.cs.

Багатофайлова збірка – це збірка, де в одному файлі обов’язково зберігається маніфест збірки, а інші – типи, реалізації і метадані. Щоб створити багатофайлову збірку, необхідно використати компілятор, вказавши головний файл з точкою входу (функція Main або WinMain) або використовуючи засоби середовища розробки Visual Studio 2005 або новішої версії, використовуючи Visual C++. Багатофайлові збірки використовуються в основному для об’єднання декількох модулі, написаних на різних мовах програмування.

C# - об’єктно-орієнтована мова програмування, розроблена компанією Microsoft. Розроблена мова групою інженерів, під керівництвом Андерса Хейлсберга, який написав перший компілятор мови Паскаль. Мова стандартизована ECMA та ISO.

C# відносять до мов, схожих на C++ та Java. Мова підтримує поліморфізм, перевантаження операторів, атрибути, властивості, анонімні функції, локальні функції, кортежі, замикання, Language Integrated Query (LINQ), виключення та їх обробку, події, ітератори, делегати [13].

Остання версія мови є версія 7.0, що випущена у березні 2017 року. Основними нововведеннями є підтримка кортежів, покращення літералів, шаблони, розширення списку повертаємих значень, локальні функції.

Перша версії мови C# випущена в лютому 2002 року, а розробка мови почалась ще в далекому 1998 році. Перша версія мови дуже нагадувала головного конкурента – мову Java, трохи їх розширюючи можливостями, яка мала мова C++ (перевантаження операторів, робота з вказівниками).

В розробці даної програми було використано багато патернів програмування, серед яких стратегія, фасад, медіатор, інтерфейс, шаблонний метод.

Стратегія – це поведінковий патерн програмування, завданням якого є визначення алгоритму в похідних класах через публічний інтерфейс. Це дозволяє змінювати алгоритм незалежно від клієнтів, що користуються цим алгоритмом.

Рис. 3.1.2. UML діаграма реалізації стратегії

Фасад – це структурний патерн програмування, що дозволяє об’єднати декілька малих підсистем в одну систему з єдиною точкою входу, що делегує ці виклики на підсистеми

Рис. 3.1.3. UML діаграма реалізації фасаду

Медіатор – це поведінковий патерн програмування, що забезпечує взаємодію між об’єктами шляхом слабкої зв’язності цих об’єктів.

Рис 3.1.4. UML діаграма реалізації медіатора

Інтерфейс – це шаблон програмування, що визначає публічні способи взаємодії з об’єктом

Шаблонний метод – це поведінковий патерн програмування, що визначає основу алгоритму і дозволяє класам-наслідникам змінювати його або використовувати, розширюючи існуючу поведінку, але не змінюючи її.



Рис. 3.1.5. UML діаграма реалізації шаблонного методу

Модульне тестування або юніт-тестування – тестування, метою якого є перевірка коректності роботи певних модулів програми. Юніт-тестування дозволяє покрити тестами нетривіальні шматки коду та у майбутньому переконатися, що зміни в цьому модулі не призвели до загальної зміни поведінки в вже відтестованих шматках програми. Це полегшує виявлення помилок і їх виправлення. Ціллю модульного тестування є ізоляція окремих частин програми, переконання в тому, що ці шматки програми працюють без помилок. Існує багато бібліотек для написання модульних тестів, наприклад, для мови C# це MSTest, NUnit, xUnit, Testdriven.NET, Moq, MbUnit.

Arrange-Act-Assert (AAA) – підхід до коректного написання тестів. Кожен тест повинен складатися з трьох частин:



  • Ініціалізація (Arrange) – створення всіх необхідних об’єктів, файлів.

  • Дія (Act) – певна взаємодія з об’єктом тестування

  • Перевірка (Assert) – порівняння очікуваних результатів з реальними

За гарним стилем програмування, один тест повинен мати лише одну перевірку і деякі пункти тесту можуть бути відсутні. Наприклад, якщо проводиться тестування методу, котрий є статичним і не приймає жодних аргументів, то блок ініціалізація може бути відсутнім.

Для тестування системи використану бібліотеку NUnit. Це відкрита бібліотека для тестування додатків, створених на .NET Framework.



using NUnit.Framework;

[TestFixture]
public class Example

{

[Test]

public void TestAreTrue()

{

Assert.IsTrue(true);

}
[Test]

public void TestAreCorrect()

{

// Arrange

var expected = 4;
// Act

var result = 2 + 2;
// Assert

Assert.AreEqual(expected, result, "should be 4");

}

}


Рис. 3.1.6. Приклад тестування на NUnit

Перевагами цього підходу є:



  • Явне відділення ініціалізації, дії та перевірки результату

  • Документування коду

Об’єктно-орієнтоване програмування – це методологія програмування, в основі якої лежить представлення всієї програми як набір взаємодіючих об’єктів, кожен з яких є в свою чергу екземпляром класу.

Основними поняттями об’єктно-орієнтованого програмування є:



  1. Інкапсуляція даних – це властивість класу об’єднати в собі стан (дані) та поведінку (методи);

  2. Наслідування – це властивість класу, що дозволяє створити клас на базі вже існуючого класу, перейнявши його поведінку та стан. Клас, який унаслідується називається батьківським, а клас, який наслідує є дочірнім;

  3. Поліморфізм – це властивість класу перевизначать існуючу поведінку класу, розширюючи її або повністю замінюючи;

  4. Абстракція – це виділення характеристик класу, що чітко визначають його і відрізняють від інших об’єктів;

  5. Клас – тип даних, що складається з даних, що описують стан, та методів обробки цих даних, що є поведінкою;

  6. Об’єкт – це екземпляр класу.

Об’єктно-орієнтована мова повинна включати в себе такі необхідні елементи:

  1. Оголошення сигнатури класу з даними і методами їх обробки;

  2. Вбудований механізм наслідування класу;

  3. Поліморфні змінні;

  4. Поліморфні методи.

Рефлексія – це одна з парадигм програмування, що означає процес в якому програма відслідковує та модифікує саму себе.

using System.Reflection
namespace ReflectionDemo {

public class Foo

{

public void F()

{

// Some actions

}

}
class Program

{

static void Main()

{

var foo = new Foo();
// without reflection

foo.F();
// with reflection

foo.GetMethod("F").Invoke(foo, null);

}

}

}


Рис. 3.1.7. Приклад використання рефлексії для виклику методу

Рефлексія використовується для динамічного відслідковування поведінки програми.

Рефлексійно-орієнтоване програмування включає в собі три частини: самоперевірку, самомодифікацію та самоклонування. Головною перевагою перед іншими парадигмами програмування є динамічна модифікація програми під час її виконання. Об’єктно-орієнтований, функціонально-орієнтований і процедурно-орієнтований підходи визначають, що послідовність дій і інструкцій визначена вже під час компіляції і під час виконання змінена не буде.

Серед плюсів рефлексії можна виділити такі:



  • Можна легко отримати значення всіх полів об’єкта;

  • В мові C# це єдиний метод отримання значення атрибуту;

  • Динамічне завантаження збірки;

  • Виконання приватних методів.

Але рефлексія має і ряд недоліків, серед яких:

  • Дуже знижує швидкодію програми;

  • Всі дії виконуються під час виконання;

  • Підвищується складність відлагодження програми.

Для збереження даних використовується спеціальний формат, що називається JavaScript Object Notation (JSON) – це текстовий формат збереження даних, що розроблений Дугласом Крофтом. Формат може використовуватись будь-якою мовою програмування, незалежно від того, що це формат запису об’єктів в мові програмування JavaScript.

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

JSON-формат представляє одну з двох структур:


  1. Набір ключ-значення (об’єкти, словники, хеш-таблиці, записи, структури, асоціативний масив);

  2. Впорядкований набір значень (масив, список, вектор, послідовність).

Значеннями можуть бути:

  1. Об’єкти – це невпорядкована пара значень ключ : значення, що обмежене фігурними дужками «{}»;

  2. Вектор – це впорядкована множина значень, що обмежена квадратними дужками «[]»;

  3. Число;

  4. Літерал – true/false/null;

  5. Рядок – це впорядковані символи, що обмеженні подвійними лапками.

{

"firstName": "Dima",

"age": 21,

"weight": 65.5,

"male": true,

"address": {

"city": "Kiev",

"postalCode": "51613"

},

"responsibilities": ["developer", "student"]

}


Рис. 3.1.8. Приклад JSON об’єкту

JSON-нотація активно розвивається та розширюється. Остання версія нотації була запропонована разом з появою нового стандарту ECMAScript 5 у 2016 році та отримала назву JSON 5. Серед нововедень є такі: пітримка коментарів, ключі об’єктів можна писати не в подвійних лапках, числа можуть бути записанні не тільки у десятковому вигляді, а і у шістнадцятковому.

Для запису результату виконання програми, використовувався широко відомий файловий формат CSV.

CSV (comma separated values) – файловий формат, котрий відповідає табличному представленню даних, де стовпці відділені крапкою з комою, а рядки відділені символом нового рядка. Цей формат використовується в основному для роботи з базами даних.

Наприклад, є таблиця наступного формату (табл. 3.1.10).

1

Data

Science

Information

A,b,c,d

next

Табл. 3.1.9. Приклад таблиці для конвертації в CSV

Ця таблиця матиме наступний вигляд у CSV форматі:



1,Data,Science

Information,”A,b,c,d,”,next



Рис. 3.1.10. Приклад контенту CSV файлу
    1. Опис основної програми


Для аналізу результатів роботи модифікованого алгоритму квіткового запилення створено дві програми: перша дозволяє вирішувати задачу оптимізації в неперервному просторі використовуючи модифікований алгоритм квіткового запилення, друга – використовуючи оригінальний алгоритм квіткового запилення.

Програма написана на C# і використовує .NET Core 1.1. Програма складається з трьох збірок:



  1. LevyFlight – збірка, що містить сам алгоритм та опис сутностей, необхідні для коректної роботи алгоритму;

  2. LevyFlight.AutoTests – консольний додаток, призначений для тестування алгоритму. В ньому можна задати параметри алгоритму, як вони будуть змінюватись, функцію оптимізації, кількість разів виконання алгоритму;

  3. LevyFlight.ConsoleApp – консольний додаток, призначений для одноразового запуску алгоритму, що містить реєстрацію всіх компонентів, необхідних для виконання програми.

Режим роботи програми та початкові параметри задаються в спеціальному JSON-файлі з назвою appsettings.json.

{

"AlgorithmSettings": {

"IsMin": true,

"VariablesCount": 30,

"PollinatorsCount": 10,

"GroupsCount": 15,

"MaxGeneration": 150,

"P": "0.85"

},

"TestedFunction": "AckleyFunction",



"UseLogger": true

}


Рис 3.2.1. Структура файлу appsettings.json

Якщо виконувана програма побудована на основі збірки LevyFlight.AutoTests, тоді файл appsettings.json генерується автоматично на основі параметрів, заданих у коді. Якщо виконувана програма побудована на основі збірки LevyFlight.ConsoleApp, тоді ці параметри користувач може вказати самостійно у файлі appsettings.json.

Серед параметрів, які можна вказати в файлі є такі:


  • Об’єкт AlgorithmSettings:

    • IsMin – булева змінна, якщо значення true, тоді виконується пошук глобального мінімуму, інакше – максимуму;

    • VariablesCount – кількість змінних функції оптимізації;

    • PollinatorsCount – кількість запилювачів в групі;

    • GroupsCount – кількість груп запилювачів;

    • MaxGeneration – кількість ітерацій алгоритму;

    • P – ймовірність глобального запилення;

  • TestedFunction – функція оптимізації. Серед можливих функцій є:

    • AckleyFunction

.

    • GriewankFunction

.

    • RastriginFunction

.

    • RosenbrockFunction

.

    • SphereFunction

.

  • UseLogger – булева змінна, значення true означає що результат роботи програми буде записуватись в консоль та файл.

Якщо необхідно знайти мінімум іншої функцію, то треба створити в збірці LevyFlight новий клас, наслідувати його від інтерфейсу IFunctionStrategy та реалізувати цей інтерфейс. Метод Apply цього інтерфейсу приймає на вхід аргументи функції та повертає її значення. Додатково до цих дій треба зареєструвати цей компонент в збірці LevyFlight.ConsoleApp.

Програма дозволяє записувати результат її виконання в файл. Назва файлу має такий формат: [день][місяць][рік][година][хвилина][секунда].log. Наприклад, «05232017120815.log». У файл записується результат виконання кожного кроку алгоритму. А саме, час початку роботи алгоритму, мінімальне значення функції по кожній групі, початок нового кроку алгоритму, в кінці алгоритму краще рішення, час завершення роботи алгоритму, час, що пройшов від початку до кінця роботи алгоритму. В консоль записується лише час початку роботи алгоритму, знайдене краще рішення, час завершення та час роботи алгоритму.

Програма, побудована на основі збірки LevyFlight.AutoTests будує файл appsettings.json використовуючи стан об’єктів класу NumericSettingField. Клас можна ініціалізувати за допомогою трьох конструкторів:


  1. З одним параметром типу double – конструктор, що створює об’єкт з постійним значенням параметру алгоритму. Це означає що під час тестування, значення цього параметру не буде змінюватись і буде дорівнювати значенню, вказаному при ініціалізації;

  2. З трьома параметрами типу double – конструктор, що створює об’єкт зі зміним значенням параметра алгоритму, де перший параметр – початкове значення, другий – кінцеве значення, третій – крок;

  3. З чотирма параметрами типу double і одним параметром типу bool – узагальнений конструктор, де перший параметр – початкове значення, другий – кінцеве значення, третій – крок, четвертий – фіксоване значення, останній – якщо вказано true, то цей алгоритм є незмінним, інакше – змінним.

Рис. 3.2.2. Структура класу NumericSettingField

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

NumericSettingField VariablesCount = new NumericSettingField(2, 30, 2, 10, true);

NumericSettingField PollinatorsCount = new NumericSettingField(5, 20, 5, 5, false);

NumericSettingField GroupsCount = new NumericSettingField(2, 30, 2, 15, true);

NumericSettingField MaxGeneration = new NumericSettingField(100, 100, 100, 1000, true);

NumericSettingField P = new NumericSettingField(0.8, 0.9, 0.05, 0.85, true);

Рис. 3.2.3. Приклад ініціалізації об’єктів, що є параметрами алгоритму у збірці LevyFlight.AutoTests

Серед всіх параметрів алгоритму повинен бути обов’язково один змінний параметр, інакше програма згенерує виключення. Якщо таких параметрів буде декілька, то програма буде вважати лише один із них змінним, всі інші – фіксованими.

Програма будує файл appsettings.json за такими правилами:


  1. Використовуючи рефлексію, знаходить всі об’єкти в збірці типу NumericSettingField;

  2. Знаходить перший змінний параметр та перевіряє чи менше його значення ніж кінцеве. Якщо більше, то тестування завершується;

  3. Отримує наступне значення змінного параметру. За отримання коректного значення відповідальність несе сам об’єкт NumericSettingField;

  4. Записує в JSON-файл поточні значення всіх параметрів, де ключем є ім’я змінної, а значенням – значення відповідного об’єкту NumericSettingField. Результатом є JSON-об’єкт, записаний в appsettings.json.

Ім’я функції оптимізації вказується в файлі functionName.json

{

"TestedFunction": "SphereFunction"

}


Рис. 3.2.4. Структура файлу functionName.json

Дозволені ім’я функцій такі самі, як і ім’я функцій в файлі appsettings.json. Якщо ввести некоректне ім’я функції, то програма згенерує виключення.

Також в цій збірці є об’єкт RepeatNumbers, який дозволяє вказати скільки разів буде запущено алгоритм, не змінивши вищезгадані параметри алгоритму. Після вказаної кількості разів у консоль буде записано середній результат по всім запускам алгоритму і параметри, з яким алгоритм запускався (рис. 3.2.6).

Рис 3.2.5. Інтерфейс додатку побудованого на основі збірки LevyFlight.AutoTests



Рис 3.2.6. Інтерфейс додатку побудованого на основі збірки LevyFlight.ConsoleApp

Основна програма (збірка LevyFlight) складається з таких класів:


  • Pollinator – клас що описує одного запилювача. Містить поточне рішення на кроці , пораховане наступне рішення на кроці , методи, що виконують обчислення наступного рішення за двома вітками алгоритму. Також містить в собі метод перевірку, який в разі наявності коренів, що є не числовим значенням (наприклад, нескінченість або значення NaN) повертають програмне виключення. В додаток до цього, є методи, що повертають поточне значення функції та методи, що повертають цей клас у вигляд, придатний до запису в файл.

Рис. 3.2.7. Структура класу Pollinator



  • PollinatorsGroup – клас, що реалізує стандартний .NET інтерфейс IEnumerable
    . Цей клас є колекцією класів Pollinator.

Рис. 3.2.8. Структура класу PollinatorsGroup



  • AlgorithmSettings – модель, що описує частину об’єкту, який зчитується з файлу appsettings.json. Після зчитування, поля об’єкту зв’язуються з полями екземпляру цього класу.

Рис. 3.2.9. Структура класу AlgorithmSettings



  • AppSettings – модель, що описує весь об’єкт, який зчитується з файлу appsettings.json. Як і в попередньому випадку, поля об’єкту зв’язуються з полями екземпляру цього класу.

Рис 3.2.10. Структура класу AppSettings



  • IFunctionStrategy – інтерфейс, що дозволяє реалізувати нові функції тестування. Має один метод Apply, який на вхід приймає аргументи функції, а виходом є значення цієї функції.

Рис 3.2.11. Структура інтерфейсу IFunctionStrategy



  • FunctionFacade – клас, що інкапсулює в собі декілька функцій, а саме функцію оптимізації, функцію, що обчислює відстань між запилювачами, лямбда функцію, що необхідна для обчислення випадкової величини для глобального запилення.

Рис. 3.2.12. Структура класу FunctionFacade



  • LevyFlightAlgorithm – клас, в якому описано алгоритм. Клас інкапсулює в собі всі групи запилювачів, параметри алгоритму (екземпляр класу AlgorithmSettings). Містить наступні методи:

    • PollinateAsync – виконує весь алгоритм та повертає знайдене найкраще рішення;

    • PolinateOnceAsync – виконує лише одну ітерацію алгоритму;

    • PostOperationAction – перевірка, що виконується після кожного кроку алгоритму. Перевіряється чи стало нове рішення кращим за попереднє, якщо стало, то замінюється нове старим, а також перевіряється, чи немає серед коренів нескінченності або NaN.

    • GoFirstBranchAsync – виконання алгоритму по першій гілці (глобальне запилення)

    • GoSecondBranch – виконання алгоритму по другій гілці (локальне запилення)

Рис. 3.2.13. Структура класу LevyFlightAlgorithm



  • LevyFlightAlgorithmLogger – клас, що наслідує LevyFlightAlgorithm та розширює його тим, що записує результат виконання програми у файл та частково у консоль.

Рис. 3.2.14. Структура класу LevyFlightAlgorithmLogger



  • PollinatorAnalyzer клас, що знаходить краще рішення в групі або краще рішення серед усіх груп.

Рис. 3.2.15. Структура класу PollinatorAnalyzer



  • ConfigurationService – клас, що містить налаштування алгоритму, виконує зчитування даних з файлу appsettings.json, створює файл, у який буде виконуватись запис результатів покрокового виконання алгоритму.

Рис. 3.2.16. Структура класу ConfigurationService



  • RandomGeneratorклас, що містить генератор псевдовипадкових чисел

Рис. 3.2.17. Структура класу RandomGenerator



  • TimeCounter – клас, що підраховує час виконання алгоритму. Містить методи Start та End, які необхідно виконати відповідно перед початком алгоритму та після закінчення для того, щоб отримати час виконання алгоритму.

Рис. 3.2.18. Структура класу TimeCounter


СПИСОК ВИКОРИСТАНОЇ ЛІТЕРАТУРИ


  1. L. X. Li, Z. J. Shao and J. X. Qian, “An optimizing Method based on Autonomous Animals: Fish Swarm Algoritm”, System Engineering Theory & Practice, 2002.

  2. S. L. Ukasik and AK. SÃlawomirZ, “Firefly algorithm for Continuous Constrained Optimization Tasks”, 1st International Confernce on Computational Collective Intelligence, Semantic Web, Social Networks and Multiagent Systems, Springer-Verlag Berlin, Heidelberg, pp.169-178, 2009.

  3. X. S. Yang, “Nature-Inspired Metaheuristic Algorithms”, Luniver Press, 2008.

  4. X. S. Yang, “A New Metaheuristic Bat-Inspired Algorithm”, Department of Engineering, University of Cambridge, Trumpington Street, Cambridge CB2 1PZ, UK, 2010.

  5. K. E. Parsopoulos and M. N. Vrahatis, “Particle Swarm Optimization and Intelligence”, Information Science Reference, Hershey, New-York, 2010

  6. T. P. Gill, “The Doppler Effect. An Introduction To The Theory of the Effect”, Logos Press, Academic Press, 1965.

  7. X. S. Yang, Flower Pollination Algorithm for Global Optimization. Department of Engineering, University of Cambridge, Trumpington Street, Cambridge CB2 1PZ, UK, 2013.

  8. N. Diab, “Recent Advances in Flower Pollination Algorithm”, International Journal of Computer Applications Technology and Research Volume 5– Issue 6, 338 - 346, 2016, ISSN:- 2319–8656

  9. S. Lukasik and P. A. Kowalski, “Study of Flower Pollination Algorithm for Continuous Optimization”, Department of Automatic Control and Information Technology, Cracow University of Technology, 2016

  10. Y. Zhou, R. Wang and Q. Luo, “Elite opposition-based flower pollination algorithm”, College of Information Science and Engineering, Guangxi University for Nationalities, Nanning 530006, China, 2016

  11. J. Richter, Applied Microsoft Windows .NET Framework Programming, Microsoft Press, A Division of Microsoft Corporation, One Microsoft Way, Redmond, Washington, 2002

  12. C. Nagel, Professional C# 6 and .NET Core 1.0, O’Reilly Media, Wiley, New-York, 2016

  13. J. Greenee, A. Stellman, Head First C#, 3rd Edition, O’Reilly Media, Boston, 2013

  14. Д. Місік, Ю. Зорін. Модифікований алгоритм квіткового запилення для розв’язання задачі глобальної оптимізації, Національний технічний університет України «Київський політехнічний інститут» ім. І. Сікорського, 2017





Скачати 225.09 Kb.

  • ВИБІР ПРОГРАМНИХ ЗАСОБІВ
  • Опис основної програми
  • СПИСОК ВИКОРИСТАНОЇ ЛІТЕРАТУРИ