Máquina de estados finitos en Java

Sheeraz Gul 12 octubre 2023
Máquina de estados finitos en Java

La máquina de estados finitos se utiliza para reconocer patrones. Este tutorial demuestra cómo implementar una máquina de estados finitos en Java.

Máquina de estados finitos en Java

La máquina de estados finitos, también conocida como máquina de autómatas finitos, toma la cadena de símbolos como entrada y luego cambia su estado en consecuencia. La transición ocurre cuando se encuentra el símbolo deseado en la entrada y, durante la transición, los autómatas pueden permanecer en el mismo estado o cambiar al siguiente estado.

Siga los pasos a continuación para implementar una máquina de estados finitos en Java.

  • Primero, cree una clase contenedora para modelar la máquina de estados finitos.

    Esa clase contenedora contendrá la matriz de objetos de estado concretos, el índice de su estado actual y la tabla de transición de estado.

  • A continuación, todas las solicitudes de los clientes se delegarán al objeto de estado actual.
  • Luego, cree una clase base de estado para que los estados concretos sean intercambiables.

    Esa clase base de estado especificará el comportamiento predeterminado de todos los estados.

  • Finalmente, la clase derivada del estado solo anulará los mensajes requeridos.

Implementemos una máquina de estados finitos en Java basada en los pasos anteriores.

package delftstack;

// Step 1. create a wrapper class which models the finite state machine.
class Java_FSM {
  // Step 2. wrapper class states
  private FSM_State[] FSM_States = {new State1(), new State2(), new State3()};
  // Step 4. wrapper class transitions
  private int[][] FSM_Transition = {{0, 1, 2}, {2, 2, 0}, {1, 0, 2}};
  // Step 3. wrapper class current state
  private int Current_State = 0;

  private void FSM_Next(int Message) {
    Current_State = FSM_Transition[Current_State][Message];
  }

  // Step 5. all client requests will be delegated to the current state object.
  public void FSM_ON() {
    FSM_States[Current_State].FSM_ON();
    FSM_Next(0);
  }

  public void FSM_OFF() {
    FSM_States[Current_State].FSM_OFF();
    FSM_Next(1);
  }

  public void FSM_ACK() {
    FSM_States[Current_State].FSM_ACK();
    FSM_Next(2);
  }
}

// Step 6. Create a state base class to make the concrete states interchangeable.
// Step 7. state base class will specify the default behavior of all states
abstract class FSM_State {
  public void FSM_ON() {
    System.out.println("An error occurred");
  }

  public void FSM_OFF() {
    System.out.println("An error occurred");
  }

  public void FSM_ACK() {
    System.out.println("An error occurred");
  }
}

class State1 extends FSM_State {
  public void FSM_ON() {
    System.out.println("State1 + ON  = State3");
  }

  public void FSM_OFF() {
    System.out.println("State1 + OFF = State2");
  }

  public void FSM_ACK() {
    System.out.println("State1 + Ack = State1");
  }
}

class State2 extends FSM_State {
  public void FSM_ON() {
    System.out.println("State2 + ON  = State1");
  }

  public void FSM_OFF() {
    System.out.println("State2 + OFF = State3");
  }
}

class State3 extends FSM_State {
  // Step 8. state derived class will only override the messages it require to
  public void FSM_ON() {
    System.out.println("State3 + ON  = State2");
  }
}

public class Finite_State_Machine {
  public static void main(String[] args) {
    Java_FSM JavaFSM = new Java_FSM();
    int[] Messages = {1, 1, 2, 2, 0, 0, 1, 2};
    for (int Message : Messages) {
      if (Message == 0) {
        JavaFSM.FSM_ON();
      } else if (Message == 1) {
        JavaFSM.FSM_OFF();
      } else if (Message == 2) {
        JavaFSM.FSM_ACK();
      }
    }
  }
}

El código anterior demuestra una máquina de estados finitos que cambia de estado en función de los mensajes de entrada. Ver salida:

State1 + OFF = State2
State2 + OFF = State3
An error occurred
An error occurred
State3 + ON  = State2
State2 + ON  = State1
An error occurred
State1 + Ack = State1
Sheeraz Gul avatar Sheeraz Gul avatar

Sheeraz is a Doctorate fellow in Computer Science at Northwestern Polytechnical University, Xian, China. He has 7 years of Software Development experience in AI, Web, Database, and Desktop technologies. He writes tutorials in Java, PHP, Python, GoLang, R, etc., to help beginners learn the field of Computer Science.

LinkedIn Facebook