
- •Розділ 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.1.3. Розробка алгоритму
Як тільки задача чітко поставлена і для неї побудована модель, ми повинні приступити до розробки алгоритму її розв'язання.
Існує тенденція: програмісти затрачають відносно невелику кількість часу на стадію розробки алгоритму при створенні програми. Проявляється сильне бажання якнайшвидше почати писати саму програму. Цьому бажанню не треба піддаватися. При написанні програми вам все рівно доведеться складати алгоритм в уяві. І якщо це ще припустимо при складанні невеликих програм, те будь-яка більш-менш серйозна задача відразу ж заплутає вас. Так що найкраще буде пройти етапи розв'язання задачі послідовно, нічого не пропускаючи.
Вибір методу розробки, що найчастіше сильно залежить від вибору моделі, може в значній мірі вплинути на ефективність алгоритму розв'язання. Два різних алгоритми можуть бути правильними, але дуже сильно відрізнятися за ефективністю.
А взагалі, варто пам'ятати про основні вимоги, яким повинні відповідати усі без винятку алгоритми. Ці властивості наступні:
дискретність;
детермінованість;
масовість;
результативність.
Приклад [ ]:
Повернемося до комівояжера з попереднього розділу. Постановка задачі і модель, описані раніше наводять на думку про наступний алгоритм.
Спочатку довільно пронумеруємо n міст цілими числами від 1 до n, привласнивши кожному місту свій номер. Базовому місту приписуємо номер n. Помітимо, що кожен тур однозначно відповідає перестановці цілих чисел 1,2,…,n-1... Дійсно, кожен тур відповідає єдиній перестановці, і кожна перестановка відповідає тільки одному туру. Таку відповідність називають взаємно однозначною. Таким чином, для будь-якої даної перестановки ми можемо легко простежити на сітковій моделі відповідний тур і обчислити його вартість.
Можна розв'язати задачу, утворивши всі перестановки перших n-1 цілих позитивних чисел. Для кожної перестановки будуємо відповідний тур і обчислюємо його вартість. Обробивши таким способом усі перестановки, запам'ятовуємо тур, що до цього моменту мав мінімальну вартість. Якщо ми знаходимо тур з більш низькою вартістю, то запам'ятовуємо вже його.
Алгоритм ETS (вичерпний комівояжер).
Розв'язуємо задачу комівояжера з N містами, послідовно розглядаючи всі перестановки з n-1 позитивних цілих чисел. У такий спосіб ми розглянемо кожен можливий тур і виберемо варіант TOUR з найменшим значенням MIN. Алгоритм ETS вимагає в якості вхідних даних число міст N і матрицю вартостей C.
Алгоритм має наступний вигляд:
Крок 0.{ініціалізація, тобто установка в початковий стан}
Set TOUR:=0 and MIN:= нескінченність;
Крок 1.{утворення всіх перестановок}
For I:=1 to (N-1)! do
Крок 2.{одержання нової перестановки}
Set P:=I-та перестановка цілих чисел 1,2,…,N-1;{тут потрібний підалгоритм}
Крок 3.{побудова нового туру}
Будуємо тур T(P), що відповідає перестановці P; та обчислюємо вартість COST(T(P)); {тут потрібні два інших підалгоритма }
Крок 4.{порівняння}
If COST(T(P))<MIN then set TOUR:=T(P) and MIN:=COST(T(P)) fi;
Od;
End.
Алгоритм ETS - непогане перше наближення до точного алгоритму. Правда йому бракує деяких важливих підалгоритмів, і він недостатньо близький до остаточної програми.
Пропонуємо вам спробувати самостійно довести алгоритм ETS до оптимальнішого вигляду.