MATLAB绘制出权值wv和阀值bv确定的误差曲面

源代码在线查看: matlab 简单蚁群算法求解tsp.txt

软件大小: 56 K
上传用户: dxhh
关键词: MATLAB 绘制 误差
下载地址: 免注册下载 普通下载 VIP

相关代码

				简单蚁群算法求解TSP的源程序2006年12月09日 星期六 20:52 
				
				蚁群算法是新兴的仿生算法,最初是由意大利学者Dorigo M于1991年首次提出,由于具有较强的鲁棒性,优良的分布式计算机制和易于与其它方法结合等优点,成为人工智能领域的一个研究热点。本程序是实现简单的蚁群算法,TSP问题取的是att48,可从http://www.iwr.uni-heidelberg.de/groups/comopt/software/TSPLIB95获取,程序运行时间可能会比较长,在我的这台CPU 1.6G+内存256M的机器上运行时间大概是13分钟左右。我用的语言是MATLAB 7.1。此程序仅供学习所用,如有问题请反馈。谢谢。(注:程序没有计算最后一个城市回来起点城市的距离)
				
				function [y,val]=QACS
				tic
				load att48 att48;
				MAXIT=300;       % 最大循环次数
				NC=48;           % 城市个数
				tao=ones(48,48);% 初始时刻各边上的信息最为1
				rho=0.2;         % 挥发系数
				alpha=1;
				beta=2;
				Q=100;
				mant=20;         % 蚂蚁数量
				iter=0;          % 记录迭代次数
				for i=1:NC       % 计算各城市间的距离
				    for j=1:NC
				        distance(i,j)=sqrt((att48(i,2)-att48(j,2))^2+(att48(i,3)-att48(j,3))^2);
				    end
				end
				bestroute=zeros(1,48);  % 用来记录最优路径
				routelength=inf;        % 用来记录当前找到的最优路径长度
				% for i=1:mant          % 确定各蚂蚁初始的位置
				% end
				for ite=1:MAXIT
				    for ka=1:mant       %考查第K只蚂蚁
				        deltatao=zeros(48,48); % 第K只蚂蚁移动前各边上的信息增量为零
				        [routek,lengthk]=travel(distance,tao,alpha,beta);
				        if lengthk				            routelength=lengthk;
				            bestroute=routek;
				        end
				        for i=1:NC-1      % 第K只蚂蚁在路径上释放的信息量
				            deltatao(routek(i),routek(i+1))=deltatao(routek(i),routek(i+1))+Q/lengthk;
				        end
				        deltatao(routek(48),1)=deltatao(routek(48),1)+Q/lengthk;
				    end
				    for i=1:NC-1
				        for j=i+1:NC
				            if deltatao(i,j)==0
				                deltatao(i,j)=deltatao(j,i);
				            end
				        end
				    end
				    tao=(1-rho).*tao+deltatao;
				end
				y=bestroute;
				val=routelength;
				toc
				
				 
				
				function [y,val]=travel(distance,tao,alpha,beta)   % 某只蚂蚁找到的某条路径
				[m,n]=size(distance);
				p=fix(m*rand)+1;
				val=0;        % 初始路径长度设为 0
				tabuk=[p];    % 假设该蚂蚁都是从第 p 个城市出发的
				for i=1:m-1
				    np=tabuk(length(tabuk));  % 蚂蚁当前所在的城市号
				    p_sum=0;
				    for j=1:m
				        if isin(j,tabuk)
				            continue;
				        else
				            ada=1/distance(np,j);
				            p_sum=p_sum+tao(np,j)^alpha*ada^beta;
				        end
				    end
				    cp=zeros(1,m);  % 转移概率
				    for j=1:m
				        if isin(j,tabuk)
				            continue;
				        else
				            ada=1/distance(np,j);
				            cp(j)=tao(np,j)^alpha*ada^beta/p_sum;
				        end
				    end
				    NextCity=pchoice(cp);
				    tabuk=[tabuk,NextCity];
				    val=val+distance(np,NextCity);
				end
				y=tabuk;
				
				 
				
				function y=isin(x,A)     % 判断数 x 是否在向量 A 中,如在返回 1 ,否则返回 0
				y=0;
				for i=1:length(A)
				    if A(i)==x
				        y=1;
				        break;
				    end
				end
				
				 
				
				function y=pchoice(A)
				a=rand;
				tempA=zeros(1,length(A)+1);
				for i=1:length(A)
				    tempA(i+1)=tempA(i)+A(i);
				end
				for i=2:length(tempA)
				    if a				        y=i-1;
				        break;
				    end
				end
				
				 
							

相关资源