📄 ccd.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 + -