Я ищу хорошие примеры конечных автоматов; язык не особенно важен, просто хорошие примеры.
Реализации кода полезны (обобщенный псевдокод), но также очень полезно собирать различные варианты использования FSM.
Примеры не обязательно должны быть основаны на компьютере, например, пример Mike Dunlavey's Railroad network, очень полезен.
finite-state-machine
ocodo
источник
источник
Ответы:
Сейф (событие вызвано)
Светофор (срабатывает время | срабатывает датчик [событие])
Торговый автомат (событие сработало, вариант сейфа )
источник
Пример протокола пограничного шлюза
BGP - это протокол, который поддерживает основные решения по маршрутизации в Интернете. Он поддерживает таблицу для определения достижимости узлов данного узла и делает Интернет по-настоящему децентрализованным.
В сети каждый узел BGP является одноранговым и использует конечный автомат с одним из шести состояний Idle , Connect , Active , OpenSent , OpenConfirm и Established . Каждое одноранговое соединение в сети поддерживает одно из этих состояний.
Протокол BGP определяет сообщения, которые отправляются одноранговым узлам для изменения их состояния.
Диаграмма состояний БПГ.
вхолостую
Первое состояние простаивает . В этом состоянии BGP инициализирует ресурсы, отклоняет попытки входящего соединения и инициирует соединение с партнером.
Connect
Второе состояние Connect . В этом состоянии маршрутизатор ожидает завершения соединения и в случае успеха переходит в состояние OpenSent . В случае неудачи он сбрасывает таймер ConnectRetry и переходит в активное состояние по истечении срока действия.
активный
В активном состоянии маршрутизатор сбрасывает таймер ConnectRetry в ноль и возвращается в состояние подключения .
OpenSent
В состоянии OpenSent маршрутизатор отправляет сообщение Open и ожидает его в ответ. Сообщения поддержки активности обмениваются, и после успешного получения маршрутизатор переводится в состояние « установлено» .
установленный
В установленном состоянии маршрутизатор может отправлять / получать: Keepalive; Обновить; и уведомляющие сообщения от / от своего партнера.
Больше информации о BGP в Википедии
источник
Они полезны для моделирования всех видов вещей. Например, избирательный цикл можно смоделировать с помощью штатов по типу (нормальное правительство) - выборы называются -> (ранняя агитация) - парламент распущен -> (активная агитация) - выборы -> (подсчет голосов ). Затем либо (подсчет голосов) - нет большинства -> (переговоры по коалиции) - достигнуто соглашение -> (нормальное правительство) или (подсчет голосов) --majority -> (нормальное правительство). Я реализовал вариант по этой схеме в игре с политической подигрой.
Они используются и в других аспектах игр: ИИ часто основан на состоянии; переходы между меню и уровнями, а также переходы после смерти или уровня завершены, часто моделируются FSM.
источник
Анализатор CSV, используемый в плагине jquery-csv
Это базовый синтаксический анализатор Chomsky Type III .
Токенайзер регулярных выражений используется для оценки данных по типу за символом. Когда встречается контрольный символ, код передается в оператор switch для дальнейшей оценки на основе начального состояния. Неуправляемые символы группируются и копируются в массовом порядке, чтобы уменьшить количество необходимых операций копирования строки.
Токенизатор:
Первый набор совпадений - это управляющие символы: разделитель значений ("), разделитель значений (,) и разделитель ввода (все варианты новой строки). Последнее совпадение обрабатывает неуправляемую группировку символов.
Есть 10 правил, которым должен удовлетворять парсер:
Примечание: 7 верхних правил получены непосредственно из IETF RFC 4180 . Последние 3 были добавлены для покрытия крайних случаев, представленных современными приложениями для работы с электронными таблицами (например, Excel, Google Spreadsheet), которые по умолчанию не разделяют (т.е. заключают в кавычки) все значения. Я попытался внести изменения в RFC, но пока не получил ответа на свой запрос.
Хватит заводить, вот схема:
Состояния:
Переходы:
Примечание: на самом деле отсутствует состояние. Должна быть строка от 'c' -> 'b', помеченная состоянием '1', потому что экранированный второй разделитель означает, что первый разделитель все еще открыт. На самом деле, вероятно, было бы лучше представить его как еще один переход. Создание их - это искусство, единого правильного пути не существует.
Примечание: в нем также отсутствует состояние выхода, но на допустимых данных анализатор всегда заканчивается при переходе 'a', и ни одно из состояний невозможно, потому что ничего не осталось для анализа.
Разница между состояниями и переходами:
Состояние является конечным, то есть оно может означать только одно.
Переход представляет собой поток между состояниями, поэтому он может означать много вещей.
По сути, отношение состояние-> переход - 1 -> * (то есть один ко многим). Состояние определяет «что это такое», а переход определяет «как оно обрабатывается».
Примечание: не беспокойтесь, если приложение состояний / переходов не кажется интуитивно понятным, оно не интуитивно понятно. Потребовалась обширная переписка с кем-то, кто был намного умнее меня, прежде чем я, наконец, получил идею придерживаться.
Псевдокод:
Примечание: это суть, на практике гораздо больше, чтобы рассмотреть. Например, проверка ошибок, нулевые значения, завершающая пустая строка (т. Е. Которая действительна) и т. Д.
В этом случае состояние - это состояние вещей, когда блок соответствия регулярному выражению завершает итерацию. Переход представляется в виде падежных операторов.
Как люди, мы имеем тенденцию к упрощению операций низкого уровня на более высокие авторефераты уровня , но работа с FSM будет работать с операциями низкого уровня. В то время как с состояниями и переходами очень легко работать по отдельности, по своей сути сложно визуализировать все сразу. Мне было легче повторять отдельные пути выполнения снова и снова, пока я не смогу интуитивно понять, как происходит переход. Это похоже на изучение базовой математики, вы не сможете оценить код с более высокого уровня, пока детали низкого уровня не станут автоматическими.
В сторону: если вы посмотрите на фактическую реализацию, там пропущено много деталей. Во-первых, все невозможные пути приведут к определенным исключениям. Удар по ним должен быть невозможным, но если что-то сломается, они будут вызывать исключения в тестовом средстве. Во-вторых, правила синтаксического анализа для того, что разрешено в «допустимой» строке данных CSV, довольно свободны, поэтому код, необходимый для обработки множества конкретных крайних случаев. Независимо от этого факта, это был процесс, который использовался для насмешки FSM перед всеми исправлениями ошибок, расширениями и тонкой настройкой.
Как и в большинстве проектов, это не точное представление реализации, но оно описывает важные части. На практике на самом деле существует 3 различных функции синтаксического анализатора, полученных из этого проекта: специфичный для csv разделитель строк, однострочный анализатор и полный многострочный анализатор. Все они работают одинаково, они отличаются тем, как они обрабатывают символы новой строки.
источник
Простой FSM на Java
Вот и ты. Хорошо, это не блестяще, но это показывает идею.
Вы часто найдете FSM в телекоммуникационных продуктах, потому что они предлагают простое решение в других сложных ситуациях.
источник
Я обнаружил, что размышления о моделировании лифта (лифта) - хороший пример конечного автомата. Это мало что требует для введения, но предоставляет далеко не тривиальную ситуацию для реализации.
Состояния, например, находятся на первом этаже, на первом этаже и т. Д. И перемещаются с первого на второй этаж или с третьего на первый этаж, но в настоящее время находятся между этажами 3 и 2 и т. Д.
Эффект кнопок в лифтовой клетке и на самих этажах обеспечивает входы, эффект которых зависит как от кнопки, нажатой, так и от текущего состояния.
На каждом этаже, кроме верхнего и нижнего, будут две кнопки: одна для запроса подъема, другая для спуска.
источник
Хорошо, вот пример. Предположим, вы хотите разобрать целое число. Было бы что-то вроде
dd*
гдеd
целая цифра.Конечно, как сказал @Gary, вы можете замаскировать их
goto
с помощью оператора switch и переменной состояния. Обратите внимание, что это может быть структурировано в этот код, который изоморфен исходному регулярному выражению:Конечно, вы также можете сделать это с помощью справочной таблицы.
Конечные автоматы могут быть сделаны многими способами, и многие вещи могут быть описаны как экземпляры конечных автоматов. Это не «вещь», а концепция, чтобы думать о вещах.
Пример железнодорожной сети
Одним из примеров FSM является сеть железных дорог.
Есть конечное число переключателей, на которых поезд может идти на одну из двух колей.
Существует конечное количество дорожек, соединяющих эти переключатели.
В любой момент поезд находится на одном пути, его можно отправить на другой путь путем пересечения переключателя на основе одного бита входной информации.
источник
Конечный автомат в Ruby:
Это поведение отдельного вычислительного узла в распределенной системе, устанавливающего схему связи на основе канала. Более менее. В графической форме это выглядит примерно так:
источник
Проверьте эту ссылку для некоторых простых примеров лексического анализа (FSM):
http://ironbark.bendigo.latrobe.edu.au/subjects/SS/clect/clect03.html
Вы также можете проверить "книгу драконов" для примеров (это не легкое чтение)
http://en.wikipedia.org/wiki/Compilers:_Principles,_Techniques,_and_Tools
источник
На практике государственные машины часто используются для:
Одним из примеров может быть конечный автомат, который сканирует строку, чтобы увидеть, имеет ли он правильный синтаксис. Например, голландские почтовые индексы имеют формат «1234 AB». Первая часть может содержать только цифры, вторая - только буквы. Может быть написан конечный автомат, который отслеживает, находится ли он в состоянии NUMBER или в состоянии LETTER, и если он обнаруживает неправильный ввод, отклоните его.
Этот конечный автомат принимает два состояния: числовое и альфа. Конечный автомат запускается в числовом состоянии и начинает читать символы строки для проверки. Если в любом из состояний встречаются недопустимые символы, функция возвращает значение False, отклоняя ввод как недействительный.
Код Python:
Источник: (конечно) государственные машины на практике
источник