【任务分配】基于matlab蚁群算法无人机任务分配【含Matlab源码 1265期】_任务分配 基于蚁群算法-程序员宅基地

技术标签: matlab  Matlab路径规划(进阶版)  

博主简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,Matlab项目合作可私信。
个人主页:海神之光
代码获取方式:
海神之光Matlab王者学习之路—代码获取方式
️座右铭:行百里者,半于九十。

更多Matlab仿真内容点击
Matlab图像处理(进阶版)
路径规划(Matlab)
神经网络预测与分类(Matlab)
优化求解(Matlab)
语音处理(Matlab)
信号处理(Matlab)
车间调度(Matlab)

一、多无人机协同作业简介

0 引言
多架无人机组成无人机集群可以协同完成任务,是未来无人机的发展方向。组成无人机集群的多架无人机通过机间链路互相通信实现协作,可以迅速准确地执行路径规划、协同侦察、协同感知和协同攻击等复杂任务。
为实现无人机集群协作的诱人前景,国内外都积极开展了相关研究工作。美国方面,美国国防预先研究计划局(DARPA)于2015年推出“小精灵”项目,计划研制具备自组织和智能协同能力的无人机蜂群系统。美国防部战略能力办公室(SCO)2014年启动了“无人机蜂群”项目,旨在通过有人机空射“灰山鹑”微型无人机蜂群执行低空态势感知和干扰任务。美国海军研究局(ONR)于2015年公布了“低成本无人机蜂群”(LOCUST)项目,研发可快速连续发射的无人机蜂群,无人机之间利用近距离射频网络共享态势信息,协同执行掩护、攻击或防御任务。2017年,在 DARPA 会议中心举办“进攻性集群战术”(OFFSET)项目的提案人活动,目标是发展基于游戏的开放架构,为城市作战的无人集群系统生成、评估和集成集群战术。
欧洲方面,2016 年,欧洲防务局启动了“欧洲蜂群”项目,开展了无人机蜂群的自主决策、协同飞行等关键技术研究。2016年,英国国防部发起无人机蜂群竞赛,参赛的多个团队控制无人机蜂群实现了通信中继、协同干扰、目标跟踪定位和区域测绘等任务。2017 年,俄罗斯无线电电子技术集团对外发表研究计划称,在战斗机上装载多架蜂群无人机可实现协同侦察和攻击的新型作战样式。
国内也相继展开相关研究。最近,中国电科(CETC)电子科学研究院发布了陆军协同无人机“蜂群”视频,引起广泛关注。
面对这一重要课题,本文研究总结了无人机协同应用的发展趋势,对其当前研究进展和发展方向进行了探讨,并提出无人机集群任务协作的发展趋势是多智能体协同。

1 无人机协同应用发展趋势
对现有研究工作的分析如图1所示,无人机协同应用大体上可以分为3个阶段,分别是分布式协同,群体智能协同和未来的多智能体协同。
在这里插入图片描述
图1 无人机协同技术的发展趋势
无人机集群协同发展的第1个阶段是简单分布式协同。在该阶段,协同任务根据执行条件,预先在简单连接和组合的集群成员之间经过计算处理后分配执行。集群基本没有能力根据环境与目标的变化动态调整任务分配,各无人机分担的任务通常是确定的。

鉴于预分配方式的局限性,受生物集群活动的启发,群体智能被应用于无人机集群,使无人机集群协同发展到第2个阶段——群体智能协同。在该阶段中,各个无人机节点被赋予初级智能,能够进行简单的认知和决策;通过集群个体之间更为紧密的耦合,可以根据执行中的反馈调整优化方式或者优化目标,使整个无人机集群系统有能力构成自组织、高稳定的分布式系统。群体智能协同阶段当前正处于研究和应用迅速发展时期。

随着节点计算能力的进一步提升和人工智能技术的飞速发展,无人机协同即将进入发展的第3个阶段——多智能体协同。在多智能体协同发展阶段,集群中的各个无人机都将是一个独立的综合智能体,具有多维度认知计算和高级智能处理能力,从而实现更高效的自主学习和决策,并在此基础上,完成更复杂、更艰巨的任务。

2 分布式协同
从无人机集群出现开始就被用于解决协同路径规划、协同感知和协同任务规划等分布式协作任务。早期的无人机分布式协同任务通常都是提前进行充分的计算和分配,无人机节点按照既定算法或者方案予以执行。根据计算结果,分布式协同无人机群可组织执行配置好的任务,如图2所示。
在这里插入图片描述
图2 分布式协同阶段的任务执行方式
2.1 协同路径规划
协同路径规划中,要求在给定目标或者搜索目标后,无人机节点根据当前的任务状态来确定飞行路径。针对协同搜索和跟踪任务的路线规划,无人机集群可采用最大化目标功能来检测最重要的目标,并在关键时刻对其进行跟踪,从而获得最有价值的信息。而协同搜索的路径规划可以分成无人机工作区间划分和全区域覆盖搜索路径规划2个子问题,将多机协同搜索转化为子区域上的单机搜索,对目标区域快速进行划分并生成飞行路线。基于改进遗传算法的多无人机协同侦察航迹规划算法,可用于解决面向复杂战场环境中高效侦察多种类型目标过程中的路径规划问题,并能够有效地提高航迹规划精度和效率。

2.2 协同感知
协同感知是多无人机集群共同探测感知某一目标区域状态的任务形式。在这类任务中最常见的是协同频谱感知。针对协同频谱感知任务特点,采用最佳融合准则的分布式协同任务执行方案可以优化检测性能,使协作频谱感知总错误率达到最小,并能降低协作感知时间,节省感知过程开销。

2.3 协同任务规划
协同任务规划要求集群系统能够根据目标任务和执行情况,对任务进行系统分配。例如,针对协同打击任务,通过建立无人机毁伤代价指标函数、航程代价指标函数和价值收益指标函数,可以实现多无人机协同打击任务的分配[5];而通过建立多目标优化模型并采用遗传算法,能有效提高任务的完成效率。针对协同搜救任务,使用一种新的基于通信保持的拍卖方法的自适应反馈调节遗传算法,能够改善传统遗传算法存在易陷入局部最优的弱点。

通过以上3种类型协同任务的相关研究工作可以看出,无人机集群的分布式协同方式虽然充分考虑了“分布式”特点,能够根据任务目标和集群特征,设置有效的目标函数和优化方法去寻求最优或者较优的结果,但是其任务执行环境和求解目标需要在任务执行之前进行优化计算,然后分配执行,不能适应实际中动态的任务目标和环境变化,缺乏“智能性”的感知和适应性行为。随着人们对“蜂群”“鸟群”等生物群体智能研究的深入,群体智能协同被进一步引入到无人机的协同中。

3 群体智能协同
“鸟群”“蚁群”等生物群体,虽然其中的个体智能有限,但是群体却展现出高度的自组织性,这一特点与无人机集群自主协同的需求相符,因而群体智能在无人机协同应用领域也得到了广泛研究,使无人机集群协同具有了初步的智能性。具备群体智能的无人机集群系统在任务拆解和执行过程中引入了群体反馈和适变能力,可执行较复杂的动态任务,其过程如图3所示。
在这里插入图片描述
图3 群体智能协同阶段的任务执行方式
3.1 协同路径规划
山区路径规划任务受到地形特征的强烈影响,难以预先确定性分配执行,简单的分布式协同无法胜任。例如,为了执行山区应急物资运输的路径规划任务,一种考虑路径安全度的改进蚁群算法可快速收敛并生成更短路径。蚁群算法也被用于无人机协同飞抵空战场的航迹规划任务中;一种基于改进混沌蚁群算法更能克服传统蚁群智能算法中易出现局部极值、收敛效率低的缺陷,提升算法的全局寻优能力和搜索效率。针对协同攻击移动目标场景的航迹规划,另一种改进的蚁群算法建立了结合任务分配的无人机群协同航迹规划模型,可以快速地对地面多个移动目标规划出有效的航迹。

3.2 协同感知
在协同感知任务中,群体智能也得到应用。针对无人机集群通信场景和需求,出现了考虑结合认知无线电技术指导下的智能通信思想和汇聚有限智慧的群体智能理论方法,构建了群体智能协同通信模型和智能协同感知模型。

3.3 协同任务规划
协同作战是协同任务规划中的典型场景,结合群体智能优化算法的优势,基于粒子群-整数编码狼群算法的集群组网任务分配算法适合解决此类协同问题;由于无人机集群协同决策困难,还可以结合狼群算法的认知与协作能力,实现在复杂环境下迅速对目标进行跟踪和包围。这种协同任务,是第一类简单协同所不能胜任的。

虽然无人机集群和群体智能的结合可以充分发挥无人机集群优势,增强分布式协同智能性,可在任务执行过程中与环境和任务执行中间过程产生一定交互和反馈,使之具备一定的自适应能力,但是,这种智能仍然是非常有限的,其本质仍然是基于特定计算模式和反馈模式下的分布式优化算法。

4 多智能体协同
随着人工智能技术和节点自身算力的不断增强,未来无人机集群中的个体将具备更强的智能性,能够独立对环境和任务进行感知和评估,实现多个智能体之间的交互和协同,从而具备多智能体协同能力。

近年来,人工智能领域研究取得了突破性进展。其中,深度强化学习在诸多领域得到了成功应用。无线通信网络基于多智能体深度强化学习的资源分配技术也得到了深入研究。多智能体深度强化学习模型早已被用于解决车联网中频谱资源分配问题,这种应用已经与无人机集群系统颇为接近。例如一种基于多智能体深度强化学习的分布式动态功率分配方案。基于多智能体深度强化学习的策略还可被用于二者的结合——用无人机辅助车辆网络进行多维资源管理。

虽然基于强化学习的多智能体通信网络资源分配问题已经得到了广泛研究,但是由于网络特性的不同,传统的针对其他通信网络的研究成果不能直接用于无人机集群网络。因而基于强化学习的多智能体自主协同应用逐渐成为未来无人机多智能体自主协同的一个研究热点。针对无人机群的通信网络资源动态分配问题而提出的多智能体深度强化学习方案也陆续出现,例如,一种基于多智能体深度强化学习的分布式干扰协调策略被用于受到干扰的无人机网络中的文件下载业务。智能体在适用于无人机网络特点的独立强化学习中,其行为策略通常只能根据它们对全局环境的局部个体观察来制定。针对这种局限性,联合采用2种不同规模的智能体可解决智能体之间的通信问题。

无人机集群协同,经常会处理动态高维离散和连续动作状态空间的优化求解问题,近来出现的演员-评论家算法是深度强化学习的一个新兴方向,结合了基于值函数和基于策略函数的深度强化学习两大分支的优势,非常适用于无人机集群的智能协同。利用演员-评论家算法,在无线信道和可再生能源再生率都是随机变化,且环境动态变化条件下,可寻求资源分配最佳策略,如用于解决车联网中复杂动态环境下的资源分配问题。应用设备到设备(D2D)网络的异构蜂窝网络环境下,基于演员-评论家算法的策略可用于智能化节能模式选择和资源分配。

随着节点智能算力的不断增强,无人机集群中的每架无人机可以作为一个具有深度强化学习能力的智能体,而整个集群可通过合作构成多智能体。相邻无人机之间通过通信网络进行信息交换与分发。如图4所示,每架无人机都与局部环境相互作用,根据从周围环境或者同伴无人机得到的信息,针对承载的任务需求,通过深度强化学习,智能地产生动作策略,进行自身资源与行为的分配与调整,进而与环境和同伴互动,并获得个体奖励。
在这里插入图片描述
图4 基于多智能体的无人机集群
每架无人机的深度强化学习智能体由2个深度神经网络构成,包括演员网络和评论家网络,如图5所示。
在这里插入图片描述
图5 基于演员评论家算法的无人机智能体
演员网络负责输出动作,评论家网络负责评价演员的动作,以获得相互促进的效果。与传统的深度强化学习方法相比,演员-评论家算法同时吸取了基于值函数方法和基于策略函数方法的优点,从价值和策略两方面来训练提升智能体,训练的更快,效果也更好。通过训练和学习,期望智能体的评论家网络可以获得最佳效用评估函数:
在这里插入图片描述
智能体从周围环境中观察得到状态信息St ,例如干扰状态、相邻无人机等。演员网络拟合动作策略函数π(St;ωπ),根据状态信息St,动作策略函数输出当前时隙的动作at,也就是资源分配结果,并应用到环境中得到个体的即时奖励rt。奖励由奖励函数计算得到,负责反馈一个即时的、合理的、具有指导意义的奖励值,从而激励智能体向目标更新策略。评论家网络拟合效用评估函数Q(St,at,ω),负责预测和评估在当前状态St采用动作at所能得到的状态动作价值,即长期性回报Rt为:
在这里插入图片描述
式中,γ是折扣因子,γ表示了当前对于未来收益的重视程度,取值在0~1之间,取值0则表示智能体忽视未来收益,只看重当前的收益rt,取值1则表示智能体将未来每个时刻的收益都视为与当前时刻收益一样的重要性。获得最大的长期性回报是智能体的最终目的,这个目标可以根据任务的性质被定义为不同的评判标准。

评论家网络的最佳效用评估函数对应的演员网络动作策略即为最佳动作策略π*。动作策略函数的参数通过策略梯度的方法进行更新,效用评估函数的参数采用最小化损失函数进行更新:
在这里插入图片描述
式中,yt为优势函数,用来衡量计算执行动作后的实际效用评估值。通过更新,智能体的演员网络的动作策略输出的动作越来越好,而评论家网络的效用评估也会越来越准确。基于多智能体的无人机群的每架无人机都会朝着收益最大的方向执行动作,从而实现集群的收益最大化。

二、蚁群算法简介

1 蚁群算法(ant colony algorithm,ACA)起源和发展历程
Marco Dorigo等人在研究新型算法的过程中,发现蚁群在寻找食物时,通过分泌一种称为信息素的生物激素交流觅食信息从而能快速的找到目标,于是在1991年在其博士论文中首次系统地提出一种基于蚂蚁种群的新型智能优化算法“蚂蚁系统(Ant system,简称AS)”,后来,提出者及许多研究者对该算法作了各种改进,将其应用于更为广泛的领域,如图着色问题、二次分配问题、工件排序问题、车辆路径问题、车间作业调度问题、网络路由问题、大规模集成电路设计等。近些年来,M.Dorigo等人把蚂蚁算法进一步发展成一种通用的优化技术“蚁群优化(Ant Colony Optimization,简称ACO)”,并将所有符合ACO框架的算法称为“蚁群优化算法(ACO algorithm)”。

在这里插入图片描述
具体来说,各个蚂蚁在没有事先告知食物在什么地方的前提下开始寻找食物。当一只找到食物以后,它会向环境释放一种挥发性分泌物pheromone (称为信息素,该物质随着时间的推移会逐渐挥发消失,信息素浓度的大小表征路径的远近)信息素能够让其他蚂蚁感知从而起到一个引导的作用。通常多个路径上均有信息素时,蚂蚁会优先选择信息素浓度高的路径,从而使浓度高的路径信息素浓度更高,形成一个正反馈。有些蚂蚁并没有像其它蚂蚁一样总重复同样的路,他们会另辟蹊径,如果另开辟的道路比原来的其他道路更短,那么,渐渐地,更多的蚂蚁被吸引到这条较短的路上来。最后,经过一段时间运行,可能会出现一条最短的路径被大多数蚂蚁重复着。最终,信息素浓度最高的路径即是最终被蚂蚁选中的最优路径。
与其他算法相比,蚁群算法是一种比较年轻的算法,具有分布式计算、无中心控制、个体之间异步间接通信等特点,并且易于与其他优化算法相结合,经过不少仁人志士的不断探索,到今天已经发展出了各式各样的改进蚁群算法,不过蚁群算法的原理仍是主干。

2 蚁群算法的求解原理
基于上述对蚁群觅食行为的描述,该算法主要对觅食行为进行以下几个方面模拟:
(1)模拟的图场景中包含了两种信息素,一种表示家,一种表示食物的地点,并且这两种信息素都在以一定的速率进行挥发。
(2)每个蚂蚁只能感知它周围的小部分地方的信息。蚂蚁在寻找食物的时候,如果在感知范围内,就可以直接过去,如果不在感知范围内,就要朝着信息素多的地方走,蚂蚁可以有一个小概率不往信息素多的地方走,而另辟蹊径,这个小概率事件很重要,代表了一种找路的创新,对于找到更优的解很重要。
(3)蚂蚁回窝的规则与找食物的规则相同。
(4)蚂蚁在移动时候首先会根据信息素的指引,如果没有信息素的指引,会按照自己的移动方向惯性走下去,但也有一定的机率改变方向,蚂蚁还可以记住已经走过的路,避免重复走一个地方。
(5)蚂蚁在找到食物时留下的信息素最多,然后距离食物越远的地方留下的信息素越少。找到窝的信息素留下的量的规则跟食物相同。蚁群算法有以下几个特点:正反馈算法、并发性算法、较强的鲁棒性、概率型全局搜索、不依赖严格的数学性质、搜索时间长,易出现停止现象。
蚂蚁转移概率公式:
在这里插入图片描述
公式中:是蚂蚁k从城市i转移到j的概率;α,β分别为信息素和启发式因子的相对重要程度;为边(i,j)上的信息素量;为启发式因子;为蚂蚁k下步允许选择的城市。上述公式即为蚂蚁系统中的信息素更新公式,是边(i,j)上的信息素量;ρ是信息素蒸发系数,0<ρ<1;为第k只蚂蚁在本次迭代中留在边(i,j)上的信息素量;Q为一正常系数;为第k只蚂蚁在本次周游中的路径长度。
在蚂蚁系统中,信息素更新公式为:
在这里插入图片描述
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;否则,终止计算,输出最优解。

在这里插入图片描述

三、部分源代码

clc;
clear;
%% initialization

% Define the position of the robots
% % Robot_position=[1,2;1,4;1,6;1,8;1,10];
% UAV_position=[5,7;3,2;7,13;6,9;5,5];
% % Define the target positions
% Target_position=[3,6;5,4;5,6;5,8;8,6];

% Random position
UAV_number=4; % The number of UAVs
task_number=15; % The number of Target positions
SizeofMap = [1 500];
size_UAV = 0;
size_task = 0;

while (size_UAV<UAV_number && size_task < task_number)
UAV_position = randi(SizeofMap,UAV_number,2);
Target_position = randi(SizeofMap,task_number,2);
% UAV_position = unique(UAV_position,‘rows’);
% Target_position = unique(Target_position,‘rows’);
size_UAV = size(unique(UAV_position,‘rows’),1);
size_task = size(unique(Target_position,‘rows’),1);
end

% Initial the speed of UAVs
UAV_speed=ones(UAV_number,1)*50;

% UAV_position = randi([1,15],10,2);
% Target_position = randi([1,15],10,2);

% UAV_number=5; % The number of UAVs
% task_number=5; % The number of Target positions
maxT=10; % The maximum tasks can be done by a single worker
task_fixed_number=1; % The number of workers are required for a single task
% unfinishtask_number=task_number;

ant_num=100; % The numbder of ants
iteratornum=200; % The iteration times

% pheromoneMatrix = [];% The matrix to store the pheromone
% maxPheromoneMatrix = []; % The assigned workers based on the pheromone matrix
% criticalPointMatrix = [];% This matrix is used to decide allocation by
% % using pheromone matrix or randomly
%
% % Initialize the last 3 matrix
% % The pheromone are initialized as all ‘1’
% pheromoneMatrix = ones(task_number,UAV_number);
% for i=1:task_number
% % From beginning, assign the workers randomly
% maxPheromoneMatrix(i) =unidrnd(UAV_number) ;
% % Once the value less or equal to 1, the allocation is based on the
% % pheromone matrix; otherwise, it is allocated randomly. For
% % initialization, the tasks are allocated randomly.
% criticalPointMatrix(i)=ceil(ant_num/task_number );
% end

%% The implementation of Ant Colony Algorithm
judge = 1;
while (isempty(Target_position) == 0)

if (judge == 1)
    %task_number =  task_number_new;
    best_ant_path = AntColonyAlgorothm(UAV_position,Target_position,UAV_number,UAV_speed,task_number,...
        ant_num, iteratornum, maxT,task_fixed_number);
    [row,col]=find(best_ant_path==1);
    
    task_number_imme = task_number;
    for j = 1: UAV_number
        mid = find(col==j);
        if (isempty(mid) == 0)
        len = length(mid);
        allo=mid(randi(len));
        Best_Strategy(j)=allo;
        else
            Best_Strategy(j)= task_number + 1;
            task_number=task_number+1;
        end
    end
end


        for j = 1:size(Best_Strategy,2)
            if(Best_Strategy(1,j) > task_number_imme)
                %Best_Strategy_updated(i,j)=0;
                Target_position(Best_Strategy(1,j),:) = UAV_position( j, :);
                %task_number=task_number+1;
            end
        end



for j =1: size(Best_Strategy,2)
    difference(j,:)=Target_position(Best_Strategy(j),:)-UAV_position(j,:);
    if (difference(j,1)==0)
        angle(j)= pi/2;
    else
        angle(j)= atan(difference(j,2)/difference(j,1));
    end
end
%end

% for i= 1: size(Best_Strategy,1)
for j= 1: size(Best_Strategy,2)
    if (difference(j,1) > 0)
        UAV_step(j,1)= UAV_speed(j)*cos(angle(j));
        UAV_step(j,2)= UAV_speed(j)*sin(angle(j));
    elseif(difference(j,1) < 0)
        UAV_step(j,1)= -UAV_speed(j)*cos(angle(j));
        UAV_step(j,2)= -UAV_speed(j)*sin(angle(j));
    elseif ((difference(j,1) == 0)&& (difference(j,2) > 0))
        UAV_step(j,1)= UAV_speed(j)*cos(angle(j));
        UAV_step(j,2)= UAV_speed(j)*sin(angle(j));
    elseif ((difference(j,1) == 0)&& (difference(j,2) < 0))
        UAV_step(j,1)= - UAV_speed(j)*cos(angle(j));
        UAV_step(j,2)= - UAV_speed(j)*sin(angle(j));
    end
end

[UAV_p
if (isempty(Target_position_new) == 1)
    break;
end
UAV_position = UAV_position_new;
if (size(Target_position,1) > size(Target_position_new,1))
    Target_position = Target_position_new;
    judge =1;
else
    judge = 0;
end

end
% task_number_imme = task_number;
% if (task_number_imme<UAV_number)
% for i = 1:size(Best_Strategy,1)
% for j = 1:size(Best_Strategy,2)
% if(Best_Strategy(i,j) > task_number_imme)
% %Best_Strategy_updated(i,j)=0;
% Target_position(Best_Strategy(i,j) = UAV_position( j, ;
% task_number=task_number+1;
% end
% end
% end
% % elseif (task_number==UAV_number)
% %
% % if (Target_position == UAV_position)
% % Target_position =[];
% % end
% end
% end
% % Start iteration
% for i=1:iteratornum
% best_ant_path=[]; % To find the best task allocation results in each iteration
% all_ant_path=[]; % To store the whole task allocation results in each iteration
%
% % For each ant
% for j=1:ant_num
% % To count how many tasks can be accomplished
% for p=1:UAV_number
% worker_quality§=maxT;
% end
%
% record_assign_worker=assignonetask(j,k,criticalPointMatrix,maxPheromoneMatrix,UAV_number,worker_quality);
% oneant_path(k,record_assign_worker)=1;
% worker_task(k,record_assign_worker)=0;
% worker_quality(record_assign_worker)=worker_quality(record_assign_worker)-1;
%
% % Once the worker has approached its maximum task capacity,
% % then, this worker cannot be assigned any task any more
% if worker_quality(record_assign_worker)==0
% worker_task(:,record_assign_worker)=0;
% end
% maxPheromoneMatrix=updatemaxPheromoneMatrix_special(pheromoneMatrix,maxPheromoneMatrix,k,record_assign_worker,worker_quality,worker_task,UAV_number,task_number);
% end
% end
% % Record all ant paths in each iteration
% all_ant_path=[all_ant_path;oneant_path];
% end
% % Find the best ant path in the stored information previously, and
% % record the corresponded travel distance of all UAVs
% [best_ant_path, min_dist(i)]=find_best_ant_path(all_ant_path,UAV_number,task_number,ant_num,UAV_position,Target_position);
%
% % Update the pheromone matrix and others based on the best ant path
% pheromoneMatrix=updatePheromoneMatrix(best_ant_path, pheromoneMatrix,UAV_number,task_number);
% maxPheromoneMatrix=updatemaxPheromoneMatrix(pheromoneMatrix,UAV_number,task_number);
% criticalPointMatrix=updatecriticalPointMatrix(pheromoneMatrix,UAV_number,task_number,ant_num);
% end

%% Display the task allcocation strategy
% Draw_Strategy(UAV_position,Target_position,best_ant_path, min_dist);
%end
function [maxPheromoneMatrix]=updatemaxPheromoneMatrix_special(pheromoneMatrix,maxPheromoneMatrix,current_task,record_assign_worker,worker_quality,worker_task,worker_number,task_number)

% The task capacity should also be updated, once the task has already
% already be completed, then the pheromone matrix has to be updated
for j=1:task_number
for i=1:worker_number
if worker_task(j,i)==0
pheromoneMatrix(j,i)=0;
end
end
end
% Find the column index of the maximum value in each row
[C,I]=max(pheromoneMatrix(current_task,:));
maxPheromoneMatrix(current_task)=I;

%对下面的影响进行操作
if worker_quality(record_assign_worker)==0
for i=current_task+1:task_number
% If the best allocation of the task is this worker, then find the
% next best worker
if maxPheromoneMatrix(i)==record_assign_worker
% Find the column index of the maximum value in each row
[C,I]=max(pheromoneMatrix(i,:));
maxPheromoneMatrix(i)=I;
end
end
end
end

四、运行结果

在这里插入图片描述

五、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1]焦阳.基于改进蚁群算法的无人机三维路径规划研究[J].舰船电子工程. 2019,39(03)

3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除

仿真咨询
1 各类智能优化算法改进及应用

生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化、公交排班优化、充电桩布局优化、车间布局优化、集装箱船配载优化、水泵组合优化、解医疗资源分配优化、设施布局优化、可视域基站和无人机选址优化

2 机器学习和深度学习方面
卷积神经网络(CNN)、LSTM、支持向量机(SVM)、最小二乘支持向量机(LSSVM)、极限学习机(ELM)、核极限学习机(KELM)、BP、RBF、宽度学习、DBN、RF、RBF、DELM、XGBOOST、TCN实现风电预测、光伏预测、电池寿命预测、辐射源识别、交通流预测、负荷预测、股价预测、PM2.5浓度预测、电池健康状态预测、水体光学参数反演、NLOS信号识别、地铁停车精准预测、变压器故障诊断

3 图像处理方面
图像识别、图像分割、图像检测、图像隐藏、图像配准、图像拼接、图像融合、图像增强、图像压缩感知

4 路径规划方面
旅行商问题(TSP)、车辆路径问题(VRP、MVRP、CVRP、VRPTW等)、无人机三维路径规划、无人机协同、无人机编队、机器人路径规划、栅格地图路径规划、多式联运运输问题、车辆协同无人机路径规划、天线线性阵列分布优化、车间布局优化

5 无人机应用方面
无人机路径规划、无人机控制、无人机编队、无人机协同、无人机任务分配

6 无线传感器定位及布局方面
传感器部署优化、通信协议优化、路由优化、目标定位优化、Dv-Hop定位优化、Leach协议优化、WSN覆盖优化、组播优化、RSSI定位优化

7 信号处理方面
信号识别、信号加密、信号去噪、信号增强、雷达信号处理、信号水印嵌入提取、肌电信号、脑电信号、信号配时优化

8 电力系统方面
微电网优化、无功优化、配电网重构、储能配置

9 元胞自动机方面
交通流 人群疏散 病毒扩散 晶体生长

10 雷达方面
卡尔曼滤波跟踪、航迹关联、航迹融合

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/TIQCmatlab/article/details/119951896

智能推荐

C语言学习笔记(一):VS2022安装使用_通用window平台开发需要勾选吗-程序员宅基地

文章浏览阅读1w次,点赞6次,收藏40次。一、安装VS2022参照B站安装教程安装。Tips:选择安装信息的时候,学习C语言勾选“通用Windows平台开发”,考虑到后续会用到C++,所以勾选了“使用C++的桌面开发”。值得一提的是,安装完成之后在后续学习过程中此安装信息也是可以修改的。二、创建项目测试程序点击最上方状态栏调试-开始执行(不调试),运行程序。成功!三、遇到问题在VS2022中,在使用scanf函数编译出错:error C4996: 'scanf': This function o_通用window平台开发需要勾选吗

golang的线程模型_goland 线程-程序员宅基地

文章浏览阅读159次。golang的线程模型是GMP模型:在语言层面是没有开放线程的但是在运行时候M个线程可以创建N个goroutine,一般N远大于M本质属于多线程模型,但是协程的调用由goruntine决定,强调开发者应该使用channel进行协程之间的同步_goland 线程

MiniFly的学习经历-程序员宅基地

文章浏览阅读1.4k次,点赞5次,收藏20次。MiniFly二次开发之:一控多同步、一控多分布、电脑控制无人机集群_minifly

Vue 查漏补缺-程序员宅基地

文章浏览阅读146次。vue 查漏补缺

mysql 浮点型详解 简书_MySQL 数据类型-程序员宅基地

文章浏览阅读1.1k次。1、整型MySQL数据类型 含义(有符号)tinyint(m) 1个字节 范围(-128~127)smallint(m) 2个字节 范围(-32768~32767)mediumint(m) 3个字节 范围(-8388608~8388607)int(m) 4个字节 范围(-2147483648~2147483647)bigint(m) 8个字节 范围(+-9.22*10的..._mysql 浮点型

基于flask的web应用开发——访问漂亮的html页面以及页面跳转_flask html-程序员宅基地

文章浏览阅读6.3k次,点赞8次,收藏36次。基于flask的web应用开发——访问漂亮的html页面以及页面跳转_flask html

随便推点

QT creator 新建项目_qtcreator构建套件-程序员宅基地

文章浏览阅读1.3k次,点赞2次,收藏3次。QT creator 新建项目_qtcreator构建套件

STM32 FOC电机PID学习笔记_foc pid 程序-程序员宅基地

文章浏览阅读2k次,点赞5次,收藏20次。简介在系统上存在外部干扰的情况下反馈是最好的选择否则使用前馈网络。为扭矩、通量和速度实施的调节器实际上是比例(P Proportional )、积分(I Integral)、微分 (D Derivative ) 调节器。 STM32中实际提供了3种,但是实际上我们常用的电机反馈调节使用的是PI反馈控制就够了。参考《STM32F PMSM single/dual FOC SDK》文档PID原理文档章节4我们平时使用到并联的PI的示意图,不过该图对于不同频率的时候的响应有缺陷。并行模式K_foc pid 程序

ubuntu18.04显卡驱动安装+cuda+cudnn+TensorFlow_3090 ubuntu18安装cuda和tensorflow-程序员宅基地

文章浏览阅读372次。Ubuntu18.04环境服务器配置显卡驱动+cuda+cudnn+TensorFlow近日实验室新来了一台服务器,两个TITIAN RTX用来跑深度学习,其中配置环境的苦差事交给了我。系统重装创建一个linux系统启动盘,用来重装系统,Unetbootin和Uiso都可以,我用的是Unetbootin,把想要安装的镜像按照要求写入U盘即可。注意: 格式化的时候我一开始随便格式化的结果用不了,后面格式化的时候选择Fat32就可以使用了。插上U盘,选择启动顺序进入U盘启动然后按着步骤走就行了。_3090 ubuntu18安装cuda和tensorflow

基于Quartus件完成一个1位全加器的设计_quartus全加器中添加半加器-程序员宅基地

文章浏览阅读220次。启动 Quartus II 软件,选择File->New Project Wizard,在出现的界面下先Next,填写工程的路径和名称,然后接着Next,直到出现下面界面并进行相应操作。与调入元件的方法一样,即在新打开的原理图编辑窗双击鼠标,在弹出 的“symbol”窗的“name”栏输入底层文件半加器的存储名“halfadder” 调出半加器,如图。再调出其他需要的元件,连接好全加器的电路图。通过拨动SW,观察LED的亮灭的效果,发现SW开表示1,关表示0,LED亮表示1,灭表示0。_quartus全加器中添加半加器

双十一助手Kola助手,实测最新2023幻想岛可用_kola任务助手-程序员宅基地

文章浏览阅读1.3k次。之前有试过喵币助手,喵惠助手,任务助手等等,可能是软件还没更新的缘故,本人两个手机都有各种原因的报错。试过的APP最稳定且已经更新最新版2023的,还很完善的就是Kola助手了,第一次试就成功了,操作过程简单可行。打开Kola助手,根据所需要的任务点击。例如,点击左上角的幻想岛,开启无障碍和悬浮窗服务,它就可以完成自动浏览和跳转了,最好是开启期间不要使用,完成任务结束再使用该手机。_kola任务助手

【JQuery学习笔记二】利用JQuery完成不同的文档和节点操作!_"单本选购函数:创建option节点,document.createelement(\"option-程序员宅基地

文章浏览阅读387次。通过3个demo来学会如何利用JQuery来对文档和节点进行不同的操作。1.使用JQuery完成省市二级联动。需求:当第一个下拉选择框选择湖北省时,第二个选择框自动加载湖北的城市。步骤:第一步:确定事件(change事件),在绑定的函数里面获取用户选择的省份 第二步:创建二维数组来存储省份和城市 第三步:遍历二维数组中的省份(与用户选择的省份进行比较)【使用JQ_"单本选购函数:创建option节点,document.createelement(\"option\")"

推荐文章

热门文章

相关标签