Finite State Machine Behaviors (FSM)

An FSM Agent

public class FSMAgent extends Agent {
   public void setup() {
      FSMBehaviour fsm = new Recognizer(this);
      addBehaviour(fsm);
   }
}

An FSM State

class State extends OneShotBehaviour {
   private int event = -1;
   private String name;
   public State(Agent a, String name) {
      super(a);
      this.name = name;
   }
   public void onStart() {
      System.out.println("Entering " + name + " state");
   }
   public void action() {
      ACLMessage msg = myAgent.blockingReceive();
      event = Integer.valueOf(msg.getContent()).intValue();
      System.out.println(
         "Exiting " + name + " state, event = " + event);
   }
   public int onEnd() { return event; }
}

An FSM Behavior

A recognizer for L = (00)+ | (11)+

class Recognizer extends FSMBehaviour {
   private State start, even0, odd0, even1, odd1, fail;
   public Recognizer(Agent a) {
      super(a);
      // init states:
      start = new State(myAgent, "start");
      even0 = new State(myAgent, "even0");
      even1 = new State(myAgent, "even1");
      odd0 = new State(myAgent, "odd0");
      odd1 = new State(myAgent, "odd1");
      fail = new State(myAgent, "fail");
      // register states:
      registerFirstState(start, "start");
      registerState(even0, "even0");
      registerState(even1, "even1");
      registerState(fail, "fail");
      registerState(odd0, "odd0");
      registerState(odd1, "odd1");
      // register transitions:
      registerTransition("start", "odd0", 0);
      registerTransition("start", "odd1", 1);
      registerTransition("odd0", "even0", 0, new String[] {"odd0"});
      registerTransition("odd1", "even1", 1, new String[] {"odd1"});
      registerTransition("even0", "odd0", 0, new String[] {"even0"});
      registerTransition("even1", "odd1", 1, new String[] {"even1"});
      registerDefaultTransition("even0", "fail");
      registerDefaultTransition("even1", "fail");
      registerDefaultTransition("odd0", "fail");
      registerDefaultTransition("odd1", "fail");
      registerDefaultTransition("fail", "fail");
      registerDefaultTransition("start", "fail");
      // start:
      scheduleFirst();
   }
}

 

Program Output

Using the dummy agent to send 00001000:

Entering start state
Exiting start state, event = 0
Entering odd0 state
Exiting odd0 state, event = 0
Entering even0 state
Exiting even0 state, event = 0
Entering odd0 state
Exiting odd0 state, event = 0
Entering even0 state
Exiting even0 state, event = 1
Entering fail state
Exiting fail state, event = 0
Exiting fail state, event = 0
Exiting fail state, event = 0