Этот алгоритм строится над базовым алгоритмом, и оба алгоритма работают параллельно. Такую организацию параллельных процессов смоделировать в AnyLogic очень просто. А именно, в каждой машине кроме стейтчарта main, реализующего базовые вычисления системы машин, добавляется новый стейтчарт, работающий параллельно с основным и реализующий описанный ранее алгоритм.
Дополнения в активном объекте Machine
В основной алгоритм вносится одно изменение: в соответствии с третьим правилом алгоритма, машина, получившая базовое сообщение, становится черной. Поэтому на переходах t и t3 в стейтчарте main добавлено это действие.
Активный объект Machine будет также оперировать и с токенами. Токен имеет свой счетчик и цвет. Именно эти параметры определены в новом классе сообщений Token.
Активный объект Machine будет иметь два дополнительных порта, in и out, через которые по кольцу передается токен. Потому тип сообщений, передаваемых через эти порты, определен как Token. Машина имеет два дополнительных параметра, token типа Token для хранения полученного по кольцу токена и machineColor, который хранит цвет машины в соответствии с этим алгоритмом. Определим машину-лидер как машину с номером 0. Именно эта машина будет инициировать запуск токена и анализировать его по получении. Все остальные экземпляры машин будут только передавать токен по кольцу.
Алгоритм распределенного завершения выражается стейтчартом. Этот стейт-чарт реализован как две независимые ветви, одна из которых осуществляет алгоритм лидера, а другая — алгоритм обычной машины в кольце. Выбор нужной части стейтчарта в каждой машине выполняется из начального состояния initial по номеру машины.
Алгоритм лидера состоит в том, что после некоторой постоянной задержки порождается новый токен и посылается по сети (через порт out). Далее в состоянии waitMyToken лидер ждет получения этого токена. После его получения из порта in лидер переходит в состояние waitActiveLeader, токен при этом сохраняется в локальной переменной token. В этом состоянии лидер находится до тех пор, пока его состояние не станет пассивным. При выходе из состояния (когда лидер стал пассивным) производится анализ выполнения четвертого правила алгоритма Дейкстры с помощью алгоритмической функции termcondition. Если условие правила выполняется, лидер переходит в состояние stopAlgorithm, в котором работа модели останавливается (рис. 19.3). Если условие не выполняется, работа лидера возобновляется с шага порождения нового токена.
Алгоритм обычной машины в кольце тоже прост (правая ветвь стейтчарта рис. 19.3). Находясь в состоянии waitTokenFromRing, машина ожидает то-кен, передаваемый по кольцу. Дождавшись токена из порта in, машина задерживает его на небольшое время (только для визуального эффекта в анимации), находясь в состоянии processingToken. Дождавшись, когда она в базовых вычислениях станет пассивной (это определяется условием main.isStateActive(main.Idle)), машина передает токен через порт out, предварительно увеличив его значение на величину счетчика с данной машины и перекрасив токен в темный цвет, если это нужно в соответствии с третьим правилом алгоритма.