当前位置: 首页 > news >正文

蚁群算法优化

%%%%%%%%%%%%蚁群算法解决 TSP 问题%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%
clear all; %清除所有变量
close all; %清图
clc; %清屏
m = 50; %蚂蚁个数
Alpha = 1; %信息素重要程度参数
Beta = 5; %启发式因子重要程度参数
Rho = 0.1; %信息素蒸发系数
G = 200; %最大迭代次数
Q = 100; %信息素增加强度系数
C = [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]; %31 个省会城市坐标
%%%%%%%%%%%%%%%第一步:变量初始化%%%%%%%%%%%%%%
n = size(C,1); %n 表示问题的规模(城市个数)
D = zeros(n,n); %D 表示两个城市距离间隔矩阵
for i = 1:n
    for j = 1:n
        if i ~= j
            D(i,j) = ((C(i,1)-C(j,1))^2+(C(i,2)-C(j,2))^2)^0.5;
        else
            D(i,j) = eps;
        end
        D(j,i) = D(i,j);
    end
end
Eta = 1./D; %Eta 为启发因子,这里设为距离的倒数
Tau = ones(n,n); %Tau 为信息素矩阵
Tabu = zeros(m,n); %存储并记录路径的生成
NC = 1; %迭代计数器
R_best = zeros(G,n); %各代最佳路线
L_best = inf.*ones(G,1); %各代最佳路线的长度
figure(1); %优化解
while NC <= G
    %%%%%%%%%%第二步:将 m 只蚂蚁放到 n 个城市上%%%%%%%%%%
    Randpos = [];
    for i = 1:(ceil(m/n))
        Randpos = [Randpos,randperm(n)];
    end
    Tabu(:,1) = (Randpos(1,1:m))';
    %%%第三步:m 只蚂蚁按概率函数选择下一座城市,完成各自的周游%%%%
    for j = 2:n
        for i = 1:m
            visited = Tabu(i,1:(j-1)); %已访问的城市
            J = zeros(1,(n-j+1)); %待访问的城市
            P = J; %待访问城市的选择概率分布
            Jc = 1;
            for k = 1:n
                if length(find(visited==k))==0
                    J(Jc) = k;
                    Jc = Jc+1;
                end
            end
            %%%%%%%%%%%计算待选城市的概率分布%%%%%%%%%%%
            for k = 1:length(J)
                P(k) = (Tau(visited(end),J(k))^Alpha)...
                    *(Eta(visited(end),J(k))^Beta);
            end
            P = P/(sum(P));
            %%%%%%%%%%%按概率原则选取下一个城市%%%%%%%%%
            Pcum = cumsum(P);
            Select = find(Pcum >= rand);
            to_visit = J(Select(1));
            Tabu(i,j) = to_visit;
        end
    end
    if NC >= 2
        Tabu(1,:) = R_best(NC-1,:);
    end
    %%%%%%%%%%%%%第四步:记录本次迭代最佳路线%%%%%%%%%%
    L = zeros(m,1);
    for i = 1:m
        R = Tabu(i,:);
        for j = 1:(n-1)
            L(i) = L(i)+D(R(j),R(j+1));
        end
        L(i) = L(i)+D(R(1),R(n));
    end
    L_best(NC) = min(L);
    pos = find(L==L_best(NC));
    R_best(NC,:) = Tabu(pos(1),:);
    %%%%%%%%%%%%%%%第五步:更新信息素%%%%%%%%%%%%%
    Delta_Tau = zeros(n,n);
    for i = 1:m
        for j = 1:(n-1)
            Delta_Tau(Tabu(i,j),Tabu(i,j+1)) = ...
                Delta_Tau(Tabu(i,j),Tabu(i,j+1))+Q/L(i);
        end
        Delta_Tau(Tabu(i,n),Tabu(i,1)) = ...
            Delta_Tau(Tabu(i,n),Tabu(i,1))+Q/L(i);
    end
    Tau = (1-Rho).*Tau+Delta_Tau;
    %%%%%%%%%%%%%%%第六步:禁忌表清零%%%%%%%%%%%%%
    Tabu = zeros(m,n);
    %%%%%%%%%%%%%%%%%历代最优路线%%%%%%%%%%%%%%%
    for i = 1:n-1
        plot([ C(R_best(NC,i),1), C(R_best(NC,i+1),1)],...
            [C(R_best(NC,i),2), C(R_best(NC,i+1),2)],'bo-');
        hold on;
    end
    plot([C(R_best(NC,n),1), C(R_best(NC,1),1)],...
        [C(R_best(NC,n),2), C(R_best(NC,1),2)],'ro-');
    title(['优化最短距离:',num2str(L_best(NC))]);
    hold off;
    pause(0.005);
    NC = NC+1;
end
%%%%%%%%%%%%%%%%%第七步:输出结果%%%%%%%%%%%%%%
Pos = find(L_best==min(L_best));
Shortest_Route = R_best(Pos(1),:); %最佳路线
Shortest_Length = L_best(Pos(1)); %最佳路线长度
figure(2),
plot(L_best)
xlabel('迭代次数')
ylabel('目标函数值')
title('适应度进化曲线')

 

http://www.lryc.cn/news/44011.html

相关文章:

  • 山东首版次申报的材料
  • 个人时间管理网站—首页的前端实现【源码】
  • Python毕业设计推荐
  • 使用nodemon时报错:“无法加载文件...,因为在此系统上禁止运行脚本“;windows执行策略修改
  • 网络协议分析期末复习(五)
  • 外贸找客户软件:Yellow Page Spider 8.7.1 Crack
  • 博客管理系统(前端页面设计)
  • 安装yolov5环境
  • IP 归属地查询 API 教你从0到1顺着网线找到键盘侠
  • 【K8S系列】深入解析Pod对象(二)
  • 从3千到3万,我的测试之路真的坎坷
  • linux下使用system函数在程序中运行linux的shell命令
  • 银行数字化转型导师坚鹏:银行业发展趋势及对人才的需求分析
  • NFS挂载
  • IDEA使用技巧
  • 自动化测试之一【接口测试总结】
  • 科大奥瑞物理实验——傅里叶光学
  • mysql count(*)的性能如何?
  • gan实战(基础GAN、DCGAN)
  • 使用C语言实现服务器/客户端的TCP通信
  • AI模型训练推理一定要知道的事情
  • SPSS27破解安装后,出现应用程序无法正常启动(0xc000007b)
  • 央企程序员写了重大bug,会造成用户个人信息泄露,领导已经知道了,需要赶紧跑路吗?...
  • day14—选择题
  • 翻转链表(力扣刷题)
  • JavaEE——锁相关
  • C语言指针与数组 进阶
  • Java连接SqlServer错误
  • Elastic 可观察性 - 适用于当今 “永远在线” 世界的解决方案
  • Temu病毒式营销,如何在大红利时期快人一步?