Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ИИС.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
283.21 Кб
Скачать

3 Постановка задачи контрольной работы

Разработать программу, реализующую алгоритм муравья, для задачи коммивояжера.

Расположить города по сторонам фигуры равномерно. Число городов изменяется от 12 до 120.

Провести исследование работы алгоритма в зависимости от значений параметров: , .

4 Описание работы программы

Заголовок файла MainAnt.cpp включает символьные константы, которые используются для представления городов и муравьев.

Константа MAX_DISTANCE определяет максимальное расстояние между городами. Параметр ALPHA определяет относительную значимость пути (количество фермента на пути). Параметр BETA устанавливает относительную значимость видимости (обратной расстоянию). Параметр RHO используется как коэффициент количества фермента, которое муравей оставляет на пути (этот параметр также известен как продолжительность пути), где (1.0 – RHO) показывает коэффициент испарения на пути после его завершения. Параметр QVAL — это константа, относящаяся к количеству фермента, которое было оставлено на пути.

Заголовок файла MainAnt.cpp также включают также описание динамических массивов cities, ants, distance, pheromone. Массив cities является массивом структуры cityType, которая используется для определения города. Массив antType является массивом структуры antType, которая моделирует поведение одного муравья.

Кроме отслеживания текущего и следующего города на пути (поля curCity и nextCity) каждый муравей также должен учитывать города, которые уже были посещены (динамический массив tabu) и длину пройденного пути. Общая длина пути сохраняется в поле tourLength.

Двумерный динамический массив distance содержит предварительно рассчитанные расстояния от одного города до всех других. Уровни фермента сохраняются в двумерном динамическом массиве pheromone. Каждый двумерный массив в алгоритме использует первый индекс в качестве начала грани, то есть исходного города, а второй - в качестве конечного

В процедуре ButtonOKClick считываем с поля количество городов, вводимое с клавиатуры. В обработчике catch введем код, который будет выполняться по ошибке ввода. Далее переопределим динамические массивы под полученные значения количества городов и муравьев.

Рассмотрим процедуру mnuCityRandomClick. Текст функции должен содержать три базовых действия, которые требуются для подготовки алгоритма муравья.

Первое действие - это создание городов. Количество городов после ввода сохраняется в переменную MAX_CITIES. Фигура расположения городов состоит из окружности и диаметра этой окружности. Разобьем фигуру на две части (окружность и ее диаметр), создадим города отдельно на окружности и отдельно на диаметре. Для этого создадим функцию PaintCircle, в которой сначала определим координаты города по осям х и у для окружности, затем для диаметра, после этого координаты сохраняются в запись текущего города.

Второе действие — во время создания городов одновременно очищаются массивы distance и pheromone.

Третье действие — это предварительный расчет расстояний между всеми городами, которые были созданы. Расстояние вычисляется с помощью обычной двумерной геометрии координат (теорема Пифагора).

Наконец, инициализируется массив ant. При этом муравьи равномерно распределяются по всем городам. Для этого используется переменная to в качестве счетчика псевдо цикла. Когда значение переменной to становится равным номеру последнего города, она возвращается к первому городу (городу 0), и процесс повторяется.

Поле curCity в структуре ant устанавливается в значение текущего города (первого города для муравья). Затем очищаются списки tabu и path. Ноль в массиве tabu обозначает, что город еще не был посещен; единица свидетельствует, что город уже включен в путь муравья. В массив path помещается номер текущего города для муравья, и очищается поле tourLength (длина пути).

Также осуществим проверку: перед отображением городов необходимо задать координаты расположения городов, очистить массивы distance и pheromone и т. д.

Для графического отображения городов на форме необходимо выполниь следующие действия.

Первое действие. Для того чтобы можно было масштабировать координаты городов, необходимо знать размеры формы. Осуществляется это в процедуре TFormAnt. Здесь XMax, YMax — размеры формы, Hx, — масштабный коэффициент.

Второе действие. Создадим функцию VisualCity, которая масштабирует координаты городов таким образом, чтобы они размещались на форме. Здесь hx, hy — реальные размеры области.

Третье действие. Процедура mnuCityShowClick для отображения городов на форме. Также в теле процедуры установим проверку: прежде чем отображать города, их координаты должны быть составлены, сохранены, координаты городов должны быть масштабированы согласно размерам формы.

Для расчета пути будем использовать процедуру mnuMinRoadClick.

Программный код представляет цикл с числом шагов, заданным переменной MAX_TIME (MAX_TOURS * MAX_CITIES). Один вызов функции simulateAnts позволяет каждому муравью перейти от одного города к другому. Функция simulateAnts возвращает нуль, если путь уже завершен, а в противном случае — значение, отличное от нуля. Функция simulateAnts выполняет перемещение муравьев из текущего города в новый город, предлагаемый вероятностным уравнением (1). Программа отмечает поле pathlndex, чтобы убедиться, что муравей еще не закончил путь. После этого вызывается функция selectNextCity, которая определяет следующую грань. Затем выбранный город загружается в структуру ant (поле nextCity), а также в списки path и tabu. После этого рассчитывается значение tourLength, чтобы сохранить длину пути. Если достигнут конец пути, в значение tourLength добавляется расстояние до начального города. Это позволяет построить полный путь через все остальные города и вернуться в начальный город.

Функция simulateAnts вызывает функцию selectNextCity, которая позволяет выбрать следующий город для составления пути. Функция selectNextCity вызывается для заданного муравья и определяет, которую из граней выбрать в соответствии со списком tabu. Выбор грани основывается на вероятностном уравнении (1), которое вычисляет коэффициент заданного пути от суммы других путей. Первой задачей функции selectNextCity является расчет знаменателя выражения. После этого все грани, которые еще не были выбраны, проверяются с помощью уравнения (1), чтобы муравей мог выбрать путь. Как только грань найдена, функция определяет город, к которому перейдет муравей.

Функция selectNextCity вызывает функцию antProduct, которая используется для расчета уравнения (1). Функция updateTrails осуществляет испарение фермента.

После завершения пути каждый муравей должен быть повторно инициализирован, а затем распределен по графу. Это выполняет функция restartAnts. Во время повторной инициализации самая оптимальная длина пути сохраняется, чтобы можно было оценить прогресс муравьев. Затем структура алгоритма очищается и повторно инициализируется - начинается следующее путешествие.

Использовать функцию необходимо в процедуре mnuMinRoadClick.

В этой же процедуре будем вызывать функции BestPath и SavePath для того, чтобы сохранять информацию о наименьшем пути. Здесь же будем выдавать информации в StatusBar о длине пути и числе циклов.

Пример решения задачи для 35 городов:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]