人工智慧——狀態機
設計模式中的狀態模式是做狀態機的基礎知識,用狀態模式設計的狀態機會非常優雅。
狀態模式的本質就是把多變的狀態抽象成一個介面,把控制狀態的條件封裝成一個控制類,利用多態性,控制類操作狀態介面就可以完成對各種狀態的切換。
舉一個例子: 現在要設計一個盡量精簡的智能小貓,小貓平時會睡覺,但遇到危險要能自動跑開。分析一下這個場景,就發現小貓有兩種狀態,睡覺和逃跑,控制條件就是是否有危險,這樣就可以用狀態模式來設計了。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:人工智慧演算法 |