matlab实用教程 实验十 遗传算法和优化问题

matlab实用教程 实验十 遗传算法和优化问题
matlab实用教程 实验十 遗传算法和优化问题

matlab实用教程实验十遗传算法与优化问题

matlab实用教程实验十遗传算法与优化问题

一、问题背景与实验目的

二、相关函数(命令)及简介

三、实验内容

四、自己动手

一、问题背景与实验目的

遗传算法(Genetic Algorithm—GA),是模拟达尔文的遗传选择和自然淘汰的生物进化过程的计算模型,它是由美国Michigan大学的J.Holland教授于1975年首先提出的.遗传算法作为一种新的全局优化搜索算法,以其简单通用、鲁棒性强、适于并行处理及应用范围广等显著特点,奠定了它作为21世纪关键智能计算之一的地位.

本实验将首先介绍一下遗传算法的基本理论,然后用其解决几个简单的函数最值问题,使读者能够学会利用遗传算法进行初步的优化计算.

1.遗传算法的基本原理

遗传算法的基本思想正是基于模仿生物界遗传学的遗传过程.它把问题的参数用基因代表,把问题的解用染色体代表(在计算机里用二进制码表示),从而得到一个由具有不同染色体的个体组成的群体.这个群体在问题特定的环境里生存竞争,适者有最好的机会生存和产生后代.后代随机化地继承了父代的最好特征,并也在生存环境的控制支配下继续这一过程.群体的染色体都将逐渐适应环境,不断进化,最后收敛到一族最适应环境的类似个体,即得到问题最优的解.值得注意的一点是,现在的遗传算法是受生物进化论学说的启发提出的,这种学说对我们用计算机解决复杂问题很有用,而它本身是否完全正确并不重要(目前生物界对此学说尚有争议).

(1)遗传算法中的生物遗传学概念

由于遗传算法是由进化论和遗传学机理而产生的直接搜索优化方法;故而在这个算法中要用到各种进化和遗传学的概念.

首先给出遗传学概念、遗传算法概念和相应的数学概念三者之间的对应关系.这些概念如下:序号遗传学概念遗传算法概念数学概念

1个体要处理的基本对象、结构也就是可行解

2群体个体的集合被选定的一组可行解

3染色体个体的表现形式可行解的编码

4基因染色体中的元素编码中的元素

5基因位某一基因在染色体中的位置元素在编码中的位置

6适应值个体对于环境的适应程度,或在环境压力下的生存能力可行解所对应的适应函数值7种群被选定的一组染色体或个体根据入选概率定出的一组可行解

8选择从群体中选择优胜的个体,淘汰劣质个体的操作保留或复制适应值大的可行解,去掉小的可行解

9交叉一组染色体上对应基因段的交换根据交叉原则产生的一组新解

10交叉概率染色体对应基因段交换的概率(可能性大小)闭区间[0,1]上的一个值,一般为0.65~0.90

11变异染色体水平上基因变化编码的某些元素被改变

12变异概率染色体上基因变化的概率(可能性大小)开区间(0,1)内的一个值, 一般为0.001~0.01

13进化、

适者生存个体进行优胜劣汰的进化,一代又一代地优化目标函数取到最大值,最优的可行解(2)遗传算法的步骤

遗传算法计算优化的操作过程就如同生物学上生物遗传进化的过程,主要有三个基本操作(或称为算子):选择(Selection)、交叉(Crossover)、变异(Mutation).

遗传算法基本步骤主要是:先把问题的解表示成“染色体”,在算法中也就是以二进制编码的串,在执行遗传算法之前,给出一群“染色体”,也就是假设的可行解.然后,把这些假设的可行解置于问题的“环境”中,并按适者生存的原则,从中选择出较适应环境的“染色体”进行复制,再通过交叉、变异过程产生更适应环境的新一代“染色体”群.经过这样的一代一代地进化,最后就会收敛到最适应环境的一个“染色体”上,它就是问题的最优解.

下面给出遗传算法的具体步骤,流程图参见图1:

第一步:选择编码策略,把参数集合(可行解集合)转换染色体结构空间;

第二步:定义适应函数,便于计算适应值;

第三步:确定遗传策略,包括选择群体大小,选择、交叉、变异方法以及确定交叉概率、变异概率等遗传参数;

第四步:随机产生初始化群体;

第五步:计算群体中的个体或染色体解码后的适应值;

第六步:按照遗传策略,运用选择、交叉和变异算子作用于群体,形成下一代群体;

第七步:判断群体性能是否满足某一指标、或者是否已完成预定的迭代次数,不满足则返回第五步、或者修改遗传策略再返回第六步.

图1 一个遗传算法的具体步骤

遗传算法有很多种具体的不同实现过程,以上介绍的是标准遗传算法的主要步骤,此算法会一直运行直到找到满足条件的最优解为止.

2.遗传算法的实际应用

例1:设

,求

注:这是一个非常简单的二次函数求极值的问题,相信大家都会做.在此我们要研究的不是问题本身,而是借此来说明如何通过遗传算法分析和解决问题.

在此将细化地给出遗传算法的整个过程.

(1)编码和产生初始群体

首先第一步要确定编码的策略,也就是说如何把

到2这个区间内的数用计算机语言表示出来.

编码就是表现型到基因型的映射,编码时要注意以下三个原则:

完备性:问题空间中所有点(潜在解)都能成为GA编码空间中的点(染色体位串)的表现型;

健全性:GA编码空间中的染色体位串必须对应问题空间中的某一潜在解;

非冗余性:染色体和潜在解必须一一对应.

这里我们通过采用二进制的形式来解决编码问题,将某个变量值代表的个体表示为一个{0,1}二进制串.当然,串长取决于求解的精度.如果要设定求解精度到六位小数,由于区间长度为

,则必须将闭区间

分为

等分.因为

所以编码的二进制串至少需要22位.

将一个二进制串(b21b20b19…b1b0)转化为区间

内对应的实数值很简单,只需采取以下两步(Matlab程序参见附录4):

1)将一个二进制串(b21b20b19…b1b0)代表的二进制数化为10进制数:

2)

对应的区间

内的实数:

例如,一个二进制串a=<1000101110110101000111>表示实数0.637197.

=(1000101110110101000111)2=2288967

二进制串<0000000000000000000000>,<1111111111111111111111>,则分别表示区间的两个端点值-1和2.

利用这种方法我们就完成了遗传算法的第一步——编码,这种二进制编码的方法完全符合上述的编码的三个原则.

首先我们来随机的产生一个个体数为4个的初始群体如下:

pop(1)={

<1101011101001100011110>,%% a1

<1000011001010001000010>,%% a2

<0001100111010110000000>,%% a3

<0110101001101110010101>} %% a4(Matlab程序参见附录2)

化成十进制的数分别为:

pop(1)={ 1.523032,0.574022 ,-0.697235 ,0.247238 }

接下来我们就要解决每个染色体个体的适应值问题了.

(2)定义适应函数和适应值

由于给定的目标函数

内的值有正有负,所以必须通过建立适应函数与目标函数的映射关系,保证映射后的适应值非负,而且目标函数的优化方向应对应于适应值增大的方向,也为以后计算各个体的入选概率打下基础.

对于本题中的最大化问题,定义适应函数

,采用下述方法:

式中

既可以是特定的输入值,也可以是当前所有代或最近K代中

的最小值,这里为了便于计算,将采用了一个特定的输入值.

若取

,则当

时适应函数

;当

时适应函数

由上述所随机产生的初始群体,我们可以先计算出目标函数值分别如下(Matlab程序参见附录3):

f [pop(1)]={ 1.226437 , 1.318543 , -1.380607 , 0.933350 }

然后通过适应函数计算出适应值分别如下(Matlab程序参见附录5、附录6):

g[pop(1)]= { 2.226437 , 2.318543 , 0 , 1.933350 }

(3)确定选择标准

这里我们用到了适应值的比例来作为选择的标准,得到的每个个体的适应值比例叫作入选概率.其计算公式如下:

对于给定的规模为n的群体pop={

},个体

的适应值为

,则其入选概率为

由上述给出的群体,我们可以计算出各个个体的入选概率.

首先可得

然后分别用四个个体的适应值去除以

,得:

P(a1)=2.226437 / 6.478330 = 0.343675 %% a1

P(a2)=2.318543 / 6.478330 = 0.357892 %% a2

P(a3)= 0 / 6.478330 = 0 %% a3

P(a4)=1.933350 / 6.478330 = 0.298433 %% a4(Matlab程序参见附录7)

(4)产生种群

计算完了入选概率后,就将入选概率大的个体选入种群,淘汰概率小的个体,并用入选概率最大的个体补入种群,得到与原群体大小同样的种群(Matlab程序参见附录8、附录11).要说明的是:附录11的算法与这里不完全相同.为保证收敛性,附录11的算法作了修正,采用了最佳个体保存方法(elitist model),具体内容将在后面给出介绍.

由初始群体的入选概率我们淘汰掉a3,再加入a2补足成与群体同样大小的种群得到newpop(1)如下:

newpop(1)={

<1101011101001100011110>,%% a1

<1000011001010001000010>,%% a2

<1000011001010001000010>,%% a2

<0110101001101110010101>} %% a4

(5)交叉

交叉也就是将一组染色体上对应基因段的交换得到新的染色体,然后得到新的染色体组,组成新的群体(Matlab程序参见附录9).

我们把之前得到的newpop(1)的四个个体两两组成一对,重复的不配对,进行交叉.(可以在任一位进行交叉)

<110101110 1001100011110>,<1101011101010001000010>

交叉得:

<100001100 1010001000010>,<1000011001001100011110>

<10000110010100 01000010>,<1000011001010010010101>

交叉得:

<01101010011011 10010101>,<0110101001101101000010>

通过交叉得到了四个新个体,得到新的群体jchpop (1)如下:

jchpop(1)={

<1101011101010001000010>,

<1000011001001100011110>,

<1000011001010010010101>,

<0110101001101101000010>}

这里采用的是单点交叉的方法,当然还有多点交叉的方法,不过有些烦琐,这里就不着重介绍了.

(6)变异

变异也就是通过一个小概率改变染色体位串上的某个基因(Matlab程序参见附录10).

现把刚得到的jchpop(1)中第3个个体中的第9位改变,就产生了变异,得到了新的群体pop(2)如下:

pop(2)= {

<1101011101010001000010>,

<1000011001001100011110>,

<1000011011010010010101>,

<0110101001101101000010> }

然后重复上述的选择、交叉、变异直到满足终止条件为止.

(7)终止条件

遗传算法的终止条件有两类常见条件:(1)采用设定最大(遗传)代数的方法,一般可设定为50代,此时就可能得出最优解.此种方法简单易行,但可能不是很精确(Matlab程序参见附录1);(2)根据个体的差异来判断,通过计算种群中基因多样性测度,即所有基因位相似程度来进行控制.

3.遗传算法的收敛性

前面我们已经就遗传算法中的编码、适应度函数、选择、交叉和变异等主要操作的基本内容及设计进行了详细的介绍.作为一种搜索算法,遗传算法通过对这些操作的适当设计和运行,可以实现兼顾全局搜索和局部搜索的所谓均衡搜索,具体实现见下图2所示.

图2 均衡搜索的具体实现图示

应该指出的是,遗传算法虽然可以实现均衡的搜索,并且在许多复杂问题的求解中往往能得到满意的结果,但是该算法的全局优化收敛性的理论分析尚待解决.目前普遍认为,标准遗传算法并不保证全局最优收敛.但是,在一定的约束条件下,遗传算法可以实现这一点.下面我们不加证明地罗列几个定理或定义,供读者参考(在这些定理的证明中,要用到许多概率论知识,特别是有关马尔可夫链的理论,读者可参阅有关文献).

定理1 如果变异概率为

,交叉概率为

,同时采用比例选择法(按个体适应度占群体适应度的比例进行复制),则标准遗传算法的变换矩阵P是基本的.

定理2 标准遗传算法(参数如定理1)不能收敛至全局最优解.

由定理2可以知道,具有变异概率

,交叉概率为

以及按比例选择的标准遗传算法是不能收敛至全局最最优解.我们在前面求解例1时所用的方法就是满足定理1的条件的方法.这无疑是一个令人沮丧的结论.

然而,庆幸的是,只要对标准遗传算法作一些改进,就能够保证其收敛性.具体如下:我们对标准遗传算法作一定改进,即不按比例进行选择,而是保留当前所得的最优解(称作超个体).该超个体不参与遗传.

最佳个体保存方法(elitist model)的思想是把群体中适应度最高的个体不进行配对交叉而直接复制到下一代中.此种选择操作又称复制(copy).De Jong对此方法作了如下定义:

定义设到时刻t(第t代)时,群体中a*(t)为最佳个体.又设A(t+1)为新一代群体,若A(t+1)中不存在a*(t),则把a*(t)作为A(t+1)中的第n+1个个体(其中,n为群体大小)(Matlab程序参见附录11).

采用此选择方法的优点是,进化过程中某一代的最优解可不被交叉和变异操作所破坏.但是,这也隐含了一种危机,即局部最优个体的遗传基因会急速增加而使进化有可能限于局部解.也就是说,该方法的全局搜索能力差,它更适合单峰性质的搜索空间搜索,而不是多峰性质的空间搜索.所以此方法一般都与其他选择方法结合使用.

定理3 具有定理1所示参数,且在选择后保留当前最优值的遗传算法最终能收敛到全局最优解.

当然,在选择算子作用后保留当前最优解是一项比较复杂的工作,因为该解在选择算子作用后可能丢失.但是定理3至少表明了这种改进的遗传算法能够收敛至全局最优解.有意思的是,实际上只要在选择前保留当前最优解,就可以保证收敛,定理4描述了这种情况.

定理4 具有定理1参数的,且在选择前保留当前最优解的遗传算法可收敛于全局最优解.例2:设

,求

,编码长度为5,采用上述定理4所述的“在选择前保留当前最优解的遗传算法”进行

二、相关函数(命令)及简介

本实验的程序中用到如下一些基本的Matlab函数:ones, zeros, sum, size, length, subs, double 等,以及for, while 等基本程序结构语句,读者可参考前面专门关于Matlab的介绍,也可参考其他数学实验章节中的“相关函数(命令)及简介”内容,此略.

三、实验内容

上述例1的求解过程为:

群体中包含六个染色体,每个染色体用22位0—1码,变异概率为0.01,变量区间为

,取Fmin=

,遗传代数为50代,则运用第一种终止条件(指定遗传代数)的Matlab程序为:[Count,Result,BestMember]=Genetic1(22,6,'-x*x+2*x+0.5',-1,2,-2,0.01,50)

执行结果为:

Count =

50

Result =

1.0316 1.0316 1.0316 1.0316 1.0316 1.0316

1.4990 1.4990 1.4990 1.4990 1.4990 1.4990

BestMember =

1.0316

1.4990

图2 例1的计算结果

(注:上图为遗传进化过程中每一代的个体最大适应度;

而下图为目前为止的个体最大适应度——单调递增)

我们通过Matlab软件实现了遗传算法,得到了这题在第一种终止条件下的最优解:当

取1.0316时,

当然这个解和实际情况还有一点出入(应该是

取1时,

),但对于一个计算机算法来说已经很不错了.

我们也可以编制Matlab程序求在第二种终止条件下的最优解.此略,留作练习.实践表明,此时的遗传算法只要经过10代左右就可完成收敛,得到另一个“最优解”,与前面的最优解相差无几.

四、自己动手

1.用Matlab编制另一个主程序Genetic2.m,求例1的在第二种终止条件下的最优解.

提示:一个可能的函数调用形式以及相应的结果为:

[Count,Result,BestMember]=Genetic2(22,6,'-x*x+2*x+0.5',-1,2,-2,0.01,0.00001)

Count =

13

Result =

1.0392 1.0392 1.0392 1.0392 1.0392 1.0392

1.4985 1.4985 1.4985 1.4985 1.4985 1.4985

BestMember =

1.0392

1.4985

可以看到:两组解都已经很接近实际结果,对于两种方法所产生的最优解差异很小.可见这两种终止算法都是可行的,而且可以知道对于例1的问题,遗传算法只要经过10代左右就可以完成收敛,达到一个最优解.

2.按照例2的具体要求,用遗传算法求上述例2的最优解.

3.附录9子程序Crossing.m中的第3行到第7行为注解语句.若去掉前面的%号,则程序的算法思想有什么变化?

4.附录9子程序Crossing.m中的第8行至第13行的程序表明,当Dim(1)>=3时,将交换数组Population的最后两行,即交换最后面的两个个体.其目的是什么?

5.仿照附录10子程序Mutation.m,修改附录9子程序Crossing.m,使得交叉过程也有一个概率值(一般取0.65~0.90);同时适当修改主程序Genetic1.m或主程序Genetic2.m,以便代入交叉概率.

6.设

,求

,要设定求解精度到15位小数.

遗传算法MATLAB完整代码(不用工具箱)

遗传算法解决简单问题 %主程序:用遗传算法求解y=200*exp(-0.05*x).*sin(x)在区间[-2,2]上的最大值clc; clear all; close all; global BitLength global boundsbegin global boundsend bounds=[-2,2]; precision=0.0001; boundsbegin=bounds(:,1); boundsend=bounds(:,2); %计算如果满足求解精度至少需要多长的染色体 BitLength=ceil(log2((boundsend-boundsbegin)'./precision)); popsize=50; %初始种群大小 Generationmax=12; %最大代数 pcrossover=0.90; %交配概率 pmutation=0.09; %变异概率 %产生初始种群 population=round(rand(popsize,BitLength)); %计算适应度,返回适应度Fitvalue和累计概率cumsump [Fitvalue,cumsump]=fitnessfun(population); Generation=1; while Generation

2019年matlab优化工具箱的使用

优化工具箱的使用 MATLAB的优化工具箱提供了各种优化函数,这些优化函数可以通过在命令行输入相应的函数名加以调用;此外为了使用方便,MA TLAB还提供了图形界面的优化工具(GUI Optimization tool)。 1 GUI优化工具 GUI优化工具的启动 有两种启动方法: (1)在命令行输入optimtool; (2)在MA TLAB主界面单击左下角的“Start”按钮,然后依次选择“Toolboxes→Optimization→Optimization tool” GUI优化工具的界面 界面分为三大块: 左边(Problem Setup and Results)为优化问题的描述及计算结果显示; 中间(Options)为优化选项的设置; 右边(Quick Reference)为帮助。为了界面的简洁,可以单击右上角“<<”、“>>”的按钮将帮助隐藏或显示。 1、优化问题的描述及计算结果显示 此板块主要包括选择求解器、目标函数描述、约束条件描述等部分。 选择合适的求解器以及恰当的优化算法,是进行优化问题求解的首要工作。 ?Solver:选择优化问题的种类,每类优化问题对应不同的求解函数。 ?Algorithm:选择算法,对于不同的求解函数,可用的算法也不同。 Problem框组用于描述优化问题,包括以下内容: ?Objective function: 输入目标函数。 ?Derivatives: 选择目标函数微分(或梯度)的计算方式。 ?Start point: 初始点。 Constraints框组用于描述约束条件,包括以下内容: ?Linear inequalities: 线性不等式约束,其中A为约束系数矩阵,b代表约束向量。 ?Linear equalities: 线性等式约束,其中Aeq为约束系数矩阵,beq代表约束向量。 ?Bounds: 自变量上下界约束。 ?Nonlinear Constraints function; 非线性约束函数。 ?Derivatives: 非线性约束函数的微分(或梯度)的计算方式。 Run solver and view results框组用于显示求解过程和结果。 (对于不同的优化问题类型,此板块可能会不同,这是因为各个求解函数需要的参数个数不一样,如Fminunc 函数就没有Constraints框组。) 2、优化选项(Options) ?Stopping criteria: 停止准则。

MATLAB课程遗传算法实验报告及源代码

硕士生考查课程考试试卷 考试科目: 考生姓名:考生学号: 学院:专业: 考生成绩: 任课老师(签名) 考试日期:年月日午时至时

《MATLAB 教程》试题: A 、利用MATLA B 设计遗传算法程序,寻找下图11个端点最短路径,其中没有连接端点表示没有路径。要求设计遗传算法对该问题求解。 a e h k B 、设计遗传算法求解f (x)极小值,具体表达式如下: 321231(,,)5.12 5.12,1,2,3i i i f x x x x x i =?=???-≤≤=? ∑ 要求必须使用m 函数方式设计程序。 C 、利用MATLAB 编程实现:三名商人各带一个随从乘船渡河,一只小船只能容纳二人,由他们自己划行,随从们密约,在河的任一岸,一旦随从的人数比商人多,就杀人越货,但是如何乘船渡河的大权掌握在商人手中,商人们怎样才能安全渡河? D 、结合自己的研究方向选择合适的问题,利用MATLAB 进行实验。 以上四题任选一题进行实验,并写出实验报告。

选择题目: B 、设计遗传算法求解f (x)极小值,具体表达式如下: 321231(,,)5.12 5.12,1,2,3i i i f x x x x x i =?=???-≤≤=? ∑ 要求必须使用m 函数方式设计程序。 一、问题分析(10分) 这是一个简单的三元函数求最小值的函数优化问题,可以利用遗传算法来指导性搜索最小值。实验要求必须以matlab 为工具,利用遗传算法对问题进行求解。 在本实验中,要求我们用M 函数自行设计遗传算法,通过遗传算法基本原理,选择、交叉、变异等操作进行指导性邻域搜索,得到最优解。 二、实验原理与数学模型(20分) (1)试验原理: 用遗传算法求解函数优化问题,遗传算法是模拟生物在自然环境下的遗传和进化过程而形成的一种自适应全局优化概率搜索方法。其采纳了自然进化模型,从代表问题可能潜在解集的一个种群开始,种群由经过基因编码的一定数目的个体组成。每个个体实际上是染色体带有特征的实体;初始种群产生后,按照适者生存和优胜劣汰的原理,逐代演化产生出越来越好的解:在每一代,概据问题域中个体的适应度大小挑选个体;并借助遗传算子进行组合交叉和主客观变异,产生出代表新的解集的种群。这一过程循环执行,直到满足优化准则为止。最后,末代个体经解码,生成近似最优解。基于种群进化机制的遗传算法如同自然界进化一样,后生代种群比前生代更加适应于环境,通过逐代进化,逼近最优解。 遗传算法是一种现代智能算法,实际上它的功能十分强大,能够用于求解一些难以用常规数学手段进行求解的问题,尤其适用于求解多目标、多约束,且目标函数形式非常复杂的优化问题。但是遗传算法也有一些缺点,最为关键的一点,即没有任何理论能够证明遗传算法一定能够找到最优解,算法主要是根据概率论的思想来寻找最优解。因此,遗传算法所得到的解只是一个近似解,而不一定是最优解。 (2)数学模型 对于求解该问题遗传算法的构造过程: (1)确定决策变量和约束条件;

最优化方法的Matlab实现(公式(完整版))

第九章最优化方法的MatIab实现 在生活和工作中,人们对于同一个问题往往会提出多个解决方案,并通过各方面的论证从中提取最佳方案。最优化方法就是专门研究如何从多个方案中科学合理地提取出最佳方案的科学。由于优化问题无所不在,目前最优化方法的应用和研究已经深入到了生产和科研的各个领域,如土木工程、机械工程、化学工程、运输调度、生产控制、经济规划、经济管理等,并取得了显著的经济效益和社会效益。 用最优化方法解决最优化问题的技术称为最优化技术,它包含两个方面的内容: 1)建立数学模型即用数学语言来描述最优化问题。模型中的数学关系式反映了最优化问题所要达到的目标和各种约束条件。 2)数学求解数学模型建好以后,选择合理的最优化方法进行求解。 最优化方法的发展很快,现在已经包含有多个分支,如线性规划、整数规划、非线性规划、动态规划、多目标规划等。 9.1 概述 利用Matlab的优化工具箱,可以求解线性规划、非线性规划和多目标规划问题。 具体而言,包括线性、非线性最小化,最大最小化,二次规划,半无限问题,线性、非线性方程(组)的求解,线性、非线性的最小二乘问题。另外,该工具箱还提供了线性、非线性最小化,方程求解,曲线拟合,二次规划等问题中大型课题的求解方法,为优化方法在工程中的实际应用提供了更方便快捷的途径。 9.1.1优化工具箱中的函数 优化工具箱中的函数包括下面几类: 1 ?最小化函数

2.方程求解函数 3.最小—乘(曲线拟合)函数

4?实用函数 5 ?大型方法的演示函数 6.中型方法的演示函数 9.1.3参数设置 利用OPtimSet函数,可以创建和编辑参数结构;利用OPtimget函数,可以获得o PtiOns优化参数。 ? OPtimget 函数 功能:获得OPtiOns优化参数。 语法:

遗传算法Matlab程序

% f(x)=11*sin(6x)+7*cos(5x),0<=x<=2*pi; %%初始化参数 L=16;%编码为16位二进制数 N=32;%初始种群规模 M=48;%M个中间体,运用算子选择出M/2对母体,进行交叉;对M个中间体进行变异 T=100;%进化代数 Pc=0.8;%交叉概率 Pm=0.03;%%变异概率 %%将十进制编码成16位的二进制,再将16位的二进制转成格雷码 for i=1:1:N x1(1,i)= rand()*2*pi; x2(1,i)= uint16(x1(1,i)/(2*pi)*65535); grayCode(i,:)=num2gray(x2(1,i),L); end %% 开始遗传算子操作 for t=1:1:T y1=11*sin(6*x1)+7*cos(5*x1); for i=1:1:M/2 [a,b]=min(y1);%找到y1中的最小值a,及其对应的编号b grayCodeNew(i,:)=grayCode(b,:);%将找到的最小数放到grayCodeNew中grayCodeNew(i+M/2,:)=grayCode(b,:);%与上面相同就可以有M/2对格雷码可以作为母体y1(1,b)=inf;%用来排除已找到的最小值 end for i=1:1:M/2 p=unidrnd(L);%生成一个大于零小于L的数,用于下面进行交叉的位置if rand()

matlab 有关GA优化的例子

核心函数: (1)function [pop]=initializega(num,bounds,eevalFN,eevalOps,options)--初始种群的生成函数 【输出参数】 pop--生成的初始种群 【输入参数】 num--种群中的个体数目 bounds--代表变量的上下界的矩阵 eevalFN--适应度函数 eevalOps--传递给适应度函数的参数 options--选择编码形式(浮点编码或是二进制编码)[precision F_or_B],如 precision--变量进行二进制编码时指定的精度 F_or_B--为1时选择浮点编码,否则为二进制编码,由precision指定精度) (2)function [x,endPop,bPop,traceInfo] = ga(bounds,evalFN,evalOps,startPop,opts,... termFN,termOps,selectFN,selectOps,xOverFNs,xOverOps,mutFNs,mutOps)--遗传算法函数 【输出参数】 x--求得的最优解 endPop--最终得到的种群 bPop--最优种群的一个搜索轨迹 【输入参数】 bounds--代表变量上下界的矩阵 evalFN--适应度函数 evalOps--传递给适应度函数的参数 startPop-初始种群 opts[epsilon prob_ops display]--opts(1:2)等同于initializega的options参数,第三个参数控制是否输出,一般为0。如[1e-6 1 0] termFN--终止函数的名称,如[maxGenTerm] termOps--传递个终止函数的参数,如[100] selectFN--选择函数的名称,如[normGeomSelect] selectOps--传递个选择函数的参数,如[0.08] xOverFNs--交*函数名称表,以空格分开,如[arithXover heuristicXover simpleXover] xOverOps--传递给交*函数的参数表,如[2 02 32 0] mutFNs--变异函数表,如[boundaryMutation multiNonUnifMutation nonUnifMutation unifMutation] mutOps--传递给交*函数的参数表,如[4 0 06 100 34 100 34 0 0] 注意】matlab工具箱函数必须放在工作目录下 【问题】求f(x)=x+10*sin(5x)+7*cos(4x)的最大值,其中0<=x<=9 【分析】选择二进制编码,种群中的个体数目为10,二进制编码长度为20,交*概率为0.95,变异概率为0.08 【程序清单】 编写目标函数 function[sol,eval]=fitness(sol,options) x=sol(1) eval=x+10*sin(5*x)+7*cos(4*x) 把上述函数存储为fitness.m文件并放在工作目录下

遗传算法经典MATLAB代码资料讲解

遗传算法经典学习Matlab代码 遗传算法实例: 也是自己找来的,原代码有少许错误,本人都已更正了,调试运行都通过了的。 对于初学者,尤其是还没有编程经验的非常有用的一个文件 遗传算法实例 % 下面举例说明遗传算法% % 求下列函数的最大值% % f(x)=10*sin(5x)+7*cos(4x) x∈[0,10]% % 将x 的值用一个10位的二值形式表示为二值问题,一个10位的二值数提供的分辨率是每为(10-0)/(2^10-1)≈0.01。% % 将变量域[0,10] 离散化为二值域[0,1023], x=0+10*b/1023, 其 中 b 是[0,1023] 中的一个二值数。% % % %--------------------------------------------------------------------------------------------------------------% %--------------------------------------------------------------------------------------------------------------% % 编程 %----------------------------------------------- % 2.1初始化(编码) % initpop.m函数的功能是实现群体的初始化,popsize表示群体的大小,chromlength表示染色体的长度(二值数的长度),

% 长度大小取决于变量的二进制编码的长度(在本例中取10位)。 %遗传算法子程序 %Name: initpop.m %初始化 function pop=initpop(popsize,chromlength) pop=round(rand(popsize,chromlength)); % rand随机产生每个单元 为{0,1} 行数为popsize,列数为chromlength的矩阵, % roud对矩阵的每个单元进行圆整。这样产生的初始种群。 % 2.2 计算目标函数值 % 2.2.1 将二进制数转化为十进制数(1) %遗传算法子程序 %Name: decodebinary.m %产生[2^n 2^(n-1) ... 1] 的行向量,然后求和,将二进制转化为十进制 function pop2=decodebinary(pop) [px,py]=size(pop); %求pop行和列数 for i=1:py pop1(:,i)=2.^(py-i).*pop(:,i); end pop2=sum(pop1,2); %求pop1的每行之和 % 2.2.2 将二进制编码转化为十进制数(2) % decodechrom.m函数的功能是将染色体(或二进制编码)转换为十进制,参数spoint表示待解码的二进制串的起始位置

最优化算法实验报告(附Matlab程序)

最优化方法(Matlab)实验报告 ——Fibonacci 法 一、实验目的: 用MATLAB 程序实现一维搜索中用Fibonacc 法求解一元单峰函数的极小值问题。二、实验原理: (一)、构造Fibonacci 数列:设数列{}k F ,满足条件: 1、011F F == 2、11 k k k F F F +-=+则称数列{}k F 为Fibonacci 数列。(二)、迭代过程: 首先由下面的迭代公式确定出迭代点: 1 1 1 (),1,...,1(),1,...,1n k k k k k n k n k k k k k n k F a b a k n F F u a b a k n F λ---+--+=+ -=-=+ -=-易验证,用上述迭代公式进行迭代时,第k 次迭代的区间长度缩短比率恰好为 1 n k n k F F --+。故可设迭代次数为n ,因此有11121211221111223231 ()()......()()n n n n n n n n n F F F F F F b a b a b a b a b a F F F F F F F ------= -=?-==?-=-若设精度为L ,则有第n 次迭代得区间长度111 ()n n n b a L b a L F -≤-≤,即 就是 111 ()n b a L F -≤,由此便可确定出迭代次数n 。

假设第k 次迭代时已确定出区间[,]k k a b 以及试探点,[,]k k k k u a b λ∈并且k k u λ<。计算试探点处的函数值,有以下两种可能:(1)若()()k k f f u λ>,则令 111111111,,()() () k k k k k k k k n k k k k k n k a b b f f F a b a F λλμλμμ++++--++++-=====+-计算1()k f μ+的值。(2)()()k k f f u λ≤,则令 111121111,,()() () k k k k k k k k n k k k k k n k a a b f f F a b a F μμλμλλ++++--++++-=====+-计算1()k f λ+的值。 又因为第一次迭代确定出了两个迭代点,以后每迭代一次,新增加一个迭代点,这样在迭代n-1后便计算完了n 个迭代点。因此第n 次迭代中,选用第n-1次的迭代点以及辨别常数δ构造n λ和n μ: 1 1n n n n λλμλδ --==+再用同样的方法进行判断:(1)、若()n f λ>()n f μ则令 1 n n n n a b b λ-==(2)、若()n f λ<=()n f μ则令 1n n n n a a b μ-==这样便可确定出最优解的存在区间[,]n n a b 。

优化方法MATLAB编程——大连理工大学

优化方法上机大作业 学院: 姓名: 学号: 指导老师:肖现涛

第一题 源程序如下: function zy_x = di1ti(x) %di1ti是用来求解优化作业第一题的函数。 x0=x; yimuxulong=0.000001; g0=g(x0);s0=-g0; A=2*ones(100,100); k=0; while k<100 lanmed=-(g0)'*s0/(s0'*A*s0); x=x0+lanmed*s0; g=g(x); k=k+1; if norm(g)

break; end miu=norm(g)^2/norm(g0)^2; s=-g+miu*s0; g0=g; s0=s;x0=x; end function f=f(x) f=(x'*ones(100,1))^2-x'*ones(100,1); function g=g(x) g=(2*x'*ones(100,1))*ones(100,1)-ones(100,1); 代入x0,运行结果如下: >> x=zeros(100,1); >> di1ti(x) After 1 iterations,obtain the optimal solution. The optimal solution is -0.250000. The optimal "x" is "ans". ans =0.005*ones(100,1).

基于遗传算法的matlab源代码

function youhuafun D=code; N=50;%Tunable maxgen=50;%Tunable crossrate=0.5;%Tunable muterate=0.08;%Tunable generation=1; num=length(D); fatherrand=randint(num,N,3); score=zeros(maxgen,N); while generation<=maxgen ind=randperm(N-2)+2;%随机配对交叉 A=fatherrand(:,ind(1:(N-2)/2)); B=fatherrand(:,ind((N-2)/2+1:end)); %多点交叉 rnd=rand(num,(N-2)/2); ind=rnd tmp=A(ind); A(ind)=B(ind); B(ind)=tmp; %%两点交叉 %for kk=1:(N-2)/2 %rndtmp=randint(1,1,num)+1; %tmp=A(1:rndtmp,kk); %A(1:rndtmp,kk)=B(1:rndtmp,kk); %B(1:rndtmp,kk)=tmp; %end fatherrand=[fatherrand(:,1:2),A,B]; %变异 rnd=rand(num,N); ind=rnd[m,n]=size(ind); tmp=randint(m,n,2)+1; tmp(:,1:2)=0; fatherrand=tmp+fatherrand; fatherrand=mod(fatherrand,3); %fatherrand(ind)=tmp; %评价、选择 scoreN=scorefun(fatherrand,D);%求得N个个体的评价函数 score(generation,:)=scoreN; [scoreSort,scoreind]=sort(scoreN); sumscore=cumsum(scoreSort); sumscore=sumscore./sumscore(end); childind(1:2)=scoreind(end-1:end); for k=3:N tmprnd=rand; tmpind=tmprnd difind=[0,diff(t mpind)]; if~any(difind) difind(1)=1; end childind(k)=scoreind(logical(difind)); end fatherrand=fatherrand(:,childind); generation=generation+1; end %score maxV=max(score,[],2); minV=11*300-maxV; plot(minV,'*');title('各代的目标函数值'); F4=D(:,4); FF4=F4-fatherrand(:,1); FF4=max(FF4,1); D(:,5)=FF4; save DData D function D=code load youhua.mat %properties F2and F3 F1=A(:,1); F2=A(:,2); F3=A(:,3); if(max(F2)>1450)||(min(F2)<=900) error('DATA property F2exceed it''s range (900,1450]') end %get group property F1of data,according to F2value F4=zeros(size(F1)); for ite=11:-1:1 index=find(F2<=900+ite*50); F4(index)=ite; end D=[F1,F2,F3,F4]; function ScoreN=scorefun(fatherrand,D) F3=D(:,3); F4=D(:,4); N=size(fatherrand,2); FF4=F4*ones(1,N); FF4rnd=FF4-fatherrand; FF4rnd=max(FF4rnd,1); ScoreN=ones(1,N)*300*11; %这里有待优化

最优化方法matlab作业

实用最优化方法 ——matlab编程作业

题一、 初值为[-1;1] 其中g0、g1分别为不同x值下得导数,f0、f1为函数值 MATLAB程序: x0=[-1;1]; s0=[1;1]; c1=0.1;c2=0.5;a=0;b=inf;d=1;n=0; x1=x0+d*s0; g0=[-400*(x0(2)-x0(1)^2)*x0(1)-2*(1-x0(1));200*(x0(2)-x0(1) ^2)]; g1=[-400*(x1(2)-x1(1)^2)*x1(1)-2*(1-x1(1));200*(x1(2)-x1(1) ^2)]; f1=100*(x1(2)-x1(1)^2)^2+(1-x1(1))^2; f0=100*(x0(2)-x0(1)^2)^2+(1-x0(1))^2; while((f0-f1<-c1*d*g0'*s0)||(g1'*s0

Matlab最优化编程例子

题目:分别用最速下降法、FR 共轭梯度法、DFP 法和BFGS 法求解问题: 22112212minf(x)x 2x x 4x x 3x =-++- 取初始点(1)T x (1,1)=,通过Matlab 编程实现求解过程。 公用函数如下: 1、function f= fun( X ) %所求问题目标函数 f=X(1)^2-2*X(1)*X(2)+4*X(2)^2+X(1)-3*X(2); end 2、function g= gfun( X ) %所求问题目标函数梯度 g=[2*X(1)-2*X(2)+1,-2*X(1)+8*X(2)-3]; end 3、function He = Hess( X ) %所求问题目标函数Hesse 矩阵 n=length(X); He=zeros(n,n); He=[2,-2; -2,4]; End 解法一:最速下降法 function [ x,val,k ] = grad( fun,gfun,x0 ) %功能:用最速下降法求无约束问题最小值 %输入:x0是初始点,fun 和gfun 分别是目标函数和梯度 %输出:x 、val 分别是最优点和最优值,k 是迭代次数 maxk=5000;%最大迭代次数 rho=0.5;sigma=0.4; k=0;eps=10e-6; while (k

遗传算法的MATLAB程序实例

遗传算法的程序实例 如求下列函数的最大值 f(x)=10*sin(5x)+7*cos(4x) x∈[0,10] 一、初始化(编码) initpop.m函数的功能是实现群体的初始化,popsize表示群体的大小,chromlength表示染色体的长度(二值数的长度), 长度大小取决于变量的二进制编码的长度(在本例中取10位)。 代码: %Name: initpop.m %初始化 function pop=initpop(popsize,chromlength) pop=round(rand(popsize,chromlength)); % rand随机产生每个单元为 {0,1} 行数为popsize,列数为chromlength的矩阵, % roud对矩阵的每个单元进行圆整。这样产生的初始种群。 二、计算目标函数值 1、将二进制数转化为十进制数(1) 代码: %Name: decodebinary.m %产生 [2^n 2^(n-1) ... 1] 的行向量,然后求和,将二进制转化为十进制 function pop2=decodebinary(pop) [px,py]=size(pop); %求pop行和例数 for i=1:py pop1(:,i)=2.^(py-1).*pop(:,i); py=py-1; end pop2=sum(pop1,2); %求pop1的每行之和 2、将二进制编码转化为十进制数(2) decodechrom.m函数的功能是将染色体(或二进制编码)转换为十进制,参数spoint表示待解码的二进制串的起始位置。(对于多个变量而言,如有两个变量,采用20为表示,每个变量10为,则第一个变量从1开始,另一个变量从11开始。本例为1),参数1ength表示所截取的长度(本例为10)。 代码: %Name: decodechrom.m %将二进制编码转换成十进制 function pop2=decodechrom(pop,spoint,length) pop1=pop(:,spoint:spoint+length-1); pop2=decodebinary(pop1); 3、计算目标函数值 calobjvalue.m函数的功能是实现目标函数的计算,其公式采用本文示例仿真,可根据不同优化问题予以修改。

最优化方法的Matlab实现(公式完整版)

第九章最优化方法的Matlab实现 在生活和工作中,人们对于同一个问题往往会提出多个解决方案,并通过各方面的论证从中提取最佳方案。最优化方法就是专门研究如何从多个方案中科学合理地提取出最佳方案的科学。由于优化问题无所不在,目前最优化方法的应用和研究已经深入到了生产和科研的各个领域,如土木工程、机械工程、化学工程、运输调度、生产控制、经济规划、经济管理等,并取得了显著的经济效益和社会效益。 用最优化方法解决最优化问题的技术称为最优化技术,它包含两个方面的内容:1)建立数学模型即用数学语言来描述最优化问题。模型中的数学关系式反映了最优化问题所要达到的目标和各种约束条件。 2)数学求解数学模型建好以后,选择合理的最优化方法进行求解。 最优化方法的发展很快,现在已经包含有多个分支,如线性规划、整数规划、非线性规划、动态规划、多目标规划等。 9.1 概述 利用Matlab的优化工具箱,可以求解线性规划、非线性规划和多目标规划问题。具体而言,包括线性、非线性最小化,最大最小化,二次规划,半无限问题,线性、非线性方程(组)的求解,线性、非线性的最小二乘问题。另外,该工具箱还提供了线性、

非线性最小化,方程求解,曲线拟合,二次规划等问题中大型课题的求解方法,为优化方法在工程中的实际应用提供了更方便快捷的途径。 9.1.1 优化工具箱中的函数 优化工具箱中的函数包括下面几类: 1.最小化函数 表9-1 最小化函数表 2.方程求解函数 表9-2 方程求解函数表

3.最小二乘(曲线拟合)函数 表9-3 最小二乘函数表 4.实用函数 表9-4 实用函数表 5.大型方法的演示函数 表9-5 大型方法的演示函数表

基于遗传算法的BP神经网络MATLAB代码

用遗传算法优化BP神经网络的Matlab编程实例(转) 由于BP网络的权值优化是一个无约束优化问题,而且权值要采用实数编码,所以直接利用Matlab遗传算法工具箱。以下贴出的代码是为一个19输入变量,1个输出变量情况下的非线性回归而设计的,如果要应用于其它情况,只需改动编解码函数即可。 程序一:GA训练BP权值的主函数 function net=GABPNET(XX,YY) %-------------------------------------------------------------------------- % GABPNET.m % 使用遗传算法对BP网络权值阈值进行优化,再用BP算法训练网络 %-------------------------------------------------------------------------- %数据归一化预处理 nntwarn off XX=[1:19;2:20;3:21;4:22]'; YY=[1:4]; XX=premnmx(XX); YY=premnmx(YY); YY %创建网络 net=newff(minmax(XX),[19,25,1],{'tansig','tansig','purelin'},'tra inlm'); %下面使用遗传算法对网络进行优化 P=XX; T=YY; R=size(P,1); S2=size(T,1); S1=25;%隐含层节点数 S=R*S1+S1*S2+S1+S2;%遗传算法编码长度 aa=ones(S,1)*[-1,1]; popu=50;%种群规模 save data2 XX YY % 是将 xx,yy 二个变数的数值存入 data2 这个MAT-file,initPpp=initializega(popu,aa,'gabpEval');%初始化种群 gen=100;%遗传代数

多目标优化实例和matlab程序

NSGA-II 算法实例 目前的多目标优化算法有很多, Kalyanmoy Deb 的带精英策略的快速非支配排序遗传算法(NSGA-II) 无疑是其中应用最为广泛也是最为成功的一种。本文用的算法是MATLAB 自带的函数gamultiobj ,该函数是基于NSGA-II 改进的一种多目标优化算法。 一、 数值例子 多目标优化问题 424221********* 4224212212112 12min (,)10min (,)55..55 f x x x x x x x x x f x x x x x x x x x s t x =-++-=-++-≤≤??-≤≤? 二、 Matlab 文件 1. 适应值函数m 文件: function y=f(x) y(1)=x(1)^4-10*x(1)^2+x(1)*x(2)+x(2)^4-x(1)^2*x(2)^2; y(2)=x(2)^4-x(1)^2*x(2)^2+x(1)^4+x(1)*x(2); 2. 调用gamultiobj 函数,及参数设置: clear clc fitnessfcn=@f; %适应度函数句柄 nvars=2; %变量个数 lb=[-5,-5]; %下限 ub=[5,5]; %上限 A=[];b=[]; %线性不等式约束 Aeq=[];beq=[]; %线性等式约束 options=gaoptimset('paretoFraction',0.3,'populationsize',100,'generations', 200,'stallGenLimit',200,'TolFun',1e-100,'PlotFcns',@gaplotpareto); % 最优个体系数paretoFraction 为0.3;种群大小populationsize 为100,最大进化代数generations 为200, % 停止代数stallGenLimit 为200, 适应度函数偏差TolFun 设为1e-100,函数gaplotpareto :绘制Pareto 前端 [x,fval]=gamultiobj(fitnessfcn,nvars,A,b,Aeq,beq,lb,ub,options)

遗传算法求函数极大值(matlab实现)

遗传算法求函数最大值(matlab实现) 一、题目: 寻找f(x)=x2,,当x在0~31区间的最大值。 二、源程序: %遗传算法求解函数最大值 %本程序用到了英国谢菲尔德大学(Sheffield)开发的工具箱GATBX,该工具箱比matlab自带的GATOOL使用更加灵活,但在编写程序方面稍微复杂一些 Close all; Clear all; figure(1); fplot('variable*variable',[0,31]); %画出函数曲线 %以下定义遗传算法参数 GTSM=40; %定义个体数目 ZDYCDS=20; %定义最大遗传代数 EJZWS=5; %定义变量的二进制位数 DG=0.9; %定义代沟 trace=zeros(2, ZDYCDS); %最优结果的初始值

FieldD=[5;-1;2;1;0;1;1]; %定义区域描述器的各个参数%以下为遗传算法基本操作部分,包括创建初始种群、复制、交叉和变异 Chrom=crtbp(GTSM, EJZWS); %创建初始种群,即生成给定 规模的二进制种群和结构gen=0; %定义代数计数器初始值variable=bs2rv(Chrom, FieldD); %对生成的初始种群进行十进制转换 ObjV=variable*variable; %计算目标函数值f(x)=x2 while gen

MATLAB优化应用

methmodeltjut@https://www.360docs.net/doc/ea4456370.html, mathematica MATLAB优化应用 §1 线性规划模型 一、线性规划问题: 实例1:生产计划问题 假设某厂计划生产甲、乙两种产品,现库存主要材料有A类3600公斤,B 类2000公斤,C类3000公斤。每件甲产品需用材料A类9公斤,B类4公斤,C类3公斤。每件乙产品,需用材料A类4公斤,B类5公斤,C类10公斤。甲单位产品的利润70元,乙单位产品的利润120元。问如何安排生产,才能使该厂所获的利润最大。 建立数学模型: 设x1、x2分别为生产甲、乙产品的件数。f为该厂所获总润。 max f=70x1+120x2 s.t 9x1+4x2≤3600 4x1+5x2≤2000 3x1+10x2≤3000 x1,x2≥0 实例2:投资问题 某公司有一批资金用于4个工程项目的投资,其投资各项目时所得的净收益(投入资金百分比)如下表:工程项目收益表

由于某种原因,决定用于项目A的投资不大于其他各项投资之和而用于项目B和C的投资要大于项目D的投资。试确定该公司收益最大的投资分配方案。 建立数学模型: 设x1、x2 、x3 、x4分别代表用于项目A、B、C、D的投资百分数。 max f=0.15x1+0.1x2+0.08 x3+0.12 x4 s.t x1-x2- x3- x4≤0 x2+ x3- x4≥0 x1+x2+x3+ x4=1 x j≥0 j=1,2,3,4 实例3:运输问题 有A、B、C三个食品加工厂,负责供给甲、乙、丙、丁四个市场。三个厂每天生产食品箱数上限如下表: 四个市场每天的需求量如下表: 从各厂运到各市场的运输费(元/每箱)由下表给出: 求在基本满足供需平衡的约束条件下使总运输费用最小。 建立数学模型: 设a i j为由工厂i运到市场j的费用,x i j 是由工厂i运到市场j的箱数。b i 是工厂i的产量,d j是市场j的需求量。

相关文档
最新文档