Алгоpитм — заранее заданное понятное и точное пpедписание возможному исполнителю совеpшить определенную последовательность действий для получения решения задачи за конечное число шагов.
Роботы (foot-bots) находятся вокруг центральной точки, которой является eye-bot. Затем foot-bots занимают позиции, являющиеся вершинами многоугольника, причём количество вершин соответствует количеству роботов. Каждый из foot-bots извещает eye-bot о достижении заданной точки. После того как все роботы "отрапортовали", они периодически сообщают о своём существовании. Eye-bot получает сообщения о существовании роботов, если количество сообщений оказывается меньше количества роботов, он даёт команду foot-bot перестроиться с учётом оставшегося количества роботов.
Задачами eye-bot являются:
1. Вычислить позиции роботов foot-bot в рое на основании первичных данных (количества роботов; координат центральной точки; радиуса окружности роя; направления первой точки).
2. На основании полученных данных от foot-bot определить окончание формирования роя.
3. На основании полученных данных от foot-bot определить событие исчезновения роботов.
Задачами foot-bot являются:
1. Получить свой номер и координаты точки, соответствующие этому номеру.
2. Достичь заданной точки.
3. Известить eye-bot о занятии точки.
4. Известить eye-bot о своём существовании.
5. Ожидать приказа о переходе к задаче № 1.
Для организации горизонтальной связи между программами роботов eye-bot и foot-bot будем использовать класс (элемент объектно-ориентированного программирования).
Взаимодействие между роботами осуществляется через методы класса Swarm. Для этого используем концепцию объектно-ориентированного программирования - инкапсуляцию.
Инкапсуляция – это свойство системы, позволяющее объединить данные и методы, работающие с ними, в классе и скрыть данные класса от непосредственного доступа внешних программ.
Eye-bot обращается к методу расчёта точек роя (DoSwarm). Далее foot-bot запрашивает свой ID (GetNumber), затем обращается к методу получения готовности точек роя (GetPointsReady) для подтверждения готовности координат точек (если же нет, то ждёт и обращается к данному методу вновь). Если метод получения готовности точек выводит подтверждение готовности, то foot-bot из метода получения координат точек (GetPoint) получает координаты своей целевой точки. Foot-bot осуществляет движение к полученной точке, после чего извещает Eye-bot о занятии точки через метод (PutReady). В это время Eye-bot обращается к методу (GetReady) и затем, если все достигли своих точек разрешает сообщать о том, что они живы. Foot-bot передают извещения о своём существовании методу (PutAlive), а из метода (GetAlive) их получает eye-bot.
Если количество живых роботов меньше первоначального значения, то eye-bot обнуляет через методы ZeroAlive, ZeroReady и ZeroNumber параметры класса, тем самым извещает foot-bots о начале перестроения и, обращаясь к методу DoSwarm задаёт новые точки роя с учётом изменившегося количества роботов.
Если же количество живых роботов остаётся тем же, то через метод PutTrueReadyGetAlive даётся указание foot-bot извещении о своём существовании.
Для расчёта точек роя используется функция PointRet. В функции PointRet определены переменные координат центральной точки cen (x, y), радиус окружности, т.е. переменная rad и направление точки от центральной - переменная ang.
Функция вычисляет координаты y и x. После вычисления координаты x, направление точки сравнивается со всевозможным углом направления. При ang <= 90 точки X и Y высчитываются путём сложения, при 90 < ang <= 180 точки y складываются, а x вычитаются. При 180 < ang <= 270 - путём вычитания, при 270 < ang <= 360 точки y вычитаются, а x складываются.