⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 新建 文本文档 (2).txt

📁 在《蚁群算法原理及其应用》段海滨那本书的基础上改进的代码
💻 TXT
字号:
function [bestSolution,bestRoute]=ACA8(filePath,numOfAnts,initao,alpha,beta,Q,rou,NCmax)
% Basic Ant Colony Algorithm for TSP Matlab Version
% Rewrite by Hzsong(hzsong123@126.com),2008.01.04
% 《蚁群算法原理及其应用》段海滨,P36,P426
% numOfAnts:蚂蚁个数
% initao:有向图上每条边的初始化信息量
% alpha:信息启发因子,表示轨迹的相对重要性,反映了蚂蚁在运动过程中所积累的信息在蚂蚁运动时所起的作用,
%        其值越大,则该蚂蚁越倾向于选择其他蚂蚁经过的路径,蚂蚁之间协作性越强。
% beta:期望启发式因子,表示能见度的相对重要性,反映了蚂蚁在运动过程中启发信息在蚂蚁选择路径中受重视程度,
%       其值越大,则该状态转移概率越接近于贪心规则。
% Q:表示信息素强度,它在一定程序上影响算法的收敛速度。
% rou:信息素挥发系数,1-rou:信息残留因子。rou取[0,1)。
% NCmax:最大迭代次数
% Demo1——
%                              filePath numOfAnts initao alpha beta Q  rou NCmax
% [bestSolution,bestRoute]=ACA8(  '',     20,     0.1,   1.0, 5.0,500,0.4,4000);
%      ——[bestSolution,bestRoute]=ACA8('ulysses16-tsp.txt',10,0.1,1.0,5.0,150,0.2,80)
% Demo2:
% for i=1:10
% figure;
% ACA('ulysses16-tsp.txt',10,0.1,1.0,5.0,500,0.6,80);
% end
% % % % % % % % 初始化阶段 % % % % % % % %
% A0:城市坐标参数     numOfCitys:城市个数
close all;clc;tic;
if isempty(filePath)
    filePath='E:\hzs\MatlabProgram\ACA\TSP\TSP\mat\att48.mat';
end
if exist(filePath,'file')
    load(filePath);% bestSolution,bestRoute,cityPos,description
    numOfCitys=size(cityPos,2);
else
    [filePath,cityPos,numOfCitys]=openCityFile;
end

% 为了计算最优路线的信息量而添加的语句,可删。
bestRoute0=bestRoute;totalTaos0=zeros(1,NCmax);
totalTaos=zeros(1,NCmax);




x=cityPos(2,:); % 得到X-坐标
y=cityPos(3,:); % 得到Y-坐标
% 利用文件中的数据来确定蚂蚁个数和Q值
Q=0;numOfAdd=0;
numOfAnts=numOfCitys/2;
% 距离矩阵
for i=1:numOfCitys-1
    for j=i+1:numOfCitys
        distance(i,j)=sqrt((x(i)-x(j))^2+(y(i)-y(j))^2);
        distance(j,i)=sqrt((x(j)-x(i))^2+(y(j)-y(i))^2);
        Q=Q+distance(i,j);numOfAdd=numOfAdd+1;
    end
end
Q=Q/numOfAdd;
% (1)将m只蚂蚁放在n个城市里.g(NC,k)的值表示第NC次迭代时,第k只蚂蚁所在城市的序号
for NC=1:NCmax
    for k=1:numOfAnts
        g(NC,k)=fix((numOfCitys-1)*rand(1))+1;
    end
end

tao=zeros(numOfCitys,numOfCitys);%有向图上每条边的初始化信息量
yita=zeros(numOfCitys,numOfCitys);%启发函数,表示蚂蚁从城市i转移到城市j的期望程度
for i=1:numOfCitys
    for j=1:numOfCitys
        if j~=i %不在矩阵对角线时
            tao(i,j)=initao;%(1)令有向图上每条边的初始化信息量tao(i,j)为常数
            yita(i,j)=1/distance(i,j);
        end
    end
end
% initao=initao.*ones(numOfCitys,numOfCitys);%(1)令有向图上每条边的初始化信息量tao(i,j)为常数

bestSolution=1000000000;% 最优解
bestSolutions=zeros(1,NCmax);
selectNum=3;
% solutionsSelected=zeros(NCmax,3);%最优解,次优解,次次优解
% 如果有上一次的计算值,接着计算
if exist('d:\1\result.mat','file')
    load('d:\1\result.mat');% to get tao & bestSolution
end
% % % % % % % % 蚂蚁建立路线阶段 % % % % % % % %
for NC=1:NCmax
    detatao=zeros(numOfCitys,numOfCitys);%初始时刻信息量增量detatao(i,j)=0;
    if mod(NC,10)==0
        disp([num2str(NC),' of ',num2str(NCmax)]);
    end
    % 禁忌表tabu:0表示可以转移,1表示不可转移
    tabu=zeros(numOfAnts,numOfCitys); % 在每一次循环时清空禁忌表
    route=zeros(numOfAnts,numOfCitys);% route:numOfAnts*(numOfCitys-1)的矩阵:route(k,t)表示蚂蚁k第s次经过的城市标号
    route(:,1)=(g(NC,:))';% 每只蚂蚁出发时所在的城市标号
    solution=zeros(1,numOfAnts);
    for k=1:numOfAnts % 第k只蚂蚁
        tabu(k,g(NC,k))=1;
        maxp=zeros(1,numOfCitys); % maxp:1*n的矩阵,用来记录每一次迭代第k只蚂蚁状态转移概率的最大值
        % 公式2.4.3 计算第k只蚂蚁从选择的第s个城市route(k,t+1)到城市1-n的状态转移概率
        currentCity=route(k,1);% 蚂蚁当前所在的城市标号
        for t=1:numOfCitys-1 % 遍历时间
            maxp(t)=0;
            % 从城市route(k,t+1)到城市j(1,2,...numOfCitys)
            for j=1:numOfCitys
                if tabu(k,j)==0 % 蚂蚁k可以转移到城市j
                    pTJ(t,j)=(tao(currentCity,j)^alpha).*(yita(currentCity,j)^beta);
                else
                    pTJ(t,j)=0;
                end
            end
            %             maxp(t)=max(pTJ(t,:));
            %             maxpFlag=find(pTJ(t,:)==maxp(t));
            %             nextCity=maxpFlag(1);% 找到蚂蚁k下一个要去的城市标号

            % 查看pTJ的大小情况,可删除
            pT=pTJ(t,:);
%             if sum(pT)<0.0000001
%                 pT(1:4)*10000000
%             end
            pT=pT/sum(pT);
            [result1,index1]=sort(pT,2,'descend');
            selectRate=rand(1,2).*result1(1:2);
            if selectRate(1)>selectRate(2)
                nextCity=index1(1);
            else
                nextCity=index1(2);
            end
            solution_medium(k,t)=distance(currentCity,nextCity);
            route(k,t+1)=nextCity;
            tabu(k,nextCity)=1;
            tao(currentCity,nextCity)=...
                (1-rou)*tao(currentCity,nextCity)+rou*Q/distance(currentCity,nextCity);
            tao(nextCity,currentCity)=...
                (1-rou)*tao(nextCity,currentCity)+rou*Q/distance(nextCity,currentCity);
            solution(k)=solution(k)+solution_medium(k,t);
            %             disp([num2str(currentCity),'-->',num2str(nextCity)]);
            currentCity=nextCity;% 为下一次循环准备
        end %'for t=2:numOfCitys-1'循环结束

        % 当s=n的时候,终点--->起点
        nextCity=route(k,1); % 返回起点
        solution_medium(k,numOfCitys)=distance(currentCity,nextCity);
        tao(currentCity,nextCity)=...
            (1-rou)*tao(currentCity,nextCity)+rou*Q/distance(currentCity,nextCity);
        tao(nextCity,currentCity)=...
            (1-rou)*tao(nextCity,currentCity)+rou*Q/distance(nextCity,currentCity);

        solution(k)=solution(k)+solution_medium(k,numOfCitys);
        solution_NC(NC,k)=solution(k);
    end %'for k=1:numOfAnts'循环结束
 

%=====================第2部分=================
% % % % % % % % 全局更新阶段 % % % % % % % %
    % 公式2.4.6
    [result,index]=sort(solution_NC(NC,:));
    for i=1:selectNum
        for t=1:numOfCitys-1
            detatao(route(index(i),t),route(index(i),t+1))=...
                detatao(route(index(i),t),route(index(i),t+1))+Q*numOfCitys/solution(index(i));
            detatao(route(index(i),t+1),route(index(i),t))=...
                detatao(route(index(i),t+1),route(index(i),t))+Q*numOfCitys/solution(index(i));
        end
        detatao(route(index(i),numOfCitys),route(index(i),1))=...
            detatao(route(index(i),numOfCitys),route(index(i),1))+Q*numOfCitys/solution(index(i));
        detatao(route(index(i),1),route(index(i),numOfCitys))=...
            detatao(route(index(i),1),route(index(i),numOfCitys))+Q*numOfCitys/solution(index(i));
    end % 'for i=1:bb'循环结束
    % 公式2.4.5
    tao=(1-rou)*tao+rou*detatao;
    %     for i=1:numOfCitys-1
    %         for j=i+1:numOfCitys
    %             tao(i,j)=(1-rou)*tao(i,j)+rou*detatao(i,j);
    %             tao(j,i)=(1-rou)*tao(j,i)+rou*detatao(j,i);
    %         end
    %     end
    % 更新最优解和最优路径
    if bestSolution>solution_NC(NC,index(1))
        bestSolution=solution_NC(NC,index(1));
        bestRoute=route(index(1),:);
    end
    bestSolutions(NC)=bestSolution;
    % 计算最优路线的信息量而添加的语句,可删。
    bestRoute1=bestRoute;
    totalTao0=tao(bestRoute0(numOfCitys),bestRoute0(1));
    totalTao1=tao(bestRoute1(numOfCitys),bestRoute1(1));
    for i=1:numOfCitys-1
        totalTao0=totalTao0+tao(bestRoute0(i),bestRoute0(i+1));
        totalTao1=totalTao1+tao(bestRoute1(i),bestRoute1(i+1));
    end
    totalTaos0(NC)=totalTao0;
    totalTaos1(NC)=totalTao1;

    % 计算最优路线的信息量而添加的语句,可删。
    %     initao=tao;
end % 'for NC=1:NCmax'循环结束
save('d:\1\result.mat','tao','bestSolution','bestRoute');

% % % % % % % % 输出TSP问题的迭代结果 % % % % % % % %
% bestRoute=bestRoute_NC(bestSolutionFlag,:);
figure(1);
strTitle=['第',num2str(NCmax),'次迭代的最优解为:',num2str(bestSolution)];
strColor='rgb';
dispASAResult(bestRoute,x,y,strTitle,strColor,tao);
saveas(gcf,'d:\1\1','emf');
% % % % % % % % 输出TSP问题的最优结果 % % % % % % % %
if exist(filePath,'file')
    load(filePath);% bestSolution,bestRoute,cityPos,description
    if ~isempty(bestRoute)
        figure(2);
        strTitle=['系统的最优解为:',num2str(bestSolution)];
        strColor='ymc';
        dispASAResult(bestRoute,x,y,strTitle,strColor,tao);
        saveas(gcf,'d:\1\2','emf');
    end
end
% 计算最优路线的信息量而添加的语句,可删。
figure(3);
plot(totalTaos0,'r');
hold on;
plot(totalTaos1,'g');
legend('最优值路线上的信息总量','每一步迭代时的信息总量');
xlabel('迭代次数');ylabel('信息总量');
title('信息总量');
hold off;
saveas(gcf,'d:\1\3','emf');
figure(4);
plot(bestSolutions);title('每一次迭代最优解的变化');
saveas(gcf,'d:\1\4','emf');
toc % end of programe


% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
% % % % % % % % % % % % % %自己写的函数 % % % % % % % % % % % % % % % %
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
% RGB Value   Short Name  Long Name
%  [1 1 0]        y         yellow
%  [1 0 1]        m         magenta
%  [0 1 1]        c         cyan
%  [1 0 0]        r         red
%  [0 1 0]        g         green
%  [0 0 1]        b         blue
%  [1 1 1]        w         white
%  [0 0 0]        k         black
function dispASAResult(bestRoute,x,y,strTitle,strColor,tao) % 根据最优路线,和城市坐标画出ACA计算结果
% bestRoute:最优路线
% cityPos:城市坐标
% strTitle:Figure名字
set(gcf,'units','normalize','position',[0.1 0.1 0.8 0.75]);
set(gca,'position',[0.05 0.05 0.9 0.9]);
hold on;
numOfCitys=length(x);
try
    lineColors=strColor;
catch
    lineColors='rgb';
end
for j=1:numOfCitys-1
    % 画线
    lineColor=lineColors(mod(j-1,3)+1);
    line([x(bestRoute(j)),x(bestRoute(j+1))],[y(bestRoute(j)),y(bestRoute(j+1))],'color',lineColor);
    % 画城市
    plot(x(bestRoute(j)),y(bestRoute(j)),'marker','o','markersize',12);
    text(x(bestRoute(j)),y(bestRoute(j)),num2str(bestRoute(j)));
    % 画信息量
    strTemp=num2str(tao(bestRoute(j),bestRoute(j+1)));
    indexOfDot=find(strTemp=='.');
    text((x(bestRoute(j))+x(bestRoute(j+1)))/2,...
        (y(bestRoute(j))+y(bestRoute(j+1)))/2,...
        strTemp(1:indexOfDot+1)   );
end
% 画线
lineColor=lineColors(mod(numOfCitys-1,3)+1);
line([x(bestRoute(numOfCitys)),x(bestRoute(1))],[y(bestRoute(numOfCitys)),y(bestRoute(1))],'color',lineColor);
% 画城市
plot(x(bestRoute(numOfCitys)),y(bestRoute(numOfCitys)),'marker','o','markersize',12);
text(x(bestRoute(numOfCitys)),y(bestRoute(numOfCitys)),num2str(bestRoute(numOfCitys)));
% 画信息量
strTemp=num2str(tao(bestRoute(numOfCitys),bestRoute(1)));
indexOfDot=find(strTemp=='.');
text((x(bestRoute(numOfCitys))+x(bestRoute(1)))/2,...
     (y(bestRoute(numOfCitys))+y(bestRoute(1)))/2,...
     strTemp(1:indexOfDot+1)   );
% 画起点
plot(x(bestRoute(1)),y(bestRoute(1)),'color','r','marker','s','markersize',10);
% 画终点
plot(x(bestRoute(numOfCitys)),y(bestRoute(numOfCitys)),'color','r','marker','d','markersize',10);
grid on;
xlabel('X-坐标');
ylabel('Y-坐标');
title(strTitle);
hold off;

% 函数:打开和导入TSP问题城市坐标文件
function [filePath,cityPos,numOfCitys]=openCityFile
[fname,pname,filterindex]=uigetfile('*.*','所有文件(*.*)');
filePath=[pname,fname];
fid=fopen(filePath,'r');
if fid==-1
    warndlg('不能打开文件','警告');
    fclose(fid);
    return;
end
[A0,COUNT]=fscanf(fid,' %g');
numOfCitys=COUNT/3;
fclose(fid);
cityPos=reshape(A0,3,numOfCitys);% 得到TSP问题中的城市坐标
indexOfDot=find(filePath=='.');
if isempty(indexOfDot)
    filePath=[filePath,'-my'];
else
    filePath=[filePath(1:indexOfDot-1),'-my',filePath(indexOfDot:end)];
end
% if exist(filePath)
fidmy=fopen(filePath,'wt');
fprintf(fidmy,'%5i%8.2f%8.2f\numOfCitys',cityPos);
fclose(fidmy);
% disp('文件写入完毕');



att48.mat里面的内容:
bestRoute,1*48的矩阵,最优路径
bestSolution,最优路径值
cityPos,3*48的矩阵,城市编号、X坐标、Y坐标

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -