Необходимо разработать модуль, решающий задачу сборки ханойской башни (рис. 1). При выполнении задания считать, что в системе есть три одинаковых (по функциям) робота. Структура каждого робота позволяет формировать ханойскую башню. Т.е. есть держатель для дисков и манипулятор чтобы снимать и класть в стопку диск.
Рис.1. Ханойская башня
У одного из роботов есть диски, которые располагаются в виде пирамидки(ханойской башни): в самом низу лежит самый большой диск, затем идёт чуть поменьше диск, затем ещё меньше диск и т. д. Необходимо переместить диски с одного робота на другой. Допускается два подхода к решению задачи.
В первом используется два вида модулей. Довольно простые модули-исполнители (которые управляют роботами) и модуль координатор (агент управления). Агент управления должен заставить роботов передать друг другу диски таким образом, чтобы у одного из них получилась собранная ханойская башня.
Во втором случае вид модулей - один. Модули управления роботами в этом случае способны решить задачу построения ханойской башни кооперируясь без агента-координатора.
При реализации алгоритма построения башни следует учитывать следующие условия:
При реализации модуля следует также использовать системные сообщения среды исполнения, определенные протоколом обмена ядра (Kernel).
Messages ; Сообщения TimeOut : 1 | Сообщение TimeOut. Рассылается машинами состояний в случае превышения допустимого интервала нахождения в определенном состоянии. 1 : 0 ; Поколение 1, число аргументов 0 ModuleFailedOnEvent : 2 | Модуль не смог обработать сообщение 1 : 3 ; Поколение 1, число аргументов 3 EventKind : int | - Тип, события, при реакции на которое произошла ошибка ExceptionKind : string | - Тип ошибки (исключения) ExceptionMessage : string | - Сообщение об ошибке Start : 3 | Команда инициализации 1 : 0 ; Поколение 1, число аргументов 0 Stop : 4 | Команда остановки 1 : 0 ; Поколение 1, число аргументов 0 StateChanged : 5 | Событие, присылаемое в момент изменения состояния конечного автомата 1 : 4 ; Поколение 1, число аргументов 4 MachineName : string | - Имя конечного автомата, перешедшего в новое состояние OldState : string | - Старое состояние машины NewState : string | - Новое состояние машины Event : int | - Событие, активировавшее переход
Системные сообщения используются для возможности обработки в модуле событий его загрузки и выгрузки, а также о иных важных событиях (например тайм-аутах).
После загрузки модулю обычно направляется сообщение Kernel.Start. Получив его, модуль может выполнить какую-то инициализацию.
Сообщение Kernel.Stop используется для оповещения модуля о выгрузке. Обычно получив такое сообщение модуль переходит в конечное состояние.
Сообщение Kernel.TimeOut может быть прислано ядром, если модуль находится в состоянии, отмеченном пометкой TimeOut=Значение (в миллисекундах). Если модуль находится в таком состоянии без переходов время, большее чем указанное значение, то он получит сообщение Kernel.TimeOut.
Сообщение Kernel.StateChanged отладочное информационное сообщение. В режиме отладки модуль рассылает такое сообщение при каждом изменении состояния конечного автомата. В сообщении зафиксированы старое и новое состояние, а также код события, активировавшего переход.
При выполнении задания следует считать, что адреса указанных выше модулей постоянны и известны заранее:
Модуль | Адрес |
Контролирующая логика (при наличии) | "ControlLogic" |
Модуль-исполнитель (робот 1) | "Driver1" |
Модуль-исполнитель (робот 2) | "Driver2" |
Модуль-исполнитель (робот 3) | "Driver3" |
Для успешного прохождения тестирования кандидат должен предоставить комплект материалов:
Комплект предоставляется в форме zip-архива с именем в формате <ФамилияИО>.zip (например: SukhoiDA.zip).
Задание можно выполнять как с применением Microsoft Visual C++ (под управлением ОС Windows), так и с применением компилятора gcc (под управлением ОС Linux CentOS 7 или ОС Ubuntu Linux).
Если появились какие-то вопросы, на которые не обнаружился ответ в материалах их можно задать через электронную почту.