人工智慧——狀態機

設計模式中的狀態模式是做狀態機的基礎知識,用狀態模式設計的狀態機會非常優雅。

狀態模式的本質就是把多變的狀態抽象成一個介面,把控制狀態的條件封裝成一個控制類,利用多態性,控制類操作狀態介面就可以完成對各種狀態的切換。

舉一個例子: 現在要設計一個盡量精簡的智能小貓,小貓平時會睡覺,但遇到危險要能自動跑開。分析一下這個場景,就發現小貓有兩種狀態,睡覺和逃跑,控制條件就是是否有危險,這樣就可以用狀態模式來設計了。UML圖如下:

首先設計出抽象的狀態父類,有一個純虛函數virtual void execute(CTroll* troll),子類必須繼承,然後逃跑類和睡覺類繼承狀態類。代碼如下:

#pragma once

#include "Troll.h"

class CTroll;

class CState

{

public:

CState(void);

~CState(void);

virtual void execute(CTroll* troll)=0;

};

class CState_Runaway:public CState

{

private:

void Run(){cout<<"I will run away!"<<endl;}

public:

void execute(CTroll* troll);

};

class CState_Sleep: public CState

{

private:

void Sleep(){cout<<"sleep ZZZZZZZZZZZ"<<endl;}

public:

void execute(CTroll* troll);

};

再設計控制類,控制類的核心就是有一個狀態類的指針,這個指針指向狀態類的父類,這樣利用多態性,就可以操作各狀態子類了。代碼如下:

#pragma once

#include "stdafx.h"

#include "State.h"

class CState;

class CTroll

{

private:

CState* m_pCurrentState;

bool m_bSafe;

public:

CTroll(void);

~CTroll(void);

public:

void Update();

void ChageState(CState* pNewState);

void SetSafe(bool safe){m_bSafe=safe;}

bool GetSafe(){return m_bSafe;}

};

狀態類的實現如下:

#include "State.h"

#include "stdafx.h"

CState::CState(void)

{

}

CState::~CState(void)

{

}

void CState_Runaway::execute(CTroll* troll)

{

if (troll->GetSafe())

{

troll->ChageState(new CState_Sleep());

}

else

{

Run();

}

}

void CState_Sleep::execute(CTroll* troll)

{

if (troll->GetSafe())

{

Sleep();

}

else

{

troll->ChageState(new CState_Runaway());

}

}

控制類的實現如下:

#include "Troll.h"

CTroll::CTroll(void)

{

m_pCurrentState=new CState_Sleep();

m_bSafe=true;

}

CTroll::~CTroll(void)

{

delete m_pCurrentState;

}

void CTroll::Update()

{

m_pCurrentState->execute(this);

}

void CTroll::ChageState(CState* pNewState)

{

delete m_pCurrentState;

m_pCurrentState=pNewState;

Update();

}

最後是主程序:

#include "stdafx.h"

#include "State.h"

int main()

{

CTroll cat;

cat.Update();

bool safe=false;

cat.SetSafe(safe);

cat.Update();

system("pause");

return 0;

}

這樣,一個精簡的智能小貓就做出來了。


推薦閱讀:

未來政治制度是一個「演算法」制度
SKlearn機器學習入門(5決策樹(分類))
Character人物之線條表現

TAG:人工智慧演算法 |