数模论坛

 找回密码
 注-册-帐-号
搜索
热搜: 活动 交友 discuz
查看: 13496|回复: 16

关于遗传算法

[复制链接]
发表于 2003-7-21 03:19:37 | 显示全部楼层 |阅读模式
这是遗传算法的初始化的一部分(matlab),最后一个if-else-end的作用是选则编码,我看不懂,不知道那是什么格式,请各位大虾指点一二。

function [pop] = initializega(num, bounds, eevalFN,eevalOps,options)
if nargin<5
options=[1e-6 1];
end
if nargin<4
eevalOps=[];
end
if options(2)==1 %浮点编码
estr=['[ pop(i, pop(i,xZomeLength)]=' eevalFN '(pop(i,,[0 eevalOps]);'];
else %二进制编码
estr=['x=b2f(pop(i,,bounds,bits);[x v]=' eevalFN(x,[0 eevalOps]);
pop(i,:)=[f2b(x,bounds,bits) v];'];
end
发表于 2003-7-21 04:31:43 | 显示全部楼层

%nargin是函数参数的个数
function [pop] = initializega(num, bounds, eevalFN,eevalOps,options)
if nargin<5  %如果给出的变量个数为5个以下,使用默认的参数表options
options=[1e-6 1];
end
if nargin<4  %如果给出的变量个数为4个以下,使用默认的空参数表eevalOps
eevalOps=[];
end
if options(2)==1 %浮点编码  
estr=['[ pop(i, pop(i,xZomeLength)]=' eevalFN '(pop(i,,[0 eevalOps]);'];
else %二进制编码
estr=['x=b2f(pop(i,,bounds,bits);[x v]=' eevalFN(x,[0 eevalOps]);
pop(i,:)=[f2b(x,bounds,bits) v];'];
end

从名字可以看出函数执行的是遗传算法的初始化工作,里面很多函数是另外写的。
pop一般在遗传算法中表示人口群体,就是population的意思,estr是编码串,具体的意思
要依其他的函数申明而定,你给的程序块并不完全,所以很多具体的东东没法解释,只能根据
命名的规则来解释。
 楼主| 发表于 2003-7-23 22:16:20 | 显示全部楼层

这是初始化的全部程序,也是所有例子中的第一个,因为这样,这个程序涉及调用的外部函数表现在nargin上。要说明的是num是初始个数,bounds是范围,eevalFN是适应度函数,eevalOps是要设置的东东,(这是我从网上下载的,并不是我不愿意将所有的程序全粘上)
function [pop] = initializega(num, bounds, eevalFN,eevalOps,options)
if nargin<5
  options=[1e-6 1];
end
if nargin<4
  eevalOps=[];
end
if options(2)==1  %浮点编码
    estr=['[ pop(i, pop(i,xZomeLength)]=' eevalFN '(pop(i,,[0 eevalOps]);'];
  else  %二进制编码
    estr=['x=b2f(pop(i,,bounds,bits);[x v]=' eevalFN(x,[0 eevalOps]);
pop(i,:)=[f2b(x,bounds,bits) v];'];  
  end
end

numVars = size(bounds,1);     %变量的数目
rng= (bounds(:,2)-bounds(:,1))';  %变量边界

if options(2)==1
  xZomeLength = numVars+1;                
  pop= zeros(num,xZomeLength);        
  pop(:,1:numVars)=(ones(num,1)*rng).*(rand(num,numVars))+ (ones(num,1)*bounds(:,1)');
else
  bits=calcbits(bounds,options(1));
  xZomeLength = sum(bits)+1;                
  pop = round(rand(num,sum(bits)+1));
end

for i=1:num
  eeval(estr);
end

还有一点,我将程序copy到matlab上后发现上程序有点错误,我就改了,所以上半部分有点出入。
发表于 2003-7-25 09:01:41 | 显示全部楼层

sorry,偶也看得胡里糊涂的。

大概这样解释:
pop是一个群体向量,当编码方式是二进制编码的时候,向量的取值为0、1,
pop = round(rand(num,sum(bits)+1));说明产生num*(sum(bits)+1)个0、1群体,
当编码方式是浮点编码的时候,向量的取值为实数,而且均值为1,从这句话可以看出:
pop(:,1:numVars)=(ones(num,1)*rng).*(rand(num,numVars))+ (ones(num,1)*bounds(:,1)');

然后对于estr也同样可以这样:
不过这一段给的信息好象有点不够,

if options(2)==1 %浮点编码
estr=['[ pop(i, pop(i,xZomeLength)]=' eevalFN '(pop(i,,[0 eevalOps]);'];
因为适应度函数往往是以实数的形式出现的,所以需要有浮点编码。

else %二进制编码
estr=['x=b2f(pop(i,,bounds,bits);[x v]=' eevalFN(x,[0 eevalOps]);
b2f是不是系统函数呢?我机子上没有安装Matlab,并不知道,但是从名字可以猜测如果
群体为实数群体需要变为bit的形式,

但是这段语句太过怪异,偶也解释不太清楚。
发表于 2003-7-25 22:10:30 | 显示全部楼层

没有关系的,大家在一起探讨就慢慢会明朗的。
我的编程虽然学的还可以,但还是要继续努力,还望更的编程高手进来嘿嘿
发表于 2003-7-28 03:13:30 | 显示全部楼层

请问学习GA,NN,SA,之类的算法对解题是不是有很大的帮助啊?
发表于 2003-7-28 06:38:50 | 显示全部楼层

确实挺有用的,因为现在建模的时候很多问题很复杂,用这些最优化方法会使问题游刃而解,但是程序很难编的说,只要你平时努力去留意一下这些算法,象97年零件优化(SA)、98年洪水(SA)、00年的DNA(标准的NN)、01年的公交车(师兄有用NN的说)、还有02年彩票(偶去年用到了NN),03年美赛伽马刀(GA,可偶没编出来,555~~~)都可以用这几个方法进行解决,嘿嘿,好象每一年都和NN、SA、GA有点牵连。用了这些方法,即便你说了但没有去编,得奖也增添几分砝码,呵呵,个人认为。
发表于 2003-7-28 18:27:51 | 显示全部楼层

非常感谢斑竹!
尽管我们的教练不是很赞成我们用这样的一些算法,但是我们队员都很有兴趣学啊!
发表于 2003-7-30 01:09:08 | 显示全部楼层

NN SA 是what?
3q先
发表于 2003-7-30 01:16:41 | 显示全部楼层

神经网络算法(NNA) netrul net algorithm
模拟退火算法(simulated annealing algorithm, SA),
退火进化算法(annealing evolution algorithm, AEA)
遗传算法(genetic algorithm, GA)
不知道英文写对了没
您需要登录后才可以回帖 登录 | 注-册-帐-号

本版积分规则

小黑屋|手机版|Archiver|数学建模网 ( 湘ICP备11011602号 )

GMT+8, 2024-11-30 06:15 , Processed in 0.060894 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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