Home >> Blog >> 什麼是有限狀態機?

什麼是有限狀態機?

介紹

有限狀態機或FSM是一種計算模型,可用於模擬順序邏輯,或者換句話說,用於表示和控制執行流程。有限狀態機可用於對許多領域的問題進行建模,包括數學、人工智能、遊戲或語言學。

定義

一個有限狀態機是一種基於由一個或多個狀態組成的假設機器的計算模型。這台機器只能同時激活一個狀態。這意味著機器必須從一種狀態轉換到另一種狀態才能執行不同的操作。

有限狀態機是在給定時間存儲某物狀態的任何設備。狀態將根據輸入進行更改,為實施的更改提供結果輸出。

有限狀態機來自計算機科學的一個分支,稱為“自動機理論”。屬於該領域的數據結構家族還包括圖靈機。

這裡的要點如下:

  • 我們有一組固定的機器可以處於的狀態
  • 機器一次只能處於一種狀態
  • 一系列輸入被發送到機器
  • 每個狀態都有一組轉換,每個轉換都與一個輸入相關聯並指向一個狀態

現實世界的例子

讓我們看看在現實世界中什麼是有限狀態機:

投幣閘機

  • 狀態:鎖定、解鎖
  • 過渡:將硬幣指向插槽將解鎖旋轉門,推動解鎖的旋轉門的手臂將讓客戶通過並再次鎖定旋轉門

紅綠燈

  • 狀態:紅色、黃色、綠色
  • 過渡:在給定時間後,紅色將變為綠色,綠色變為黃色,黃色變為紅色

保險箱

  • 狀態:多個“鎖定”狀態,一個“解鎖”狀態
  • 轉換:正確的組合將我們從初始鎖定狀態移動到更接近解鎖狀態的鎖定狀態,直到我們最終到達解鎖狀態。不正確的組合使我們回到最初的鎖定狀態

編程示例

知道了我們所知道的,讓我們做一個簡單而基本的編程示例。假設我們在我們最喜歡的視頻遊戲中有我們的朋友馬里奧。所以,馬里奧可以做以下動作:

  • 站著不動
  • 鴨子

我們可以看到馬里奧可以做很多事情,所有這些事情都應該是一個特定的狀態。在編寫任何一行代碼之前,我們應該問問自己我們所有不同的狀態是如何組合在一起的。我們需要確切地知道馬里奧可以做什麼以及他如何以及何時可以做這些動作。例如,當我們按下相應的按鈕時,馬里奧可以站著不動然後跑,但在他跳躍時不能跑。因此,不會導致狀態變化的輸入將被忽略。

我們可以首先定義一個“狀態接口”:

interface State
{
void enter(Character character);
State handleInput(Character character, Input input);
void update(Character character);
}

所以,我們的角色,這裡是我們親愛的馬里奧,可能有以下代碼:

class RunningState : State
{
void enter(Character character)
{
// Various operations like
// setting the graphics
}
State handleInput(Character character, Input input)
{
// Various operations like
// checking the input
// Returning a state after all the operations
return new StandingState();
}
void update(Character character)
{
// Various operations
}
}

所以,我們的角色,這裡是我們親愛的馬里奧,可能有以下代碼:

class Mario : Character, Player
{
private State _state;
void handleInput(Input input)
{
_state.handleInput(this, input);
}
void update()
{
_state.update(this);
}
}

基於堆棧的 FSM

我們可以走得更遠一點。我們可以使用基於堆棧的 FSM。使用我們之前的解決方案,我們沒有歷史概念。我們知道我們當前的狀態,但我們無法回到之前的狀態。

為了解決這個問題,我們可以使用Stack ,它以LIFO樣式(後進先出)存儲元素,以保存我們的不同狀態。這意味著當前狀態是Stack頂部的狀態。然後,當我們想要轉換到一個新狀態時,我們將該新狀態推送到堆棧上,這個狀態就變成了當前狀態。完成後,我們彈出這個狀態,之前的狀態變成當前狀態。當然,我們有責任管理我們想要堆棧中的哪些狀態以及我們想要丟棄哪些狀態。

結論

通過本文,我們了解了有限狀態機是什麼。我們看到有限狀態機是一種基於由一個或多個狀態組成的假設機器的計算模型,並且該機器只有一個單一狀態可以同時處於活動狀態。

最後一句話

如果你喜歡這篇文章,你可以考慮在Patreon上支持和幫助我!這一定非常棒!否則,您可以在Medium和Tumblr上找到我的其他帖子。您還將在我的個人網站上了解更多關於我自己的信息。直到下一次,快樂的頭痛!