基于遗传算法2,得到了所有粒子的cost都一样,不知道问题出在哪?
clc;
clear;
close all;
%% 问题定义
CostFunction=@(x) costfunction(x); % 测试函数
nVar=3; % 决策变量个数
VarSize=[1 nVar]; % 决策变量矩阵规模
VarMin=[3e-3 25 45]; % 下限
VarMax=[5e-3 35 55]; % 上限
% 目标个数
nObj=numel(CostFunction(unifrnd(VarMin,VarMax,VarSize)));
%% NSGA-II 参数设置
MaxIt=150; % 最大迭代数
nPop=100; % 种群大小
pCrossover=0.7; % 交叉率
nCrossover=2*round(pCrossover*nPop/2); % 子代个数
pMutation=0.4; % 变异率
nMutation=round(pMutation*nPop); % 变异数量
mu=0.02; % 突变概率
sigma=0.1*(VarMax-VarMin); % 突变步长
%% 初始化
empty_individual.Position=[];
empty_individual.Cost=[];
empty_individual.Rank=[];
empty_individual.DominationSet=[];
empty_individual.DominatedCount=[];
empty_individual.CrowdingDistance=[];
pop=repmat(empty_individual,nPop,1); % 复制
for i=1:nPop
pop(i).Position=unifrnd(VarMin,VarMax,VarSize);
pop(i).Cost=CostFunction(pop(i).Position);
end
% 非支配排序
[pop, F]=NonDominatedSorting(pop);
% 计算拥挤度
pop=CalcCrowdingDistance(pop,F);
% 对个体排序
[pop, F]=SortPopulation(pop);
%% NSGA-II 主循环
for it=1:MaxIt
% 交叉
popc=repmat(empty_individual,nCrossover/2,2);
for k=1:nCrossover/2
i1=randi([1 nPop]);
p1=pop(i1);
i2=randi([1 nPop]);
p2=pop(i2);
[popc(k,1).Position, popc(k,2).Position]=Crossover(p1.Position,p2.Position);
popc(k,1).Cost=CostFunction(popc(k,1).Position);
popc(k,2).Cost=CostFunction(popc(k,2).Position);
end
popc=popc(:);
% 变异
popm=repmat(empty_individual,nMutation,1);
for k=1:nMutation
i=randi([1 nPop]);
p=pop(i);
popm(k).Position=Mutate(p.Position,mu,sigma);
popm(k).Cost=CostFunction(popm(k).Position);
end
% 合并
pop=[pop
popc
popm];
[pop, F]=NonDominatedSorting(pop);
pop=CalcCrowdingDistance(pop,F);
pop=SortPopulation(pop);
% 防止溢出
pop=pop(1:nPop);
% 非支配排序
[pop, F]=NonDominatedSorting(pop);
% 计算拥挤度
pop=CalcCrowdingDistance(pop,F);
% 种群排序
[pop, F]=SortPopulation(pop);
% 存储 F1
F1=pop(F{1});
% 结果显示
disp(['Iteration ' num2str(it) ': Number of F1 Members = ' num2str(numel(F1))]);
% 动态画图
figure(1);
PlotCosts(F1);
pause(0.01);
这个是matlab的主代码
检查非支配排序函数是否正确实现。如果非支配排序函数没有正确实现,那么所有个体的cost都一样的情况可能会发生。
检查基因编码是否正确设置。如果基因编码设置不正确,那么所有个体的适应度都一样的情况可能会发生。
检查变异操作是否正确实现。如果变异操作没有正确实现,那么所有个体的适应度都一样的情况可能会发生。
检查交叉操作是否正确实现。如果交叉操作没有正确实现,那么所有个体的适应度都一样的情况可能会发生。