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

📄 ccd.m

📁 该程序是基于MATLAB环境的pso实现tsp问题
💻 M
字号:
flag=0;		%停止程序标志
oldbestval=0;	%记录旧的适应度值	
samecounter=0; 	%记录得到相同适应度值的迭代次数
iteration = 0;	%迭代次数
MaxIter =2000;  	%最大迭代次数
PopSize=200;     	%种群大小
alpha=0.8;	%概率
beta=0.4;
w=0.4;
%NDim = 14;
NDim = 31;
population = ones(NDim,PopSize);		 %初始化各粒子,即产生路径种群
for i=1:PopSize
    population(:,i)=randperm(NDim)';
end
population=BeginWith1(population);	 %以1为起点重排每个路径
%node=[16.47 96.10; 16.47 94.44; 20.09 92.54; 22.39 93.37; 25.23 97.24;...
      %22.00 96.05; 20.47 97.02; 17.20 96.29; 16.30 97.38; 14.05 98.12;...
      %16.53 97.38; 21.52 95.59; 19.41 97.13; 20.09 94.55];	%节点坐标
node=[1304  2312; 3639  1315; 4177  2244; 3712  1399; 3488  1535;...
      3326  1556; 3238  1229; 4196  1004; 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  2367;3394  2643;...
      3439  3201;2935  3240;3140  3550;2545  2357;2778  2826;2370  2975];  
  
nodeDistance=zeros(NDim,NDim);		 %计算每个城市之间的距离
for i=1:NDim
    for j=1:NDim
        nodeDistance(i,j)=sqrt((node(i,1)-node(j,1))^2+(node(i,2)-node(j,2))^2);
    end
end
fvalue=zeros(1,200);
for i = 1:PopSize			%计算各路径的距离
        fvalue(i) = wholeDistance(population(:,i)',nodeDistance);
end

velocity =zeros(NDim,PopSize);  		%产生交换序
for i=1:PopSize
    velocity(:,i)=round(rand(1,NDim)'*NDim);
end


pbest = population;   		%记录各粒子的个体极值点位置,即个体找到的最短路径
fpbest = fvalue;      		%记录最佳适应度值,即个体找到的最短路径的长度
[fbestval,index] = min(fvalue);    	% 找出全局极值和相应的序号 




while(flag == 0) && (iteration < MaxIter)	%寻找最优主程序
    iteration = iteration +1;		%迭代次数递增
    
    for i=1:PopSize			%更新全局极值点位置,这里指路径
        gbest(1:31,i) = population(:,index);%00000000000000
    end
         
    pid_xid=ExchangeIndex(population,pbest);		%求pid-xid ,pgd-xid交换序
    pid_xid=HoldByAlpha(pid_xid,alpha); 		%以概率alpha保留交换序
    pgd_xid=ExchangeIndex(population,gbest);
    pgd_xid=HoldByAlpha(pgd_xid,beta);
    
    velocity=HoldByAlpha(velocity,w);		%以概率w保留交换序

    population = changeIndex(population,velocity);	%根据交换序进行路径交换
    population = changeIndex(population,pid_xid);
    population = changeIndex(population,pgd_xid);
    
    
    
    
    for i = 1:PopSize			% 更新各路径距离
          fvalue(i) = wholeDistance(population(:,i)',nodeDistance);
    end

    changeColumns = fvalue <fpbest;	% 更新后的距离优于更新前的,记录序号
    pbest(:, find(changeColumns)) = population(:, find(changeColumns));    % 更新个体最佳路径
    fpbest = fpbest.*( ~changeColumns) + fvalue.*changeColumns;          %更新个体最佳路径距离
    [fbestval, index] = min(fvalue); 	%更新全局最佳路径,记录相应的序号

    if fbestval==oldbestval		%比较更新前和更新后的适应度值;
        samecounter=samecounter+1;	%相等时记录加一;
    else
        oldbestval=fbestval;		 %不相等时更新适应度值,并记录清零;
        samecounter=0;
    end
    
    
    
    if samecounter >= 20		%多次迭代的适应度值相近时程序停止
        flag=1;
    end

     Best(iteration) =fbestval;		% 输出及描出找到的全局极值
	
end


figure
plot(fvalue,'o')

for k=1:31
    H(k,1:2)=node(population(k,1),1:2);
end
H(32,:)=[1304 2312];
plot(H(:,1),H(:,2))

⌨️ 快捷键说明

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