|
楼主 |
发表于 2017-1-22 16:50:53
|
显示全部楼层
clc
clear all;
close all;
c1 = 1.49455;
c2 = 1.49455;
maxg = 200;
sizepop = 20;
%初始速度和种群上下边界
Vmax=1;
Vmin=-1;
popmax=5;
popmin=-5;
%产生粒子和速度
for i=1:sizepop
%随机产生一个种群
pop(i,:)=5*rands(1,2);%i是第行矩阵,列数待定。rands(1,2)产生一行两列。% 初始化种群
V(i,:)=rands(1,2);%初始化速度
%计算适应度
fitness(i)=fun(pop(i,:)); %粒子的适应度值
end
%找最好的粒子
[bestfitness bestindex]=min(fitness);%min返回两个数值 一个是数值最小的 一个是这个最小数值的位置
zbest = pop(bestindex, :);%全局最优x1与x2值
gbest=pop;%个体最优x1与x2值
fitnessgbest = fitness; %个体最佳适应度
fitnesszbest=bestfitness; %全局最佳适应度值
%%迭代寻优
for i=1:maxg
for j=1:sizepop
%速度更新
V(j, :) = V(j, :) +c1*rand*(gbest(j, :) - pop(j, :)) + c2*rand*(zbest - pop(j, :));
V(j,find(V(j,:)>Vmax)) =Vmax;% 如果X是一个逻辑表达式,则返回一个逻辑数组,一般如果存在满足要求的元素,则返回一个单位列向量
V(j,find(V(j,:)<Vmin)) =Vmin;
%种群更新
pop(j,:) = pop(j,:) +0.5*V(j,:);
pop(j, find(pop(j,:)>popmax)) = popmax;
pop(j, find(pop(j,:)<popmin)) = popmin;
%自适应变异
if rand<0.8
k = ceil(2*rand);%ceil取整
pop(j,k) = rand;
end
%适应度值
fitness(j)=fun(pop(j,:));
%个体最优更新
if fitness(j) < fitnessgbest(j)
gbest(j,:) = pop(j,:);
fitnessgbest(j) = fitness(j);
end
%群体最优更新
if fitness(j) < fitnesszbest
zbest(j,:) = pop(j,:);
fitnesszbest= fitness(j);
end
end
yy(i) = fitnesszbest;%保存每一代最优个体
end
%%结果分析
plot(yy,'linewidth',2)
title(['适应度曲线 ' '终止代数= ' num2str(maxg)]);
grid on
xlabel('进化代数'); ylabel(' 适应度');
%输出结果
zbest |
|