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

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

三、Cohesion聚集
3.1 定義
??Cohesion定義為,智能體不會傾向于獨立行動,類鳥群傾向于維持群體的完整性,每個智能體會盡量與附近智能體靠近,以避免孤立。

??具體表現(xiàn)為,每個智能體會自發(fā)的搜索鄰域(neighborhood)內(nèi),出現(xiàn)的其他智能體,并計算出這些智能體的平均中心位置,即重心位置,然后朝該重心運動。
? 已知領域的定義為,以該智能體的位置為圓心,運動方向為弧,扇形半徑為distance的扇形區(qū)域。

? 鄰域具有兩個特征,一是距離(distance,扇形半徑),二是角度(angle,扇形圓心角)。
? 在這個領域內(nèi)的群體會影響獨立智能體的行為。
3.2 Flock
??為了簡便,我們每次計算環(huán)境內(nèi)全部智能體與當前智能體的距離,然后篩選出處在當前智能體的鄰域內(nèi)的其他智能體,來計算它們的重心。
? 為此我們需要新建一個Flock文件,用來存儲環(huán)境內(nèi)的全部智能體。

? 動態(tài)數(shù)組flock存儲環(huán)境內(nèi)的全部智能體,run方法為每個智能體boid傳遞全部智能體flock,并且不能忘了傳遞 增量時間。
? 注意這里需要用auto &將變量定義為引用類型,不然無法執(zhí)行變量b的函數(shù)。

? 同時,不要忘記修改World文件內(nèi)的相關代碼,我們之前是用一個Boids數(shù)組來存儲全部智能體,現(xiàn)在我們用flock來做這個事情。
? 先在World.h文件中新增一個Flock類型的變量:Flock flock;然后在.cpp文件中修改代碼:


??現(xiàn)在我們已經(jīng)獲取到了環(huán)境中的全部智能體信息Flock,并將其傳遞給每個智能體Boid,接下來我們就需要通過領域和重心,來模擬出Boids的聚集行為。
3.3 重心和運動
? 在數(shù)學模型上,Reynolds將Cohesion行為模式表現(xiàn)為智能體尋找領域內(nèi)的群體的重心位置。
? 在平面直角坐標系中,重心的坐標是頂點坐標的算術平均。若有n個點,則其重心坐標為:
x =(x1+x2+……+xn)/ n
y =(y1 + y2 +...+ yn)/ n
? 當一個智能體計算出鄰域內(nèi)其他群體的重心位置后,會執(zhí)行seek方法計算出運動到重心位置所需的力。

? 最后,不要忘了在SteeringBehavior方法中應用這個計算出來的力,該方法不僅用來執(zhí)行全部的行為模式,還需要計算出這些行為模式改變后的受力,并將這些受力合并成智能體最終的受力,再通過Update方法來更新智能體的位置。

3.4 結果演示
?


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