Задача о коммивояжере
Страница 3
Поскольку среди невыделенных элементов появятся новые нули (согласно определению), переходят к первому этапу, рассматривая преобразованную матрицу. Завершив первый этап, либо переходят ко второму, либо вновь к третьему этапу, если все нули матрицы оказываются выделенными. (В программе выбор реализован в процедуре Central_Control ).
В первом случае после проведения второго этапа итерация заканчивается, а во втором - после проведения третьего этапа получают новую матрицу, в которой будут невыделенные нули, и всю последовательность операций, начиная с первого этапа, необходимо повторить. После конечного числа повторений очередной первый этап обязательно закончится переходом на второй этап и количество независимых нулей увеличится на единицу. (К+1)-я итерация закончена.
Теперь можно перейти к рассмотрению методов получения верхней оценки:
Метод 1: "По возрастанию номеров".
Рассчитывается цена маршрута по зафиксированным для данной вершины городам. Затем работает следующий алгоритм нахождения маршрута:
1. Рассчитывается число пройденных городов.
2. Если пройдены все города, то выход, иначе из последнего города незаконченного маршрута добавляется переход в еще непройденный город с минимальным номером и возврат к шагу 1.
Программная реализация ‑ VHCOUNT. V_1
Метод 2: "С оптимизацией".
Рассчитывается цена маршрута по зафиксированным для данной вершины городам. Затем работает следующий алгоритм нахождения маршрута:
1. Рассчитывается число пройденных городов.
2. Если пройдены все города, то выход, иначе из последнего города незаконченного маршрута добавляется переход в город, переход в который имеет минимальные затраты и возврат к шагу 1.
Программная реализация - VHCOUNT. V_2
Метод 3: "Венгерский метод".
Данный метод основан на нижней оценке, получаемой венгерским методом. При установке расчета верхней оценки данным методом расчет нижней оценки автоматически устанавливается на венгерский метод, так как необходимым условием является то, что в каждой строке и каждом столбце только одна пометка. Алгоритм работы метода следующий:
1. Получаем решение релаксированной задачи венгерским методом.
2. Проверяем сколько городов пройдено.
3. Если пройдены все города, то значит получено решение нерелаксированной задачи то переход к пункту 5, иначе переход к пункту 4.
4. В строке города, из которого был возврат в первый, находим минимальное значение среди столбцов еще не пройденных городов и первого города.
5. Если в новом маршруте пройдено N городов, то из последнего города назначаем переход в первый.
6. Если маршрут замкнут, то выход из алгоритма, иначе переход к пункту 2.
Метод схож с методом "С оптимизацией", но отличается тем, что отсутствуют дополнительные проверки, так как исходное решение уже подчиняется вышеуказанным условиям. Программная реализация - SOLUTION. LEVELS
Интерфейс программы построен по структуре, аналогичной Turbo-средам, но не содержит объекто-ориентированного внутреннего содержания. Главное меню имеет следующую структуру:
Рассмотрим меню по пунктам:
Данные. Новая задача.
Этот пункт меню вызывает сначала процедуру ввода размерности задачи, затем процедуру ее редактирования. При вызове производится обнуление всех текущих значений матрицы.
Данные. Размерность задачи.
Данный пункт меню активизирует процедуру изменения размерности задачи. При этом если матрица уменьшается, то значения в отсеченной части не зануляются и при последующем увеличении размерности могут быть снова использованы. В случае увеличения размера на большее значение крайние элементы оказываются нулевыми.
Данные. Редактирование.
Пункт активизирует процедуру по вводу начальной матрицы условий. В процедуре реализован вертикальный и горизонтальный скроллинг матрицы, а также скроллинг внутри вводимой строки. Кроме того возможна настройка ширины строки ввода, которая описана в пункте меню "Опции. Ввод".
Данные. Генерация.
Пункт активизирует процедуру, генерирующую матрицу случайным образом в заданном диапазоне значений, который задается перед генерацией.
Данные. Работа с диском. Сохранить матрицу.
Данный пункт позволяет сохранить текущую исходную матрицу в файл на диск. Может быть активизирован в любой момент работы меню клавишей F2.
Данные. Работа с диском. Открыть матрицу.
Данный пункт позволяет считать с диска исходную матрицу. Может быть активизирован в любой момент работы меню клавишей F3.
Решение. Начать решение.
Данный пункт запускает работу алгоритма решения, используя текущие настройки.
Решение. Последний результат.
Данный пункт позволяет вывести последний полученный результат решения.
Режим решения. Блок: Минимум - Максимум.
Этот блок позволяет выбрать направление решения задачи на минимум или на максимум. Значение по умолчанию - Минимум.
Режим решения. Блок: Автоматический - Обучающий.
Этот блок позволяет выбрать между автоматическим и обучающим режимами решения задачи. Значение по умолчанию - Автоматический.
Расчет оценок. Блок "Верхняя оценка".
Этот блок позволяет выбрать метод расчета верхней оценки. При выборе третьего метода расчета ("Венгерский метод"), при решении автоматически устанавливается четвертый метод расчета нижней оценки ("Венгерский метод"). Значение по умолчанию - Венгерский метод.
Расчет оценок. Блок "Нижняя оценка".
Этот блок позволяет выбрать метод расчета нижней оценки. Какого-либо влияния на метод расчета верхней оценки выбор не оказывает. Значение по умолчанию - Венгерский метод.
Опции. Часы.
Данный пункт позволяет включить и выключить часы.
Опции. Звук.
Данный пункт позволяет включить и выключить звук.
Опции. Ввод.
Данный пункт позволяет задать ширину строки ввода при редактировании начальной матрицы задачи. Значение по умолчанию - 6.
Опции. Screen Saver.
Данный пункт позволяет задать время задержки срабатывания Screen Saver-а. Время указывается в минутах. Значение по умолчанию - 5 минут.
Опции. Сохранить опции.
Данный пункт позволяет запомнить состояние часов и звука в файле (Shadow.dsk).
Выход.
Данный пункт осуществляет выход из программы.
Структурно программа состоит из девяти модулей:
1. DESCRIPT.PAS - описание всех глобальных переменных программы. Исполняемых процедур не содержит.
2. IOMENU.PAS - модуль для обработки меню. Авторы - Илья Осипов, Андрей Шапошников.
3. IOCRT.PAS - модуль экранных функций вывода. Автор - Илья Осипов.
4. INOUT.PAS - модуль ввода-вывода. Автор - Андрей Шапошников.
5. SERVICE.PAS - модуль системных процедур программы. Автор - Андрей Шапошников.
6. VHCOUNT.PAS - модуль расчета оценок. Автор - Игорь Яров.
7. SOLUTION.PAS - модуль общего управления решением. Авторы - Игорь Яров, Андрей Шапошников.
8. VENGRSOL.PAS - модуль расчета оценок венгерским методом. Автор - Андрей Шапошников.
9. SHADOW.PAS - модуль общего управления программой. Автор - Андрей Шапошников.
Процедуры, которые используются при решении задачи описаны ранее. Можно лишь добавить, что общее управление алгоритмом ветвей и границ осуществляется процедурой OverDrive в автоматическом режиме решения и процедурой StudyMode в обучающем режиме решения.
Процедуры интерфейса программы и глобальные переменные описаны ниже.
Модуль INOUT.PAS
Procedure MatrIn(var a : workmatr ; var sz : byte ; msize, diag : boolean);
Процедура ввода начальной матрицы условий. Передаваемые параметры:
var a : workmatr - указатель на матрицу (описана глобальной переменной).
var sz : byte - текущая размерность задачи (описана глобальной переменной).
msize : boolean - возможность изменения размеров матрицы (True - могут быть изменены).