matlab遗传算法先收敛后发散,遗传算法及其MATLAB实现

a4c26d1e5885305701be709a3d33442f.png

遗传算法及其MATLAB实现

(2006-04-29 08:52:47)

遗传算法及其MATLAB实现

主要参考书:

MATLAB 6.5 辅助优化计算与设计 飞思科技产品研发中心编著

电子工业出版社 2003.1

遗传算法及其应用 陈国良等编著

人民邮电出版社 1996.6

主要内容:

遗传算法简介

遗传算法的MATLAB实现

应用举例

在工业工程中,许多最优化问题性质十分复杂,很难用

传统的优化方法来求解.自1960年以来,人们对求解这类难

解问题日益增加.一种模仿生物自然进化过程的、被称为“

进化算法(evolutionary algorithm)”的随机优化技术在解这

类优化难题中显示了优于传统优化算法的性能。目前,进化

算法主要包括三个研究领域:遗传算法、进化规划和进化

策略。其中遗传算法是迄今为止进化算法中应用最多、比较

成熟、广为人知的算法。

一、遗传算法简介

遗传算法(Genetic Algorithm, GA)最先是由美国Mic-

hgan大学的John Holland于1975年提出的。遗传算法是

模拟达尔文的遗传选择和自然淘汰的生物进化过程的计算

模型。它的思想源于生物遗传学和适者生存的自然规律,

是具有“生存+检测”的迭代过程的搜索算法。遗传算法

以一种群体中的所有个体为对象,并利用随机化技术指

导对一个被编码的参数空间进行高效搜索。其中,选择、

交叉和变异构成了遗传算法的遗传操作;参数编码、初始

群体的设定、适应度函数的设计、遗传操作设计、控制参

数设定等5个要素组成了遗传算法的核心内容。

遗传算法的基本步骤:

遗传算法是一种基于生物自然选择与遗传机理的随机

搜索算法,与传统搜索算法不同,遗传算法从一组随机产

生的称为“种群(Population)”的初始解开始搜索过程。种

群中的每个个体是问题的一个解,称为“染色体(chromos

ome)”。染色体是一串符号,比如一个二进制字符串。这

些染色体在后续迭代中不断进化,称为遗传。在每一代中

用“适值(fitness)”来测量染色体的好坏,生成的下一代染

色体称为后代(offspring)。后代是由前一代染色体通过交

叉(crossover)或者变异(mutation)运算形成的。

在新一代形成过程中,根据适度的大小选择部分后代,淘

汰部分后代。从而保持种群大小是常数。适值高的染色体

被选中的概率较高,这样经过若干代之后,算法收敛于最

好的染色体,它很可能就是问题的最优解或次优解。

主要步骤如下所示:

(1)编码:GA在进行搜索之前先将解空间的解数据表示成

遗传空间的基因型串结构数据,这些串结构数据的不同组

合便构成了不同的点。

(2)初始群体的生成:随机产生N个初始串结构数据,每个

串结构数据称为一个个体,N个个体构成了—个群体。

GA以这N个串结构数据作为初始点开始迭代。

(3)适应性值评估检测:适应性函数表明个体或解的优劣性。

对于不同的问题,适应性函数的定义方式也不同。

(4)选择:选择的目的是为了从当前群体个选出优良的个体

,使它们有机会作为父代为下一代繁殖子孙。遗传算法通

过选择过程体现这一思想,进行选择的原则是适应性强的

个体为下一代贡献一个或多个后代的概率大。选择实现了

达尔文的适者生存原则。

(5)交叉:交叉操作是遗传算法中最主要的遗传操作。通过

交叉操作可以得到新一代个体,新个体组合了其父辈个体

的特性。交叉体现了信息交换的思想。

(6)变异:变异首先在群体中随机选择一个个体,对于选中

的个体以一定的概率随机地改变串结构数据中某个串的值。

同生物界一样,GA中变异发生的概率很低,通常取值在

0.001~0.01之间。变异为新个体的产中提供了机会。

实际上,遗传算法中有两类运算:

● 遗传运算:交叉和变异

● 进化运算:选择

GA的计算过程流程图

遗传算法的特点

GA是对问题参数的编码组进行计算,

而不是针对参数本身。

GA的搜索是从问题解的编码组开始搜素、

而不是从单个解开始。

GA使用目标函数值(适应度)这一信息进行搜索,

而不需导数等其他信息。

GA算法使用的选择、交叉、变异这三个算子都是随机操作,

而不是确定规则。

举例图解说明计算流程

二、遗传算法的MATLAB实现

需要如下主函数:

编码和种群生成

function [pop] = initializega(num,bounds,evalFN,evalOps,options)

% pop - the initial, evaluated, random population

% num - the size of the population, i.e. the number to create

% bounds - the number of permutations in an individual (e.g., number

% of cities in a tsp

% evalFN - the evaluation fn, usually the name of the .m file for evaluation

% evalOps- any options to be passed to the eval function defaults [ ]

% options- options to the initialize function, ie. [eps, float/binary, prec]

% where eps is the epsilon value and the second option is 1 for

% orderOps, prec is the precision of the variables defaults [1e-6 1]

交叉

function [c1,c2] = arithXover(p1,p2,bounds,Ops)

% Arith crossover takes two parents P1,P2 and performs an interpolation

% along the line formed by the two parents.

%

% function [c1,c2] = arithXover(p1,p2,bounds,Ops)

% p1 - the first parent ( [solution string function value] )

% p2 - the second parent ( [solution string function value] )

% bounds - the bounds matrix for the solution space

% Ops - Options matrix for arith crossover [gen #ArithXovers]

选择

normGeomSelect:NormGeomSelect is a ranking selection

function based on the normalized geometric distribution.

(基于正态分布的序列选择函数)

变异

function[newPop] = normGeomSelect(oldPop,options)

% NormGeomSelect is a ranking selection function based on

the normalized

% geometric distribution.

%

% function[newPop] = normGeomSelect(oldPop,options)

% newPop - the new population selected from the oldPop

% oldPop - the current population

% options - options to normGeomSelect

[gen probability_of_selecting_best]

一些辅助函数:

f2b :Return the binary representation of the float number

fval(将浮点数转化为二进制数)

b2f:Return the float number corresponing to the binary

representation of bval. (将二进制数转化为

浮点数)

nonUnifMutation: Non uniform mutation changes one

of the parameters of the parent based on a non-uniform

probability distribution. This Gaussian distribution starts wide,

and narrows to a point distribution as the current generation

approaches the maximum generation.

(基于非均一概率分布进行非均一变异)

maxGenTerm:Returns 1, i.e. terminates the GA when the

maximal_generation is reached.

(当迭代次数大于最大迭代次数时,终止遗传算法,返回

为1,否则返回为0。)

roulette:roulette is the traditional selection function with the

probability of surviving equal to the fittness of i / sum of the

fittness of all individuals

三、应用举例

1.计算下列函数的最大值。

f(x)=x+10*sin(5x)+7cos(4x) , x∈[0,9]

方式1 >>gademo

方式2

step 1 编写目标函数gademo1eval1.m

function [sol, val] = gaDemo1eval_r(sol,options)

x=sol(1);

val = x + 10*sin(5*x)+7*cos(4*x);

step 2 生成初始种群,大小为10

initPop=initializega(10,[0, 9],'gademo1eval1',[],[1e-6,1]);

step 3 25次遗传迭代

[x, endPop,bpop,trace] = ga([0 9],'gademo1eval1',[],initPop,...

[1e-6 1 1],'maxGenTerm',25,...

'normGeomSelect',[0.08],...

['arithXover'],[2],...

'nonUnifMutation',[2, 25 ,3])

% Output Arguments:

% x - the best solution found during the course of the

run

% endPop - the final population

% bPop - a trace of the best population

(解的变化)

% traceInfo - a matrix of best and means of the ga

for each generation

(种群平均值的变化)

%

% Input Arguments:

% bounds - a matrix of upper and lower bounds

on the variables

% evalFN - the name of the evaluation .m function

% evalOps

- options to pass to the evaluation function ([NULL])

% startPop - a matrix of solutions that can be initialized

% from initialize.m

% opts - [epsilon, prob_ops ,display]

change required to consider two solutions

different, prob_ops 0 if you want to apply the

% genetic operators probabilisticly to each solution,

1 if you are supplying a deterministic number

of operator applications and display is 1 to output

progress 0 for quiet. ([1e-6 1 0])

% termFN - name of the .m termination function

(['maxGenTerm'])

% termOps - options string to be passed to the termination

function ([100]).

% selectFN - name of the .m selection function

(['normGeomSelect'])

% selectOpts - options string to be passed to select after

% select(pop,#,opts) ([0.08])

% xOverFNS - a string containing blank seperated names

of Xover.m files (['arithXover heuristicXover

simpleXover'])

% xOverOps - A matrix of options to pass to Xover.m files

with the first column being the number of that

xOver to perform similiarly for mutation

([2 0;2 3;2 0])

% mutFNs - a string containing blank seperated names of

mutation.m files (['boundaryMutation

multiNonUnifMutation ...

% nonUnifMutation unifMutation'])

% mutOps - A matrix of options to pass to Xover.m files

with the first column being the number of that

xOver to perform similiarly for mutation

([4 0 0;6 100 3;4 100 3;4 0 0])

2.求sin(x) 在0到3.14之间的最大值.

function [sol, val] = sin1(sol,options)

x=sol(1);

val =sin(x);

initPop=initializega(10,[0, 3.14],'sin1',[],[1e-6,1]);

[x, endPop,bpop,trace] = ga([0 3.14],'sin1',[],initPop,...

[1e-6 1 1],'maxGenTerm',25,...

'normGeomSelect',[0.08],...

['arithXover'],[2],...

'nonUnifMutation',[2, 25 ,3])

3. binaryExample.m

二元函数例子 二进制编码

方式1 >> binaryExample

方式2

function [sol,val] = gaMicheval_r(sol,options)

val = 21.5 + sol(1) * sin(4*pi*sol(1)) + sol(2)*sin(20*pi*sol(2));

%%%%%%%%%%%%%%

global bounds

% Setting the seed back to the beginning for comparison sake

rand('seed',0)

% Crossover Operators

xFns = 'simpleXover';

xOpts = [.4];

% Mutation Operators

mFns = 'binaryMutation';

mOpts = [0.005];

% Termination Operators

termFns = 'maxGenTerm';

termOps = [200]; % 200 Generations

% Selection Function

selectFn = 'roulette'

selectOps = [];

% Evaluation Function

evalFn = 'gaMichEval';

evalOps = [];

% Bounds on the variables

bounds = [-3, 12.1; 4.1, 5.8];

% GA Options [epsilon float/binar display]

gaOpts=[1e-6 0 1];

% Generate an intialize population of size 20

startPop = initializega(20,bounds,'gaMichEval',[],[1e-6 0]);

[x endPop bestPop trace]=ga(bounds,evalFn,evalOps,startPop,gaOpts,...

termFns,termOps,selectFn,selectOps,xFns,xOpts,mFns,mOpts);

% x is the best solution found

x

% endPop is the ending population

endPop

% trace is a trace of the best value and average value of generations

trace

clf

plot(trace(:,1),trace(:,2));

hold on

plot(trace(:,1),trace(:,3));

% Lets increase the population size by running the defaults

%

rand('seed',0)

termOps=[100];

[x endPop bestPop trace]=ga(bounds,evalFn,evalOps,[],gaOpts,termFns,termOps,...

selectFn,selectOps);

% x is the best solution found

x

% endPop is the ending population

%endPop

% trace is a trace of the best value and average value of generations

%trace

% Plot the best over time

clf

plot(trace(:,1),trace(:,2));

% Add the average to the graph

hold on

plot(trace(:,1),trace(:,3));

4. floatExample.m

二元函数例子 浮点编码

global bounds

% Setting the seed to the same for binary

rand('seed',156789)

% Crossover Operators

xFns = 'arithXover heuristicXover simpleXover';

xOpts = [1 0; 1 3; 1 0];

% Mutation Operators

mFns = 'boundaryMutation multiNonUnifMutation nonUnifMutation unifMutation';

mOpts = [2 0 0;3 200 3;2 200 3;2 0 0];

% Termination Operators

termFns = 'maxGenTerm';

termOps = [200]; % 200 Generations

% Selection Function

selectFn = 'normGeomSelect';

selectOps = [0.08];

% Evaluation Function

evalFn = 'gaMichEval';

evalOps = [];

% Bounds on the variables

bounds = [-3 12.1; 4.1 5.8];

% GA Options [epsilon float/binar display]

gaOpts=[1e-6 1 1];

% Generate an intialize population of size 20

startPop = initializega(20,bounds,'gaMichEval',[1e-6 1])

[x endPop bestPop trace]=ga(bounds,evalFn,evalOps,startPop,gaOpts,...

termFns,termOps,selectFn,selectOps,xFns,xOpts,mFns,mOpts);

% x is the best solution found

x

% endPop is the ending population

endPop

% bestPop is the best solution tracked over generations

bestPop

% Plot the best over time

clf

plot(trace(:,1),trace(:,2));

% Add the average to the graph

hold on

plot(trace(:,1),trace(:,3));

% Lets increase the population size by running the defaults

[x endPop bestPop trace]=ga(bounds,evalFn,evalOps,[],gaOpts);

% x is the best solution found

x

% endPop is the ending population

endPop

% bestPop is the best solution tracked over generations

bestPop

% Plot the best over time

clf

plot(trace(:,1),trace(:,2));

% Add the average to the graph

hold on

plot(trace(:,1),trace(:,3));

5. 求解货郎担问题(TSP)

orderBasedExample.m

6. 求解非线性规划问题

max f(x)

s.t. gi(x)<=0,i=1,...,m

hi(x)=0,i=m+1,...,n

x∈Ω

?不可行的后代?

拒绝策略

修复策略

改进遗传算子策略

惩罚策略

e.g. min f(x)=(x1-2)2+(x2-1)2

s.t. g1(x)=x1-2x2+1>=0

g2(x)=x12/4-x22+1>=0

分析:取加法形式的适值函数:

val(x)=f(x)+p(x)

惩罚函数 p(x)由两部分组成,可变乘法因子和

违反约束乘法,其表达式如下:

其中ri是约束i的可变惩罚系数。

步骤如下:

function [sol,eval]=f552(sol,options)

x1=sol(1);

x2=sol(2);

r1=0.1;

r2=0.8;

%约束条件

g1=x1-2*x2+1;

g2=x1.^2/4-x2.^2+1;

%加惩罚项的适值

if (g1>=0)&(g2>=0)

eval=(x1-2).^2+(x2-1).^2;

else

eval=(x1-2).^2+(x2-1).^2+r1*g1+r2*g2;

end

eval=-eval;

%%%%%%%%%%%%%%%%%%%%%%%%%%%

%维数n=2

%设置参数边界

bounds = ones(2,1)*[-1 1];%??????

%遗传算法优化

[p,endPop,bestSols,trace]=ga(bounds,'f552');

p

%性能跟踪

plot(trace(:,1),trace(:,3),'b-')

hold on

plot(trace(:,1),trace(:,2),'r-')

xlabel('Generation');

ylabel('Fittness');

legend('解的变化','种群平均值的变化');

分享:

a4c26d1e5885305701be709a3d33442f.png喜欢

0

a4c26d1e5885305701be709a3d33442f.png赠金笔

加载中,请稍候......

评论加载中,请稍候...

发评论

登录名: 密码: 找回密码 注册记住登录状态

昵   称:

评论并转载此博文

a4c26d1e5885305701be709a3d33442f.png

发评论

以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值