Автор: Пользователь скрыл имя, 30 Марта 2011 в 19:18, курсовая работа
Сейчас решение данной задачи необходимо во многих областях связанных с замкнутыми и при этом жестко связанными по времени системами, такими как: конвейерное производство, многооперационные обрабатывающие комплексы, судовые и железнодорожные погрузочные системы, перевозки грузов по замкнутому маршруту, расчет авиационных линий.
Введение_________________________________________________________2
Глава 1. Задача о коммивояжере_____________________________________3
Общая постановка задачи______________________________________3
Математическая модель задачи_______________________________3
Глава 2. Метод ветвей и границ____________________________________5
2.1. Основные понятия и определения_____________________________5
2.2. Постановка задачи_________________________________________5
2.3. Решение задачи методом ветвей и границ_______________________5
Глава 3. Программная реализация метода ветвей и границ_____________12
3.1. Язык программирования___________________________________12
3.2. Описание алгоритма_______________________________________12
3.3. Описание основных структур данных_________________________15
3.4. Описание интерфейса с пользователем________________________16
Заключение___________________________________________________17
Литература___________________________________________________18
Текст программы______________________________________________
Рис. 3. Ветвление на третьем шаге
Приведенная
платежная матрица для
2 | 3 | 5 | |
3 | 8 | ∞ | 0 |
4 | ∞ | 7 | 0 |
6 | 0 | 0 | ∞ |
Степени Θij нулевых элементов этой матрицы Θ35 = 8, Θ45 = 7, Θ62 = 8, Θ63 =7. Выбираем Θ35 = 8. Разбиваем на и .
Нижняя
граница для
равна 55 + 8 = 64. В матрице для
вычеркиваем строку 3 и столбец 5 и
полагаем c63= ∞. Получим
2 | 3 | |
4 | ∞ | 7 |
6 | 0 | ∞ |
Для
приведения надо вычесть минимум
по строке 4: r4=7. При этом нижняя граница
станет равной 55+7 = 62. После приведения
получим
2 | 3 | |
4 | ∞ | 0 |
6 | 0 | ∞ |
Из матрицы 2´2 получаем два перехода с нулевой длинной: (4, 3) и (6, 2).
Рис. 4
Ветвление на четвертом шаге
Рис. 5
Дерево ветвления с оценками
Полученный маршрутом коммивояжера z0 = (1, 4, 3, 5, 6, 2, 1) или (A-D-C-E-F-B-A).
Для написания программы был выбран язык Си++ по следующим причинам:
В программе содержится рекурсивная функция, которая обеспечивает перебор возможных путей для поиска самого короткого. Именно здесь заключен алгоритм решения задачи «коммивояжера». Рассмотрим его подробнее:
Следует рассмотреть один из основных моментов алгоритма, связанных с перебором маршрутов. Из рисунка №2 можно проследить порядок формирования путей и рассмотреть на конкретном примере, как работает алгоритм. Здесь приведен пример для 4 городов. Остановимся на рисунке по подробнее.
Из приведенного примера уже можно выделить, как алгоритм перебирает пути. Он действует по следующей схеме:
Теперь рассмотрим структуру приложения, опишем классы и процедуры, которые были изменены и наполнены кодом.
Программа состоит из 4 классов:
Класс CKurs_LipinDlg. В начале при вызове функции OnInitDialog() переменные заполняются начальными данными. Затем из файла «table.ini» считывается таблица расстояний между городами. И теперь диалоговое окно готово к работе с пользователем. Функция OnPaint() выводит на экран карту, позволяет выделять города, выбранные пользователем, а также соединяет города линиями-путями, когда задача решена. Кроме того, обеспечивается вывод информации для пользователя: пояснения, длина минимального пути и список расстояний между городами, составляющие минимальный путь.
При
нажатии левой кнопкой мыши вызывается
функция
OnLButtonDown(). Она определяет по какому
городу щелкнул пользователь и ставит/снимает
выделение с него. Также здесь осуществляется
проверка на количество выделенных городов,
т.к. время ожидания решения задачи для
количества более 13 городов станет не
удовлетворительным (от 1,5 минут и более).
Поэтому программа выдаст сообщение, если
мы попытаемся выйти за допустимые пределы.
Кнопка «Выбрать стандартные города» выделяет города, которые требуется соединить в условии задачи, а именно Москва, Ярославль, Нижний Новгород, Самара, Саратов, Волгоград, Воронеж, Пенза, Липецк, Тамбов, Орел, Курск, Тула. Кнопка «Очистить» снимает выделение со всех городов и задает начальные значения ряду необходимых переменных.
Функция OnButton3() связана с кнопкой «Задать пункт отправления». После нажатия кнопки пользователь может щелчком мыши выбрать пункт отправления коммивояжера. Кнопка «Параметры» вызывает диалоговое окно «Параметры», где пользователь может редактировать таблицу расстояний между городами. Функция OnOK() обрабатывает нажатие кнопки «Рассчитать путь». Она подготавливает начальные значения для вызова рекурсивной функции: создается таблица расстояний только для выделенных городов, заполняется первоначальный минимальный путь, выводится поясняющая информация. Затем вызывается функция recursiv(), которая перебирает варианты маршрутов, отсекает лишние ветви путей и находит минимальный.
Класс CSetting.
Функция OnInitDialog() программным путем создает и выводит поля ввода, имитируя таблицу расстояний между городами. Затем считывается файл «table.ini», и заполняются поля ввода полученными значениями. Вызывается функция Proverka(), которая сканирует полученные данные на ошибки, т.е. определяет введены ли только цифры, и если нет, тогда удаляет все лишние символы.
По нажатию кнопки «Сохранить» программа передает данные в родительское окно, записывает данные из полей ввода в файл и закрывает диалоговое окно.
При загрузке приложения появляется основное диалоговое окно. Здесь пользователь может выбрать несколько городов и рассчитать для них минимальный путь.
Чтобы отменить выделение городов нужно щелкнуть по кнопке «Очистить». Нажав кнопку «Рассчитать путь», мы получим результат: города соединены минимальным путем, его длина дана в окне информации, в списке показаны расстояния между городами, входящими в полученный путь. Кнопка «Выбрать стандартные города» выделяет города, требуемые в задании.
Чтобы выделить пункт отправления коммивояжера нужно выбрать «Задать пункт отправления».
Кнопка «Параметры» вызывает диалоговое окно для ввода расстояний между городами . Это окно является модальным и его особенностью является то, что нет возможности перехода к родительскому окну.
Здесь пользователь может отредактировать расстояния между городами. Для этого нужно щелкнуть в поле ввода, и ввести другое значение. Перемещаться по этой «таблице» можно по строкам при помощи клавиш Tab или Shift+Tab.
По завершении ввода нужно нажать кнопку «Сохранить», чтобы программа записала измененные данные в файл. При этом автоматически проверится правильность введенный информации и все ошибки будут исправлены.
Кнопка «Отмена» позволяет не сохранять введенные изменения, если пользователь ошибся во введенной информации.
По нажатии любой из кнопок диалоговое окно «Параметры» закрывается и мы возвращаемся к главному окну.
Если в строке заголовка главного окна щелкнуть правой кнопкой мыши и выбрать пункт «О программе», то появится диалоговое окно, содержащее сведения о программе и об авторе. Нажав кнопку «OK» возвращаемся к главному окну.
Заключение
Для решения задачи мной использовался язык программирования С++, так как я посчитал его наиболее удобным. В ходе работы был разработан алгоритм решения задачи о коммивояжере с помощью метода ветвей и границ. Алгоритм позволяет быстро найти кратчайший путь между городами. Решение полностью удовлетворяет условиям задачи, а именно: объездить все города точно по одному разу и вернуться в исходный с минимумом затрат. По алгоритму разработано приложение, решающее задачу о коммивояжере.
Литература
Информация о работе Программная реализация метода ветвей и границ