大话遗传算法

咱们先来看看比较古板的遗传算法描述:

a)初始化:设置进化代数计数器t=0,设置最大进化代数T,随机生成M个个体作为初始群体P(0)。

  b)个体评价:计算群体P(t)中各个个体的适应度。   c)选择运算:将选择算子作用于群体。选择的目的是把优化的个体直接遗传到下一代或通过配对交叉产生新的个体再遗传到下一代。选择操作是建立在群体中个体的适应度评估基础上的。   d)交叉运算;将交叉算子作用于群体。所谓交叉是指把两个父代个体的部分结构加以替换重组而生成新个体的操作。遗传算法中起核心作用的就是交叉算子。   e)变异运算:将变异算子作用于群体。即是对群体中的个体串的某些基因座上的基因值作变动。   群体P(t)经过选择、交叉、变异运算之后得到下一代群体P(t 1)。

  f)终止条件判断:若t=T,则以进化过程中所得到的具有最大适应度个体作为最优解输出,终止计算。

 

上述说了那多,初始化、个休评价、选择运算、交叉运算、变异运算,很多人看了都云里来雾里去。

这些东西怎么运用到实际当中去呢?

我前些天在明珠电视台看了一段美国科学纪录片,当中讲到了,俄罗斯的研究人员,将狐狸驯化的实验。

实验当中,研究人员首先挑选了一批比较温和的狐狸,来做初始代,以让他们繁殖后代,看能否繁殖出家禽般的温驯的动物。看狐狸是否温和,这就是个体评价,选择出来做为初始代,这就是第一次运行运算。

公性和母性的狐狸被圈养在一起,温和的公性狐狸和母性狐狸之间日久生情,不由得偷吃的禁果,两个狐狸欲死欲仙,在某点上合二为一,这就是交叉运算。偷吃禁果以后,母狐狸怀孕了,生出了小狐狸,小狐狸继承了父母的个性,实验人员又对其进行训练,使之变得更加温和了,这就是变异运算。通过几代选择、繁殖以后,最新一代的狐狸居然变得和狗一样温驯,容易与人接触、交流,达成了研究人员的初始目标。原来这一代家禽狐狸就是他们需要找的。

结论:

虽然世界上所有的狐狸中本来就有完全像狗一样的,或者已经逝去,或者就在某个人的家中,我们如果想得到一只或一批,那么我们是去全世界广播式的搜索?然后将全世界的狐狸集中起来一个一个的比较,看是否符合要求(这就好比穷举算法,成本高昂,现在的宣传一个华为手机广告都要好几亿呐,呵呵),还是利用遗传属性,挑选出一批来驯化繁殖,来得到我们想要的?

穷举法能得到最温驯的家禽,遗传算法也能得到近似最温驯的一个解,但成本相对很少。

这就是遗传算法的魅力所在。

  • 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、付费专栏及课程。

余额充值