• 遗传算法GA求解TSP问题


    假设有一个旅行商人要拜访全国31个省会城市,它需要选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。对路径选择的要求是:所选路径的路成为所有路径之中的最小值。
    全国31个省会城市的坐标为

    [1304 2312;3639 1315;4177 2244;3712 1399;3488 1535;3326 1556;3238 1229;4196 1044;

    4312  790;4386  570;3007 1970;2562 1756;2788 1491;2381 1676;1332  695;3715 1678;

    3918 2179;4061 2370;3780 2212;3676 2578;4029 2838;4263 2931;3429 1908;3507 2376;

    3394 2643;3439 3201;2935 3240;3140 3550;2545 2357;2778 2826;2370 2975]

    1. clear all;
    2. close all;
    3. clc;
    4. C=[1304 2312;3639 1315;4177 2244;3712 1399;3488 1535;3326 1556;...
    5. 3238 1229;4196 1044;4312 790;4386 570;3007 1970;2562 1756;...
    6. 2788 1491;2381 1676;1332 695;3715 1678;3918 2179;4061 2370;...
    7. 3780 2212;3676 2578;4029 2838;4263 2931;3429 1908;3507 2376;...
    8. 3394 2643;3439 3201;2935 3240;3140 3550;2545 2357;2778 2826;...
    9. 2370 2975];
    10. N=size(C,1);%1表示按行计算,2表示按列计算
    11. D=zeros(N);%城市距离矩阵
    12. %%%%%求任意两城市距离
    13. for i=1:N
    14. for j=1:N
    15. D(i,j)=((C(i,1)-C(j,1))^2+(C(i,2)-C(j,2))^2)^0.5;
    16. end
    17. end
    18. NP=200;%种群规模
    19. G=1000;%遗传次数
    20. f=zeros(NP,N);%用于存储种群
    21. F=[];%种群更新中间存储(选择,交叉,遗传
    22. for i=1:NP
    23. f(i,:)=randperm(N);%初始化种群
    24. end
    25. R=f(1,:); %R存储历代最优路径,初始化时取种群第一个个体做最优
    26. len=zeros(NP,1); %路径长度
    27. fitness=zeros(NP,1);%种群归一化后的适应度值
    28. gen=0;
    29. while gen
    30. %%%%%%%%%%计算路径长度
    31. for i=1:NP
    32. len(i,1)=D(f(i,N),f(i,1));
    33. for j=1:N-1
    34. len(i,1)=len(i,1)+D(f(i,j),f(i,j+1));
    35. end
    36. end
    37. maxlen=max(len);
    38. minlen=min(len);
    39. %%%%%%%%%%更新最短路径
    40. rr=find(len==minlen);
    41. R=f(rr(1,1),:);
    42. %%%%%%%%%%%%%%%%%%%%%%%%%%%%归一化适应值
    43. for i=1:length(len)
    44. fitness(i,1)=((1-(len(i,1)-minlen)/(maxlen-minlen+0.001)));
    45. end
    46. %%%%%选择操作
    47. nn=0;
    48. for i=1:NP
    49. if fitness(i,1)>=rand%遍历每个个体,适应度大于某个随机值时选择
    50. nn=nn+1;
    51. F(nn,:)=f(i,:);
    52. end
    53. end
    54. [aa,bb]=size(F);
    55. while aa
    56. nnper=randperm(nn);%任选两个进行交叉和变异操作
    57. A=F(nnper(1),:);
    58. B=F(nnper(2),:);
    59. %%%%交叉操作
    60. W=ceil(N/10);%交叉点个数
    61. p=unidrnd(N-W+1); %交叉点起始位置,把p到p+w位置上的元素交换
    62. for i=1:W
    63. x=find(A==B(p+i-1));
    64. y=find(B==A(p+i-1));
    65. temp=B(p+i-1);%A与B交换p+i-1的位置
    66. B(p+i-1)=A(p+i-1);
    67. A(p+i-1)=temp;
    68. temp=A(x);%A与B交换x和y的位置
    69. A(x)=B(y);
    70. B(y)=temp;
    71. end
    72. %%%%%%%%%%%%%%%%%%%变异操作
    73. p1=floor(1+N*rand());
    74. p2=floor(1+N*rand());
    75. while p1==p2
    76. p1=floor(1+N*rand());
    77. p2=floor(1+N*rand());
    78. end
    79. temp=A(p1);%将A 的p1和p2位置交换
    80. A(p1)=A(p2);
    81. A(p2)=temp;
    82. temp=B(p1);%将B的p1和p2的位置交换
    83. B(p1)=B(p2);
    84. B(p2)=temp;
    85. F=[F;A;B];
    86. [aa,bb]=size(F);%a的值每次+2
    87. end
    88. %%%%%%%%后事处理
    89. if aa>NP
    90. F=F(1:NP,:);%保持种群规模为NP
    91. end
    92. f=F;
    93. f(1,:)=R;%将种群第一个个体赋值为上一代最优个体
    94. clear F;%清除种群更新中间存储
    95. gen=gen+1;
    96. Rlength(gen)=minlen;%记录历代最优路径长度
    97. end
    98. figure
    99. for i=1:N-1
    100. plot([C(R(i),1),C(R(i+1),1)],[C(R(i),2),C(R(i+1),2)],'bo-');
    101. hold on;
    102. end
    103. plot([C(R(N),1),C(R(1),1)],[C(R(N),2),C(R(1),2)]);
    104. title(['优化最短距离:',num2str(minlen)]);
    105. figure
    106. plot(Rlength);
    107. xlabel('迭代次数');
    108. ylabel('目标函数值');
    109. title('适应度进化曲线')

  • 相关阅读:
    沟通之痛:如何改变?
    文件上传漏洞
    MySQL 8.0 架构 之 慢查询日志(Slow query log)(2)流程图:查询记录到慢查询日志中的条件
    UDF 函数返回中文结果在 datastudio 客户端为乱码
    [RCTF 2019]Nextphp
    新鲜速递:Spring Boot3多模块项目跨包自动注入的方法,快速编写自己的starter项目
    数组c++介绍
    【无标题】
    模块化讲解
    计算机算法分析与设计(4)---凸多边形的最优三角划分(含C++代码)
  • 原文地址:https://blog.csdn.net/qq_54169998/article/details/126268417