欢迎访问 GreenSim 团队主页→http://blog.sina.com.cn/greensim 邮箱:greensim@163.com
遗传算法改进的模糊 C-均值聚类 MATLAB 源代码
模糊 C-均值算法容易收敛于局部极小点,为了克服该缺点,将遗传算法应
用于模糊 C-均值算法(FCM)的优化计算中,由遗传算法得到初始聚类中心,再使
用标准的模糊 C-均值聚类算法得到最终的分类结果。
迭代次数
种群规模,要求是偶数
变异概率
决策变量的下界,M×1 的向量
决策变量的上界,M×1 的向量
原始样本数据,n×p 的矩阵
分类个数
模糊 C 均值聚类数学模型中的指数
function [BESTX,BESTY,ALLX,ALLY]=GAFCM(K,N,Pm,LB,UB,D,c,m)
%% 此函数实现遗传算法,用于模糊 C-均值聚类
% GreenSim 团队——专业级算法设计&代写程序
% 欢迎访问 GreenSim 团队主页→http://blog.sina.com.cn/greensim
%% 输入参数列表
% K
% N
% Pm
% LB
% UB
% D
% c
% m
%% 输出参数列表
% BESTX
% BESTY
% ALLX
% ALLY
%% 第一步:
M=length(LB);%决策变量的个数
%种群初始化,每一列是一个样本
farm=zeros(M,N);
for i=1:M
K×1 细胞结构,每一个元素是 M×1 向量,记录每一代的最优个体
K×1 矩阵,记录每一代的最优个体的评价函数值
K×1 细胞结构,每一个元素是 M×N 矩阵,记录全部个体
K×N 矩阵,记录全部个体的评价函数值
x=unifrnd(LB(i),UB(i),1,N);
farm(i,:)=x;
end
%输出变量初始化
ALLX=cell(K,1);%细胞结构,每一个元素是 M×N 矩阵,记录每一代的个体
ALLY=zeros(K,N);%K×N 矩阵,记录每一代评价函数值
BESTX=cell(K,1);%细胞结构,每一个元素是 M×1 向量,记录每一代的最优个体
BESTY=zeros(K,1);%K×1 矩阵,记录每一代的最优个体的评价函数值
k=1;%迭代计数器初始化
%% 第二步:迭代过程
while k<=K
%% 以下是交叉过程
newfarm=zeros(M,2*N);
Ser=randperm(N);%两两随机配对的配对表
第 1页
欢迎访问 GreenSim 团队主页→http://blog.sina.com.cn/greensim 邮箱:greensim@163.com
A=farm(:,Ser(1));
B=farm(:,Ser(2));
P0=unidrnd(M-1);
a=[A(1:P0,:);B((P0+1):end,:)];%产生子代 a
b=[B(1:P0,:);A((P0+1):end,:)];%产生子代 b
newfarm(:,2*N-1)=a;%加入子代种群
newfarm(:,2*N)=b;
for i=1:(N-1)
A=farm(:,Ser(i));
B=farm(:,Ser(i+1));
P0=unidrnd(M-1);
a=[A(1:P0,:);B((P0+1):end,:)];
b=[B(1:P0,:);A((P0+1):end,:)];
newfarm(:,2*i-1)=a;
newfarm(:,2*i)=b;
end
FARM=[farm,newfarm];
%% 选择复制
SER=randperm(3*N);
FITNESS=zeros(1,3*N);
fitness=zeros(1,N);
for i=1:(3*N)
Beta=FARM(:,i);
FITNESS(i)=FIT(Beta,D,c,m);
end
for i=1:N
f1=FITNESS(SER(3*i-2));
f2=FITNESS(SER(3*i-1));
f3=FITNESS(SER(3*i));
if f1<=f2&&f1<=f3
farm(:,i)=FARM(:,SER(3*i-2));
fitness(:,i)=FITNESS(:,SER(3*i-2));
elseif f2<=f1&&f2<=f3
farm(:,i)=FARM(:,SER(3*i-1));
fitness(:,i)=FITNESS(:,SER(3*i-1));
else
end
farm(:,i)=FARM(:,SER(3*i));
fitness(:,i)=FITNESS(:,SER(3*i));
end
%% 记录最佳个体和收敛曲线
X=farm;
Y=fitness;
ALLX{k}=X;
第 2页
欢迎访问 GreenSim 团队主页→http://blog.sina.com.cn/greensim 邮箱:greensim@163.com
ALLY(k,:)=Y;
minY=min(Y);
pos=find(Y==minY);
BESTX{k}=X(:,pos(1));
BESTY(k)=minY;
%% 变异
for i=1:N
if Pm>rand&&pos(1)~=i
AA=farm(:,i);
BB=GaussMutation(AA,LB,UB);
farm(:,i)=BB;
end
end
disp(k);
k=k+1;
end
%% 绘图
BESTY2=BESTY;
BESTX2=BESTX;
for k=1:K
TempY=BESTY(1:k);
minTempY=min(TempY);
posY=find(TempY==minTempY);
BESTY2(k)=minTempY;
BESTX2{k}=BESTX{posY(1)};
end
BESTY=BESTY2;
BESTX=BESTX2;
plot(BESTY,'-ko','MarkerEdgeColor','k','MarkerFaceColor','k','MarkerSize',2)
ylabel('函数值')
xlabel('迭代次数')
第 3页