
- •Розділ 2. Задача та її аналіз
- •2.1. Етапи розв’язання задач:
- •2.1.1. Постановка задачі
- •2.1.2. Побудова моделі
- •2.1.3. Розробка алгоритму
- •2.1.4. Перевірка правильності алгоритму
- •2.1.5. Аналіз алгоритму і його складності
- •2.1.6. Реалізація алгоритму
- •2.1.7. Перевірка програми
- •2.1.8. Документація
- •2.2. Типи задач
- •2.3. Принцип декомпозиції
- •2.4. Логічна схема розрахунку
- •2.5. Методи розробки алгоритмів
- •2.5.1. Методи приватних цілей, підйому і відпрацювання назад
- •2.5.2. Евристики
- •2.5.3. Рекурсія
- •Заключні зауваження
Розділ 2. Задача та її аналіз
При розв’язанні будь-яких задач з використанням ЕОМ виникає необхідність чітко розмежувати ролі людини та обчислювальної машини, внаслідок того, що вони мають істотно відмінні можливості. Людині властиво вносити в процес елементи творчості, вона може інтуїтивно відшукати правильний шлях до одержання відповіді. ЕОМ же здатна тільки виконувати чітко й однозначно задану послідовність дій (програму). Тому людину іноді називають активною системою, а обчислювальну машину - пасивною системою. Цілком зрозуміло, що в якості пасивної системи може виступати і людина, але в цій ролі вона дуже програє ЕОМ у швидкості обчислень і точності виконання інструкцій. І все-таки для програміста дуже важливе уміння «перевтілюватися» у пасивну систему. Це дозволяє йому успішно контролювати весь хід розв’язання задачі.
2.1. Етапи розв’язання задач:
Практика розв’язання різноманітних задач із застосуванням ЕОМ виробила наступну схему всього циклу проходження задачі від загального її формулювання до одержання кінцевих результатів:
Постановка задачі
Побудова моделі
Розробка алгоритму
Перевірка правильності алгоритму
Аналіз алгоритму і його складності
Реалізація алгоритму
Перевірка програми
Складання документації
А де ж розв’язання задачі? – можливо, запитаєте ви. Відповідь проста: маючи в наявності правильну працездатну програму з докладною і зрозумілою документацією, розв’язати цю задачу зможе будь-яка людина, що вміє працювати з ЕОМ.
Розглянемо докладніше кожний пункт.
2.1.1. Постановка задачі
Перш ніж ми зрозуміємо задачу, потрібно її точно сформулювати. Звичайно процес точного формулювання задачі зводиться до постановки правильних додаткових питань. От деякі з них:
Чи зрозуміла термінологія, що використана в попередньому формулюванні?
Що дано?
Що потрібно знайти?
Як знайти розв’язок?
Яких потрібних даних не вистачає?
Чи є якісь початкові дані, що не можуть бути корисними ?
Які зроблені припущення?
Можливі й інші питання в залежності від конкретної задачі. Часто після одержання повних чи часткових відповідей на деякі з питань їх доводиться ставити повторно.
Приклад [ ]:
Джек – комівояжер. На його території 20 міст. Компанія відшкодовує йому тільки 50% вартості ділових автомобільних поїздок. Джек підрахував, скільки йому буде коштувати проїзд на машині між кожними двома містами на його території. Йому, природно, хотілося б знизити дорожні витрати.
Що дано? Вихідна інформація задана у виді переліку міст на території Джека і відповідної матриці вартостей, тобто двовимірного масиву з елементами Cij, рівними вартості проїзду з міста i у місто j. У даному випадку матриця вартостей має 20 рядків і 20 стовпців.
Що ми хочемо знайти? Ми хочемо допомогти Джеку знизити його дорожні витрати. Хм... це звучить трохи незрозуміло. Дійсно, питання про те, яким буде рішення, виглядає недоречним. Обміркувавши ситуацію, ми прийдемо до висновку, що нічого не можемо зробити без додаткової інформації від Джека. Чи має Джек в одних містах покупців більше чим в інших і є чи в якихось містах особливі покупці (наприклад, товстосуми, завжди готові розщедриться)? Якщо так, то, можливо, він захоче відвідувати якісь міста частіше. Можуть бути і такі міста, що Джек відвідає не спеціально, а заїде туди, коли виявиться в сусіднім місті. Іншими словами, треба знати більше про пріоритети Джека і враховувати переваги при складанні графіка поїздок.
Тому ми повертаємося до Джека і вимагаємо додаткову інформацію. Він повідомляє, що хотів би мати маршрут, що починається і закінчується в його базовому місті і що минає по одному разу кожне місто на його території. Отже, нам потрібний список міст, що містить кожне місто тільки один раз за винятком його базового міста, що розміщений в списку першим і останнім. Порядок міст у цьому списку являє собою маршрут Джека. Сума вартостей проїзду між кожними двома послідовними містами списку – це загальна вартість маршруту, що представлений списком. Ми вирішимо задачу Джека, якщо представимо йому список з найменшою можливою загальною вартістю.
Це гарна постановка задачі. Ми знаємо, що в нас є, і що потрібно знайти.