[未答复] 遗传算法过程中,在选择算法处出现位置 1 处的索引超出数组边界(不能超出 1)

[复制链接]
s200100053 发表于 2022-9-19 23:08:09
1.主程序
clear
clc
%% 优化遗传算法参数
maxgen=300;%最大迭代次数
sizepop=100;%种群个数
pcross=0.6;%交叉率
pmutation=0.01;%变异率
%% 变量个数实数编码
lenchrom=[1,1,1];%染色体个数(实数编码)
bound=[-5,5;-5,5;-5,5];%实数范围
individuals=struct('fitness',zeros(1,sizepop),'chrom',[]);%结构体,适应度
avgfitness=[];%个体平均适应值
bestfitness=[];
bestchrom=[];
%% 初始化种群
for i=1:sizepop
    individuals.chrom(i,:)=code(lenchrom,bound);%生成多少个随机数根据染色体个数和实数范围决定
    x=individuals.chrom(i,:);
    individuals.fitness(i)=fun(x);%个体适应度函数
end


[bestfitness,bestindex]=min(individuals.fitness);%求最优值,找目标函数适应度最小值
bestchrom=individuals.chrom(bestindex,:);
avgfitness=sum(individuals.fitness)/sizepop;%平均适应度


trace=[];
for i=1:maxgen
    individuals = Select(individuals,sizepop);%选择好的个体
    avgfitness=sum(individuals.fitness)/sizepop;
    individuals.chrom=Cross(pcross,lenchrom,individuals.chrom,sizepop,bound);%交叉操作pcross交叉概率
    individuals.chrom=Mutation(pmutation,lenchrom,individuals.chrom,sizepop,[i,maxgen],bound);%变异操作[i,maxgen]i代表当前代数,maxgen代表最大代数
   
    for j=1:sizepop
        x=individuals.chrom(j,:);
        individuals.fitness(j)=fun(x);%目标函数值计算
    end
   
    [newbestfitness,newbestindex]=min(individuals.fitness);%新的最好目标函数值
    [worestfitness,worestindex]=max(individuals.fitness);
    if bestfitness > newbestfitness
        bestfitness=newbestfitness;
        bestchrom=individuals.chrom(newbestindex,:);
    end
    individuals.chrom(worestindex,:)=bestchrom;
    individuals.fitness(worestindex)=bestfitness;
   
    avgfitness=sum(individuals.fitness)/sizepop;%平均适应度
   
    trace=[trace;avgfitness,bestfitness];
end

2.选择程序(轮盘赌法)
function ret=Select(individuals,sizepop)


individuals.fitness=1./individuals.fitness;
sumfitness=sum(individuals.fitness);
sumf=individuals.fitness ./sumfitness;


index=[];
for i=1:sizepop
    pick=rand;
    while pick==0
        pick=rand;
    end
    for j=1:sizepop
        pick=pick-sumf(j);
        if pick<0
            index=[index,j];
            break
        end
    end   
end
individuals.chrom=individuals.chrom(index, :);
individuals.fitness=individuals.fitness(index, :);
ret=individuals;

位置 1 处的索引超出数组边界(不能超出 1)

位置 1 处的索引超出数组边界(不能超出 1)


您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
相关文章
热门教程
站长推荐
快速回复 返回顶部 返回列表