找回密码
 注册
Simdroid-非首页
查看: 429|回复: 8

一个简单的遗传算法的例子

[复制链接]
发表于 2009-8-14 13:47:56 | 显示全部楼层 |阅读模式 来自 韩国
本帖最后由 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

查看全部评分

发表于 2009-8-14 16:44:29 | 显示全部楼层 来自 黑龙江哈尔滨
Simdroid开发平台
没想到这么少。

不知道多目标的麻烦吗? 如果不麻烦的话,我想自己编编就不用现成的优化软件了。
回复 不支持

使用道具 举报

发表于 2009-8-14 20:25:15 | 显示全部楼层 来自 河北石家庄
本帖最后由 feynmand 于 2009-8-14 20:32 编辑

这是单变量的程序,编写的非常简洁。多变量的话需要对程序进行向量化的扩展,这一步稍微麻烦一些。

不过如果想要做多目标优化的话还是比较容易实现的。比如说目标函数f1,f2……等,将各目标加权相加得到函数F,然后进行优化就可以了。

编写遗传算法程序困难的地方在于约束条件的设置,尤其是非线性约束。

BTW:TBE签名档中的那句话“凌晨4点就被吵醒了,这时的城市很安静,一想我TMD在创业呢,睡意全无,继续奋斗”来自老罗?

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2009-8-14 23:22:20 | 显示全部楼层 来自 黑龙江哈尔滨
非常感谢feynmand版主的回复。的确是来自老罗。

权函数的选取可能是个问题,modeFRONTIER中,不是基于权函数的把多个目标归成一个目标的,这也是他一直引以为荣的亮点,我有空再想想吧。呵呵
回复 不支持

使用道具 举报

发表于 2010-10-10 13:27:04 | 显示全部楼层 来自 四川成都
谢谢分享。。
回复 不支持

使用道具 举报

发表于 2010-10-10 13:28:29 | 显示全部楼层 来自 四川成都
谢谢分享。。
回复 不支持

使用道具 举报

发表于 2011-12-15 15:50:02 | 显示全部楼层 来自 重庆沙坪坝区
feynmand 发表于 2009-8-14 20:25
这是单变量的程序,编写的非常简洁。多变量的话需要对程序进行向量化的扩展,这一步稍微麻烦一些。

不过如 ...

你说的很对,困难在于有约束的问题程序的编制,至少我是这样子认为了,因为我在这里出现了问题,一直困扰,觉得程序没有问题,但就是不收敛
回复 不支持

使用道具 举报

发表于 2011-12-20 22:09:09 | 显示全部楼层 来自 湖北宜昌
请问斑竹,多目标和单目标具体的区别在哪里啊?具体分析哈适应度函数,遗传算子方面,谢谢!
回复 不支持

使用道具 举报

发表于 2016-5-13 15:35:41 | 显示全部楼层 来自 湖北武汉
朋友,有多目标优化的程序吗,麻烦指导下,扣扣1264756132
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-4-23 20:29 , Processed in 0.063183 second(s), 19 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表