Estoy buscando buenos ejemplos de máquinas de estados finitos; el lenguaje no es particularmente importante, solo buenos ejemplos.
Las implementaciones de código son útiles (pseudocódigo generalizado), pero también es muy útil para reunir los diversos usos de los FSM.
Los ejemplos no necesariamente tienen que estar basados en computadora, por ejemplo, el ejemplo de Mike Dunlavey Railroad networks es muy útil.
finite-state-machine
ocodo
fuente
fuente
Respuestas:
A Safe (evento activado)
Semáforo (tiempo activado | sensor [evento] activado)
Máquina expendedora (evento activado, una variación de la caja fuerte )
fuente
Ejemplo de protocolo de puerta de enlace fronterizo
BGP es un protocolo que respalda las decisiones básicas de enrutamiento en Internet. Mantiene una tabla para determinar la accesibilidad de los hosts desde un nodo determinado e hizo que Internet sea realmente descentralizada.
En la red, cada nodo BGP es un par y utiliza una máquina de estados finitos, con uno de los seis estados Idle , Connect , Active , OpenSent , OpenConfirm y establecida . Cada conexión de igual en la red mantiene uno de estos estados.
El protocolo BGP determina los mensajes que se envían a sus pares para cambiar su estado.
BPG statechart.
Ocioso
El primer estado de inactividad . En este estado, BGP inicializa los recursos, rechaza los intentos de conexión entrantes e inicia una conexión con el igual.
Conectar
El segundo estado Conecta . En este estado, el enrutador espera a que se complete la conexión y pasa al estado OpenSent si tiene éxito. Si no tiene éxito, restablece el temporizador ConnectRetry y pasa al estado Activo al expirar.
Activo
En el estado Activo , el enrutador restablece el temporizador ConnectRetry a cero y vuelve al estado Conectar .
OpenSent
En el estado OpenSent , el enrutador envía un mensaje Open y espera a cambio uno. Los mensajes de Keepalive se intercambian y, una vez recibidos con éxito, el enrutador se coloca en el estado establecido .
Establecido
En el estado establecido , el enrutador puede enviar / recibir: Keepalive; Actualizar; y mensajes de notificación a / de su par.
Más información sobre BGP está en wikipedia
fuente
Son útiles para modelar todo tipo de cosas. Por ejemplo, un ciclo electoral puede ser modelado con estados a lo largo de las líneas de (gobierno normal) - elección llamada -> (campaña temprana) - Parlamento disuelto -> (campaña fuerte) - elección -> (conteo de votos ) Luego, ya sea (recuento de votos) --no mayoría -> (negociaciones de coalición) - acuerdo alcanzado -> (gobierno normal) o (recuento de votos) - mayoría -> (gobierno normal). He implementado una variante de este esquema en un juego con un subjuego político.
También se usan en otros aspectos de los juegos: la IA a menudo se basa en el estado; Las transiciones entre menús y niveles, y las transiciones al morir o el nivel completado a menudo están bien modeladas por los FSM.
fuente
El analizador CSV utilizado en el complemento jquery-csv
Es un analizador de gramática básico de Chomsky Tipo III .
Un tokenizer regex se utiliza para evaluar los datos en una base de char-by-char. Cuando se encuentra un control char, el código se pasa a una instrucción switch para una evaluación adicional basada en el estado inicial. Los caracteres sin control se agrupan y copian en masa para reducir el número de operaciones de copia de cadena necesarias.
El tokenizador:
El primer conjunto de coincidencias son los caracteres de control: delimitador de valor (") separador de valor (,) y separador de entrada (todas las variaciones de nueva línea). La última coincidencia maneja la agrupación de caracteres sin control.
Hay 10 reglas que el analizador debe cumplir:
Nota: Las 7 reglas principales se derivan directamente de IETF RFC 4180 . Los últimos 3 se agregaron para cubrir casos extremos introducidos por aplicaciones modernas de hoja de cálculo (ex Excel, hoja de cálculo de Google) que no delimitan (es decir, cotizan) todos los valores de forma predeterminada. Intenté contribuir con los cambios al RFC pero aún no he escuchado una respuesta a mi consulta.
Suficiente con la liquidación, aquí está el diagrama:
Estados:
Transiciones:
Nota: en realidad le falta un estado. Debe haber una línea desde 'c' -> 'b' marcada con el estado '1' porque un segundo delimitador escapado significa que el primer delimitador aún está abierto. De hecho, probablemente sería mejor representarlo como otra transición. Crear estos es un arte, no hay una única forma correcta.
Nota: También le falta un estado de salida, pero en los datos válidos el analizador siempre termina en la transición 'a' y ninguno de los estados es posible porque no queda nada para analizar.
La diferencia entre estados y transiciones:
Un estado es finito, lo que significa que solo se puede inferir que significa una cosa.
Una transición representa el flujo entre estados, por lo que puede significar muchas cosas.
Básicamente, la relación estado-> transición es 1 -> * (es decir, uno a muchos). El estado define "qué es" y la transición define "cómo se maneja".
Nota: No se preocupe si la aplicación de estados / transiciones no se siente intuitiva, no es intuitiva. Se necesitó una correspondencia extensa con alguien mucho más inteligente que yo antes de que finalmente pudiera mantener el concepto.
El seudocódigo:
Nota: Esta es la esencia, en la práctica hay mucho más que considerar. Por ejemplo, comprobación de errores, valores nulos, una línea en blanco al final (es decir, que es válida), etc.
En este caso, el estado es la condición de las cosas cuando el bloque de coincidencia de expresiones regulares finaliza una iteración. La transición se representa como las declaraciones de caso.
Como humanos, tenemos una tendencia a simplificar las operaciones de bajo nivel en resúmenes de alto nivel, pero trabajar con un FSM es trabajar con operaciones de bajo nivel. Si bien los estados y las transiciones son muy fáciles de trabajar individualmente, es inherentemente difícil visualizar todo de una vez. Me resultó más fácil seguir los caminos individuales de ejecución una y otra vez hasta que pude intuir cómo se desarrollan las transiciones. Es como aprender matemática básica, no podrás evaluar el código desde un nivel superior hasta que los detalles de nivel bajo comiencen a ser automáticos.
Aparte: si observa la implementación real, faltan muchos detalles. Primero, todos los caminos imposibles arrojarán excepciones específicas. Debería ser imposible golpearlos, pero si algo se rompe, desencadenarán excepciones en el corredor de prueba. En segundo lugar, las reglas del analizador de lo que está permitido en una cadena de datos CSV 'legal' son bastante flexibles, por lo que el código necesario para manejar una gran cantidad de casos específicos. Independientemente de ese hecho, este fue el proceso utilizado para burlarse del FSM antes de todas las correcciones de errores, extensiones y ajustes.
Como con la mayoría de los diseños, no es una representación exacta de la implementación, pero describe las partes importantes. En la práctica, en realidad hay 3 funciones de analizador diferentes derivadas de este diseño: un divisor de línea específico de csv, un analizador de una sola línea y un analizador de varias líneas completo. Todos operan de manera similar, difieren en la forma en que manejan los caracteres de nueva línea.
fuente
FSM simple en Java
Ahí tienes. OK, no es brillante, pero muestra la idea.
A menudo encontrará FSM en productos de telecomunicaciones porque ofrecen una solución simple a una situación compleja.
fuente
He descubierto que pensar / modelar un ascensor (elevador) es un buen ejemplo de una máquina de estados finitos. Requiere poco en el camino de introducción, pero proporciona una situación lejos de trivial para implementar.
Los estados son, por ejemplo, en la planta baja, en el primer piso, etc., y se mueven de la tierra al primer piso, o se mueven de la tercera a la planta baja, pero actualmente se encuentran entre los pisos 3 y 2, y así sucesivamente.
El efecto de los botones en la jaula del elevador y en los mismos pisos proporciona entradas, cuyo efecto depende tanto del botón que se presiona junto con el estado actual.
Cada piso, excepto la parte superior e inferior, tendrá dos botones: uno para solicitar que el elevador suba, el otro para bajar.
fuente
OK, aquí hay un ejemplo. Suponga que desea analizar un número entero. Sería algo así como
dd*
donded
es un dígito entero.Por supuesto, como dijo @Gary, podría disfrazar esos
goto
s mediante una declaración de cambio y una variable de estado. Tenga en cuenta que se puede estructurar a este código, que es isomorfo a la expresión regular original:Por supuesto, también puedes hacerlo con una tabla de búsqueda.
Las máquinas de estados finitos pueden hacerse de muchas maneras, y muchas cosas pueden describirse como instancias de máquinas de estados finitos. No es tanto una "cosa" como un concepto, para pensar sobre las cosas.
Ejemplo de red ferroviaria
Un ejemplo de un FSM es una red ferroviaria.
Hay un número finito de interruptores donde un tren puede ir a una de las dos vías.
Hay un número finito de pistas que conectan estos interruptores.
En cualquier momento, un tren está en una vía, se puede enviar a otra vía cruzando un interruptor, basado en un solo bit de información de entrada.
fuente
Máquina de estado finito en rubí:
Ese es el comportamiento de un solo nodo de cómputo en un sistema distribuido, configurando un esquema de comunicación basado en enlaces. Más o menos. En forma gráfica se parece a esto:
fuente
Consulte este enlace para ver algunos ejemplos simples de análisis léxico (FSM):
http://ironbark.bendigo.latrobe.edu.au/subjects/SS/clect/clect03.html
También puede consultar el "libro del dragón" para ver ejemplos (no es una lectura ligera)
http://en.wikipedia.org/wiki/Compilers:_Principles,_Techniques,_and_Tools
fuente
En la práctica, las máquinas de estado a menudo se usan para:
Un ejemplo sería una máquina de estado que escanea una cadena para ver si tiene la sintaxis correcta. Los códigos postales holandeses, por ejemplo, están formateados como "1234 AB". La primera parte solo puede contener números, la segunda solo letras. Se podría escribir una máquina de estado que haga un seguimiento de si está en el estado NÚMERO o en el estado LETRA y, si encuentra una entrada incorrecta, rechazarla.
Esta máquina de estados aceptadores tiene dos estados: numérico y alfa. La máquina de estados comienza en el estado numérico y comienza a leer los caracteres de la cadena para verificar. Si se encuentran caracteres inválidos durante cualquiera de los estados, la función regresa con un valor Falso, rechazando la entrada como inválida.
Código de Python:
Fuente: Máquinas de estado (finito) en la práctica
fuente