遗传算法2的一些问题

基于遗传算法2,得到了所有粒子的cost都一样,不知道问题出在哪?

img

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都一样的情况可能会发生。
检查基因编码是否正确设置。如果基因编码设置不正确,那么所有个体的适应度都一样的情况可能会发生。
检查变异操作是否正确实现。如果变异操作没有正确实现,那么所有个体的适应度都一样的情况可能会发生。
检查交叉操作是否正确实现。如果交叉操作没有正确实现,那么所有个体的适应度都一样的情况可能会发生。