ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

蚁群算法的优化计算

2019-09-06 11:17:34  阅读:339  来源: 互联网

标签:end 蚁群 Route Length iter 算法 citys 优化 shortest


%%清空环境变量
clear all
clc
%%导入数据
load citys_data.mat
%%计算城市间相互距离
n = size(citys,1);
D = zeros(n,n);
%计算城市两两之间的距离
for i =1:n
    for j =1:n
        if i~=j
            D(i,j)=sqrt(sum( ( citys(i,:) - citys(j,:) ).^2 ));
        else
            D(i,j)= 1e-4;
        end
    end
end
%%初始化参数
m = 31;%蚂蚁
alpha =1;%信息素重要程度因子
beta = 5;%启发函数重要程度因子
rho = 0.1;%信息素挥发因子
Q=1;%常系数
Eta = 1./D;%启发函数
Tau = ones(n,n);%信息素矩阵
Table = zeros(m,n); %路径记录表
iter =1;
iter_max = 200; %最大迭代次数
route_best = zeros(iter_max,n);%各代最佳路径
length_best = zeros(iter_max,1);%各代最佳路径的长度
length_ave = zeros(iter_max,1);%各代最佳路径的平均长度
%%迭代寻找最优路径
while iter<=iter_max
    %随机产生各个蚂蚁的起点城市
    start = zeros(m,1);
    for i =1:m
        temp = randperm(n);%随机生成了一个路径
        start(i) = temp(1);%生成路径的起点
    end
    Table(:,1)=start;
    %构建解空间
    city_index = 1:n;
    %逐个蚂蚁路径选择
    for i =1:m
        %逐个城市选择
        for j= 2:n
            tabu = Table(i,1:(j-1));%已访问的城市集合(禁忌表)
            allow_index = ~ismember(city_index,tabu);
            allow = city_index(allow_index);%待访问的城市集合
            P = allow;
            %计算城市转移概率
            for k = 1:length(allow)
                P(k) = Tau(tabu(end),allow(k))^alpha*Eta(tabu(end),allow(k))^beta;
            end
            P = P/sum(P);
            %使用轮盘赌方法选择下一个访问城市
            Pc =cumsum(P);
            target_index = find(Pc>=rand);
            target = allow(target_index(1));
            Table(i,j) = target;
        end
    end
    %计算各个蚂蚁的路径距离
    Length = zeros(m,1);
    for i = 1:m
        Route = Table(i,:);
        for j= 1:(n-1)
            Length(i)=Length(i)+D(Route(j),Route(j+1));
        end
        Length(i) = Length(i)+D(Route(n),Route(1));
    end
    %计算最短路径与平均距离
    if iter ==1
        [min_Length,min_index] = min(Length);
        Length_best(iter) = min_Length;
        Length_ave(iter) = mean(Length);
        Route_best(iter,:) = Table(min_index,:);
    else
        [min_Length,min_index] = min(Length);
        Length_best(iter) = min(Length_best(iter-1),min_Length);
        Length_ave(iter) = mean(Length);
        if Length_best(iter) == min_Length
            Route_best(iter,:) = Table(min_index,:);
        else
            Route_best(iter,:)=Route_best((iter-1),:);
        end
    end
    %更新信息素
    Delta_Tau = zeros(n,n);
    for i=1:m
        %逐个城市计算
        for j=1:(n-1)
            Delta_Tau(Table(i,j),Table(i,j+1)) = Delta_Tau(Table(i,j),Table(i,j+1))+Q/Length(i); 
        end
        Delta_Tau(Table(i,n),Table(i,1)) = Delta_Tau(Table(i,n),Table(i,1))+Q/Length(i);
    end
    Tau = (1-rho)*Tau+Delta_Tau;
    %迭代次数加1,清空历史记录
    iter = iter+1;
    Table = zeros(m,n);
end
%% 结果显示
[shortest_length,index] = min(Length_best);
shortest_Route = Route_best(index,:);
disp(['最短距离:' num2str(shortest_length)]);
disp(['最短路径:' num2str([shortest_Route shortest_Route(1)])]);

%% 绘图
figure(1)
plot([citys(shortest_Route,1);citys(shortest_Route(1),1)],...
    [ citys(shortest_Route,2);citys(shortest_Route(1),2) ],'o-')
grid on
for i = 1:size(citys,1)
    text(citys(i,1),citys(i,2),[' ' num2str(i)]);
end
text(citys(shortest_Route(1),1),citys(shortest_Route(1),2),'起点')
text(citys(shortest_Route(end),1),citys(shortest_Route(end),2),'起点')
xlabel('城市位置横坐标')
ylabel('城市位置纵坐标')
title(['蚁群算法优化路径(最短距离:' num2str(shortest_length) ')'])

figure(2)
plot(1:iter_max,Length_best,'b',1:iter_max,Length_ave,'r')
legend('最短距离','平均距离')

  内容参考  matlab 智能计算30个案例分析

标签:end,蚁群,Route,Length,iter,算法,citys,优化,shortest
来源: https://www.cnblogs.com/wupenghao95/p/11472576.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有