大话智能优化算法之遗传算法

遗传算法是根据生物进化理论得来的,在自然社会中,我们染色体的交叉变异都是随机的,适应能力强的生物得以抵抗恶劣环境发生变异能够存活下来,而适应能力不强的将消亡。基于这种概念,我们是否可以考虑,在求最优值时,利用随机的变异交叉,迭代(可以认为是繁殖的多少代),将变异后好的样本值(目标值好的)留下来,然后将差的后代去掉,用好的来繁殖,进行迭代,这就是我们所说的优生优育啊。基因好的就该多生,目前这我们还没这政策呢。
我举个简单例子,假如我求一个连续函数的最大值,比如y(x)=x2(这里是x的平方),x范围为[-2,2]。这个函数的函数值就是我们的适应度啊,有的x对应的函数值大,就留下来,有的很小我就用好的替换掉。万物都是起源的对不,我也得首先给它造个亚当,夏娃啊。当然我们不只是造一个啦,我们造多个啊,这个群体人口基数大了才能迅速产生优良个体撒。所以我们就先初始化样本个体,但是如何初始化啊,这个就涉及到编码问题了,学过生物我们都知道人体有23条染色体,染色体间是实现片段的交叉变异,但是我们这是一个值啊1,2,0.1等,这时我们就想到了用编码,二进制编码,反正只有0,1而且二进制和十进制之间是相互转换的嘛。但是我们取值的范围不是[-2,2]么,长度是4,转化为二进制就是100,很明显取值也只能是0,1,2,3,4,加上-2,就是可以取-2,-1,0,1,2。可是这个太短了吧样本,交叉变异都不好弄,这时我们发现我们精度不够,取值只有这几个呀,所以我们想到取精度为1呀,保留后一位,那取值长度个数就变成了4/0.1=40啊,这时二进制编码长度就有32~64之间,明显我们取6,即1000000,注意到其中的我们变量值x到基因值的转化,这个自己琢磨。有了样本个体后我们就开始交叉,变异嘛,你要问我如何交叉,就是随机选两个样本来造下一代嘛,呃呃,不是酱紫的。就是随机先选择群体中的两个样本,然后用rand()随机生成在哪个位置交叉啊,就是两个样本在指定位置进行交换嘛,也就是交换0,1.一般的嘛,我们这么想交叉的越多,是不是进化的越快啊,想想人类也有几万亿年了。所以,看你设定随机交叉的次数了,交叉了我们就开始变异啊,这个更好办了,随机指定变异位置,反正就是0,1的变化。这时我们就需要进行刷选了,有些样本不行就扔掉了。可是我们如何来确定好与坏呢,对的,我们还先计算函数值大小嘛,也就是y(x)的值。每个样本都这个适应度(函数值)。这就开始找吧,找到最好的,找到最差的,不过我们可是知道啊,每一代进化是不是有个最好的呀,然后从亚当夏娃开始,我们就记录一个更更好的个体,它是所有代里面最好的。然后呢,我们就需要将用这个最最好的个体来代替每一代选出来不行的样本啊,让它进化啊。一旦某一代出现了更好的样本,我们也需要更新这个最最好的样本嘛。这样,就完啦,遗传算法就这么简单呀,你给指定交叉变异来个100代,能得出最好的个体的。当然遗传算法还有许多变种,可是明白这最基础的原理是最重要的,有兴趣的可以解决离散问题的tsp问题,也很有意思。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值