最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

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

2020-03-22 23:05 作者:有木乘舟  | 我要投稿

本系列為筆者初學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)的全部智能體。

圖15:Flock.h

? 動態(tài)數(shù)組flock存儲環(huán)境內(nèi)的全部智能體,run方法為每個智能體boid傳遞全部智能體flock,并且不能忘了傳遞 增量時間。

? 注意這里需要用auto &將變量定義為引用類型,不然無法執(zhí)行變量b的函數(shù)。

圖16:flocking方法

? 同時,不要忘記修改World文件內(nèi)的相關代碼,我們之前是用一個Boids數(shù)組來存儲全部智能體,現(xiàn)在我們用flock來做這個事情。

? 先在World.h文件中新增一個Flock類型的變量:Flock flock;然后在.cpp文件中修改代碼:

圖17:紅色箭頭是需要修改的地方
圖17:紅色箭頭是需要修改的地方

??現(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方法計算出運動到重心位置所需的力。

圖18:Cohesion方法

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

圖19:計算行為模式受力情況

3.4 結果演示

?


參考:

  • 《游戲人工智能編程案例精粹》

  • 相關代碼下載? ??https://github.com/linpeijie/GameToy

基礎 | 自治智能體----類鳥群(四)的評論 (共 條)

分享到微博請遵守國家法律
台山市| 旬邑县| 铁岭县| 安溪县| 阜宁县| 余江县| 固安县| 阳山县| 嵊州市| 永和县| 韩城市| 侯马市| 措美县| 广丰县| 玉屏| 达州市| 孝感市| 岢岚县| 长兴县| 夏河县| 诸城市| 汉阴县| 高密市| 潮州市| 洪雅县| 包头市| 博白县| 河北省| 广昌县| 海盐县| 九江县| 黔江区| 永登县| 成安县| 宁都县| 丹阳市| 青州市| 凌源市| 忻州市| 枣庄市| 莱芜市|