基礎 | 自治智能體----類鳥群(五)

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

四、Separation和Alignment
4.1 Separation
? 該行為產(chǎn)生一個向外的力,操控智能體離開他的鄰域中的其他智能體。也就是不讓兩個智能體相撞。
? 我們需要計算出鄰域中所有智能體對當前智能體的合力,然后讓智能體朝著這個合力運動。該合力的計算方式是該智能體到鄰域其他智能體的距離的相反方向。

4.2?Alignment
? 該方法使智能體與鄰域內(nèi)的群體的速度保持一致,重點是航向一致。
? 我們通過遍歷鄰域,計算出他們的平均速度,該速度的方向就是我們需要的航向,因此只要將這個速度減去智能體當前速度,就可以求出智能體往這個方向航行所需的受力。

4.3 存儲鄰域內(nèi)的智能體
? 在這之前,我們修改了之前的Cohesion方法,在里面添加了一個哈希表neighbor,用來記錄出現(xiàn)在只能鄰域內(nèi)的其他智能體,并將這個哈希表傳遞給其他方法,這樣就不需要遍歷全部的智能體,可以降低計算開銷。

? 當其他智能體出現(xiàn)在鄰域內(nèi)時,將其索引標記為1,否則為0。
4.4 一些有趣的現(xiàn)象
? 項目到這里,已經(jīng)可以完整的實現(xiàn)一個簡單的Boids類鳥群,自治智能體。它們會四處游蕩,當身邊有其他群體時,就會靠近那個群體,并與其他個體保持一定距離。
? 但是其實如果去掉seek方法和cohesion方法,只保留其他兩個行為模式,該自治智能體還是能表現(xiàn)出一定的群集行為,只是會更加混亂一些,四處亂飛。
? 在計算最終運動軌跡的時候,為每個行為模式分配權(quán)重是一件非常重要的事情。每個行為模式在整個群集中的占比不同,會影響到最終的運動軌跡。

??我們現(xiàn)在只是粗糙的將所有受力合并起來,這會產(chǎn)生非常大的計算開銷。如果我們將群體數(shù)量擴大到100以上,就會發(fā)現(xiàn)群體速度變得十分的緩慢。
? 筆者暫時不知道這是因為cpu計算開銷太大,導致幀率下降,還是因為群體受力發(fā)生改變導致速度變小。如果有小伙伴知道的話,歡迎留言答復。
4.5 結(jié)果演示


參考:
《游戲人工智能編程案例精粹》
相關(guān)代碼下載? ??https://github.com/linpeijie/GameToy