Разбиение задачи на процедуры.

Вернемся к этапу реализации алгоритма. Поскольку для n=20 наш алгоритм будет работать очень долго, возьмем для контрольного примера n=5. Какие нам понадобятся процедуры для реализации этого алгоритма?

1. Процедура генерации всех возможных перестановок.

2. Процедура вычисления стоимость каждого полученного пути.

3. Процедура сравнения различных путей и выбора минимального.

На первом этапе пункт 1 может быть осуществлен вручную, с помощью ввода данных с клавиатуры.

Необходимо определить, что будет на входе и на выходе каждой процедуры.

1. Выход - массив перестановок.

2. Вход - массив перестановок и матрица стоимостей; выход - стоимость.

3. Вход -

 

Формирование перестановок "вручную".

Для n=2 существует 2! перестановок (1 2) (2 1)

 

Заметим, что перестановка чисел 1…k получается из перестановки 1…k-1 добавлением числа k, которое можно вставить на любое из k мест.

Расположим перестановки 1…k-1 в одну строку по порядку (это можно сделать согласно п 2), начиная с (1 2 …k-1).Допишем к первой перестановке справа число k, и будем переставлять его с ближайшим левым соседом до тех пор, пока оно не окажется крайним левым. Теперь справа от числа k находится перестановка из чисел 1…k-1, заменим ее на следующую согласно п 2, и будем переставлять число k с ближайшим правым соседом до тех пор пока, оно не окажется крайним правым. Продолжая таким образом, получим k! смежных перестановок. Так как количество перестановок четное число, то в последней перестановке число k будет крайним правым, следовательно, от последней перестановки можно перейти к первой(согласно п2).

Приведенное доказательство включает в себя и алгоритм построения всех требуемых перестановок.

Пример:

1. Для n=3 (1 2) (2 1)

(1 2 3) (2 1 3)

(1 3 2) (2 3 1)

(3 1 2) (3 2 1)

2. Для n=4 (123) (132) (312) (321) (231) (213)

(1234) (1324) (3124) (3214) (2314) (2134)

(1243) (1342) (3142) (3241) (2341) (2143)

(1423) (1432) (3412) (3421) (2431) (2413)

(4123) (4132) (4312) (4321) (4231) (4213)

 

Структуры данных.

Матрица перестановок: каждая строка - это перестановка

Матрица стоимостей.

Вектор сумм - номер элемента соответствует строке матрицы перестановок, элемент – стоимость пути для данной перестановки

Проверка программы.

Эксплуатации программы предшествует её отладка. Проверка программы может быть охарактеризована как экспериментальное подтверждение того факта, что программа делает именно то, что должна делать.

1. Проверка вручную (рассматривается задача небольшой размерности и все просчитываеся на бумаге, если есть сравнение - пример на каждую ветвь (таблица истинности) ).

2. Тестирование каждого участка программы, то есть множество выводов всех возможных крайних случаев (если все случаи проверить практически невозможно, то проверить только те, которые встретятся с наибольшей вероятностью)

3. Особенности ОС, которые могли не учесть. Пример с фирмой МS.

4. Проверка качества алгоритма. Какие были сделаны допущения. Учесть все возможные варианты. Работает ли алгоритм лучше в среднем, чем в худшем случае. (®п.6)

5. Тестирование для определенных вычислительных ограничений.

6. Анализ среднего функционирования.

Многие программы для некоторых входных данных работают хорошо, а для других плохо. Характеристика работы алгоритма должна менятся плавно от хорошей к плохой при переходе от входных данных, на которых алгоритм работает хорошо, к входным данным на которых это не так.

 

"Задача коммивояжера"

При n£6 работает хорошо.

При 6£n£15 плохо.

При n³15 просто ужастно.

 

Подготовка документации.

Самое главное - оформлять в том виде, в котором хотелось бы читать.

1. Следует учесть, что ваше описание должны понять люди, не владеющие предметной областью.

2. Описать план алгоритма «сверху – вниз».

3. Описать форматы данных и требования к вводу - выводу.

Примеры.

При составление больших программ возникает необходимость разбивать задачу на подзадачи, чтобы над каждой могла работать отдельная группа людей. Разные группы должны контактировать между собой, так как выход из одной задачи это вход в другую. Основная ошибка - что-то неправильно описали.

4. Указать условия функционирования и ограничения. Указать также, в каких случаях программа работает, а в каких не работает или работает плохо.

5. Привести доказательство правильности функционирования алгоритма.

6. Приложить описание тестовых примеров и результаты тестирования.

7. Описать порядок настройки программы на конкретные условия функционирования.

Ниже приводится описание алгоритма генератора перестановок.