- 积分
- 35
- 注册时间
- 2004-10-23
- 仿真币
-
- 最后登录
- 1970-1-1
|
本帖最后由 ilxy 于 2009-8-14 13:48 编辑
clear
clc
%自己动手编的遗传算法程序,看别人编的太累了
%hanyang university, wang xiaoyong, abmcl lab, 2009year August, 14th
%采用浮点编码
%以标准化的几何分布规律随机对种群中的染色体进行选择
%交叉运算中以线性交叉的方式产生子代
%采用非均匀变异操作
f=inline('x+10*sin(5*x)+7*cos(4*x)')
%变量的定义
%gennum,种群的数目;iternum,迭代的次数;ps,选择的概率;pc,杂交的概率;pm,变异的概率
%boundzuo,区间下限,boundyou,区间上限
gennum=20
iternum=40
ps=0.08
pc=0.4
pm=0.1
boundzuo=0
boundyou=9
x=(boundyou-boundzuo)*rand(1,gennum)
%calrec用来记录适应度函数的最大值的
calrec=zeros(iternum,2)
for iter=1:iternum
fx=f(x)
[maxfx indemax]=max(fx)
calrec(iter,1)=x(indemax)
calrec(iter,2)=maxfx
%选择运算
t=ps/(1-(1-ps)^gennum)
[fxdec,nk] = sort(fx,'descend')
psge=zeros(1,gennum)
for i=1:gennum
psge(nk(i))=t*(1-ps)^(i-1)
end
qsge=cumsum(psge)
%产生升序随机数
rr=sort(rand(1,gennum),'ascend')
%确定选择之后的种群
xsel=zeros(1,gennum)
qsgenew=[0 qsge]
for j=1:gennum
for i=1:gennum
if rr(j)>qsgenew(i) & rr(j)<qsgenew(i+1)
break
end
end
%qsgenew(i+1)对应的是x(i)
xsel(j)=x(i)
end
%out=[qsge' rr' x' xsel']
%下面进行的是杂交操作
numcross=pc*gennum/2
pzong=randperm(gennum)
for i=1:numcross
v1cross=xsel(pzong(2*i-1))
v2cross=xsel(pzong(2*i))
w1=rand
xsel(pzong(2*i-1))=v1cross*w1+(1-w1)*v2cross
xsel(pzong(2*i))=v1cross*(1-w1)+w1*v2cross
end
%下面进行的是变异操作
b=3
nummut=pm*gennum
mzong=randperm(gennum)
for i=1:nummut
v1mut=xsel(mzong(i))
tmut=iter/iternum
aa=-1
bb=1
fuhao=aa+(bb-aa)*rand
if(sign(fuhao)>0)
y=v1mut-boundzuo
else
y=boundyou-v1mut
end
dv1mut=y*(rand*(1-tmut))^b
if(sign(fuhao)>0)
v1mutxin=v1mut-dv1mut
else
v1mutxin=v1mut+dv1mut
end
xsel(mzong(i))=v1mutxin
end
x=xsel
end
figure
plot(1:iternum,calrec(:,2),'b')
xlabel('迭代次数')
ylabel('适应度函数的最大值')
经过试算,与gaot工具箱的计算结果一致。 |
评分
-
1
查看全部评分
-
|