基于实数编码的求函数最小值遗传算法
来源:互联网 发布:python元组转化为列表 编辑:程序博客网 时间:2024/06/04 18:31
问题描述
计算函数
问题分析
利用实数编码,10个数对应染色体上10个基因,适应度即为每条染色体的基因平方和。对染色体升序排列,适应度最低的染色体作为纯父方与不同母方交配(君主方案),再经过变异后产生下一代染色体。
代码
初始化参数
clear all; %清除所有变量close all; %清图clc; %清屏NP=50; %染色体数目D=10; %基因数目Pc=0.8; %交叉率,一般取0.25~1Pm=0.1; %变异率,一般取0.001~0.1G=1000; %最大遗传代数,一般100~1000Xs=20; %定义域上限Xx=-20; %定义域下限f=rand(D,NP)*(Xs-Xx)+Xx; %随机获得初始种群trace=zeros(1,G); %预先分配内存Fit=zeros(1,NP); %预先分配内存
按适应度升序排列
for np=1:NP Fit(np)=func2(f(:,np)); end [SortFit,Index]=sort(Fit); Sortf=f(:,Index);
sort()默认是升序(ascending order)排列函数,如果降序sort( ,’ascend’)
假设A=[2012,2060,1993]
[B,I] = sort(A)
那么
B=[1993,2012,2060]
I=[3,1,2]
采用君主方案交叉
Emper=Sortf(:,1); NoPoint=round(D*Pc); PoPoint=randi([1 D],NoPoint,NP/2); nf=Sortf; for i=1:NP/2 nf(:,2*i-1)=Emper; %父方 nf(:,2*i)=Sortf(:,2*i); %母方 %随机交换一定数目的基因 for k=1:NoPoint nf(PoPoint(k,i),2*i-1)=nf(PoPoint(k,i),2*i); nf(PoPoint(k,i),2*i)=Emper(PoPoint(k,i)); end end
与轮盘赌的区别是:轮盘赌的父母方染色体都是根据适应度越大越容易被选中的原理随机筛选出来的。而君主方案是父方染色体全部是本代最占优的一条,母方是按一定顺序(升序)排列的一群染色体。
变异操作
for m=1:NP for n=1:D r=rand(1,1); if r<Pm nf(n,m)=rand(1,1)*(Xs-Xx)+Xx; end end end
适应度函数
function result=func2(x)result=sum(x.^2);end
完整代码
%%%%%实值遗传算法求函数极值%%%%%%%%%初始化参数%%%%%clear all; %清除所有变量close all; %清图clc; %清屏NP=50; %染色体数目D=10; %基因数目Pc=0.8; %交叉率,一般取0.25~1Pm=0.1; %变异率,一般取0.001~0.1G=1000; %最大遗传代数,一般100~1000Xs=20; %定义域上限Xx=-20; %定义域下限f=rand(D,NP)*(Xs-Xx)+Xx; %随机获得初始种群trace=zeros(1,G); %预先分配内存Fit=zeros(1,NP); %预先分配内存%%%%%遗传算法循环%%%%%for gen=1:G %%%%%按适应度升序排列%%%%% for np=1:NP Fit(np)=func2(f(:,np)); end [SortFit,Index]=sort(Fit); Sortf=f(:,Index); %%%%%采用君主方案进行选择交叉操作%%%%% Emper=Sortf(:,1); NoPoint=round(D*Pc); PoPoint=randi([1 D],NoPoint,NP/2); nf=Sortf; for i=1:NP/2 nf(:,2*i-1)=Emper; nf(:,2*i)=Sortf(:,2*i); for k=1:NoPoint nf(PoPoint(k,i),2*i-1)=nf(PoPoint(k,i),2*i); nf(PoPoint(k,i),2*i)=Emper(PoPoint(k,i)); end end %%%%%变异操作%%%%% for m=1:NP for n=1:D r=rand(1,1); if r<Pm nf(n,m)=rand(1,1)*(Xs-Xx)+Xx; end end end f=nf; trace(gen)=SortFit(1);endBestf=Sortf(:,1)summ=func2(Bestf)trace(end);figureplot(trace)xlabel('迭代次数')ylabel('目标函数值')title('适应度进化曲线')
阅读全文
0 0
- 基于实数编码的求函数最小值遗传算法
- 遗传算法求二元函数的最小值
- 应用遗传算法求函数最小值
- 遗传算法---实数编码方式
- 遗传算法---实数编码方式
- 简单的遗传算法问题之实数编码(二)
- 基于网格的遗传算法求函数极值
- 基于二进制编码的遗传算法求解函数最大值
- MATLAB遗传算法例子二:求多元函数最小值
- 标准的遗传算法求函数最大值
- 标准的遗传算法求函数最大值。
- 遗传算法求函数极大值
- 求N个实数的最大值和最小值
- 求函数的最小值
- 求函数的最大值——遗传算法
- C# 遗传算法求函数最大值
- 简单遗传算法求函数极值
- 遗传算法工具箱求函数极值
- 人工神经网络和其他
- Percona XtraDB Cluster规划实施
- 关于Vbox
- 第十一周项目3
- JSON的简单介绍以及C语言的JSON库使用
- 基于实数编码的求函数最小值遗传算法
- Git 修改Git的提交方式 https -> ssh
- MYSQL explain详解之range
- 手记_java注解_咕泡
- java.lang.NoClassDefFoundError: org/springframework/core/ResolvableTypeProvider
- BigDecimal
- 《算法导论》最长子序列问题
- pt-osc全解pt-online-schema-change
- PHP 循环取2个时间之内的年月