MATLAB遗传算法作业

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

MATLAB遗传算法

一:遗传算法简介:

遗传算法(Genetic Algorithm)是一类借鉴生物界的进化规律(适者生存,优胜劣汰遗传机制)演化而来的随机化搜索方法。它是由美国的J.Holland教授1975年首先提出,其主要特点是直接对结构对象进行操作,不存在求导和函数连续性的限定;具有内在的隐并行性和更好的全局寻优能力;采用概率化的寻优方法,能自动获取和指导优化的搜索空间,自适应地调整搜索方向,不需要确定的规则。遗传算法的这些性质,已被人们广泛地应用于组合优化、机器学习、信号处理、自适应控制和人工生命等领域。它是现代有关智能计算中的关键技术。

二:遗传算法的基本步骤

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

b)个体评价:计算群体P(t)中各个个体的适应度。

c)选择运算:将选择算子作用于群体。选择的目的是把优化的个体直接遗传到下一代或通过配对交叉产生新的个体再遗传到下一代。选择操作是建立在群体中个体的适应度评估基础上的。 d)交叉运算:将交叉算子作用于群体。遗传算法中起核心作用的就是交叉算子。

e)变异运算:将变异算子作用于群体。即是对群体中的个体串的某些基因座上的基因值作变动。

群体P(t)经过选择、交叉、变异运算之后得到下一代群体P(t+1)。

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

三:matlab实现

例子:f(x)=10*sin(5x)+7*cos(4x) x∈[0,10] 将变量域 [0,10] 离散化为二值域 [0,1023], x=0+10*b/1023。

1.初始化

initpop.m

function pop=initpop(popsize,chromlength)

pop=round(rand(popsize,chromlength)); % rand随机产生每个单元为0或者1

行数(种群数量)为popsize,列数为chromlength(个体所含基因数)的矩阵,

2.计算目标函数值

2.1 将二进制数转化为十进制数(1)

decodebinary.m

%产生 [2^n 2^(n-1) ... 1] 的行向量,然后求和,将二进制转化为十进制

function pop2=decodebinary(pop)

[px,py]=size(pop) %Pop的行和列数

for i=1:px

pop2(i)=0

for j=1:py

pop2(i)=pop2(i)+2.^(py-j)*pop(i,j)

end

end

2.2 将二进制编码转化为十进制数(2)

Decodechrom.m

%函数的功能是将染色体(或二进制编码)转换为十进制,参数spoint表示待解码的二进制串的起始位置

function pop2=decodechrom(pop,spoint,length)

pop1=pop(:,spoint:spoint+length-1)%pop1取pop的第spoint列到spoint+length-1列为止

pop2=decodebinary(pop1)

2.2.3 计算目标函数值

% calobjvalue.m函数的功能是实现目标函数的计算

function [objvalue] = calobjvalue(pop)

temp1=decodechrom(pop,1,10)%将pop每行转换成十进制

x=temp1*10/1023%将二值域中的数转化为变量域的数

objvalue=10*sin(5*x)+7*cos(4*x)%变量域是从1到10

m=max(objvalue)

b=0

for i=1:100

if objvalue(i)==m

b=b+1

end

end

figure

fplot('10*sin(5*x)+7*cos(4*x)',[0 10])

hold on

plot(x,objvalue,'or')

xlabel(sprintf('%2d',b))

grid on

3 计算个体的适应值

calfitvalue.m

%计算个体的适应值

function fitvalue=calfitvalue(objvalue)

[px,py]=size(objvalue)

for i=1:py

if objvalue(i)>0;

temp=objvalue(i)

else

temp=0.0

end

fitvalue(i)=temp

End

4 选择复制

selection.m

% 根据方程 pi=fi/∑fi=fi/fsum ,选择步骤:

% 1) 在第 t 代,计算 fsum 和 pi

% 2) 产生 {0,1} 的随机数 rand( .),求 s=rand( .)*fsum % 3) 求 ∑fi≥s 中最小的 k ,则第 k 个个体被选中

%最后再产生一个0到1之间的随机数,依据该随机数出现在上述哪一个概率区域内来确定各个个体被选中的次数。

% 4) 进行 N 次2)、3)操作,得到 N 个个体,成为第 t=t+1 代种群

function [newpop] = selection(pop,fitvalue)

totalfit=sum(fitvalue)%求适应值的和

fitvalue=fitvalue/totalfit%单个个体被选择的概率

%如 fitvalue=[1 2 3 4],则 cumsum(fitvalue)=[1 3 6 10]

fitvalue=cumsum(fitvalue)

[px,py]=size(pop)

ms=sort(rand(px,1))%从小到大排列 列向量

fitin=1

newin=1

while newin<=px %得到px个个体

if(ms(newin))

newpop(newin,:)=pop(fitin,:)%将pop的第fitin行复制给newpop

中的newin行

newin=newin+1

else

fitin=fitin+1

end

End

5 交叉

crossover.m

%交叉的概率为pc

function [newpop] =crossover(pop,pc)

[px,py]=size(pop)

newpop=ones(size(pop))%所有元素为1

for i=1:2:px-1

if(rand

cpoint=round(rand*py)

newpop(i,:)=[pop(i,1:cpoint),pop(i+1,cpoint+1:py)];

newpop(i+1,:)=[pop(i+1,1:cpoint),pop(i,cpoint+1:py)];

else

newpop(i,:)=pop(i,:)

newpop(i+1,:)=pop(i+1,:)

end

end

6 变异

mutation.m

%每个个体的每一位都以概率 pm 翻转,即由“1”变为“0”,

function [newpop] = mutation(pop,pm)

[px,py]=size(pop) newpop=pop

for i=1:px*py %对每一个元素进行判断

if(rand

newpop(i)=1-pop(i)

end

end

7 求出群体中最大得适应值及其个体

best.m

%求出群体中适应值最大的值

function [bestindividual,bestfit] = best(pop,fitvalue)

[px,py]=size(pop)

bestindividual=pop(1,:)

bestfit=fitvalue(1);

for i=2:px

if fitvalue(i)>bestfit

bestindividual=pop(i,:)

bestfit=fitvalue(i)

end

end

8 主程序

main.m

%遗传算法主程序

popsize=100%种群大小

chromlength=10 %字符串长度,即个体长度

pc=0.6 %交叉概率

pm=0.001 %变异概率

pop=initpop(popsize,chromlength)%随机产生初始群体

[objvalue]=calobjvalue(pop) %计算目标函数值,形成一个20*1的列向量

fitvalue=calfitvalue(objvalue)%计算群体中每个个体的适应度

for i=1:20 %20次迭代

[newpop]=selection(pop,fitvalue)%选择

[newpop]=crossover(newpop,pc)%交叉

[newpop]=mutation(newpop,pm)%变异

[objvalue]=calobjvalue(newpop)

fitvalue=calfitvalue(objvalue)

[bestindividual,bestfit]=best(newpop,fitvalue)%求出群体中适应值最大的个体及适应值

y(i)=max(bestfit);

n(i)=i;

pop5=bestindividual;

x(i)=decodechrom(pop5,1,chromlength)*10/1023;

pop=newpop;

end

相关文档
最新文档