Міністерство освіти і науки України Національний технічний університет України «Київський політехнічний інститут імені Ігоря Сікорського» Кафедра АСОІУ Спеціальність 126 «Інформаційні системи та технології» КУРСОВА РОБОТА з дисципліни “Додаткові розділи дослідження операцій” на тему «Задача про рюкзак» Виконали Прийняли студент групи ІС-72 Доц. каф. АСОІУ, к.т.н. Корнієнко В.С. ЖДАНОВА О.Г. N зал. кн. ІС-7211 __________________________ ________________________ (підпис) студент групи __________________ (оцінка) ІС-72 __________________________ N зал. кн. ІС-7230 (підпис) Доц. каф. АСОІУ, к.т.н. ПОПЕНКО В.Д. Шинягін М.Д. ________________________ (підпис) (підпис) __________________ (оцінка) Доц. каф. АСОІУ, к.т.н. СПЕРКАЧ М.О. __________________________ (підпис) Київ-2020 Національний технічний університет України «Київський політехнічний інститут імені Ігоря Сікорського» (назва вищого навчального закладу) Кафедра Дисципліна Спеціальність АСОІУ Додаткові методи дослідження операцій 126 Інформаційні системи та технології Курс 3 Група ІС-72 Семестр 6 ЗАВДАННЯ НА КУРСОВУ РОБОТУ СТУДЕНТУ Корнієнку Владиславу Сергійовичу Шинягіну Максиму Дмитровичу 1. Тема роботи Задача про рюкзак 2. Термін здачі студентом закінченої роботи 30 травня 2020 року 3. Завдання курсової роботи Вид робіт Побудувати математичну модель задачі. Виконати аналіз можливих методів розв’язання Розробити жадібний алгоритм (ЖА) розв’язання задачі. Розробити алгоритм методу гілок та меж (МГтаМ) розв’язання задачі. Розробити ймовірнісний алгоритм (ЙА) розв’язання задачі. Розробити алгоритм динамічного програмування Пападімітріу (АДПП) розв’язання задачі. Виконавець Корнієнко В., Шинягін М.. Корнієнко В., Шинягін М.. Корнієнко В. Виконати програмну реалізацію ЖА. Виконати програмну реалізацію алгоритму МГтаМ. Виконати програмну реалізацію ЙА. Виконати програмну реалізацію алгоритму АДПП. Визначити складність розроблених алгоритмів (теоретичну та експериментальну Програмно реалізувати генератор індивідуальних задач (ГІЗ) Використовуючи ГІЗ, виконати порівняльний аналіз розроблених алгоритмів Корнієнко В. Корнієнко В. Шинягін М.. Шинягін М.. Корнієнко В Шинягін М.. Шинягін М.. Корнієнко В., Шинягін М.. Корнієнко В., Шинягін М.. Корнієнко В., Шинягін М.. 4. Зміст розрахунково-пояснювальної записки Змістовні постановки задачі. Математична постановка задачі. Аналіз можливих методів розв’язання. Опис розроблених алгоритмів розв’язання задачі. Опис програмної реалізації розроблених алгоритмів. Приклади застосування алгоритмів. Оцінка складності розроблених алгоритмів. Результати порівняльного аналізу розроблених алгоритмів. Висновки. 5. Перелік графічного матеріалу (с точним зазначенням обов’язкових креслень) 6. Дата видачі завдання 20 лютого 2020 року КАЛЕНДАРНИЙ ПЛАН Назва етапів виконання курсової № Строк виконання роботи етапів роботи 1 2 Опис постановки задачі Консультація у керівника 01.03 05.03 3 Пошук літературних джерел за темою курсової роботи. Порівняльний аналіз існуючих методів розв’язання задачі 15.03 4 Вивчення теоретичних положень ЖА, МГтаМ, ЙА та АДПП 31.03 5 6 7 8 9 10 11 Розробка ЖА розв’язання задачі. Розробка ЙА розв’язання задачі. Розробка АДПП розв’язання задачі. Розробка алгоритму МГтаМ розв’язання задачі Розв’язання задач “вручну” Консультація в керівника – погодження інтерфейсу програми Розробка програмної реалізації. Відлагодження програм. Оцінка складності алгоритмів розв’язання задачі Оформлення пояснювальної записки Захист курсової роботи Студенти Корнієнко В.С. (підпис) (прізвище, ініціали) Шинягін М.Д. (підпис) Керівник (прізвище, ініціали) Жданова О. Г. (підпис) «20» лютого 2020 року (прізвище, ініціали) 10.04 15.04 15.04 10.05 15.05 20.05 31.05 Примітка РЕФЕРАТ Пояснювальна записка до курсової роботи: 48 с., 36 рис., 4 табл., 10 джерел. Предмет дослідження: задача про рюкзак. Мета роботи: дослідження існуючих алгоритмів рішення задачі про рюкзак. Порівняльний аналіз роботи алгоритмів. Суть задачі про рюкзак в тому, щоб для заданої множини предметів, кожен з яких має вагу і цінність, визначити яку кількість кожного з предметів слід взяти, так, щоб сумарна вага не перевищувала задану, а сумарна цінність була максимальною. Для порівняння було обрано чотири алгоритми: жадібний алгоритм, метод гілок та меж, ймовірнісний алгоритм, алгоритм динамічного програмування. Були розраховані складності алгоритмів вирішення задачі. Результат роботи методу гілок та меж виявився кращим за очікуваний теоретичний. Жадібний алгоритм продемонстрував невеликий час роботи в порівнянні з іншими алгоритмами, проте він не гарантує знаходження оптимального результату. Зміст ВСТУП ............................................................................................................................................. 7 1 2 ПОСТАНОВКА ЗАДАЧІ ............................................. Ошибка! Закладка не определена. 1.1 Змістовна постановка задачі ................................ Ошибка! Закладка не определена. 1.2 Математична постановка задачі........................... Ошибка! Закладка не определена. 1.3 Постановка індивідуальної задачі ....................... Ошибка! Закладка не определена. 1.4 Математична постановка індивідуальної задачі Ошибка! Закладка не определена. ОПИС МЕТОДІВ РОЗВ’ЯЗАННЯ ЗАДАЧІ .......................................................................... 8 2.1 Існуючі методи розв'язання ................................................................................................ 12 2.1.1 Повний перебір ............................................................................................................. 12 2.1.2 Генетичні алгоритми .................................................................................................... 12 2.1.3 Метод гілок і меж ......................................................................................................... 13 2.2 Розробка жадібного алгоритму розв’язання задачі......................................................... 13 2.3 Опис методу гілок та меж ............................................................................................... 14 2.4 Опис алгоритму динамічного програмування .............................................................. 15 2.5 Опис ймовірнісного алгоритму ...................................................................................... 17 2.6 Приклади застосування розроблених алгоритмів ........................................................ 17 2.6.1 Жадібний алгоритм ................................................................................................... 17 2.6.2 Метод гілок та меж .................................................................................................... 18 2.6.3 Алгоритм динамічного програмування ................................................................... 20 2.6.4 Ймовірнісний алгоритм .................................. Ошибка! Закладка не определена. 3 ОПИС ПРОГРАМНОГО ПРОДУКТУ.................................................................................. 22 3.1 Опис функціональної моделі .......................................................................................... 22 3.2 Рішення з інформаційного забезпечення ...................................................................... 22 3.2.1 Вхідні дані .................................................................................................................. 22 3.2.2 Вихідні дані ................................................................................................................ 23 3.2.3 Опис інформаційного забезпечення ........................................................................ 25 3.3 Рішення з програмного забезпечення ............................................................................ 25 3.3.1 Опис обраних засобів розробки ............................................................................... 25 3.3.2 Архітектура програмного забезпечення .................................................................. 26 3.4 Керівництво користувача ............................................................................................... 30 3.4.1 Інструкція користувача ............................................................................................. 30 3.4.2 Методика випробувань ............................................................................................. 34 4 Дослідження розроблених алгоритмів.................................................................................. 35 4.1 Приклади розв’язання задач розробленим програмним забезпеченням ................... 35 4.1.1 Вирішення індивідуальної задачі ............................................................................. 35 4.1.2 Вирішення задач достаньої розмірності .................................................................. 36 4.1.3 Вирішення задачі максимально можливої розмірності ......................................... 41 4.2 Часова складність алгоритмів ........................................................................................ 43 ВИСНОВКИ................................................................................................................................... 48 ПЕРЕЛІК ПОСИЛАНЬ ................................................................................................................. 49 ВСТУП Задача, що розглядається у даній роботі – це задача про рюкзак. Одна з її варіацій містить наступне формулювання: Дано n предметів і рюкзак ємністю (максимальною вагою) V. Нехай заданий об’єм (вага) aj >0 та вартість (важливість) cj >0 для j-ого предмету, j=1,2,…,n. Необхідно визначити з набору даних предметів варіант заповнення , щоб сумарна вага (об’єм) не була більшою за максимальну вагу (ємність), а сумарна вартість була максимальною. Ця задача має наступні області використання: Фінанси (пошук найкращого балансу між ризиками та ефективністю вкладів, генерування ключів для криптосистем); кроєння різних матеріалів (вибір оптимальної схеми розкрою матеріалів з метою зменшення кількості відходів); завантаження човна або літака (вибір багажів для оптимального завантаження транспортного засобу); розміщення вантажів на складі мінімальної площі. В даній роботі ця задача розв'язується наступними алгоритмами: метод гілок та меж, ймовірнісний алгоритм, метод динамічного програмування, жадібний алгоритм. 1 1.1 ПОСТАНОВКА ЗАДАЧІ Змістовна постановка задачі Задача про рюкзак Дано n предметів і рюкзак ємністю (максимальною вагою) V. Нехай заданий об’єм (вага) aj >0 та вартість (важливість) cj >0 для j-ого предмету, j=1,2,…,n. Необхідно визначити з набору даних предметів варіант заповнення , щоб сумарна вага (об’єм) не була більшою за максимальну вагу (ємність), а сумарна вартість була максимальною. 1.2 Математична постановка задачі Змінні 𝑉 − максимальна вага рюкзака 𝑛 − кількість предметів 𝑎𝑗 − вага 𝑗 − го предмету, 𝑗 = 1,2, … , 𝑛 𝑐𝑗 − вартість (важливість) 𝑗 − го предмету, 𝑗 = 1,2, … , 𝑛 Обмеження Обмеження на максимальну вагу рюкзака: n a jxj V, j 1 x j {1,0}, j 1, n aj > 0, cj > 0, j = 1,n . Цільова функція Необхідно заповнити рюкзак набором предметів з найбільшою загальною вартістю n c j x j max j 1 1.3 Постановка індивідуальної задачі Задача 1. Дано n = 4 предметів і рюкзак ємністю (максимальною вагою) V = 10. № предмету a (вага) c (вартість) 1 4 40 2 7 42 3 5 25 4 3 12 Необхідно визначити з набору даних предметів варіант заповнення , щоб сумарна вага (об’єм) не була більшою за максимальну вагу (ємність), а сумарна вартість була максимальною. Задача 2. Дано n = 5 предметів і рюкзак ємністю (максимальною вагою) V = 16. № предмету a (вага) c (вартість) 1 5 50 2 9 99 3 2 18 4 3 15 5 7 42 Необхідно визначити з набору даних предметів варіант заповнення , щоб сумарна вага (об’єм) не була більшою за максимальну вагу (ємність), а сумарна вартість була максимальною. 1.4 Математична постановка індивідуальної задачі Задача 1. Змінні 𝑉 = 10 − максимальна вага рюкзака 𝑛 = 4 − кількість предметів 𝑎𝑗 , 𝑐𝑗 − дані з таблиці, 𝑗 = 1,2, … , 𝑛 Обмеження Обмеження на максимальну вагу рюкзака: 4𝑥1 + 7𝑥2 + 5𝑥3 + 3𝑥4 ≤ 10, ̅̅̅̅ 𝑥𝑗 ∈ {1,0}, 𝑗 = 1,4 Цільова функція Необхідно заповнити рюкзак набором предметів з найбільшою загальною вартістю 40𝑥1 + 42𝑥2 + 25𝑥3 + 12𝑥4 → 𝑚𝑎𝑥 ̅̅̅̅ 𝑥𝑗 ∈ {1,0}, 𝑗 = 1,4 Допустимі Розв’язки № предмету a (вага) c (вартість) 2 7 42 4 3 12 Загальна вартість 54. № предмету a (вага) c (вартість) 1 4 40 3 5 25 Загальна вартість 65. Задача 2. Змінні 𝑉 = 16 − максимальна вага рюкзака 𝑛 = 5 − кількість предметів 𝑎𝑗 , 𝑐𝑗 − дані з таблиці, 𝑗 = 1,2, … , 𝑛 Обмеження Обмеження на максимальну вагу рюкзака: 5𝑥1 + 9𝑥2 + 2𝑥3 + 3𝑥4 + 7𝑥5 ≤ 16, ̅̅̅̅ 𝑥𝑗 ∈ {1,0}, 𝑗 = 1,5 Цільова функція Необхідно заповнити рюкзак набором предметів з найбільшою загальною вартістю 50𝑥1 + 99𝑥2 + 18𝑥3 + 15𝑥4 + 42𝑥5 → 𝑚𝑎𝑥 ̅̅̅̅ 𝑥𝑗 ∈ {1,0}, 𝑗 = 1,5 Допустимі Розв’язки № предмету a (вага) c (вартість) 2 9 99 5 7 42 Загальна вартість 141. № предмету a (вага) c (вартість) 1 5 50 3 2 18 4 3 15 Загальна вартість 83. 2 ОПИС МЕТОДІВ РОЗВ’ЯЗАННЯ ЗАДАЧІ 2.1 Існуючі методи розв'язання 2.1.1 Повний перебір Як і для інших дискретних задач, задачу про рюкзак можна вирішити, повністю перебравши всі можливі рішення. Припустимо, є N предметів, які можна укладати в рюкзак. Потрібно визначити максимальну вартість вантажу, вага якого не перевищує W. Для кожного предмета існує 2 варіанти: предмет або кладеться в рюкзак, або ні. Тоді перебір всіх можливих варіантів має тимчасову складність O (2 ^ N), що дозволяє його використовувати лише для невеликої кількості предметів. З ростом числа предметів задача не може бути розв&#39;язаною даним методом за прийнятний час. 2.1.2 Генетичні алгоритми Вони не гарантують знаходження оптимального рішення за поліноміальний час і не дають оцінку близькості рішення до оптимального, але володіють хорошими часовими показниками, дозволяючи знайти досить гарне рішення швидше за інші відомих детермінованих або евристичних методів. Кожна особина (генотип) являє собою підмножину предметів, які ми хочемо упакувати в ранець (їх загальна вага може перевищити допустиму вантажопідйомність). Для зручності інформація зберігається у вигляді бінарних рядків, в яких кожен біт визначає, чи поміщається цей предмет в ранець. Функція пристосованості визначає близькість рішення до оптимального. Наприклад, такою може служити сумарна цінність предметів, за умови, що сумарна вага не перевищує вантажопідйомність. Після серії змін поколінь, в яких схрещуються найбільш пристосовані особини і ігноруються залишилися, алгоритм, за припущенням, має поліпшити вихідні рішення 2.1.3 Метод гілок і меж Оригінальний алгоритм, запропонований Пітером Колесаром в 1967 році, пропонує впорядкувати предмети по їх питомої вартості (стосовно цінності до ваги) і будувати дерево повного перебору. Його поліпшення полягає в тому, що в процесі побудови дерева, для кожного вузла ми оцінюємо верхню межу цінності рішення, і продовжуємо будувати дерево тільки для вузла з максимальною оцінкою. Коли максимальна верхня межа виявляється в листі дерева, алгоритм закінчує свою роботу. Здатність методу гілок і меж зменшувати кількість варіантів перебору сильно спирається на вхідні дані. Його доцільно застосовувати лише в тому випадку, коли питомі цінності предметів значно відрізняються. 2.2 Розробка жадібного алгоритму розв’язання задачі Маємо наступну ідею жадібного алгоритму: упорядковуємо речі за їх питомою цінністю, та кладемо в рюкзак речі з найбільшою питомою цінністю. Вхід: 𝑆 = {1, 2, … , 𝑛} – множина предметів; 𝑎1 , 𝑎2 , … 𝑎𝑛 – ваги предметів; : 𝑐1 , 𝑐2 , … 𝑐𝑛 – вартість (важливість) предметів; 𝑉 – максимально допустима вага рюкзака Вихід: множина 𝐹 ⊆ 𝑆 a(𝐹) − сумарна вага предметів множини F. Упорядкувати предмети так, що 𝑐1 𝑎1 ≥ 𝑐2 𝑎2 ≥ 𝑐3 𝑎3 ≥… ≥ 𝑐𝑛 𝑎𝑛 Покласти 𝐹 ≔ for i := 1 to n do // Якщо в рюкзаку ще є місце, додаємо найкориснішу річ, // яка в нього поміщається if (V−𝒂(𝐹) ≤ 𝑎𝑖 ) then 𝐹 ≔ 𝐹 ⋃ { i } end 2.3 Опис методу гілок та меж Для даного методу необхідно побудувати бінарне дерево станів. Кожен вузол на рівні 0 <= i <= n представляє всі підмножини з n елементів, які включають певний вибір з перших і впорядкованих елементів. Даний частковий вибір однозначно визначається шляхом від кореня до вузла: гілка,що спрямована вліво, вказує на включення чергового елементу в підмножину, в той час як права гілка вказує на відсутність даного елементу в підмножині. Ми записуємо загальну вагу та вартість вибору разом з верхньою межею для будь-якої підмножини, яка може бути отримана шляхом додавання деяких елементів(або жодних) до цього вибору. У найгіршому випадку алгоритм генерує всі проміжні стадії і всі стани. Тоді часова складність алгоритму дорівнює O (2n). Вхід: 𝑆 = {1, 2, … , 𝑛} – множина предметів; 𝑎1 , 𝑎2 , … 𝑎𝑛 – ваги предметів; 𝑐1 , 𝑐2 , … 𝑐𝑛 – вартість (важливість) предметів; 𝑉 – максимально допустима вага рюкзака Вихід: множина 𝐹 ⊆ 𝑆 a(𝐹) − сумарна вага предметів множини F. Упорядкувати предмети так, що 𝑐1 𝑎1 ≥ 𝑐2 𝑎2 ≥ 𝑐3 𝑎3 ≥… ≥ 𝑐𝑛 𝑎𝑛 Вирахувати верхню межу для кореня дерева (початкового стану) Додаємо в чергу корінь дерева while ( черга не пуста ) do Беремо перший елемент з черги і поміщаємо його в node if ( верхня оцінка node > цінність найкращого стану AND висота node < кількість предметів в рюкзаку на поточному кроці - 1) створюємо стан – with вага with += вага поточного предмету if ( вага with <= V ) кладемо в рюкзак поточний предмет Sвисота_поточного_стану цінність with += цінність поточного предмету Вирахувати верхню межу для with if ( цінність with > цінність найкращого стану ) найкращий стан = with if ( верхня оцінка with > цінність найкращого стану ) додати в чергу with створюємо стан – without Вирахувати верхню межу для without if ( верхня оцінка without > цінність найкращого стану) додати в чергу without end 2.4 Опис алгоритму динамічного програмування Задача пакування рюкзака має властивість суб-оптимальної структури, тобто, можна знайти оптимальний розв'язок задачі з 𝑖 змінними на основі розв'язку задачі з 𝑖 − 1 змінною. Ця властивість дозволяє застосувати засоби динамічного програмування для розв'язання задачі пакування рюкзака. Нехай потрібно розв'язати 0-1 задачу пакування рюкзака. Позначимо через KP(i, c) максимальну вартість, яку можна отримати для перших 𝑖 предметів із загальною вагою меншою або рівною c. Задача пакування рюкзака зводиться до знаходження KP(n, W). Ідея полягає в тому, що оптимальний розв'язок задачі KP(i, c) можна отримати, використовуючи розв'язки двох простіших задач: задачі з 𝑖 − 1 змінними для рюкзака з такою ж ємністю c (KP(i−1, c)), та 𝑥𝑖 = 0; задачі з 𝑖 − 1 змінними для рюкзака з ємністю 𝑐 − 𝜔𝑖 (𝐾𝑃(𝑖 − 1, 𝑐 − 𝜔𝑖 )) , та 𝑥𝑖 = 1. Розв'язок задачі пакування рюкзака з 0 змінними (KP (0 ,*)) дорівнює нулю. Розв'язок задачі пакування рюкзака при c=0 (KP (* ,0)) також дорівнює нулю. Тепер можна записати 𝐾𝑃(𝑖, 𝑐) рекурсивно: 𝐾𝑃(0, 𝑐) = 0, 0 ≤ 𝑐 ≤ 𝑊 𝐾𝑃(𝑖, 0) = 0, 0 ≤ 𝑖 ≤ 𝑛 𝐾𝑃(𝑖, 𝑐) = 𝐾𝑃(𝑖 − 1, 𝑐), якщо 𝜔𝑖 > 𝑐 (новий предмет важчий, ніж поточний резерв ваги) 𝐾𝑃(𝑖, 𝑐) = max(𝐾𝑃(𝑖 − 1, 𝑐), 𝐾𝑃(𝑖 − 1, 𝑐 − 𝜔𝑖 ) + 𝑝𝑖 ), якщо 𝜔𝑖 ≤ 𝑐. Потім будується таблиця T[i, c], елементи якої містять значення розв'язків задач KP(i, c) в наступний спосіб: для c від 0 до W робити T[0,c] := 0 кінець для для i від 1 до n робити для c від 0 до W робити якщо c>=w[i] то T[i,c] := max( T[i-1,c], T[i-1, c-w[i]] + p[i] ) інакше T[i,c] := T[i-1,c] кінець якщо кінець для кінець для вивести T[n,W] Коли таблиця побудована, випадок задачі T[n, W] слід звести до випадку T[0, *]. Часова складність алгоритму дорівнює O(nW). Алгоритм має дві переваги: 1. Швидкість; 2. Не потрібне сортування змінних. та недолік: 1. вимагає порівняно багато пам'яті (що робить його не прийнятним для розв'язання великих задач). Цей метод було розроблено Робертом Ґарфінкелем та Джорджем Немгаузером в 1972 році. 2.5 Опис ймовірнісного алгоритму Ймовірнісний алгоритм – дуже неефективний алгоритм пошуку. Його використовують в освітніх цілях, щоб порівняти з іншими, більш продуктивними алгоритмами. Алгоритм працює наступним чином: до рюкзаку додаються випадкові предмети, доки є місце; далі перевіряється чи відповідає цінність рюкзака максимально можливій цінності. Якщо так – ми знайшли відповідь, якщо ні – додаємо нові випадкові предмети. Середній час роботи алгоритму 𝑂(𝑛 ∙ ∑∞ 𝑖=1 𝑖 𝑛! 1 𝑖−1 ∙ (1 − ) 𝑛! ) = 𝑂(𝑛 ∙ 𝑛!) 2.6 Приклади застосування розроблених алгоритмів 2.6.1 Жадібний алгоритм Дано n = 5 предметів і рюкзак ємністю (максимальною вагою) V = 16. № a (вага) c (вартість) 1 5 50 2 9 99 3 2 18 4 3 15 5 7 42 предмету Визначимо питому вагу предметів та відсортуємо предмети за зменшенням цього значення. № предмету r (питома вага) 2 99/9 = 11 1 50/5 = 10 3 18/2 = 9 5 42/7 = 6 4 15/3 = 5 Далі, будемо класти в рюкзак найкориснішу річ, якщо вона в нього поміщається. Ітера ція Вміст рюкзака Сумарна вага Сумарна вартість 1 2 9 99 2 2, 1 14 149 3 2, 1, 3 16 167 (максимальна) Отже, сумарна вага предметів – 16, а сумарна вартість – 167. 2.6.2 Метод гілок та меж Дано n = 5 предметів і рюкзак ємністю (максимальною вагою) V = 16. № a (вага) c (вартість) предмету 1 5 50 2 9 99 3 2 18 4 3 15 5 7 42 Визначимо питому вагу предметів та відсортуємо предмети за зменшенням цього значення. № предмету r (питома вага) 2 99/9 = 11 1 50/5 = 10 3 18/2 = 9 5 42/7 = 6 4 15/3 = 5 Рисунок 2.1 – Схема розв’язку жадібним алгоритмом Отже, сумарна вага предметів – 16, а сумарна вартість – 167. 2.6.3 Алгоритм динамічного програмування Будемо вирішувати індивідуальну задачу, умова якої зображена далі: Дано n = 5 предметів і рюкзак ємністю (максимальною вагою) V = 16. № a (вага) c (вартість) 1 5 50 2 9 99 3 2 18 4 3 15 5 7 42 предмету Необхідно визначити з набору даних предметів варіант заповнення , щоб сумарна вага (об’єм) не була більшою за максимальну вагу (ємність), а сумарна вартість була максимальною. Будуємо таблицю розв'язків: Отже отримуємо рішення. Найкращий варіант заповнення рюкзака: № a (вага) c (вартість) 1 5 50 2 9 99 3 2 18 предмету Загальна вага предметів дорівнює 16, загальна вартість – 167. 2.6.4 Ймовірнісний алгоритм Будемо вирішувати індивідуальну задачу, умова якої зображена далі: Дано n = 5 предметів і рюкзак ємністю (максимальною вагою) V = 16. № a (вага) c (вартість) 1 5 50 2 9 99 3 2 18 4 3 15 5 7 42 предмету Необхідно визначити з набору даних предметів варіант заповнення , щоб сумарна вага (об’єм) не була більшою за максимальну вагу (ємність), а сумарна вартість була максимальною. Обираємо випадкові предмети з переліку: № a (вага) c (вартість) 5 7 42 2 9 99 предмету Вага 16, Вартість 141. № a (вага) c (вартість) 3 2 18 2 9 99 4 3 15 предмету Вага 14, Вартість 132. № a (вага) c (вартість) 1 5 50 3 2 18 2 9 99 предмету Вага 16, Вартість 167. Отримали оптимальний розв'язок, припиняємо пошук. 3 ОПИС ПРОГРАМНОГО ПРОДУКТУ 3.1 Опис функціональної моделі Програмний продукт (ПП) містить наступні складові: 1. робота з індивідуальною задачею (ІЗ): 1) введення вручну даних ІЗ; 2) генерація (випадковим чином) даних ІЗ; 3) збереження в файл/читання з файлу/редагування даних ІЗ; 4) розв’язання ІЗ усіма розробленими методами (з виведенням на екран відповідних розв’язків та значень ЦФ); 2. експериментальне дослідження розроблених алгоритмів: 1) задання діапазонів зміни параметрів експериментів: розмірність задач (від; до; крок); кількість ІЗ, яку необхідно згенерувати для кожної розмірності; верхня межа зміни коефіцієнтів (ЦФ та обмежень); 2) генерація множини ІЗ 3) розв’язання множини згенерованих ІЗ усіма розробленими методами; 4) виведення результатів експериментів: порівняння за часом. 3.2 Рішення з інформаційного забезпечення 3.2.1 Вхідні дані Вхідні дані зчитуються з файлу, вводяться користувачем, генеруються випадковим чином або використовуються попередньо збережені. На вхід подаються такі дані, що стосуються ІЗ: n: кількість предметів; назва предмету; a: вага предмету; c: цінність предмету; V: ємність рюкзака; коефіцієнти i та j; На вхід подаються такі дані, що стосуються дослідження алгоритмів: кількість задач для дослідження алгоритмів. 3.2.2 Вихідні дані На вихід подаються наступні дані: початковий набір предметів (рисунок 3.1 та рисунок 3.2); ємність рюкзака (рисунок 3.3); сумарна цінність предметів в рюкзаку (рисунок 3.3); сумарна вага предметів в рюкзаку (рисунок 3.3); час виконання обраного алгоритму (рисунок 3.3); результат/набір предметів, які були поміщені в рюкзак (рисунок 3.2); меню (рисунки 3.1 та 3.2); графік результатів досліджень за часом виконання алгоритмів (рисунок 3.4); Скріншоти виконання застосунку: Рисунок 3. 1 – Початкове вікно застосунку Рисунок 3. 2 – Результат вирішення ІЗ-2 методом гілок та меж Рисунок 3. 3 – ємність рюкзака, сумарна цінність, сумарна вага, час виконання обраного алгоритму. Рисунок 3. 4 – графік результатів досліджень за часом виконання алгоритмів 3.2.3 Опис інформаційного забезпечення Результати роботи програми та розв’язання задач зберігаються в пам’яті і доступні протягом часу роботи програми. Файли для зчитування інформації про задачу зберігаються у каталозі “InputSamples”. За замовчуванням застосунок містить у даному каталозі файл “sample20.txt”, який містить тестові дані для ІЗ. Для того, щоб застосунок використовував дані з файлів користувача, їх необхідно розмістити саме в даному каталозі. 3.3 Рішення з програмного забезпечення 3.3.1 Опис обраних засобів розробки Програмне забезпечення було реалізовано з використанням мови програмування C#. Для розробки було обрано середовище Microsoft Visual Studio. Для реалізації поставлених задач було застосовано технологію WPF. WPF надає змогу побудувати застосунок для платформи Windows із зручним інтерфейсом користувача. Платформа .NET Core, яка використовувалась, надала змогу використовувати різноманітні бібліотеки для зменшення часу, витраченого на розроблення програмного продукту. Зокрема, візуалізація графіків була виконана з використанням бібліотеки “OxyPlot”. Також у даній роботі було використано компонент LINQ, що надає змогу виконання запитів до даних. Для вимірювання часу, витраченого на виконання певного алгоритму, було використано простір імен System.Diagnostics. А для забезпечення взаємодії з файлами, було застосовано простір імен System.IO. 3.3.2 Архітектура програмного забезпечення 3.3.2.1 Схема архітектури ПП На рисунку 3.5 наведена схема архітектури розробленого програмного забезпечення. Рисунок 3. 5 – Схема архітектури розробленого програмного забезпечення Застосунок складається з класів для реалізації та виконання алгоритмів, взаємодії з файлами та класи, що відповідають відповідним елементам UI. UI описаний за допомогою xaml. 3.3.2.2 Діаграма класів (об'єктів) Рисунок 3. 6 – Розроблені класи проекту Рисунок 3. 7 – Розроблені класи для відповідних елементів UI У таблиці 3.2 наведений опис розроблених класів. Таблиця 3. 1 – Опис розроблених класів Назва класу Опис класу Item Опис предмету та його властивостей KnapsackSolution Опис розв’язку задачі Node Опис стану рюкзака PriorityQueue Черга KnapsackInput Введення даних про рюкзак, зчитування даних з файлу BranchAndBoundSolver Алгоритм гілок та меж DynamicProgrammingSolver Алгоритм динамічного програмування GreedySolver Жадібний алгоритм RandomSolver Ймовірнісний алгоритм DialogWindow Клас для елемнту UI з введенням коефіцієнтів для генерації ІЗ InputFileWindow Клас для елементу UI з введенням назви файлу InputManuallyWindow Клас для елементу UI з введенням даних для ІЗ MainViewModel Клас для генерації масиву задач і їх розв’язання MainWindow Клас для елементу UI з головним меню PlotWindow/100 Клас для елементу UI з відображенням графіку 3.3.2.3 Специфікація функцій Табличний опис основних функцій системи. Таблиця 3. 2 – Опис основних функцій системи Ім’я функції Призначення функції Параметри ComputeBound Обчислення верхньої межі (IList<Item> items, int capacity) GenerateRandomItems Генерування випадкових предметів для ІЗ - ReadInput Зчитування даних з файлу (string fileName) Solve Розв’язання ІЗ - SolveMultiple1000 Розв’язання масиву задач розмірністю 1000 - SolveMultiple100 FillTable Enqueue Dequeue CompareTo Розв’язання масиву задач розмірністю 100 Заповнення таблиці для методу динамічного програмування Додавання елементу до черги Видалення першого елементу з черги Вирахування різниці між межами двох станів - - (T element) - (Node other) 3.4 Керівництво користувача 3.4.1 Інструкція користувача Рисунок 3. 8 – Меню програми (стартове вікно) при запуску програми та без введених даних ІЗ Оскільки не вказано дані рюкзака, то у разі обрання опції виконання будьякого алгоритму, ми отримаємо наступне повідомлення: Рисунок 3. 9 – Повідомлення про відсутність даних про рюкзак Використовуючи даний застосунок ми маємо змогу згенерувати випадкові дані для задачі, ввести відповідні коефіцієнти для генерації даних, обрати один з трьох шаблонів даних, ввести дані вручну, або зчитати дані з файлу. У разі вибору пункту “Input with coefficient” ми отримаємо наступне вікно: Рисунок 3. 10– Введення коефіцієнтів для генерації даних Після генерації речей ми повернемося до головного вікна та побачимо результат: Рисунок 3. 11 – Меню програми із введеними даними ІЗ Для генерування випадкових даних необхідно обрати опцію “Random items”. Для обрання шаблонних даних, необхідно обрати одну з опцій “Data set 1”, “Data set 2”, “Data set 3”. Для введення даних вручну, необхідно обрати опцію “Input manually”. Рисунок 3. 4 – Введення даних вручну Далі необхідно ввести цінність та вагу предмету та опціонально назву і натиснути кнопку Add. Після цього додається один предмет. Для того щоб завершити введення, необхідно в полі “Capacity of knapsack” ввести максимальну ємність рюкзака та натиснути кнопку Finish. Для зчитування даних з файлу необхідно обрати опцію “Input from file” та у вікні, що з’явилось вписати назву файлу, що знаходиться в каталозі InputSamples. Рисунок 3. 13 – Введення назви файлу Обравши один з методів вирішення задачі в головному меню, ми отримаємо наступний результат: Рисунок 3. 14 – Розв’язана задача методом гілок та меж. Для дослідження часу роботи реалізованих алгоритмів можна обрати опції “Display plot for 1000” або “Display plot for 100”, що відкриє відповідно вікно з результатом роботи алгоритмів для 1000 задач, або 100. Рисунок 3. 15– Візуалізація роботи алгоритмів для вирішення 100 задач 3.4.2 Методика випробувань Для перевірки працездатності розробленого програмного забезпечення застосовувались функціональне та системне тестування, що виконувались в межах методу сірого ящику. Таблиця 3. 3 – Тестові сценарії Тема Кроки Вхідні дані Введення невалідних даних при введенні вручну 1. Обрати опцію “Input manually” 2. Ввести текст або залишити пустими поля value або weight 3. Натиснути кнопку Add 1. Обрати опцію “Input manually” 2. Заповнити поля числами більше 0 3. Натиснути кнопку Add Введення валідних даних при введенні вручну Введення невалідної назви файлу 1. Обрати опцію “Input from file”. 2. Натиснути клавішу OK. a-z Очікуваний результат Виведення повідомлення про помилку Фактични й результат Виведення повідомлення про помилку 1-* Додавання предмету Додавання предмету Виведення повідомлення про помилковість введеної назви sample20.txt Зчитано дані з файлу та відображено їх Виведення повідомлення про помилковість введеної назви Введення валідної назви файлу 1. Обрати опцію “Input from file”. 2. Ввести “sample20.txt” 3. Натиснути клавішу OK. Запуск алгоритму без введених даних про рюкзкак 1. За умови відсутності даних про предмети у головному вікні обрати один з методів рішення. Виведення повідомлення про відсутність даних про рюкзак Виведення повідомлення про відсутність даних про рюкзак 1. Обрати метод введення даних (Random items) 2. Обрати один з методів рішення Розв’язання задачі та демонстрація результатів у головному вікні Розв’язання задачі та демонстрація результатів у головному вікні Запуск алгоритму з введеними даними про рюкзкак Зчитано дані з файлу та відображено їх 4 ДОСЛІДЖЕННЯ РОЗРОБЛЕНИХ АЛГОРИТМІВ 4.1 Приклади розв’язання задач розробленим програмним забезпеченням 4.1.1 Вирішення індивідуальної задачі Задача 1. Вирішення індивідуальної задачі 1 алгоритмами Жадібного пошуку, Гілок та Меж, Динамічного програмування та Ймовірнісним алгоритмом продемонстроване на рисунках 4.1 - 4.4 відповідно. Рисунок 4. 1 – Розв’язання індивідуальної задачі 1 Жадібним алгоритмом Рисунок 4. 2 – Розв’язання індивідуальної задачі 1 алгоритмом Гілок та Меж Рисунок 4. 3 – Розв’язання індивідуальної задачі 1 алгоритмом Динамічного програмування Рисунок 4. 4 – Розв’язання індивідуальної задачі 1 Ймовірнісним алгоритмом Оптимальний розв’язок був знайдений всіма алгоритмами. 4.1.2 Вирішення задач достаньої розмірності Вирішення задачі розмірністю 15 елементів алгоритмами Жадібного пошуку, Гілок та Меж, Динамічного програмування та Ймовірнісним алгоритмом продемонстроване на рисунках 4.5 - 4.8 відповідно. Рисунок 4. 5 – Розв’язання задачі розмірністю 15 елементів Жадібним алгоритмом Рисунок 4. 6 – Розв’язання задачі розмірністю 15 елементів алгоритмом Гілок та Меж Рисунок 4. 7 – Розв’язання задачі розмірністю 15 елементів алгоритмом Динамічного програмування Рисунок 4. 8 – Розв’язання задачі розмірністю 15 елементів Ймовірнісним алгоритмом Вирішення задачі розмірністю 20 елементів алгоритмами Жадібного пошуку, Гілок та Меж, Динамічного програмування та Ймовірнісним алгоритмом продемонстроване на рисунках 4.9 – 4.12 відповідно. Рисунок 4. 9 – Розв’язання задачі розмірністю 20 елементів Жадібним алгоритмом Рисунок 4. 10 – Розв’язання задачі розмірністю 20 елементів алгоритмом Гілок та Меж Рисунок 4. 11 – Розв’язання задачі розмірністю 20 елементів алгоритмом Динамічного програмування Рисунок 4. 12 – Розв’язання задачі розмірністю 20 елементів Ймовірнісним алгоритмом 4.1.3 Вирішення задачі максимально можливої розмірності Вирішення задачі розмірністю 10000 елементів алгоритмами Жадібного пошуку, Гілок та Меж, Динамічного програмування продемонстроване на рисунках 4.13 – 4.16 відповідно. Рисунок 4. 13 – Розв’язання задачі розмірністю 10000 елементів Жадібним алгоритмом Рисунок 4. 14 – Розв’язання задачі розмірністю 10000 елементів алгоритмом Гілок та Меж Рисунок 4. 15 – Розв’язання задачі розмірністю 10000 елементів алгоритмом Динамічного програмування Відсутній розв’язок задачі Ймовірнісним алгоритмом, бо він дуже не ефективний та після 2 діб роботи не надав результату. Часова складність алгоритмів 4.2 Середній час обчислення задач різної розмірності реалізованими алгоритмами Жадібного пошуку, Гілок та Меж, Динамічного програмування та Ймовірнісним алгоритмом наведений у таблиці 4.1. Таблиця 4. 1 – Середній час виконання реалізованих алгоритмів Розмірність задачі (кількість вершин) 10 20 30 40 50 60 70 80 90 100 Кількість задач Жадібний алгоритм 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 0,0024 0,0066 0,0094 0,0091 0,0113 0,0146 0,0158 0,0184 0,0179 0,023 Середній час виконання (секунди) Алгоритм Алгоритм Ймовірнісний Гілок та Меж Динамічного алгоритм програмування 0,0128 0,0127 0,1039 0,0561 0,0246 11,9615 0,0473 0,0359 1442,1626 0,1096 0,0654 0,1 0,0828 0,1015 0,1006 0,1076 0,1244 0,1439 0,1297 0,1171 0,1391 0,1215 0,1727 - Порівняльний графік швидкодії алгоритмів Жадібного пошуку, Гілок та Меж, Динамічного програмування наведені на рисунку 4.16. Название диаграммы 0,35 0,3 0,25 0,2 0,15 0,1 0,05 0 10 вершин 20 вершин 30 вершин Жадібний алгоритм 40 вершин 50 вершин 60 вершин Алгоритм Гілок та Меж 70 вершин 80 вершин 90 вершин 100 вершин Алгоритм Динамічного програмування Рисунок 4. 16 – Порівняльний графік швидкодії алгоритмів Жадібного пошуку, Гілок та Меж, Динамічного програмування Порівняльні графіки швидкодії в межах Жадібного алгоритму наведений на рисунку 4.17. Порівняльний графік швидкодії в межах алгоритму Гілок та Меж наведений на рисунку 4.18. Порівняльний графік швидкодії в межах алгоритму Динамічного програмування наведений на рисунку 4.19. Порівняльний графік швидкодії в межах Ймовірнісного алгоритму наведений на рисунку 4.20. Рисунок 4. 17 – Графік швидкодії Жадібного алгоритму Рисунок 4. 18 – Графік швидкодії алгоритму Гілок та Меж Рисунок 4. 19 – Графік швидкодії алгоритму Динамічного програмування Рисунок 4. 20 – Графік швидкодії Ймовірнісного алгоритму Згідно з означення Жадібного алгоритму, його складність дорівнює O(n 2 ) . На рисунку 4.16 можна побачити, що дійсно, алгоритм виконувався за O(V 2 ) . Згідно з означення алгоритму Гілок та Меж, у найгіршому випадку він генерує всі проміжні стани і тоді часова складність алгоритму дорівнює 𝑂(2𝑛 ). В нашому випадку, алгоритм не будує повне дерево станів, тому його швидкодія є загалом кращою. Складність алгоритму Динамічного програмування, за теорією дорівнює 𝑂(𝑊 ∗ 𝑁). Він має бути швидшим, за попередні на великих розмірностях, але як ми побачили в таблиці 4.1 та на рисунку 4.16, в нашому випадку він показав гірші результати. Ймовірнісний алгоритм – найгірший з реалізованих за часом роботи. Його складність становить приблизно 𝑂(𝑛 ∗ 𝑛!). Через завеликий час роботи ми не змогли додати його до порівняльного графіку (рисунок 4.16). Отже, ми побачили, що при великих розмірностях жадібний алгоритм працює швидше, ніж інші алгоритми, проте не є оптимальним. На рисунках 4.17 та 4.20 зображена швидкість виконання реалізованих алгоритмів на стаціонарній розмірності матриці. Графіки показують приблизно рівномірний час, що програма витрачає на вирішення задач. Результати роботи реалізованої програми достатньо співпадають із теоретичними, що описано в аналізі теоретичних і отриманих складностей алгоритмів. Алгоритм Гілок та Меж працює більш ефективно, ніж очікувалося. ВИСНОВКИ Розв’язавши задачу про рюкзак обраними алгоритмами, ми отримали результати, що відповідали теоретично очікуваним результатам. Точний результат було отримано алгоритмом динамічного програмування, методом гілок та меж, ймовірнісним алгоритмом. Дещо не точний результат отримали, використавши жадібний алгоритм. Порівнявши алгоритми за часом роботи, виявилось, що ймовірнісний алгоритм є найповільнішим з реалізованих. Натомість, алгоритм гілок та меж показав кращі результати, ніж очікувалось. Час роботи жадібного алгоритму є незначним, в порівнянні з іншими, проте він часто не надає оптимального рішення. ПЕРЕЛІК ПОСИЛАНЬ 1. 0-1 Knapsack Problem [Електронний ресурс] // Режим доступу: https://www.geeksforgeeks.org/0-1-knapsack-problem-dp-10/ 2. How to solve the Knapsack Problem with dynamic programming [Електронний ресурс] // Режим доступу: https://medium.com/@fabianterh/how-to-solve-the-knapsackproblem-with-dynamic-programming-eb88c706d3cf 3. 0/1 Knapsack Problem Dynamic Programming [Електронний ресурс] // Режим доступу: https://www.youtube.com/watch?v=8LusJS5-AGo 4. A BRANCH AND BOUND ALGORITHM FOR THE KNAPSACK PROBLEM [Електронний ресурс] // Режим доступу: https://www0.gsb.columbia.edu/mygsb/faculty/research/pubfiles/4407/kolesar_branch_bound.pdf 5. 0/1 Knapsack using Branch and Bound [Електронний ресурс] // Режим доступу: https://www.youtube.com/watch?v=yV1d-b_NeK8 6. Greedy Algorithm for the Fractional Knapsack [Електронний ресурс] // Режим доступу: https://medium.com/@TheGeekiestOne/greedy-algorithm-for-the-fractional-knapsack312b49a33331 7. Greedy algorithms for a class of knapsack problems with binary weights [Електронний ресурс] // Режим доступу: https://www.imacm.uniwuppertal.de/fileadmin/imacm/preprints/amna_opap_09_02.pdf 8. 0-1 Knapsack Problem (Dynamic Programming) [Електронний ресурс] // Режим доступу: https://www.youtube.com/watch?v=xOlhR_2QCXY 9. The Knapsack Problem [Електронний ресурс] // Режим доступу: https://www.youtube.com/watch?v=gA0I_tFBCTE 10. Knapsack Problem [Електронний ресурс] // Режим доступу: https://www.sciencedirect.com/topics/computer-science/knapsack-problem