基于共识的捆绑算法CBBA实现多无人机多任务调度附matlab代码

简介: 基于共识的捆绑算法CBBA实现多无人机多任务调度附matlab代码

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

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

🍊个人信条:格物致知。

更多Matlab仿真内容点击👇

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

信号处理              图像处理               路径规划       元胞自动机        无人机

⛄ 内容介绍

Theorem 1. Provided that the scoring function is DMG (Diminishing Marginal Gain), the CBBA process with a conflflict resolution phase over a static communication network with diameter D satisfifiesthe following:

1. CBBA produces the same solution as SGA(sequentional greedy algo) with the corresponding winning bid values and winning agent information being shared across the flfleet

2. The convergence time Tc is bounded above by NminD.

⛄ 部分代码

% Runs consensus between neighbors

% Checks for conflicts and resolves among agents


%---------------------------------------------------------------------%


function [CBBA_Data t] = CBBA_Communicate(CBBA_Params, CBBA_Data, Graph, old_t, T)


% Copy data

for n = 1:CBBA_Params.N,

   old_z(n,:) = CBBA_Data(n).winners;

   old_y(n,:) = CBBA_Data(n).winnerBids;    

end


z = old_z;

y = old_y;

t = old_t;


epsilon = 10e-6;



% Start communication between agents


% sender   = k

% receiver = i

% task     = j


for k=1:CBBA_Params.N

   for i=1:CBBA_Params.N

       if( Graph(k,i) == 1 )

           for j=1:CBBA_Params.M


               % Implement table for each task

               

               if( old_z(k,j) == k ) % Entries 1 to 4: Sender thinks he has the task

               

                   % Entry 1: Update or Leave

                   if( z(i,j) == i )

                       if( old_y(k,j) - y(i,j) > epsilon )  % Update

                           z(i,j) = old_z(k,j);

                           y(i,j) = old_y(k,j);

                       elseif( abs(old_y(k,j) - y(i,j)) <= epsilon )  % Equal scores

                           if( z(i,j) > old_z(k,j) )  % Tie-break based on smaller index

                               z(i,j) = old_z(k,j);

                               y(i,j) = old_y(k,j);

                           end

                       end

                       

                   % Entry 2: Update

                   elseif( z(i,j) == k )

                       z(i,j) = old_z(k,j);

                       y(i,j) = old_y(k,j);

                   

                   % Entry 3: Update or Leave

                   elseif( z(i,j) > 0 )

                       if( old_t(k,z(i,j)) > t(i,z(i,j)) )  % Update

                           z(i,j) = old_z(k,j);

                           y(i,j) = old_y(k,j);

                       elseif( (old_y(k,j) - y(i,j)) > epsilon )  % Update

                           z(i,j) = old_z(k,j);

                           y(i,j) = old_y(k,j);

                       elseif( abs(old_y(k,j) - y(i,j)) <= epsilon )  % Equal scores

                           if( z(i,j) > old_z(k,j) )  % Tie-break based on smaller index

                               z(i,j) = old_z(k,j);

                               y(i,j) = old_y(k,j);

                           end

                       end

               

                   % Entry 4: Update

                   elseif( z(i,j) == 0 )

                       z(i,j) = old_z(k,j);

                       y(i,j) = old_y(k,j);

                       

                   else

                       disp('Unknown winner value: Should not be here, please revise')

                   end

                   

               elseif( old_z(k,j) == i ) % Entries 5 to 8: Sender thinks receiver has the task


                   % Entry 5: Leave

                   if( z(i,j) == i )

                       % Do nothing

                       

                    % Entry 6: Reset

                   elseif( z(i,j) == k )

                       z(i,j) = 0;

                       y(i,j) = 0;

                 

                    % Entry 7: Reset or Leave

                   elseif( z(i,j) > 0 )

                       if( old_t(k,z(i,j)) > t(i,z(i,j)) )  % Reset

                           z(i,j) = 0;

                           y(i,j) = 0;

                       end

                       

                   % Entry 8: Leave

                   elseif( z(i,j) == 0 )

                       % Do nothing

                       

                   else

                       disp('Unknown winner value: Should not be here, please revise')

                   end

                 

               elseif( old_z(k,j) > 0 ) % Entries 9 to 13: Sender thinks someone else has the task

                   

                   % Entry 9: Update or Leave

                   if( z(i,j) == i )

                       if( old_t(k,old_z(k,j)) > t(i,old_z(k,j)) )

                           if ( (old_y(k,j) - y(i,j)) > epsilon )

                               z(i,j) = old_z(k,j);  % Update

                               y(i,j) = old_y(k,j);

                           elseif( abs(old_y(k,j) - y(i,j)) <= epsilon )  % Equal scores

                               if( z(i,j) > old_z(k,j) )  % Tie-break based on smaller index

                                   z(i,j) = old_z(k,j);

                                   y(i,j) = old_y(k,j);

                               end

                           end

                       end

                       

                    % Entry 10: Update or Reset

                   elseif( z(i,j) == k )

                       if( old_t(k,old_z(k,j)) > t(i,old_z(k,j)) )  % Update

                           z(i,j) = old_z(k,j);

                           y(i,j) = old_y(k,j);

                       else  % Reset

                           z(i,j) = 0;

                           y(i,j) = 0;

                       end

                       

                   % Entry 11: Update or Leave

                   elseif( z(i,j) == old_z(k,j) )

                       if( old_t(k,old_z(k,j)) > t(i,old_z(k,j)) )  % Update

                           z(i,j) = old_z(k,j);

                           y(i,j) = old_y(k,j);

                       end

                   

                   % Entry 12: Update, Reset or Leave

                   elseif( z(i,j) > 0 )

                       if( old_t(k,z(i,j)) > t(i,z(i,j)) )

                           if( old_t(k,old_z(k,j)) >= t(i,old_z(k,j)) )  % Update

                               z(i,j) = old_z(k,j);

                               y(i,j) = old_y(k,j);

                           elseif( old_t(k,old_z(k,j)) < t(i,old_z(k,j)) ) % Reset

                               z(i,j) = 0;

                               y(i,j) = 0;

                           else

                               disp('Should not be here, please revise')

                           end

                       else

                           if( old_t(k,old_z(k,j)) > t(i,old_z(k,j)) )

                               if( (old_y(k,j) - y(i,j)) > epsilon )  % Update

                                   z(i,j) = old_z(k,j);

                                   y(i,j) = old_y(k,j);

                               elseif( abs(old_y(k,j) - y(i,j)) <= epsilon )  % Equal scores

                                   if( z(i,j) > old_z(k,j) )   % Tie-break based on smaller index

                                       z(i,j) = old_z(k,j);

                                       y(i,j) = old_y(k,j);

                                   end

                               end

                           end

                       end


                   % Entry 13: Update or Leave

                   elseif( z(i,j) == 0 )

                       if( old_t(k,old_z(k,j)) > t(i,old_z(k,j)) )  % Update

                           z(i,j) = old_z(k,j);

                           y(i,j) = old_y(k,j);

                       end

                       

                   else

                       disp('Unknown winner value: Should not be here, please revise')

                   end

                   

               elseif( old_z(k,j) == 0 ) % Entries 14 to 17: Sender thinks no one has the task


                   % Entry 14: Leave

                   if( z(i,j) == i )

                       % Do nothing

                       

                    % Entry 15: Update

                   elseif( z(i,j) == k )

                       z(i,j) = old_z(k,j);

                       y(i,j) = old_y(k,j);

                 

                    % Entry 16: Update or Leave

                   elseif( z(i,j) > 0 )

                       if( old_t(k,z(i,j)) > t(i,z(i,j)) )  % Update

                           z(i,j) = old_z(k,j);

                           y(i,j) = old_y(k,j);

                       end

                       

                   % Entry 17: Leave

                   elseif( z(i,j) == 0 )

                       % Do nothing

                       

                   else

                       disp('Unknown winner value: Should not be here, please revise')

                   end

                   

                   % End of table

                   

               else

                   disp('Unknown winner value: Should not be here, please revise')

               end

           end

           

           % Update timestamps for all agents based on latest comm

           for n=1:CBBA_Params.N

               if( n ~= i && t(i,n) < old_t(k,n) )

                   t(i,n) = old_t(k,n);

               end

           end

           t(i,k) = T;

           

       end

   end

end


% Copy data

for n = 1:CBBA_Params.N,

   CBBA_Data(n).winners    = z(n,:);

   CBBA_Data(n).winnerBids = y(n,:);

end

end

⛄ 运行结果

⛄ 参考文献


⛳️ 代码获取关注我

❤️部分理论引用网络文献,若有侵权联系博主删除
❤️ 关注我领取海量matlab电子书和数学建模资料


相关文章
|
2天前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
|
5天前
|
算法 数据挖掘 数据安全/隐私保护
基于FCM模糊聚类算法的图像分割matlab仿真
本项目展示了基于模糊C均值(FCM)算法的图像分割技术。算法运行效果良好,无水印。使用MATLAB 2022a开发,提供完整代码及中文注释,附带操作步骤视频。FCM算法通过隶属度矩阵和聚类中心矩阵实现图像分割,适用于灰度和彩色图像,广泛应用于医学影像、遥感图像等领域。
|
6天前
|
算法 调度
基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图
车间作业调度问题(JSSP)通过遗传算法(GA)和模拟退火算法(SA)优化多个作业在并行工作中心上的加工顺序和时间,以最小化总完成时间和机器闲置时间。MATLAB2022a版本运行测试,展示了有效性和可行性。核心程序采用作业列表表示法,结合遗传操作和模拟退火过程,提高算法性能。
|
6天前
|
机器学习/深度学习 算法 芯片
基于GSP工具箱的NILM算法matlab仿真
基于GSP工具箱的NILM算法Matlab仿真,利用图信号处理技术解析家庭或建筑内各电器的独立功耗。GSPBox通过图的节点、边和权重矩阵表示电气系统,实现对未知数据的有效分类。系统使用MATLAB2022a版本,通过滤波或分解技术从全局能耗信号中提取子设备的功耗信息。
|
6天前
|
机器学习/深度学习 算法 5G
基于MIMO系统的SDR-AltMin混合预编码算法matlab性能仿真
基于MIMO系统的SDR-AltMin混合预编码算法通过结合半定松弛和交替最小化技术,优化大规模MIMO系统的预编码矩阵,提高信号质量。Matlab 2022a仿真结果显示,该算法能有效提升系统性能并降低计算复杂度。核心程序包括预编码和接收矩阵的设计,以及不同信噪比下的性能评估。
23 3
|
3月前
|
安全
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
本文介绍了2023年高教社杯数学建模竞赛D题的圈养湖羊空间利用率问题,包括问题分析、数学模型建立和MATLAB代码实现,旨在优化养殖场的生产计划和空间利用效率。
191 6
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
|
3月前
|
存储 算法 搜索推荐
【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现
本文提供了2022年华为杯数学建模竞赛B题的详细方案和MATLAB代码实现,包括方形件组批优化问题和排样优化问题,以及相关数学模型的建立和求解方法。
124 3
【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现
|
3月前
|
数据采集 存储 移动开发
【2023五一杯数学建模】 B题 快递需求分析问题 建模方案及MATLAB实现代码
本文介绍了2023年五一杯数学建模竞赛B题的解题方法,详细阐述了如何通过数学建模和MATLAB编程来分析快递需求、预测运输数量、优化运输成本,并估计固定和非固定需求,提供了完整的建模方案和代码实现。
88 0
【2023五一杯数学建模】 B题 快递需求分析问题 建模方案及MATLAB实现代码
|
6月前
|
数据安全/隐私保护
耐震时程曲线,matlab代码,自定义反应谱与地震波,优化源代码,地震波耐震时程曲线
地震波格式转换、时程转换、峰值调整、规范反应谱、计算反应谱、计算持时、生成人工波、时频域转换、数据滤波、基线校正、Arias截波、傅里叶变换、耐震时程曲线、脉冲波合成与提取、三联反应谱、地震动参数、延性反应谱、地震波缩尺、功率谱密度
基于混合整数规划的微网储能电池容量规划(matlab代码)
基于混合整数规划的微网储能电池容量规划(matlab代码)