遗传算法matlab_【遗传算法】MATLAB代码

92cd0fd635694f8f060b2393c97b10bc.png
遗传算法 - 搜狗百科​baike.sogou.com
bc80ba599613e4507c07bf15c274307b.png

【遗传算法】的基本流程为

  1. 产生初始种群
  2. 计算种群中个体对应的实际结果的值
  3. 计算个体对应的适应度
  4. 根据适应度选择个体
  5. 交叉
  6. 变异
  7. 求最佳结果

【案例】

有8个城市,旅行商需要找到最短的路线

【程序结果】

59444a87fab684dd1a6c65450972d0ae.png

e132bf93fe770d75f77f044018c8529a.png

【代码】

%% 遍历8个城市的最短路径问题

七个处理流程用到的七个函数如下

【产生初始种群】

%% 产生初始种群,popsize为初始种群的个数,chromlength为每个个体的长度
function pop=initpop1(popsize,chromlength)
for i=1:popsize
    pop(i,:)=randperm(chromlength);% randperm产生1-chromlength的随机排列
end

【计算个体的值】

function [objvalue]=calobjvalue1(pop)%计算目标函数值即距离
D=[5 0;3.54 3.54;0 5;-3.54 3.54;-5 0;-3.54 -3.54;0 -5;3.54 -3.54];%确定城市坐标
[px,py]=size(pop);
for i=1:px
    k=sqrt((D(pop(i,1),1)-D(pop(i,py),1))^2+(D(pop(i,1),2)-D(pop(i,py),2))^2);
    for j=1:py-1
        k=k+sqrt((D(pop(i,j),1)-D(pop(i,j+1),1))^2+(D(pop(i,j),2)-D(pop(i,j+1),2))^2);
    end
    objvalue(i)=k;
end

【计算个体的适应度】

%%计算个体适应度
function [fitvalue]=calfitvalue1(objvalue)
x=objvalue;
fitvalue=1./x;%距离最小映射为适应度最大
fitvalue=10.*x.*x-1400*x+49000;%二次函数,可以实现非线性映射,并使种群更易收敛到最优解

【选择】

function [newpop,a,b]=selection1(pop,fitvalue) %选择
totalfit=sum(fitvalue); %求适应度值之和
pfitvalue=fitvalue/totalfit; %单个个体被选择的概率
mfitvalue=cumsum(pfitvalue); %如fitvalue=[1 2 3 4]cumsum(fitvalue)=[1 3 6 10] 
[px,py]=size(pop);
ms=(rand(px,1)); %转动轮盘
a=ms;
b=mfitvalue;
fitin=1; 
newin=1;
newpop=zeros(px,py);
while newin<=px
    if mfitvalue(fitin)>ms(newin)
        newpop(newin,:)=pop(fitin,:); 
        newin=newin+1; 
        fitin=1;
    else
        fitin=fitin+1;
    end
end

【交叉】

function [newpop1]=crossover1(newpop,pc)%交叉
[px,py]=size(newpop);
newpop1=zeros(size(newpop));
for i=1:px
    po=rand(1);
    if po<pc
        y=round(rand*px);%随机寻找交叉对象
        x1=round(rand*py); %随机寻找交叉点
        x2=round(rand*py); %随机寻找交叉点
        cpoint1=min(x1,x2);%寻找交叉起点 
        cpoint2=max(x1,x2);%寻找交叉终点
        while cpoint1==0||cpoint2==0||y==0
            y=round(rand*px);%随机寻找交叉对象
            x1=round(rand*py); %随机寻找交叉点
            x2=round(rand*py); %随机寻找交叉点
            cpoint1=min(x1,x2);%寻找交叉起点
            cpoint2=max(x1,x2);%寻找交叉终点
        end
        newpop1(i,:)=[newpop(i,1:cpoint1-1),newpop(y,cpoint1:cpoint2),newpop(i,cpoint2+1:py)]; %两个染色体在交叉点位置交叉
        t=1;
        while t==1
            t=0;
            for m=1:py
                for n=cpoint1:cpoint2
                    if newpop1(i,m)==newpop1(i,n) &&(m<cpoint1||m>cpoint2)
                        newpop1(i,m)=newpop(i,n);
                    t=1;
                    end
                end %对交叉后染色体做调整
            end
        end
    else
        newpop1(i,:)=newpop(i,:);% 产生新染色体
    end
end

【变异】

function [newpop2]=mutation1(newpop1,pm) % 变异
%Name: mutation.m
[px,py]=size(newpop1);
newpop2=zeros(px,py);
for i=1:px
    ps=rand;
    if ps<pm
        mpoint1=round(rand*py);
        mpoint2=round(rand*py);
        if mpoint1<=0||mpoint2<=0
            mpoint1=1;
            mpoint2=1;
        end
        t=newpop1(i,mpoint1);
        newpop1(i,mpoint1)=newpop1(i,mpoint2);
        newpop1(i,mpoint2)=t;
    end
end
newpop2=newpop1;

【求最优】

%% 找到最佳个体
function [bestindividual,bestfit,worstindividual,worstfit]=best1(a,newpop2,newfitvalue)%最佳个体
%Name: best.m
[px,py]=size(newpop2);
bestindividual=newpop2(1,:);%假设新的经过交叉变异的种群中第一个个体就是距离最短的
bestfit=newfitvalue(1);%假设第一个是适应度最好的,为了比较设置初始值
wostfit=newfitvalue(1);%假设第一个是适应度最坏的,为了比较设置初始值
j=1;
%挨个对比所有的个体找到适应度最差的位置
for i=1:px
    if newfitvalue(i)<wostfit
        j=i;
        wostfit=newfitvalue(i);
    end
end
worstindividual=newpop2(j,:);%将最差的替换为上一代的最好的
worstfit=newfitvalue(j);
for i=1:px
    if newfitvalue(i)>bestfit %更新为适应度大的个体
        bestindividual=newpop2(i,:);%循环下去求最佳个体
        bestfit=newfitvalue(i);%循环下去求最佳适应度
    end
end

【参考】

七个函数及题目来源于【西安交通大学】【智能信息处理】课程讲义,GA代码为个人编写。

祝你科研顺利!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
简单的遗传算法计算函数最值. function ga_main() % 遗传算法程序 % n-- 种群规模% ger-- 迭代次数% pc--- 交叉概率% pm-- 变异概率 % v-- 初始种群(规模为n)% f-- 目标函数值% fit-- 适应度向量 % vx-- 最优适应度值向量% vmfit-- 平均适应度值向量 clear all; close all; clc;%清屏 tic;%计时器开始计时 n=20;ger=100;pc=0.65;pm=0.05;%初始化参数 %以上为经验值,可以更改。 % 生成初始种群 v=init_population(n,22); %得到初始种群,22串长,生成20*22的0-1矩阵 [N,L]=size(v); %得到初始规模行,列 disp(sprintf('Number of generations:%d',ger)); disp(sprintf('Population size:%d',N)); disp(sprintf('Crossover probability:%.3f',pc)); disp(sprintf('Mutation probability:%.3f',pm)); %sprintf可以控制输出格式 % 待优化问题 xmin=0;xmax=9; %变量X范围 f='x+10*sin(x.*5)+7*cos(x.*4)'; % 计算适应度,并画出初始种群图形 x=decode(v(:,1:22),xmin,xmax);"位二进制换成十进制,%冒号表示对所有行进行操作。 fit=eval(f);%eval转化成数值型的 %计算适应度 figure(1);%打开第一个窗口 fplot(f,[xmin,xmax]);%隐函数画图 grid on;hold on; plot(x,fit,'k*');%作图,画初始种群的适应度图像 title('(a)染色体的初始位置');%标题 xlabel('x');ylabel('f(x)');%标记轴 % 迭代前的初始化 vmfit=[];%平均适应度 vx=[]; %最优适应度 it=1; % 迭代计数器 % 开始进化 while it<=ger %迭代次数 0代 %Reproduction(Bi-classist Selection) vtemp=roulette(v,fit);%复制算子 %Crossover v=crossover(vtemp,pc);%交叉算子 %Mutation变异算子 M=rand(N,L)<=pm;%这里的作用找到比0.05小的分量 %M(1,:)=zeros(1,L); v=v-2.*(v.*M)+M;%两个0-1矩阵相乘后M是1的地方V就不变,再乘以2. NICE!!确实好!!!把M为1的位置上的地方的值变反 %这里是点乘 %变异 %Results x=decode(v(:,1:22),xmin,xmax);%解码,求目标函数值 fit=eval(f); %计算数值 [sol,indb]=max(fit);% 每次迭代最优目标函数值,包括位置 v(1,:)=v(indb,:); %用最大值代替 fit_mean=mean(fit); % 每次迭代目标函数值的平均值。mean求均值 vx=[vx sol]; %最优适应度值 vmfit=[vmfit fit_mean];%适应度均值 it=it+1; %迭代次数计数器增加 end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值