全部版块 我的主页
论坛 站务区 十一区 新手入门区
1516 0
2020-07-10
%一步步编写代码实现遗传算法实现的功能
clear all; clc; close all;
global pop_size
pop_size=20;
generation=100;
p_c=0.9;
p_mu=0.1;
length=8;
parents=randi([0,1],pop_size,length);
for k=1:generation
    Fit=cal_fit_con(parents);
    maxFit=max(Fit(:,1));
    minFit=min(Fit(:,1));
    rr=find(Fit(:,1)==maxFit);
    xBest=parents(rr(1,1),:);%利用上面找到的适应度最大的位置来找出对应的自变量x的编码。
    yBest=Fit(rr(1,1),1);%利用上面找到的适应度最大的位置来找出对应的函数值
    %%这里为什么要用最大最小值进行归一化处理?为什么不直接用个体适应度除以总适应度,得出比率。
    %基于轮盘赌的选择操作,又称比例选择方法,其基本思想是:各个个体被选中的概率与其适应度大小成正比
    Fit0=(Fit(:,1)-minFit)/(maxFit-minFit);
    sum_Fit=sum(Fit0);
    fitvalue=Fit0./sum_Fit;%以上三步,通过归一化,求出每个个体的适应度,计算出他们被遗传到下一代群体中的概率 fitvalue。
    fitvalue=cumsum(fitvalue);%计算出每个个体的积累概率;??
    ms=sort(rand(pop_size,1));%在[0,1]区间内产生一个均匀分布的伪随机数ms
    fiti=1;
    newi=1;
    while newi<=pop_size && fiti<=pop_size%若个体的累计概率大于伪随机数ms,则选择个体fiti,重复pop_size次。
        if (ms(newi)<fitvalue(fiti))
            nparents(newi,:)=parents(fiti,:);
            newi=newi+1;
        else
            fiti=fiti+1;
        end
    end
%交叉算子
%随机产生一个概率p,如果p小于交叉概率pc,则随机产生一组自变量x的解q,当q的某一个位置等于1时,交换自变量解nparents中(i+1)和(i)的值。
for i=1:2:pop_size
    p=rand;
    if p<p_c
        q=randi([0,1],1,length);
        for j=1:length
            if q(j)==1
                temp=nparents(i+1,j);
                nparents(i+1,j)=nparents(i,j);
                nparents(i,j)=temp;
            end
        end
    end  
end
%变异算子
%随机产生一个概率r,如果p小于交叉概率pm,变异自变量解nf(m),即如果某一位置为0,则将其变为1。
for m=1:pop_size
    for n=1:length
        r=rand;
        if r<p_mu
            if nparents(m,n)==0
                nparents(m,n)=1;
            else
                nparents(m,n)=0;
            end
        end
    end
end
parents=nparents;
parents(i,:)=xBest;
xtrace(k,:)=parents(rr(1,1),:);
trace(k)=Fit(rr(1,1),1);%每一个trace都是迭代中最大价值。
end
yBest
xBest
figure(1)
plot(trace);
xlabel('迭代次数')
ylabel('函数目标值')
title('适应度进化曲线')

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群