【无人机分配】基于共识的捆绑算法CBBA实现带时间窗多无人机多任务调度附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。

🍎个人主页:Matlab科研工作室

🍊个人信条:格物致知。

更多Matlab仿真内容点击👇

​智能优化算法​​​  ​​神经网络预测​​​ ​​雷达通信 ​​​ ​​无线传感器​

​信号处理​​​ ​​图像处理​​​ ​​路径规划​​​ ​​元胞自动机​​​ ​​无人机 ​​​ ​​电力系统​

⛄ 内容介绍

相较于一架多功能昂贵的大型无人机,多架异构低成本无人机集群在作战可靠性和复杂环境适应性方面,具有潜在优势。无人机集群任务分配是通过优化为集群中的无人机选择合理的任务,使集群执行任务的收益最大或执行代价最小,高效实时的任务分配是保障集群作战效能最大的重要手段之一。近年来,分布式的协同任务分配技术(无中心网络节点)得到学术界和工业界的广泛关注。但是,针对相关研究大多停留在算法收敛性的理论分析和纯数字仿真验证阶段,算法设计较少考虑实际计算芯片的资源约束;性能验证方面,缺乏计算芯片在环的半实物平台的支撑。针对这两方面不足,本论文进行了如下的研究。首先,针对无人机-单任务条件下的分配问题,研究了分配算法的目标模型和约束模型,以及基于分布式拍卖算法的求解方法,对算法收敛性做了分析,并进行了仿真验证与分析;针对需要多个无人机一起执行同一个任务的场景,修正了问题模型,研究了基于合同网协议的求解方法,该方法的核心思想是在无人机集群内局部执行"招标-竞标-中标"的流程,对合同网协议进行了仿真分析。针对无人机-多任务分配的场景,研究了基于CBBA算法的求解流程,并进行了仿真分析。采用无人机动态存储任务序列的策略;并在无人机间互通信息,以调整当前任务序列,进而避免任务冲突。

⛄ 部分代码

%计算投标值

function [CBBA_Data,bestIdxs,taskTimes,feasibility] = CBBA_ComputeBids(CBBA_Params,CBBA_Data,agent,tasks,feasibility)

%判断路径是否已满,如果满了就不用添加任务

L = find(CBBA_Data.path == -1);

if(isempty(L))

    return;

end

%初始化任务的投标,最佳ID,时间

CBBA_Data.bids = zeros(1,CBBA_Params.M);

bestIdxs       = zeros(1,CBBA_Params.M);

taskTimes      = zeros(1,CBBA_Params.M);

for m = 1:CBBA_Params.M

    %检查代理和任务类型是否对应

    if(CBBA_Params.CM(agent.type,tasks(m).type) > 0 )

        %检测路径中是否包含当前的任务m

        if(isempty(find(CBBA_Data.path(1,1:L(1,1)-1) == m, 1)))

            bestBid = 0;

            bestIndex = 0;

            bestTime = -1;

            %在其他任务位置j插入任务m,判断能否生成更好的路径

            for j = 1:L(1,1)

                %判断是否有新的可行的路径

                if(feasibility(m,j) == 1)

                    skip = 0;

%                     if(CBBA_Params.CM(agent.type,tasks(m).type) == 1)

%                         if(CBBA_Data.path(1,j-1) >= 7 && CBBA_Data.path(1,j-1) <= 13)

%                             CBBA_Data.path(1,j) = [];

%                             CBBA_Data.times(1,j) = [];

%                             taskNext = [];

%                             timeNext = [];

%                         else

%                             taskNext = tasks(CBBA_Data.path(j));

%                             timeNext = CBBA_Data.times(j);

%                         end

%                     elseif(CBBA_Params.CM(agent.type,tasks(m).type) == 2)

%                         if(CBBA_Data.path(1,j-1) >= 7 && CBBA_Data.path(1,j-1) <= 13)

%                             taskPrev = tasks(CBBA_Data.path(j-1));

%                             timePrev = CBBA_Data.times(j-1);

%                         end

%                     end

                    %是否把m插到开头

                    if(j == 1)

                        taskPrev = [];

                        timePrev = [];

                    else

                        taskPrev = tasks(CBBA_Data.path(j-1));

                        timePrev = CBBA_Data.times(j-1);

                    end

                    %是否把m插入到最后

                    if(j == L(1,1))

                        taskNext = [];

                        timeNext = [];

                    else

                        taskNext = tasks(CBBA_Data.path(j));

                        timeNext = CBBA_Data.times(j);

                    end

                    %调用Scoring_CalcScore功能包

                    [score, minStart ,maxStart] = Scoring_CalcScore(CBBA_Params,agent,tasks(m),taskPrev,timePrev,taskNext,timeNext);

                    if(minStart > maxStart)

                        skip = 1;

                        feasibility(m,j) = 0;

                    end

                    %保存最佳数值和任务的位置

                    if(~skip)

                        if(score > bestBid)

                            bestBid   = score;

                            bestIndex = j;

                            bestTime  = minStart;

                        end

                    end

                end

            end

            %保存最佳的出价信息

            if(bestBid > 0)

                CBBA_Data.bids(1,m) = bestBid;

                bestIdxs(1,m)       = bestIndex;

                taskTimes(1,m)      = bestTime; 

            end

        end

    

    end

end

⛄ 运行结果

⛄ 参考文献

[1]林晨. 面向无人机集群任务分配的分布式算法研究[D]. 电子科技大学, 2019.

[2]陈华毅. 基于智能优化算法的多无人机协同航迹规划研究[D]. 中国矿业大学(江苏).

⛄ 完整代码

❤️部分理论引用网络文献,若有侵权联系博主删除

❤️ 关注我领取海量matlab电子书和数学建模资料

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
这是一个非常复杂的任务,需要大量的代码算法。在这里,我将简要介绍一下CBBA算法和人工势场法,以及如何将它们结合起来实现多动态目标的围捕任务。 CBBA算法(Consensus-Based Bundle Algorithm)是一种用于多智能体任务分配算法。该算法通过协商和交换信息来实现任务的分配,以最小化分配的代价。CBBA算法的基本思想是,每个智能体提出一个任务列表,然后与其他智能体交换信息,以选择和分配任务。任务分配的过程中,每个智能体只能被分配一个任务,而且每个任务只能被一个智能体完成。CBBA算法的优点是简单易实现,能够处理大规模任务分配问题,并且能够适应动态环境。 人工势场法是一种用于路径规划和避障的方法。该方法利用了物理学中的势场概念,将机器人看作一个电粒子,将障碍物看作有相反电荷的粒子,然后根据粒子间的相互作用力计算机器人的运动轨迹。人工势场法的优点是简单易实现,能够处理复杂的环境,并且能够适应动态环境。 在多动态目标的围捕任务中,我们需要将CBBA算法和人工势场法结合起来,以实现任务分配和路径规划。具体实现步骤如下: 1. 初始化任务列表和智能体列表,然后进入任务分配循环。 2. 每个智能体根据当前的任务列表和已经完成的任务,计算出自己可完成的任务列表,并将任务列表发送给其他智能体。 3. 每个智能体根据接收到的任务列表,计算出自己最优的任务,并将任务分配结果发送给其他智能体。 4. 每个智能体根据自己被分配的任务,使用人工势场法计算出路径,并执行任务。 5. 当所有任务都完成时,退出任务分配循环。 6. 绘制围捕过程,以便观察和分析。 下面是一个简单的Matlab代码示例,用于实现基于CBBA算法的任务分配和人工势场法的路径规划和避障: ```matlab % 初始化任务列表 task_list = [1,2,3,4,5]; % 初始化智能体列表 agent_list = [1,2,3,4]; % 初始化位置和速度 pos = zeros(length(agent_list),2); vel = zeros(length(agent_list),2); % 进入任务分配循环 while ~isempty(task_list) % 计算可完成的任务列表 for i = 1:length(agent_list) available_tasks = []; for j = 1:length(task_list) % 如果任务没有被分配,并且智能体可以完成该任务,则将任务加入可完成任务列表 if task_list(j) ~= -1 && can_complete_task(agent_list(i), task_list(j)) available_tasks = [available_tasks, task_list(j)]; end end % 将可完成任务列表发送给其他智能体 send_available_tasks(agent_list(i), available_tasks); end % 计算最优任务 for i = 1:length(agent_list) % 接收其他智能体发送的可完成任务列表 available_tasks = recv_available_tasks(agent_list(i)); % 计算最优任务 best_task = find_best_task(agent_list(i), available_tasks); % 将任务分配结果发送给其他智能体 send_task_assignment(agent_list(i), best_task); end % 执行任务 for i = 1:length(agent_list) % 接收任务分配结果 assigned_task = recv_task_assignment(agent_list(i)); % 计算路径 path = calculate_path(agent_list(i), assigned_task); % 避障 path = avoid_obstacles(path); % 移动智能体 pos(i,:) = move_agent(pos(i,:), vel(i,:), path); end % 标记已完成的任务 for i = 1:length(agent_list) assigned_task = recv_task_assignment(agent_list(i)); if assigned_task ~= -1 task_list(assigned_task) = -1; end end end % 绘制围捕过程 plot_capturing_process(); ``` 需要注意的是,上述代码中的函数和变量都需要根据具体情况进行实现和修改。此外,路径规划和避障的具体实现方法也需要根据具体需求进行选择和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

matlab科研助手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值