Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What kind of problems are state machines good for? [closed]

What kind of programming problems are state machines most suited for?

I have read about parsers being implemented using state machines, but would like to find out about problems that scream out to be implemented as a state machine.

like image 548
Oded Avatar asked Sep 02 '08 20:09

Oded


People also ask

What are state machines good for?

Why Use a State Machine? State Machines are used in applications where distinguishable states exist. Each state can lead to one or multiple states and can also end the process flow. A State Machine relies on user input or in-state calculation to determine which state to go to next.

When should I use state machines?

State machines are useful if you can define a clear number of states and events that will trigger transitions to them. They might be good for user interfaces or communications protocols. However, when building complex systems, implementation of state machines is not the best option.

What can finite state machines be used for?

Finite state machines can be used to model problems in many fields including mathematics, artificial intelligence, games, and linguistics. A system where particular inputs cause particular changes in state can be represented using finite state machines.

What is the basic function of a state machine?

A state machine is any device storing the status of something at a given time. The status changes based on inputs, providing the resulting output for the implemented changes.


2 Answers

The easiest answer is probably that they are suited for practically any problem. Don't forget that a computer itself is also a state machine.

Regardless of that, state machines are typically used for problems where there is some stream of input and the activity that needs to be done at a given moment depends the last elements seen in that stream at that point.

Examples of this stream of input: some text file in the case of parsing, a string for regular expressions, events such as player entered room for game AI, etc.

Examples of activities: be ready to read a number (after another number followed by a + have appear in the input in a parser for a calculator), turn around (after player approached and then sneezed), perform jumping kick (after player pressed left, left, right, up, up).

like image 101
mweerden Avatar answered Oct 03 '22 10:10

mweerden


A good resource is this free State Machine EBook. My own quick answer is below.

When your logic must contain information about what happened the last time it was run, it must contain state.

So a state machine is simply any code that remembers (or acts on) information that can only be gained by understanding what happened before.

For instance, I have a cellular modem that my program must use. It has to perform the following steps in order:

  1. reset the modem
  2. initiate communications with the modem
  3. wait for the signal strength to indicate a good connection with a tower
  4. ...

Now I could block the main program and simply go through all these steps in order, waiting for each to run, but I want to give my user feedback and perform other operations at the same time. So I implement this as a state machine inside a function, and run this function 100 times a second.

enum states{reset,initsend, initresponse, waitonsignal,dial,ppp,...}
modemfunction()
{
  static currentstate

  switch(currentstate)
  {
  case reset:
    Do reset
    if reset was successful, nextstate=init else nextstate = reset
    break
  case initsend
    send "ATD"
    nextstate = initresponse 
    break
  ...
  }
currentstate=nextstate
}

More complex state machines implement protocols. For instance a ECU diagnostics protocol I used can only send 8 byte packets, but sometimes I need to send bigger packets. The ECU is slow, so I need to wait for a response. Ideally when I send a message I use one function and then I don't care what happens, but somewhere my program must monitor the line and send and respond to these messages, breaking them up into smaller pieces and reassembling the pieces of received messages into the final message.

like image 40
Adam Davis Avatar answered Oct 03 '22 09:10

Adam Davis