天天看點

【協同任務】基于matlab蟻群算法多無人機攻擊排程【含Matlab源碼 034期】

一、多無人機協同作業簡介

0 引言

多架無人機組成無人機叢集可以協同完成任務,是未來無人機的發展方向。組成無人機叢集的多架無人機通過機間鍊路互相通信實作協作,可以迅速準确地執行路徑規劃、協同偵察、協同感覺和協同攻擊等複雜任務。

為實作無人機叢集協作的誘人前景,國内外都積極開展了相關研究工作。美國方面,美國國防預先研究計劃局(DARPA)于2015年推出“小精靈”項目,計劃研制具備自組織和智能協同能力的無人機蜂群系統。美國防部戰略能力辦公室(SCO)2014年啟動了“無人機蜂群”項目,旨在通過有人機空射“灰山鹑”微型無人機蜂群執行低空态勢感覺和幹擾任務。美國海軍研究局(ONR)于2015年公布了“低成本無人機蜂群”(LOCUST)項目,研發可快速連續發射的無人機蜂群,無人機之間利用近距離射頻網絡共享态勢資訊,協同執行掩護、攻擊或防禦任務。2017年,在 DARPA 會議中心舉辦“進攻性叢集戰術”(OFFSET)項目的提案人活動,目标是發展基于遊戲的開放架構,為城市作戰的無人叢集系統生成、評估和內建叢集戰術。

歐洲方面,2016 年,歐洲防務局啟動了“歐洲蜂群”項目,開展了無人機蜂群的自主決策、協同飛行等關鍵技術研究。2016年,英國國防部發起無人機蜂群競賽,參賽的多個團隊控制無人機蜂群實作了通信中繼、協同幹擾、目标跟蹤定位和區域測繪等任務。2017 年,俄羅斯無線電電子技術集團對外發表研究計劃稱,在戰鬥機上裝載多架蜂群無人機可實作協同偵察和攻擊的新型作戰樣式。

國内也相繼展開相關研究。最近,中國電科(CETC)電子科學研究院釋出了陸軍協同無人機“蜂群”視訊,引起廣泛關注。

面對這一重要課題,本文研究總結了無人機協同應用的發展趨勢,對其目前研究進展和發展方向進行了探讨,并提出無人機叢集任務協作的發展趨勢是多智能體協同。

1 無人機協同應用發展趨勢

對現有研究工作的分析如圖1所示,無人機協同應用大體上可以分為3個階段,分别是分布式協同,群體智能協同和未來的多智能體協同。

【協同任務】基于matlab蟻群算法多無人機攻擊排程【含Matlab源碼 034期】

圖1 無人機協同技術的發展趨勢

無人機叢集協同發展的第1個階段是簡單分布式協同。在該階段,協同任務根據執行條件,預先在簡單連接配接群組合的叢集成員之間經過計算處理後配置設定執行。叢集基本沒有能力根據環境與目标的變化動态調整任務配置設定,各無人機分擔的任務通常是确定的。

鑒于預配置設定方式的局限性,受生物叢集活動的啟發,群體智能被應用于無人機叢集,使無人機叢集協同發展到第2個階段——群體智能協同。在該階段中,各個無人機節點被賦予初級智能,能夠進行簡單的認知和決策;通過叢集個體之間更為緊密的耦合,可以根據執行中的回報調整優化方式或者優化目标,使整個無人機叢集系統有能力構成自組織、高穩定的分布式系統。群體智能協同階段目前正處于研究和應用迅速發展時期。

随着節點計算能力的進一步提升和人工智能技術的飛速發展,無人機協同即将進入發展的第3個階段——多智能體協同。在多智能體協同發展階段,叢集中的各個無人機都将是一個獨立的綜合智能體,具有多元度認知計算和進階智能處理能力,進而實作更高效的自主學習和決策,并在此基礎上,完成更複雜、更艱巨的任務。

2 分布式協同

從無人機叢集出現開始就被用于解決協同路徑規劃、協同感覺和協同任務規劃等分布式協作任務。早期的無人機分布式協同任務通常都是提前進行充分的計算和配置設定,無人機節點按照既定算法或者方案予以執行。根據計算結果,分布式協同無人機群可組織執行配置好的任務,如圖2所示。

【協同任務】基于matlab蟻群算法多無人機攻擊排程【含Matlab源碼 034期】

圖2 分布式協同階段的任務執行方式

2.1 協同路徑規劃

協同路徑規劃中,要求在給定目标或者搜尋目标後,無人機節點根據目前的任務狀态來确定飛行路徑。針對協同搜尋和跟蹤任務的路線規劃,無人機叢集可采用最大化目标功能來檢測最重要的目标,并在關鍵時刻對其進行跟蹤,進而獲得最有價值的資訊。而協同搜尋的路徑規劃可以分成無人機工作區間劃分和全區域覆寫搜尋路徑規劃2個子問題,将多機協同搜尋轉化為子區域上的單機搜尋,對目标區域快速進行劃分并生成飛行路線。基于改進遺傳算法的多無人機協同偵察航迹規劃算法,可用于解決面向複雜戰場環境中高效偵察多種類型目标過程中的路徑規劃問題,并能夠有效地提高航迹規劃精度和效率。

2.2 協同感覺

協同感覺是多無人機叢集共同探測感覺某一目标區域狀态的任務形式。在這類任務中最常見的是協同頻譜感覺。針對協同頻譜感覺任務特點,采用最佳融合準則的分布式協同任務執行方案可以優化檢測性能,使協作頻譜感覺總錯誤率達到最小,并能降低協作感覺時間,節省感覺過程開銷。

2.3 協同任務規劃

協同任務規劃要求叢集系統能夠根據目标任務和執行情況,對任務進行系統配置設定。例如,針對協同打擊任務,通過建立無人機毀傷代價名額函數、航程代價名額函數和價值收益名額函數,可以實作多無人機協同打擊任務的配置設定[5];而通過建立多目标優化模型并采用遺傳算法,能有效提高任務的完成效率。針對協同搜救任務,使用一種新的基于通信保持的拍賣方法的自适應回報調節遺傳算法,能夠改善傳統遺傳算法存在易陷入局部最優的弱點。

通過以上3種類型協同任務的相關研究工作可以看出,無人機叢集的分布式協同方式雖然充分考慮了“分布式”特點,能夠根據任務目标和叢集特征,設定有效的目标函數和優化方法去尋求最優或者較優的結果,但是其任務執行環境和求解目标需要在任務執行之前進行優化計算,然後配置設定執行,不能适應實際中動态的任務目标和環境變化,缺乏“智能性”的感覺和适應性行為。随着人們對“蜂群”“鳥群”等生物群體智能研究的深入,群體智能協同被進一步引入到無人機的協同中。

3 群體智能協同

“鳥群”“蟻群”等生物群體,雖然其中的個體智能有限,但是群體卻展現出高度的自組織性,這一特點與無人機叢集自主協同的需求相符,因而群體智能在無人機協同應用領域也得到了廣泛研究,使無人機叢集協同具有了初步的智能性。具備群體智能的無人機叢集系統在任務拆解和執行過程中引入了群體回報和适變能力,可執行較複雜的動态任務,其過程如圖3所示。

【協同任務】基于matlab蟻群算法多無人機攻擊排程【含Matlab源碼 034期】

圖3 群體智能協同階段的任務執行方式

3.1 協同路徑規劃

山區路徑規劃任務受到地形特征的強烈影響,難以預先确定性配置設定執行,簡單的分布式協同無法勝任。例如,為了執行山區應急物資運輸的路徑規劃任務,一種考慮路徑安全度的改進蟻群算法可快速收斂并生成更短路徑。蟻群算法也被用于無人機協同飛抵空戰場的航迹規劃任務中;一種基于改進混沌蟻群算法更能克服傳統蟻群智能算法中易出現局部極值、收斂效率低的缺陷,提升算法的全局尋優能力和搜尋效率。針對協同攻擊移動目标場景的航迹規劃,另一種改進的蟻群算法建立了結合任務配置設定的無人機群協同航迹規劃模型,可以快速地對地面多個移動目标規劃出有效的航迹。

3.2 協同感覺

在協同感覺任務中,群體智能也得到應用。針對無人機叢集通信場景和需求,出現了考慮結合認知無線電技術指導下的智能通信思想和彙聚有限智慧的群體智能理論方法,建構了群體智能協同通信模型和智能協同感覺模型。

3.3 協同任務規劃

協同作戰是協同任務規劃中的典型場景,結合群體智能優化算法的優勢,基于粒子群-整數編碼狼群算法的叢集組網任務配置設定算法适合解決此類協同問題;由于無人機叢集協同決策困難,還可以結合狼群算法的認知與協作能力,實作在複雜環境下迅速對目标進行跟蹤和包圍。這種協同任務,是第一類簡單協同所不能勝任的。

雖然無人機叢集和群體智能的結合可以充分發揮無人機叢集優勢,增強分布式協同智能性,可在任務執行過程中與環境和任務執行中間過程産生一定互動和回報,使之具備一定的自适應能力,但是,這種智能仍然是非常有限的,其本質仍然是基于特定計算模式和回報模式下的分布式優化算法。

4 多智能體協同

随着人工智能技術和節點自身算力的不斷增強,未來無人機叢集中的個體将具備更強的智能性,能夠獨立對環境和任務進行感覺和評估,實作多個智能體之間的互動和協同,進而具備多智能體協同能力。

近年來,人工智能領域研究取得了突破性進展。其中,深度強化學習在諸多領域得到了成功應用。無線通信網絡基于多智能體深度強化學習的資源配置設定技術也得到了深入研究。多智能體深度強化學習模型早已被用于解決車聯網中頻譜資源配置設定問題,這種應用已經與無人機叢集系統頗為接近。例如一種基于多智能體深度強化學習的分布式動态功率配置設定方案。基于多智能體深度強化學習的政策還可被用于二者的結合——用無人機輔助車輛網絡進行多元資源管理。

雖然基于強化學習的多智能體通信網絡資源配置設定問題已經得到了廣泛研究,但是由于網絡特性的不同,傳統的針對其他通信網絡的研究成果不能直接用于無人機叢集網絡。因而基于強化學習的多智能體自主協同應用逐漸成為未來無人機多智能體自主協同的一個研究熱點。針對無人機群的通信網絡資源動态配置設定問題而提出的多智能體深度強化學習方案也陸續出現,例如,一種基于多智能體深度強化學習的分布式幹擾協調政策被用于受到幹擾的無人機網絡中的檔案下載下傳業務。智能體在适用于無人機網絡特點的獨立強化學習中,其行為政策通常隻能根據它們對全局環境的局部個體觀察來制定。針對這種局限性,聯合采用2種不同規模的智能體可解決智能體之間的通信問題。

無人機叢集協同,經常會處理動态高維離散和連續動作狀态空間的優化求解問題,近來出現的演員-評論家算法是深度強化學習的一個新興方向,結合了基于值函數和基于政策函數的深度強化學習兩大分支的優勢,非常适用于無人機叢集的智能協同。利用演員-評論家算法,在無線信道和可再生能源再生率都是随機變化,且環境動态變化條件下,可尋求資源配置設定最佳政策,如用于解決車聯網中複雜動态環境下的資源配置設定問題。應用裝置到裝置(D2D)網絡的異構蜂窩網絡環境下,基于演員-評論家算法的政策可用于智能化節能模式選擇和資源配置設定。

随着節點智能算力的不斷增強,無人機叢集中的每架無人機可以作為一個具有深度強化學習能力的智能體,而整個叢集可通過合作構成多智能體。相鄰無人機之間通過通信網絡進行資訊交換與分發。如圖4所示,每架無人機都與局部環境互相作用,根據從周圍環境或者同伴無人機得到的資訊,針對承載的任務需求,通過深度強化學習,智能地産生動作政策,進行自身資源與行為的配置設定與調整,進而與環境和同伴互動,并獲得個體獎勵。

【協同任務】基于matlab蟻群算法多無人機攻擊排程【含Matlab源碼 034期】

圖4 基于多智能體的無人機叢集

每架無人機的深度強化學習智能體由2個深度神經網絡構成,包括演員網絡和評論家網絡,如圖5所示。

【協同任務】基于matlab蟻群算法多無人機攻擊排程【含Matlab源碼 034期】

圖5 基于演員評論家算法的無人機智能體

演員網絡負責輸出動作,評論家網絡負責評價演員的動作,以獲得互相促進的效果。與傳統的深度強化學習方法相比,演員-評論家算法同時吸取了基于值函數方法和基于政策函數方法的優點,從價值和政策兩方面來訓練提升智能體,訓練的更快,效果也更好。通過訓練和學習,期望智能體的評論家網絡可以獲得最佳效用評估函數:

【協同任務】基于matlab蟻群算法多無人機攻擊排程【含Matlab源碼 034期】

智能體從周圍環境中觀察得到狀态資訊St ,例如幹擾狀态、相鄰無人機等。演員網絡拟合動作政策函數π(St;ωπ),根據狀态資訊St,動作政策函數輸出目前時隙的動作at,也就是資源配置設定結果,并應用到環境中得到個體的即時獎勵rt。獎勵由獎勵函數計算得到,負責回報一個即時的、合理的、具有指導意義的獎勵值,進而激勵智能體向目标更新政策。評論家網絡拟合效用評估函數Q(St,at,ω),負責預測和評估在目前狀态St采用動作at所能得到的狀态動作價值,即長期性回報Rt為:

【協同任務】基于matlab蟻群算法多無人機攻擊排程【含Matlab源碼 034期】

式中,γ是折扣因子,γ表示了目前對于未來收益的重視程度,取值在0~1之間,取值0則表示智能體忽視未來收益,隻看重目前的收益rt,取值1則表示智能體将未來每個時刻的收益都視為與目前時刻收益一樣的重要性。獲得最大的長期性回報是智能體的最終目的,這個目标可以根據任務的性質被定義為不同的評判标準。

評論家網絡的最佳效用評估函數對應的演員網絡動作政策即為最佳動作政策π*。動作政策函數的參數通過政策梯度的方法進行更新,效用評估函數的參數采用最小化損失函數進行更新:

【協同任務】基于matlab蟻群算法多無人機攻擊排程【含Matlab源碼 034期】

式中,yt為優勢函數,用來衡量計算執行動作後的實際效用評估值。通過更新,智能體的演員網絡的動作政策輸出的動作越來越好,而評論家網絡的效用評估也會越來越準确。基于多智能體的無人機群的每架無人機都會朝着收益最大的方向執行動作,進而實作叢集的收益最大化。

二、蟻群算法簡介

1 蟻群算法(ant colony algorithm,ACA)起源和發展曆程

Marco Dorigo等人在研究新型算法的過程中,發現蟻群在尋找食物時,通過分泌一種稱為資訊素的生物激素交流覓食資訊進而能快速的找到目标,于是在1991年在其博士論文中首次系統地提出一種基于螞蟻種群的新型智能優化算法“螞蟻系統(Ant system,簡稱AS)”,後來,提出者及許多研究者對該算法作了各種改進,将其應用于更為廣泛的領域,如圖着色問題、二次配置設定問題、工件排序問題、車輛路徑問題、工廠中的房間作業排程問題、網絡路由問題、大規模內建電路設計等。近些年來,M.Dorigo等人把螞蟻算法進一步發展成一種通用的優化技術“蟻群優化(Ant Colony Optimization,簡稱ACO)”,并将所有符合ACO架構的算法稱為“蟻群優化算法(ACO algorithm)”。

【協同任務】基于matlab蟻群算法多無人機攻擊排程【含Matlab源碼 034期】

具體來說,各個螞蟻在沒有事先告知食物在什麼地方的前提下開始尋找食物。當一隻找到食物以後,它會向環境釋放一種揮發性分泌物pheromone (稱為資訊素,該物質随着時間的推移會逐漸揮發消失,資訊素濃度的大小表征路徑的遠近)資訊素能夠讓其他螞蟻感覺進而起到一個引導的作用。通常多個路徑上均有資訊素時,螞蟻會優先選擇資訊素濃度高的路徑,進而使濃度高的路徑資訊素濃度更高,形成一個正回報。有些螞蟻并沒有像其它螞蟻一樣總重複同樣的路,他們會另辟蹊徑,如果另開辟的道路比原來的其他道路更短,那麼,漸漸地,更多的螞蟻被吸引到這條較短的路上來。最後,經過一段時間運作,可能會出現一條最短的路徑被大多數螞蟻重複着。最終,資訊素濃度最高的路徑即是最終被螞蟻選中的最優路徑。

與其他算法相比,蟻群算法是一種比較年輕的算法,具有分布式計算、無中心控制、個體之間異步間接通信等特點,并且易于與其他優化算法相結合,經過不少仁人志士的不斷探索,到今天已經發展出了各式各樣的改進蟻群算法,不過蟻群算法的原理仍是主幹。

2 蟻群算法的求解原理

基于上述對蟻群覓食行為的描述,該算法主要對覓食行為進行以下幾個方面模拟:

(1)模拟的圖場景中包含了兩種資訊素,一種表示家,一種表示食物的地點,并且這兩種資訊素都在以一定的速率進行揮發。

(2)每個螞蟻隻能感覺它周圍的小部分地方的資訊。螞蟻在尋找食物的時候,如果在感覺範圍内,就可以直接過去,如果不在感覺範圍内,就要朝着資訊素多的地方走,螞蟻可以有一個小機率不往資訊素多的地方走,而另辟蹊徑,這個小機率事件很重要,代表了一種找路的創新,對于找到更優的解很重要。

(3)螞蟻回窩的規則與找食物的規則相同。

(4)螞蟻在移動時候首先會根據資訊素的指引,如果沒有資訊素的指引,會按照自己的移動方向慣性走下去,但也有一定的機率改變方向,螞蟻還可以記住已經走過的路,避免重複走一個地方。

(5)螞蟻在找到食物時留下的資訊素最多,然後距離食物越遠的地方留下的資訊素越少。找到窩的資訊素留下的量的規則跟食物相同。蟻群算法有以下幾個特點:正回報算法、并發性算法、較強的魯棒性、機率型全局搜尋、不依賴嚴格的數學性質、搜尋時間長,易出現停止現象。

螞蟻轉移機率公式:

【協同任務】基于matlab蟻群算法多無人機攻擊排程【含Matlab源碼 034期】

公式中:是螞蟻k從城市i轉移到j的機率;α,β分别為資訊素和啟發式因子的相對重要程度;為邊(i,j)上的資訊素量;為啟發式因子;為螞蟻k下步允許選擇的城市。上述公式即為螞蟻系統中的資訊素更新公式,是邊(i,j)上的資訊素量;ρ是資訊素蒸發系數,0<ρ<1;為第k隻螞蟻在本次疊代中留在邊(i,j)上的資訊素量;Q為一正常系數;為第k隻螞蟻在本次周遊中的路徑長度。

在螞蟻系統中,資訊素更新公式為:

【協同任務】基于matlab蟻群算法多無人機攻擊排程【含Matlab源碼 034期】

3 蟻群算法的求解步驟:

(1)初始化參數在計算之初,需要對相關參數進行初始化,如蟻群規模(螞蟻數量)m、資訊素重要程度因子α、啟發函數重要程度因子β、資訊素會發銀子ρ、資訊素釋放總量Q、最大疊代次數iter_max、疊代次數初值iter=1。

(2)建構解空間将各個螞蟻随機地置于不同的出發點,對每個螞蟻k(k=1,2,3…m),按照(2-1)計算其下一個待通路城市,直到所有螞蟻通路完所有城市。

(3)更新資訊蘇計算每個螞蟻經過路徑長度Lk(k=1,2,…,m),記錄目前疊代次數中的最優解(最短路徑)。同時,根據式(2-2)和(2-3)對各個城市連接配接路徑上資訊素濃度進行更新。

(4) 判斷是否終止若iter<iter_max,則令iter=iter+1,清空螞蟻經過路徑的記錄表,并傳回步驟2;否則,終止計算,輸出最優解。

(5)判斷是否終止若iter<iter_max,則令iter=iter+1,清空螞蟻經過路徑的記錄表,并傳回步驟2;否則,終止計算,輸出最優解。3. 判斷是否終止若iter<iter_max,則令iter=iter+1,清空螞蟻經過路徑的記錄表,并傳回步驟2;否則,終止計算,輸出最優解。

【協同任務】基于matlab蟻群算法多無人機攻擊排程【含Matlab源碼 034期】

三、部分源代碼

t=[4 5;16 25.8;10 45;20 55;30 65;35 55;29 31;37 26;47 27;30 31.3;31 17;14 7;35.6 13.8;26.7 22.5;21 39;38 42;5 26;28 53;20 13;10 60;26 31;54 38;7 58;12 36;30 2] %24個點,第25個點事origin
save t.mat t
load t.mat
value=[1 1 1 2 3 2 1 3 3 2 2 2 2 2 1 2 3 3 1 1 2 1 1 1]; %24個目标的價值
value=value/100;
time=zeros(1,25); %偵察UAV時間數組,裡面放的是飛機走的航程,除以速度便是時間,設速度為‘1’
attacktime=zeros(1,25); %打擊UAV時間數組
%把偵察過的任務對應無人機走過的航程存到該任務的一個矩陣裡,當做時間,然後打擊任務如果標明某任務,check一下時間是否合格,合格的話,可以打擊,并存入禁忌表,不合格的話,選次機率的
 
%注:目的是把所有目标執行完所有任務,是以每次疊代最後所有無人機收獲的總價值都一樣,都是所有目标的價值之和;是以本程式考慮優先執行價值大的目标,防止無人機飛很久、打很久後攻打效率變低
%的情況出現
 
%%計算城市間互相距離
n=size(t,1);
D=zeros(n,n);
for i=1:n
    for j=1:n
        if i~=j
            D(i,j)=sqrt(sum((t(i,:)-t(j,:)).^2));
        else
            D(i,j)=1e-2;
        end
    end
end
%%初始化參數
m=10;         %螞蟻個數
alpha=1;      %資訊素重要程度因子
beta=1;       %啟發函數重要程度因子
gama=2;
rho=0.3;      %資訊素揮發因子
Q=1.0;          %總量
eta=1./D;     %啟發函數
tau=ones(n,n)+7.1192e-005;%資訊素矩陣
iter=1;       %疊代次數初始值
iter_max=80;  %疊代次數最大值
length_best=zeros(iter_max,1);%每次疊代最佳路徑長度(應該是一次比一次小)
length_ave=zeros(iter_max,1); %每次疊代路徑平均長度 
%%疊代尋找最佳路徑
while iter<=iter_max
    whta=cell(8,1);
    lieend=zeros(8,1);
    for zu=1:8
    city_index=1:25;       %城市來标号 
    table=[];
    start=zeros(4,1);
        temp=randperm(24);
        for i=1:4
        start(i)=temp(i);
        end
    table(:,1)=start;
    j=2;
 while (j<=30)
        for i=1:4
            if i==1 %UAV1隻負責“偵察”任務
                if table(1,(j-1))~=25
                    table1=table(1,:);
                    table1=[table1;table(3:4,:)];
                    tabu1=table1(:); %UAV1的禁忌表出來了 %25如果也在tabu1裡的話,那麼
            allow_index1=~ismember(city_index,tabu1);  %【走過的變成0,能走的為1】【若tabu=(1 4)則allow_index=(0 1 1 0 1 1 1...)】【注意:allow_index與city_index同維】
            allow1=city_index(allow_index1);  %把還能走的序号摘出來了(待通路的城市集合)
            P1=allow1;
            %計算城市的轉移機率
            if numel(allow1)~=0
              for k=1:max(size(allow1))-1
               P1(k)=(tau(table(1,(j-1)),allow1(k))^alpha)*(eta(table(1,(j-1)),allow1(k))^beta)*10000+7.1192e-004;
              end
            P1(max(size(allow1)))=7.1192e-005;
            P1=P1/sum(P1);
            [d1,ind1]=sort(P1,2,'descend');%從大到小排序是d1,對應的原序号是ind1
            target1=allow1(ind1(1));
            %輪盤賭法選擇下一個城市
            %pc1=cumsum(P1);  % (p1 p1+p2 p1+p2+p3 p1+p2+p3+p4 ....)【p1<->allow(1)  p2<->allow(2) ...】
            %target_index1=find(pc1>=rand); 
            %target1=allow1(target_index1(1));  %這次傳回的是allow數組中城市的真正序号
            table(1,j)=target1;  %把選好這個點放到路徑表裡面
            rr=D(25,table(1,1));
            time(table(1,1))=rr;
            if j>2
            for c=2:(j-1)
                rr=rr+D(table(1,c-1),table(1,c));
            end 
            end
            rrr=rr+D(table(1,j-1),target1);%rrr就是UAV1到該點時走過的航程
            time(target1)=rrr;
            else
                table(1,j)=25;
            end
                end
                 if table(1,(j-1))==25
                    table(1,j)=25;
                 end
            end          
            if i==2 %UAV2隻負責“打擊”任務
                if (table(2,(j-1))~=25)
                table(2,1)=table(1,1); %設定它第一次打擊的是UAV1偵察過的目标
                ta2=table(1:(4*(j-1)+1)); %目前元素之前所有的元素
                tabu21=[];
                tabu22=[];
                tabu2=[];
                for y=1:24
                    if sum(ta2==y)==2
                        tabu21=[tabu21;y];
                    end
                end                       %出現過兩次的放在tabu21裡
                tabu22=setdiff(1:24,ta2); %一次都沒出現的放在tabu22裡
                tabu2=[tabu21',tabu22];   %tabu2出來了
            allow_index2=~ismember(city_index,tabu2);  %【走過的變成0,能走的為1】【若tabu=(1 4)則allow_index=(0 1 1 0 1 1 1...)】【注意:allow_index與city_index同維】
            allow2=city_index(allow_index2);  %把還能走的序号摘出來了(待通路的城市集合)
            P2=allow2;
            %計算城市的轉移機率
           for k=1:(length(allow2)-1)
               P2(k)=tau(table(2,(j-1)),allow2(k))*eta(table(2,(j-1)),allow2(k))*value(allow2(k))*10000;
           end
           P2(max(size(allow2)))=7.1192e-005;
            P2=P2/sum(P2);
            [d2,ind2]=sort(P2,2,'descend');%從大到小排序是d1,對應的原序号是ind1
            target2=allow2(ind2(1)); %target2=d1(1);
            %輪盤賭法選擇下一個城市
            %pc2=cumsum(P2);  % (p1 p1+p2 p1+p2+p3 p1+p2+p3+p4 ....)【p1<->allow(1)  p2<->allow(2) ...】
            %target_index2=find(pc2>=rand);  %選中那個機率較大的選中的點,傳回的是allow數組中的序号
            %target2=allow2(target_index2(1));  %這次傳回的是allow數組中城市的真正序号
            %table(2,j)=target2;  %把選好這個點放到路徑表裡面
            oo=D(25,table(2,1));
            attacktime(table(2,1))=oo;
            if j>2
            for c=2:(j-1)
                oo=oo+D(table(2,c-1),table(2,c));
            end 
            end
            ooo=oo+D(table(2,j-1),target2);%ooo就是UAV2到該點時走過的航程
            if numel(d2)>5
            u=2;
            while (ooo>time(target2)+20 & u<6)
                 target2=allow2(ind2(u));
                 ooo=oo+D(table(2,(j-1)),target2);
                 u=u+1;
            end
            end
            table(2,j)=target2;
            attacktime(target2)=ooo;
                end
                if table(2,(j-1))==25
                    table(2,j)=25;
                end
            end
            if i==3 %UAV3是“察打”任務
                if table(3,(j-1))~=25
                    ta3=table(1:(4*(j-1)+2));
                    tabu3=[];
                    tabu3c=[];
                for y=1:24
                    if sum(ta3==y)==2
                        tabu3=[tabu3;y];
                    end
                end    %出現兩次的放在tabu3裡   
                  for y=1:24
                    if sum(ta3==y)==1
                        tabu3c=[tabu3c;y];
                    end
                end %tabu3c是待打的任務,已偵查完的任務
            allow_index3=~ismember(city_index,tabu3);  %【走過的變成0,能走的為1】【若tabu=(1 4)則allow_index=(0 1 1 0 1 1 1...)】【注意:allow_index與city_index同維】
            allow3=city_index(allow_index3);  %把還能走的序号摘出來了(待通路的城市集合)
            P3=allow3;
            %計算城市的轉移機率
           for k=1:(length(allow3)-1)
               %if ismember(allow3(k),tabu3c)==1     
               h=table(3,(j-1))
               P3(k)=(tau(table(3,j-1),allow3(k))^alpha)*(eta(table(3,(j-1)),allow3(k))^beta)*value(allow3(k))*10000+7.1192e-005;%這是要打的,需要價值
               %else
               %P3(k)=(tau(table(3,(j-1)),allow3(k))^alpha)*(eta(table(3,(j-1)),allow3(k))^beta)*100+7.1192e-005;%這些是待偵察的,沒有價值
               %end
           end
            P3(max(size(allow3)))=7.1192e-009;
            P3=P3/sum(P3);
            [d3,ind3]=sort(P3,2,'descend');%從大到小排序是d1,對應的原序号是ind1
            target3=allow3(ind3(1));
            %輪盤賭法選擇下一個城市
            %pc3=cumsum(P3);  % (p1 p1+p2 p1+p2+p3 p1+p2+p3+p4 ....)【p1<->allow(1)  p2<->allow(2) ...】
            %target_index3=find(pc3>=rand);  %選中那個機率較大的選中的點,傳回的是allow數組中的序号
            %target3=allow3(target_index3(1));  %這次傳回的是allow數組中城市的真正序号
            %table(3,j)=target3;  %把選好這個點放到路徑表裡面
            ww=D(25,table(3,1));
            time(table(3,1))=ww;
            if j>2
            for c=2:(j-1)
                ww=ww+D(table(3,c-1),table(3,c));
            end 
            end
            www=ww+D(table(3,j-1),target3);%www就是UAV3到該點時走過的航程
            if ismember(target3,tabu3c)==0 %偵察任務
                time(target3)=www;
                table(3,j)=target3;
            else %打擊任務
                attacktime(target3)=www;
                if numel(d3)>5
                u=2;
            while (www>time(target3)+20 & u<6)
                 target3=allow3(ind3(u));
                 www=ww+D(table(3,(j-1)),target3);
                 u=u+1;
            end
                end
            attacktime(target3)=www;
            table(3,j)=target3;%www<time(target3)+10 說明此打擊任務合理
            end 
                end
                if table(3,(j-1))==25
                    table(3,j)=25;
                end
            end
            if i==4 %UAV4是“察打”任務
                if table(4,(j-1))~=25
                    ta4=table(1:(4*(j-1)+3));
                    tabu4=[];
                    tabu4c=[];
                for y=1:24
                    if sum(ta4==y)==2
                        tabu4=[tabu4;y];
                    end
                end    %出現兩次的放在tabu4裡、、可以把已經偵察過的放在tabu4c中,(即出現過一次的),如果選到的是在tabu4'中的說明是要打擊的然後算一下它的航程,再和偵察路徑比較 
                for y=1:24
                    if sum(ta4==y)==1
                        tabu4c=[tabu4c;y];
                    end
                end 
            allow_index4=~ismember(city_index,tabu4);  %【走過的變成0,能走的為1】【若tabu=(1 4)則allow_index=(0 1 1 0 1 1 1...)】【注意:allow_index與city_index同維】
            allow4=city_index(allow_index4);  %把還能走的序号摘出來了(待通路的城市集合)
            P4=allow4;
            %計算城市的轉移機率
           for k=1:(max(size(allow4))-1)
               %if ismember(allow4(k),tabu4c)==1
               sxx=table(4,(j-1))
               P4(k)=(tau(table(4,(j-1)),allow4(k))^alpha)*(eta(table(4,(j-1)),allow4(k))^beta)*value(allow4(k))*10000+7.1192e-005;
               %else
               %P4(k)=(tau(table(4,(j-1)),allow4(k))^alpha)*(eta(table(4,(j-1)),allow4(k))^beta)*100+7.1192e-005;
               %end
           end
           P4(max(size(allow4)))=7.1192e-009;
            P4=P4/sum(P4);
            [d4,ind4]=sort(P4,2,'descend');%從大到小排序是d1,對應的原序号是ind1
            target4=allow4(ind4(1));
            %輪盤賭法選擇下一個城市
            %pc4=cumsum(P4);  % (p1 p1+p2 p1+p2+p3 p1+p2+p3+p4 ....)【p1<->allow(1)  p2<->allow(2) ...】
            %target_index4=find(pc4>=rand);  %選中那個機率較大的選中的點,傳回的是allow數組中的序号
            %target4=allow4(target_index4(1));  %這次傳回的是allow數組中城市的真正序号
            %table(4,j)=target4;  %把選好這個點放到路徑表裡面
            qq=D(25,table(4,1));
            time(table(4,1))=qq;
            if j>2
            for c=2:(j-1)
                qq=qq+D(table(4,c-1),table(4,c));
            end 
            end
            qqq=qq+D(table(4,j-1),target4);%www就是UAV3到該點時走過的航程
            if ismember(target4,tabu4c)==0 %偵察任務
                time(target4)=qqq;
                table(4,j)=target4;
            else %打擊任務
                attacktime(target4)=qqq;
                if numel(d4)>5
                u=2;
            while (qqq>time(target4)+20 & u<6)
                 target4=allow4(ind4(u));
                 qqq=qq+D(table(4,j-1),target4);
                 u=u+1;
            end
                end
            attacktime(target4)=qqq;
            table(4,j)=target4;%www<time(target4)+10 說明此打擊任務合理
            end                
                end
                if table(4,(j-1))==25
                    table(4,j)=25;
                end
              end
        end %一列結束      

四、運作結果

【協同任務】基于matlab蟻群算法多無人機攻擊排程【含Matlab源碼 034期】

五、matlab版本及參考文獻

1 matlab版本

2014a

2 參考文獻

[1] 包子陽,餘繼周,楊杉.智能優化算法及其MATLAB執行個體(第2版)[M].電子工業出版社,2016.

[2]張岩,吳水根.MATLAB優化算法源代碼[M].清華大學出版社,2017.

[3]巫茜,羅金彪,顧曉群,曾青.基于改進PSO的無人機三維航迹規劃優化算法[J].兵器裝備工程學報. 2021,42(08)

[4]鄧葉,姜香菊.基于改進人工勢場法的四旋翼無人機航迹規劃算法[J].傳感器與微系統. 2021,40(07)

[5]馬雲紅,張恒,齊樂融,賀建良.基于改進A*算法的三維無人機路徑規劃[J].電光與控制. 2019,26(10)

繼續閱讀