基礎(chǔ) | 自治智能體----類鳥群(一)

本系列為筆者初學(xué)c/c++和游戲AI開發(fā)的學(xué)習(xí)過程,算法為主,不涉及到具體的游戲開發(fā)軟件學(xué)習(xí)(如unity,虛幻4等),若有錯誤請?jiān)谠u論區(qū)留下批評意見。
語言:c/c++ (11及以上)?
平臺:macOS mojave?
編譯器:vs Code / g++


? Boids,類鳥群,最早由Craig Reynolds在1986年BBC的紀(jì)錄片中提出的計(jì)算模型,指在計(jì)算機(jī)中模擬自然界中鳥群和魚群的行為模式,并稱其為操控行為。
? 該操控行為(Steering Behaviors)主要有三種行為模式:
體積排斥:個體占據(jù)一定的體積,且永不相交,即每個個體都會避免與最近的個體發(fā)生碰撞。

速度對齊:每個個體與其近鄰(如與第k個粒子距離最近的Nk個鄰居)保持速度同步。

聚集傾向:粒子不會傾向于獨(dú)立行動(粒子群保持維持),每個個體會盡量與附近個體靠近,以避免孤立。

Cohesion: steer to move toward the average position of local flockmates
? 個體運(yùn)動是獨(dú)立的,每個個體均獨(dú)立執(zhí)行以上三個行為模式,即每個個體只會根據(jù)附近其他個體的運(yùn)動來調(diào)整自身當(dāng)前的運(yùn)動狀態(tài),而沒有任何“領(lǐng)導(dǎo)”在起作用。
? 在計(jì)算機(jī)模型中,個體(boid)可以獲取整個場景的全部信息,但要發(fā)生群集的行為需要個體的領(lǐng)域(neighborhood)內(nèi)出現(xiàn)一個群體(flockmates)。
? 鄰域有兩個特征:一是距離(從boid的中心測量),二是角度(從boid的飛行方向測量)。

? 不在個體鄰域內(nèi)的群體會被忽略掉。鄰域可以被當(dāng)做是一個有限感知模型,但更正確的說法是,領(lǐng)域定義了一個區(qū)域,在這個區(qū)域里,群體影響著個體的航向(行為)。
有關(guān)Boids的所有資料均可在Craig Reynolds的個人網(wǎng)站上查閱到:http://www.red3d.com/cwr/boids/

? 類鳥群是一個很好的有關(guān)自治智能體的樣本,它能幫我們很好的理解和實(shí)現(xiàn)一個自治智能體程序。所謂自治智能體,是指能在一定條件下對周圍的環(huán)境做出有限的自治行為的對象。
一個自治智能體是這樣一個系統(tǒng),它位于一個環(huán)境的內(nèi)部,是環(huán)境的一部分,且能感知該環(huán)境對他它有效實(shí)施的作用,并永遠(yuǎn)按此進(jìn)行,為未來的新感知提供條件。
----《游戲人工智能編程案例精粹》
? 自治智能體在游戲中有著很好的應(yīng)用,適用于非常多的場景,如游蕩的怪物自動避開障礙物,巡邏的衛(wèi)兵避開人群等等。
? 當(dāng)然也可以通過編寫硬規(guī)則來實(shí)現(xiàn)上述的功能,但這樣就會讓NPC看起來傻傻呆呆的,同時也會讓游戲失去許多樂趣,不是么。
? 自治智能體的運(yùn)行過程可以分解為三個步驟:
行動選擇:負(fù)責(zé)制定計(jì)劃,選定目標(biāo)。
操控:負(fù)責(zé)分解目標(biāo),發(fā)出控制信號,服務(wù)行動選擇環(huán)節(jié)制定的目標(biāo)和計(jì)劃。
移動:負(fù)責(zé)執(zhí)行操控行為發(fā)過來的控制信號,做出具體的動作。
? 舉個例子,你半夜時候突然感到餓了,決定到冰箱拿點(diǎn)東西吃,于是你掀起被子、下床,打開冰箱拿出了牛奶和面包吃了起來。
? 在這整個過程當(dāng)中,對“感到餓了”這個環(huán)境的變化,大腦會做出“吃東西”這樣的計(jì)劃,并將目標(biāo)定在“冰箱”;之后,大腦中其他部位會將計(jì)劃分解為“下床,打開冰箱,吃東西”這一系列操作,并通過各種神經(jīng)信號發(fā)送給手腳;最后,你的手和腳執(zhí)行這些操控信號,走到了目標(biāo)點(diǎn),開心的吃了一頓。

? 該項(xiàng)目仍然來自《游戲人工智能編程案例精粹》,但是由于各種原因的限制,筆者對其進(jìn)行了大量的修改,并且會按照自己的理解來講解該項(xiàng)目,但其核心思想和內(nèi)容不會改變。
? 具體的演示視頻,筆者已經(jīng)上傳到B站,可以在這里看到。

? 筆者選用了跨平臺的第三方庫SFML來實(shí)現(xiàn)圖形界面的開發(fā),這是一個簡單方便的多媒體庫,??非常適合用來當(dāng)做簡單的2D游戲引擎,開發(fā)小游戲。
? 具體的安裝教程,在這篇文章里有個簡單的介紹。
? 至于SFML的使用教程,推薦直接參考官方文檔:https://www.sfml-dev.org/ ,也可以跟著這本書學(xué)習(xí)《SFML Game Development》。

參考:?
《游戲人工智能編程案例精粹》
http://www.red3d.com/cwr/boids/? ??Craig Reynolds
相關(guān)代碼下載:https://github.com/linpeijie/GameToy/tree/master/GameAI