• m基于ACO蚁群算法的考虑装载率的循环送货的最短线路规划MATLAB仿真


    目录

    1.算法概述

    2.仿真效果预览

    3.核心MATLAB程序

    4.完整MATLAB程序


    1.算法概述

            根据这些装载率再结合路径最短来设计几个循环送货的线路。最理想状态是一条循环路径出去把所有的货都能遍历,并且装载率也很高。但是显然理想状态不可能,所以我们要做的就是尽量往理想状态靠,通过这些数据,用最少的循环路径条数(或者说最经济的)和最高的装载率以及最少的每条路径遍历次数(这些加起来基本就能看做是最低成本),来把那些货运完。

    根据你所提供的参数资料,目前,我们所需要考虑的影响成本的几个因素为:

    ·每辆卡车的装货量;

    ·每个地点的坐标值;

    ·每个地点的频数,货物种类以及数量,体积;

    ·卡车的耗油量;

        这里由于原先考虑出现点问题,这里考虑每辆卡车的优化方案分别进行仿真分析。

    这里所设计的环路方案,必须满足如下的几个条件:

    第一:每个点通过次数必须满足规定的频次;

    第二:从原点出发,在装载率最大化的情况下尽可能多的历遍点,然后返回节点;

    第三:在完成所有节点的频次需求和货物需求所需要的路线最短即油耗最小。

            通过上面的分析,整个问题即,卡车每次装多少种类的多少数目的货物出发送货(装载量),且完成送货任务总路径最短,中间可能回来取货(油耗),每个点通过次数在规定次数之内,此时的成本最低。并且,每次送货的装载量又决定了最终的路线长度即油耗,这里省略掉时间成本。这里单独考虑每辆卡车的优化任务。

           通过上面的分析可知,这里的优化问题,本质上是一个VRP和VFP的联合问题,即车辆调度循环发送和装载的联合问题。

    这里,我们的优化目标函数为:

    这里的函数含义是:

    成本最低;

    路径综合最短;

    每条线路的装载率最大;

     

    2.仿真效果预览

    matlab2022a仿真结果如下:

    3.核心MATLAB程序

    1. .................................................................
    2. %映射表
    3. B = func_maps(C_f);
    4. %计算规模和权值的初始值
    5. [SCALEs,Wsd]=func_w(C);
    6. %中心和每个供货点之间连接能节省的距离
    7. Save_d = func_save_d(SCALEs,Wsd);
    8. LOADs = 0;
    9. Eer = 1./Wsd; %启发常系数
    10. Tau = ones(SCALEs,SCALEs);
    11. Save_roads = zeros(Num_ann,SCALEs+20);%生成路的径
    12. Iteration = 1;
    13. Best_roads = [Iter,SCALEs+20]; %各代最佳路线
    14. Best_roads_Lens = inf.*ones(Iter,1); %各代最佳路线的长度
    15. Best_roads_Lens_avgs = zeros(Iter,1); %各代路线的平均长度
    16. flag = 0;
    17. %进行蚁群+PSO算法
    18. while (Iteration <= Iter)
    19. disp('当前迭代次数')
    20. Iteration
    21. %产生随机变量作为初始化粒子
    22. Save_roads(:,1) = randint(Num_ann,1,[1,1]);
    23. flag = zeros(SCALEs,1);
    24. %按如下的规则进行循环历遍
    25. pp = 0;
    26. for i=1:Num_ann
    27. pp = 0;
    28. %指定随机性
    29. % RandStream.setDefaultStream(RandStream('mt19937ar','seed',Iteration*i));
    30. Will_walks = Save_roads(i,:);
    31. Will_walks = Will_walks(Will_walks>0);
    32. Will_walks2 = setdiff(1:SCALEs,Will_walks);
    33. c_temp = length(Will_walks2);
    34. Jer=1;
    35. while Jer <= SCALEs
    36. pp = pp +1;
    37. if isempty(Will_walks2) == 0
    38. %按照规则选下一个供货点或者是回到中心
    39. for k=1:length(Will_walks2)
    40. x(k) = (Tau(Will_walks(end),Will_walks2(k))) *...
    41. (Eer(Will_walks(end),Will_walks2(k))) *...
    42. (Save_d(Will_walks(end),Will_walks2(k))^2);
    43. end
    44. Pers = rand(1,1);
    45. if Pers < 0.1
    46. choices = find(max(x));
    47. else
    48. x = x/(sum(x));
    49. xcum = cumsum(x);
    50. choices = find(xcum>=rand(1,1));
    51. end
    52. %以下是对每个供货点进行供货的装载情况的计算
    53. if isempty(choices) == 1
    54. choices = 1;
    55. %计算当前供货点的物件数量和体积
    56. INDs = choices;
    57. INDs2 = INDs;
    58. LOADs = LOADs + V1{INDs2}(choices);
    59. else
    60. INDs = Will_walks2(choices(1));
    61. %对当前点下的情况进行装货
    62. INDs2 = B(INDs,2);
    63. %计算当前点种的货物的种类
    64. ZL = length(V1{INDs2});
    65. %%产生一组概率进行选择货物,如果装载满足需求,则继续装,否则不装
    66. %NNS = floor(ZL*rand(1,1)) + 1;
    67. NNS = 1;
    68. for NNS = 1:ZL
    69. CC = Nums{INDs2}(NNS);
    70. while CC > 0 & LOADs <= lemda*Qv
    71. Vtmp = V1{INDs2}(NNS);%选择的货物的体积大小
    72. %然后进行装载
    73. LOADs = LOADs + Vtmp;
    74. %存货数量减1
    75. CC = CC-1;
    76. Nums{INDs2}(NNS) = CC;
    77. end
    78. end
    79. end
    80. %计算装载率
    81. if LOADs <= lemda*Qv
    82. WW(i,pp) = LOADs/(lemda*Qv);
    83. end
    84. if LOADs > lemda*Qv%装满则返回
    85. choices = 1;
    86. Jer = Jer-1;
    87. LOADs = 0;
    88. Save_roads(i,length(Will_walks)+1) = choices(1);
    89. else
    90. Save_roads(i,length(Will_walks)+1) = Will_walks2(choices(1));
    91. end
    92. end
    93. Will_walks = Save_roads(i,:);
    94. Will_walks = Will_walks(Will_walks>0);
    95. Will_walks2 = setdiff(1:SCALEs,Will_walks);
    96. x = [];
    97. if Will_walks(end) > 1 | Will_walks(end) < 1
    98. Save_roads(i,1:(length(Will_walks)+1))=[Will_walks,1];
    99. end
    100. if sum(Nums{INDs2}) == 0
    101. flag(Jer) = INDs;
    102. else
    103. flag(Jer) = 0;
    104. end
    105. Jer=Jer+1;
    106. end
    107. LOADs=0;
    108. end
    109. L = zeros(Num_ann,1);
    110. for i=1:Num_ann
    111. tmpsss = Save_roads(i,:);
    112. R = tmpsss(tmpsss>0);
    113. for j=1:(length(R)-1)
    114. L(i) = L(i) + Wsd(R(j),R(j+1));
    115. end
    116. end
    117. Best_roads_Lens(Iteration) = min(L);
    118. pos = find(L==Best_roads_Lens(Iteration));
    119. Best_roads(Iteration,1:length(Save_roads(pos(1),:))) = Save_roads(pos(1),:);
    120. SELS = find(Best_roads(Iteration,:)==1);
    121. Best_save = [];
    122. Best_save2 = 0;
    123. for Si=1:(length(SELS)-1)
    124. YBEST = Best_roads(Iteration,SELS(Si):SELS(Si+1));
    125. al = length(YBEST);
    126. T = zeros((length(SELS)-1),1);
    127. for Sj=1:(al-1)
    128. T(Si)=T(Si)+Wsd(YBEST(Sj),YBEST(Sj+1));
    129. end
    130. for Sp=2:(al-1)
    131. for Sq=(Sp+1):(al-1)
    132. DD = YBEST;
    133. temp1 = DD(Sp);
    134. temp2 = DD(Sq);
    135. DD(Sp) = temp2;
    136. DD(Sq) = temp1;
    137. TT = zeros(1);
    138. for Sj=1:(al-1)
    139. TT = TT + Wsd(DD(Sj),DD(Sj+1));
    140. end
    141. if TT<T(Si)
    142. T(Si) = TT;
    143. YBEST = DD;
    144. end
    145. end
    146. end
    147. if Si>=2
    148. YBEST = YBEST(2:al);
    149. end
    150. Best_save = [Best_save,YBEST];
    151. Best_save2= Best_save2+T(Si);
    152. end
    153. Best_roads_Lens(Iteration) = Best_save2;
    154. Best_roads(Iteration,1:length(Best_save)) = Best_save;
    155. Best_save = [];
    156. Best_save2 = 0;
    157. Best_roads_Lens_avgs(Iteration) = mean(L);
    158. LOADs = 0;
    159. Iteration = Iteration+1;
    160. Delta_Tau=zeros(SCALEs,SCALEs);
    161. for i=1:Num_ann
    162. MM = Save_roads(i,:);
    163. R = MM(MM>0);
    164. for j=1:(length(R)-1)
    165. Delta_Tau(R(j),R(j+1))=Delta_Tau(R(j),R(j+1))+Importance/L(i);
    166. end
    167. end
    168. Tau = (1-Rr).*Tau+Delta_Tau;
    169. %清零
    170. Save_roads = zeros(Num_ann,SCALEs);
    171. end
    172. %优化结果
    173. Pos = find(Best_roads_Lens==min(Best_roads_Lens));
    174. best_route = Best_roads(Pos(1),:);
    175. best_route = best_route(best_route>0);
    176. for i = 1:SCALEs
    177. Load_rate(i) = mean(WW(:,i));
    178. end
    179. %装载率的变化
    180. %装载率的变化
    181. disp('装载率:');
    182. max(Load_rate)
    183. .................................
    184. 02-008m

    4.完整MATLAB程序

    matlab源码说明_我爱C编程的博客-CSDN博客

    V

  • 相关阅读:
    Vue3 v-model非兼容更改
    亚商投资顾问 早餐FM/1122全国性商业银行信贷工作座谈会
    【Call for papers】IJCAI-2023(CCF-A/截稿日期: 2023年1月18日)
    网页大作业代码自取【HTML+CSS制作美味糖果网站】
    图像识别(八)| 还对全连接层迷迷糊糊?背会一首诗就行了
    sklearn快速入门教程:处理连续型特征
    聊聊更新表时的隐式提交
    Leetcode力扣 MySQL数据库 1907 按分类统计薪水
    【前端进阶】-TypeScript类型声明文件详解及使用说明
    dvaJs在react 项目中的简单使用
  • 原文地址:https://blog.csdn.net/hlayumi1234567/article/details/127854436