当前位置:文档之家› 基于Matlab的遗传算法程序设计及优化问题求解

基于Matlab的遗传算法程序设计及优化问题求解

基于Matlab的遗传算法程序设计及优化问题求解
基于Matlab的遗传算法程序设计及优化问题求解

曲靖师范学院

学生毕业论文(设计)

题目:基于Matlab的遗传算法程序设计及优化问题求解

院(系):数学与信息科学学院

专业:信息与计算科学

班级:20051121班

学号:2005112104

论文作者:沈秀娟

指导教师:刘俊

指导教师职称:教授

2009年 5月

基于Matlab的遗传算法程序设计及优化问题求解

摘要

遗传算法作为一种新的优化方法,广泛地用于计算科学、模式识别和智能故障诊断等方面,它适用于解决复杂的非线性和多维空间寻优问题,近年来也得到了较为广阔的应用. 本文介绍了遗传算法的发展、原理、特点、应用和改进方法,以及基本操作和求解步骤,再基于Matlab编写程序实现遗传算法并求解函数的优化问题. 程序设计过程表明,用Matlab语言进行优化计算,具有编程语句简单,用法灵活,编程效率高等优点. 经仿真验证,该算法是正确可行的.

关键词:遗传算法;Matlab;优化

Matlab-based genetic algorithm design and optimization of procedures for

problem solving

Abstract:As a new optimizated method,genetic algorithm is widely used in co mputational science,pattern recognition,intelligent fault diagnosisandsoon. It is suitable to solve complex non-linear and multi-dimensionaloptimizatio n problem.And it has been more widely used in recentyears.This paper descri bes the development of genetic algorithms,principle,features,application an d improvement of methods.At the same time,it in-troduces basic operation and solution steps.And then,it achievesgeneticalgorithm on the matlab programmi ng andsolves the function optimization problem.The program design process sh ows that this optimization calculation has advantages of simple programming language,flexible usage and high efficiency in Matlab language.The algorith m iscorrect and feasible by simulated authentication.

Keywords: Genetic algorithm; Matlab;Optimization

目录

1 引言 (1)

2 文献综述 (1)

2.1国内外研究现状及评价 (1)

2.2提出问题 (2)

3 遗传算法的理论研究 (2)

3.1遗传算法的产生背景 (2)

3.2遗传算法的起源与发展 (3)

3.2.1 遗传算法的起源 (3)

3.2.2 遗传算法的发展 (3)

3.3遗传算法的数学基础研究 (4)

3.4遗传算法的组成要素 (6)

3.5遗传算法的基本原理 (7)

3.6遗传算法在实际应用时采取的一般步骤 (8)

3.7遗传算法的基本流程描述 (9)

3.8遗传算法的特点 (10)

3.9遗传算法的改进 (11)

3.10遗传算法的应用领域 (12)

4 基于MATLAB的遗传算法实现 (14)

5 遗传算法的函数优化的应用举例 (17)

6 结论 (18)

6.1主要发现 (18)

6.2启示 (18)

6.3局限性 (19)

6.4努力的方向 (19)

参考文献 (20)

致谢 (21)

附录 (22)

1引言

遗传算法(Genetic Algorithm)是模拟自然界生物进化机制的一种算法即遵循适者生存、优胜劣汰的法则也就是寻优过程中有用的保留无用的则去除. 在科学和生产实践中表现为在所有可能的解决方法中找出最符合该问题所要求的条件的解决方法即找出一个最优解. 这种算法是1960年由Holland提出来的其最初的目的是研究自然系统的自适应行为并设计具有自适应功能的软件系统. 它的特点是对参数进行编码运算不需要有关体系的任何先验知识沿多种路线进行平行搜索不会落入局部较优的陷阱,能在许多局部较优中找到全局最优点是一种全局最优化方法[1-3]. 近年来,遗传算法已经在国际上许多领域得到了应用. 该文将从遗传算法的理论和技术两方面概述目前的研究现状描述遗传算法的主要特点、基本原理以及改进算法,介绍遗传算法的应用领域,并用MATLAB 实现了遗传算法及最优解的求解.

2文献综述

2.1国内外研究现状及评价

国内外有不少的专家和学者对遗传算法的进行研究与改进. 比如:1991年D.WHITEY 在他的论文中提出了基于领域交叉的交叉算子(ADJACENCY BASED CROSSOVER),这个算子是特别针对用序号表示基因的个体的交叉,并将其应用到了TSP问题中,通过实验对其进行了验证. 2002年,戴晓明等应用多种群遗传并行进化的思想,对不同种群基于不同的遗传策略,如变异概率,不同的变异算子等来搜索变量空间,并利用种群间迁移算子来进行遗传信息交流,以解决经典遗传算法的收敛到局部最优值问题. 国内外很多文献都对遗传算法进行了研究. 现查阅到的国内参考文献[1-19]中, 周勇、周明分别在文献[1]、[2]中介绍了遗传算法的基本原理;徐宗本在文献[3]中探讨了包括遗传算法在内的解全局优化问题的各类算法,文本次论文写作提出了明确的思路;张文修、王小平、张铃分别在文献[4]、[5]、[6]从遗传算法的理论和技术两方面概述目前的研究现状;李敏强、吉根林、玄光南分别在文献[7]、[8]、[9]中都不同程度的介绍了遗传算法的特点以及改进算法但未进行深入研究;马玉明、张丽萍、戴晓辉、柴天佑分别在文献[10]、[11]、[12]、[13]中探讨了遗传算法产生的背景、起源和发展;李敏强、徐小龙、林丹、张文修分别在文献[14]、[15]、[16]、[17]探讨了遗传算法的发展现状及以后的发展动向;李敏强,寇纪凇,林丹,李书全在文献[18]中主要论述了遗传算法的具体的实施步

1

骤、应用领域及特点;孙祥,徐流美在文献[19]中主要介绍了Matlab的编程语句及基本用法.

所有的参考文献都从不同角度不同程度的介绍了遗传算法但都不够系统化不够详细和深入.

2.2提出问题

随着研究的深入,人们逐渐认识到在很多复杂情况下要想完全精确地求出其最优解既不可能,也不现实,因而求出近似最优解或满意解是人们的主要着眼点之一. 很多人构造出了各种各样的复杂形式的测试函数,有连续函数,有离散函数,有凸函数,也有凹函数,人们用这些几何特性各异的函数来评价遗传算法的性能. 而对于一些非线性、多模型、多目标的函数优化问题用其他优化方法较难求解遗传算法却可以方便地得到较好的结果. 鉴于遗传算法在函数优化方面的重要性,该文在参考文献[1-19]的基础上,用Matlab语言编写了遗传算法程序, 并通过了调试用一个实际例子来对问题进行了验证,这对在Matlab环境下用遗传算法来解决优化问题有一定的意义.

3遗传算法的理论研究

3.1遗传算法的产生背景

科学研究、工程实际与国民经济发展中的众多问题可归结作“极大化效益、极小化代价”这类典型模型. 求解这类模型导致寻求某个目标函数(有解析表达式或无解析表达式)在特定区域上的最优解. 而为解决最优化问题目标函数和约束条件种类繁多,有的是线性的,有的是非线性的;有的是连续的,有的是离散的;有的是单峰值的,有的是多峰值的. 随着研究的深入,人们逐渐认识到:在很多复杂情况下要想完全精确地求出其最优解既不可能,也不现实,因而求出近似最优解或满意解是人们的主要着眼点之

一. 总的来说,求最优解或近似最优解的方法有三种: 枚举法、启发式算法和搜索算法.

(1)枚举法. 枚举出可行解集合内的所有可行解以求出精确最优解. 对于连续函数,该方法要求先对其进行离散化处理,这样就有可能产生离散误差而永远达不到最优解. 另外,当枚举空间比较大时该方法的求解效率比较低,有时甚至在目前最先进的计算工具上都无法求解.

(2)启发式算法. 寻求一种能产生可行解的启发式规则以找到一个最优解或近似最

优解. 该方法的求解效率虽然比较高,但对每一个需要求解的问题都必须找出其特有的

2

启发式规则,这个启发式规则无通用性不适合于其它问题.

(3)搜索算法. 寻求一种搜索算法,该算法在可行解集合的一个子集内进行搜索操作以找到问题的最优解或近似最优解. 该方法虽然保证了一定能够得到问题的最优解,但若适当地利用一些启发知识就可在近似解的质量和求解效率上达到一种较好的平衡.

随着问题种类的不同以及问题规模的扩大,要寻求一种能以有限的代价来解决上述最优化问题的通用方法仍是一个难题. 而遗传算法却为我们解决这类问题提供了一个

有效的途径和通用框架开创了一种新的全局优化搜索算法.

3.2遗传算法的起源与发展

3.2.1 遗传算法的起源

50年代末到60年代初,自然界生物进化的理论被广泛接受生物学家Fraser,试图通过计算的方法来模拟生物界“遗传与选择”的进化过程,这是遗传算法的最早雏形. 受一些生物学家用计算机对生物系统进行模拟的启发,Holland开始应用模拟遗传算子研究适应性. 在1967年,Bagley关于自适应下棋程序的论文中,他应用遗传算法搜索下棋游戏评价函数的参数集并首次提出了遗传算法这一术语. 1975年,Holland出版了遗传算法历史上的经典著作《自然和人工系统中的适应性》,首次明确提出遗传算法的概念. 该著作中系统阐述了遗传算法的基本理论和方法,并提出了模式(schemat atheorem)[4],证明在遗传算子选择、交叉和变异的作用下具有低阶、短定义距以及平均适应度高于群体平均适应度的模式在子代中将以指数级增长. Holand创建的遗传算法,是基于二进制表达的概率搜索方法. 在种群中通过信息交换重新组合新串;根据评价条件概率选择适应性好的串进入下一代;经过多代进化种群最后稳定在适应性好的串上. Holand最初提出的遗传算法被认为是简单遗传算法的基础,也称为标准遗传算法.

3.2.2 遗传算法的发展

(1)20世纪60年代,John Holland教授和他的数位博士受到生物模拟技术的启发,认识到自然遗传可以转化为人工遗传算法. 1962年,John Holland提出了利用群体进化模拟适应性系统的思想,引进了群体、适应值、选择、变异、交叉等基本概念.

(2)1967年,J.D.Bagely在其博士论文中首次提出了“遗传算法”的概念.

(3)1975年,Holland出版了《自然与人工系统中的适应性行为》(Adaptation in Natural and Artificial System).该书系统地阐述了遗传算法的基本理论和方法,提出了遗传算法的基本定理—模式定理,从而奠定了遗传算法的理论基础. 同年De Jong

3

在其博士论文中,首次把遗传算法应用于函数优化问题对遗传算法的机理与参数进行了较为系统地研究并建立了著名的五函数测试平台.

(4)20世纪80年代初,Holland教授实现了第一个基于遗传算法的机器学习系统—分类器系统(Classifier System简称CS),开创了基于遗传算法的机器学习的新概念.

(5)1989年,David Goldberg出版了《搜索、优化和机器学习中的遗传算法》(Genetic Algorithms in Search Optimization and Machine Learning).该书全面系统地总结了当时关于遗传算法的研究成果,结合大量的实例完整的论述了遗传算法的基本原理及应用,奠定了现代遗传算法的基础.

(6)1992年,John R.Koza出版了专著《遗传编程》(Genetic Programming)提出了遗传编程的概念,并成功地把遗传编程的方法应用于人工智能、机器学习、符号处理等方面. 随着遗传算法的不断深入和发展,关于遗传算法的国际学术活动越来越多,遗传算法已成为一个多学科、多领域的重要研究方向.

今天遗传算法的研究已经成为国际学术界跨学科的热门话题之一. 遗传算法是一种有广泛应用前景的算法,但是它的研究和应用在国内尚处于起步阶段. 近年来遗传算法已被成功地应用于工业、经济管理、交通运输、工业设计等不同领域解决了许多问题.例如可靠性优化、流水车间调度、作业车间调度、机器调度、设备布局设计、图像处理以及数据挖掘等.

3.3 遗传算法的数学基础研究

模式定理及隐含并行性原理被看作遗传算法的两大基石,后来又提出了建筑块假设,但是模式定理无法解释遗传算法实际操作中的许多现象,隐性并行性的论证存在严重漏洞,而建筑块假设却从未得到过证明. 对遗传算法的基础理论的研究主要分三个方面:模式定理的拓广和深入、遗传算法的新模型、遗传算法的收敛性理论.

(1)模式定理的拓广和深入. Holland给出模式定理:具有短的定义长度、低阶、并且模式采样的平均适应值在种群平均适应值以上的模式在遗传迭代过程中将按指数增

长率被采样模式定理可表达为:

m(H,t+1)≥m(H,t).

()

f

H

f

.()?

?

?

?

?

-

-

-P

H

O

l

P m

H

c

.

1

.

1

δ

(1)

其中m(Ht):在t代群体中存在模式H 的串的个数.

4

()H

f:在t 代群体中包含模式H 的串的平均适应值. f:t代群体中所有串的平均适应值.

l表示串的长度p

c 表示交换概率p

m

表示变异概率.

Holland的模式定理奠定了遗传算法的数学基础根据隐性并行性得出每一代处理有效模式的下限值是()l c n2113.其中n是种群的大小c1是小整数. Bertoui和Dorigo进行了深入的研究获得当2βl

n=,β为任意值时处理多少有效模式的表达式. 上海交通大学的恽为民等获得每次至少产生()

21-n

o数量级的结果. 模式定理中模式适应度难以计算和分析A.D.Berthke首次提出应用Walsh函数进行遗传算法的模式处理并引入模式变换

的概念采用Walsh函数的离散形式有效地计算出模式的平均适应度并对遗传算法进行了有效的分析. 1972年Frantz首先发现一种常使GA从全局最优解发散出去的问题,称为GA-欺骗题[5]. Goldberg最早运用Walsh模式转换设计出最小的GA-欺骗问题并进行了详细分析.

(2)遗传算法的新模型. 由于遗传算法中的模式定理和隐性并行性存在不足之处,为了搞清楚遗传算法的机理,近几年来人们建立了各种形式的新模型最为典型的是马氏链模型遗传算法的马氏链模型[6-7],主要由三种分别是种群马氏链模型、Vose模型和Cerf 扰动马氏链模型. 种群马氏链模型将遗传算法的种群迭代序列视为一个有限状态马氏

链来加以研究,运用种群马氏链模型转移概率矩阵的某些一般性质分析遗传算法的极限行为,但转移概率的具体形式难以表达妨碍了对遗传算法的有限时间行为的研究;Vose 模型是在无限种群假设下利用相对频率导出,表示种群的概率的向量的迭代方程,通过这一迭代方程的研究,可以讨论种群概率的不动点及其稳定性,从而导致对遗传算法的极限行为的刻画,但对解释有限种群遗传算法的行为的能力相对差一些. Cerf扰动模型是法国学者Cerf将遗传算法看成一种特殊形式的广义模拟退火模型,利用了动力系统的随机扰动理论,对遗传算法的极限行为及收敛速度进行了研究. 还有其它改进模型,例如张铃、张钹等人提出的理想浓度模型,它首先引入浓度和家族的概念,通过浓度计算建立理想浓度模型[8-10],其浓度变化的规律为:

5

c(Hi,t +1)=c(H,t).

()

()

()t f

t

O

H

f

i

,

(2)

c(Hi,t+1)表示模式Hi在t时刻的浓度,并对其进行分析,得出结论:遗传算法本质上是一个具有定向制导的随机搜索技术,其定向制导原则是导向适应度高的模式为祖先的染色体“家族”方向.

(3)遗传算法的收敛性理论. 对于遗传算法的马氏链分析本身就是建立遗传算法的收敛性理论[11-12], Eiben等用马尔可夫链证明了保留最优个体的遗传算法的概率性全局收敛,Rudolph用齐次有限马尔可夫链证明了具有复制、交换、突变操作的标准遗传算法收敛不到全局最优解,不适合于静态函数的优化问题,建议改变复制策略以达到全局收敛,Back和Muhlenbein研究了达到全局最优解的算法的时间复杂性问题,近几年,徐宗本等人建立起鞅序列模型,利用鞅序列收敛定理证明了遗传算法的收敛性.

3.4遗传算法的组成要素

遗传算法所涉及的五大要素:参数编码、初始群体的设定、适应度函数的设计、遗传操作的设计和控制参数的设定,其具体内容如下:

(1)参数编码. 遗传算法中常用的编码方法是二进制编码,它将问题空间的参数用字符集{0,1}构成染色体位串,符合最小字符集原则,操作简单,便于用模式定理分析.

(2)适应度函数的设计. 适应度函数是评价个体适应环境的能力,使选择操作的依据,是由目标函数变换而成. 对适应度函数唯一的要求是其结果为非负值. 适应度的尺度变换是对目标函数值域的某种映射变换,可克服未成熟收敛和随机漫游现象. 常用的适应度函数尺度变化方法主要有线性变换、幂函数变换和指数变换.[13]

(3)遗传操作的设计. 包括选择、交叉、变异.

①选择(Selection). 选择是用来确定交叉个体,以及被选个体将产生多少个子代个体. 其主要思想是个体的复制概率正比于其适应值,但按比例选择不一定能达到好的效果. 选择操作从早期的轮盘赌选择发展到现在最佳个体保存法、排序选择法、联赛选择法、随机遍历抽样法、局部选择法、柔性分段复制、稳态复制、最优串复制、最优串保留等.

②交叉(Crossover). 交叉是指把两个父代个体的部分结构加以替换重组而生成新个体的操作,其作用是组合出新的个体,在串空间进行有效搜索,同时降低对有效模式的破坏概率. 各种交叉算子均包含两个基本内容:确定交叉点的位置和进行部分基因的

6

交换. 常用的交叉操作方法有单点交叉、双点交叉、一致交叉、均匀交叉、算术交叉、二维交叉、树结构交叉、部分匹配交叉、顺序交叉和周期交叉等等.

③变异(Mutation). 变异是指将个体编码串中的某些基因值用其它基因值来替换,形成一个新的个体. 遗传算法中的变异运算是产生新个体的辅助方法,其目的是使遗传算法具有局部的随机搜索能力和保持群体的多样性. 变异算法包括确定变异点的位置

和进行基因值替换. 常见的变异算子有基本位变异、均匀变异、高斯变异、二元变异、逆转变异、自适应变异等.

(4) 控制参数设定. 遗传算法中需要确定一些参数取值,主要有串长l,群体大小n,交叉概率pc、变异概率pm等,对遗传算法性能影响很大. 目前对参数根据情况进行调整变化研究比较多,而一般确定的参数范围是:n=20~200,pc = 015 ~110,pm =0~0105.

3.5遗传算法的基本原理

在自然界,由于组成生物群体中各个体之间的差异,对所处环境有不同的适应和生存能力,遵照自然界生物进化的基本原则,适者生存、优胜劣汰,将要淘汰那些最差个体,通过交配将父本优秀的染色体和基因遗传给子代,通过染色体核基因的重新组合产生生命力更强的新的个体与由它们组成的新群体. 在特定的条件下,基因会发生突变,产生新基因和生命力更强的新个体;但突变是非遗传的,随着个体不断更新,群体不断朝着最优方向进化,遗传算法是真实模拟自然界生物进化机制进行寻优的. 在此算法中,被研究的体系的响应曲面看作为一个群体,相应曲面上的每一个点作为群体中的一个个体,个体用多维向量或矩阵来描述,组成矩阵和向量的参数相应于生物种组成染色体的基因,染色体用固定长度的二进制串表述,通过交换、突变等遗传操作,在参数的一定范围内进行随机搜索,不断改善数据结构,构造出不同的向量,相当于得到了被研究的不同的解,目标函数值较优的点被保留,目标函数值较差的点被淘汰.[14]由于遗传操作可以越过位垒,能跳出局部较优点,到达全局最优点.

遗传算法是一种迭代算法,它在每一次迭代时都拥有一组解,这组解最初是随机生成的,在每次迭代时又有一组新的解由模拟进化和继承的遗传操作生成,每个解都有一目标函数给与评判,一次迭代成为一代. 经典的遗传算法结构图如下:

7

8

图1 遗传算法的结构图

3.6遗传算法在实际应用时采取的一般步骤

(1)根据求解精度的要求,确定使用二进制的长度. 设值域的取值范围为[a i ,b i ],若要求精确到小数点后6位,则由(b i -a i )×106<2m i -1求得m i 的最小长度,进而可求出位于区间的任一数:

x i =a i +decimal(1001...0012)×

1

2--m i a b i i [15]

(3)

其中,i=1,2, ..., Popsize ;Popsize 为种群中染色体的个数; (2)利用随机数发生器产生种群;

(3)对种群中每一染色体v i ,计算其对应适应度eval(v i ),i=1,2,… ,Popsize ; (4)计算种群适应度之和F :

F=

()v eval i

Popsize

i ∑=1

(4)

(5)计算每个染色体选择概率Pi :

()F

v eval p i i =

(5)

i=1,2, ... ,Popsize ;

(6)计算每个染色体的累加概率q

i

q i =∑

=

i

j

j

p

1

(6)

i=1, 2, ...,Popsize ;

(7)产生一个位于[0,1]区间的随机数序列,其长度为N,如果其中任意一数r

1

则选择第一个染色体,若q

i1-

i

,则选择第i个染色体,i=1,2, ... Popsize,这

样可以获得新一代种群;

(8)对新一代种群进行交叉运算:设交叉概率为p

c

,首先产生一个位于区间[0,1]

内的随机数序列,其长度为N,如果其中任意一数r

c

,则对应染色体被选中(如果选中奇数个,则可以去掉一个),然后在[1,m-1]区间中产生随机数,个数为选中的染色体数的一半,然后根据随机数在对应位置进行交换操作,从而构成新的染色体;

(9)变异操作:设变异概率为p

m

,产生m×N个位于区间[0,1]上的随机数.如果某

一随机数r

m

,则选中对应位变异,构成新的种群;

(10)第一代计算完毕,返回③继续计算,直到达到满意的结果为止.

3.7遗传算法的基本流程描述

随机初始化种群p(0)={x1,x2,...,xn};t=0;计算p(0)中个体的适应值;

while(不满足终止条件)

{ 根据个体的适应值及选择策略从p(t)中选择下一代生成的父体p(t);

执行交叉,变异和再生成新的种群p(t+1) ;

计算p(t+1)中个体的适应值;

t=t+1;

}

伪代码为:

BEGIN:

I=0;

Initialize P(I);

9

Fitness P(I);

While (not Terminate2Condition)

{

I++;

GA2Operation P(I);

Fitness P(I);

}

END.

3.8遗传算法的特点

遗传算法不同于传统的搜索和优化方法. 主要区别在于:

(1)自组织、自适应和自学习性(智能性). 应用遗传算法求解问题时,在编码方案、适应度函数及遗传算子确定后,算法将利用进化过程中获得的信息自行组织搜索. 由于基于自然的选择策略“适者生存、不适者被淘汰”,因而适应度大的个体具有较高的生存概率. 通常适应度大的个体具有更适应环境的基因结构,再通过基因重组和基因突变等遗传操作,就可能产生更适应环境的后代. 进化算法的这种自组织、自适应特征,使它同时具有能根据环境变化来自动发现环境的特性和规律的能力. 自然选择消除了算

法设计过程中的一个最大障碍,即需要事先描述问题的全部特点,并要说明针对问题的不同特点算法应采取的措施.因此,利用遗传算法,我们可以解决那些复杂的非结构化问题.

(2)遗传算法的本质并行性. 遗传算法按并行方式搜索一个种群数目的点,而不是单点. 它的并行性表现在两个方面,一是遗传算法是内在并行的( inherent paralleli sm),即遗传算法本身非常适合大规模并行. 最简单的并行方式是让几百甚至数千台计算机各自进行独立种群的演化计算,运行过程中甚至不进行任何通信(独立的种群之间若有少量的通信一般会带来更好的结果),等到运算结束时才通信比较,选取最佳个体.这种并行处理方式对并行系统结构没有什么限制和要求,可以说,遗传算法适合在目前所有的并行机或分布式系统上进行并行处理,而且对并行效率没有太大影响. 二是遗传算法的内含并行性. 由于遗传算法采用种群的方式组织搜索,因而可同时搜索解空间内的多个区域,并相互交流信息. 使用这种搜索方式,虽然每次只执行与种群规模N成比例的计算,但实质上已进行了大约O(N3)次有效搜索,这就使遗传算法能以较少的计算

10

获得较大的收益.

(3)遗传算法不需要求导或其他辅助知识,而只需要影响搜索方向的目标函数和相

应的适应度函数.

(4)遗传算法强调概率转换规则,而不是确定的转换规则.

(5)遗传算法可以更加直接的应用.

(6)遗传算法对给定问题,可以产生许多的潜在解,最终选择可以由使用者确定. 在某些特殊情况下,如多目标优化问题不止一个解存在,有一组pareto最优解. 这种遗传算法对于确认可替代解集而言是特别合适的.[16-17]

3.9遗传算法的改进

(1)编码表示

Holland在运用模式定理分析编码机制时,建议使用二进制编码,但二进制编码不

能直接反映问题的固有结构精度不高,个体长度大,占用计算机内存多.解决这个问题

的措施有:

①动态编码(dynamic encoding)GA是当算法收敛到某局部最优时增加搜索的精度从而使得在全局最优点附近,可以进行更精确的搜索,增加精度的办法是在保持串长不变的前提下减小搜索区域.

②对于问题的变量是实向量的情形,可以直接采用实数进行编码,这样可以直接在解的表现型上进行遗传操作,从而便于引入与问题领域相关的启发式信息以增加算法的搜索能力.

③复数编码的GA是为了描述和解决二维问题,基因用x+yi表示,其还可以推广到多

维问题的描述中.

④多维实数编码GA使无效交叉发生的可能性大大降低,同时其合理的编码长度也有助于算法在短时间内获得高精度的全局最优解.

⑤在组合优化中,可以使用有序串编码. 当问题的表示是树和图时,我们还可以

使用结构式编码.

(2)适应度函数

适应度函数是用来区分群体中个体好坏的标准,是自然选择的唯一标准,选择的好坏直接影响算法的优劣. 选择的不容易引起两种不利于优化的现象:

①异常个体引起早熟收敛,影响求得全局最优解. 这种现象常出现在小规模群体中.

11

在遗传进化的早期,一些超常个体的适应度很大,在群体中占有很大的比例,这些异常个体因竞争力太突出而控制了选择过程,结果使得算法过早收敛.

②个体差距不大,引起搜索成为随机漫游. 当群体中个体的适应度差别不大,个体间竞争力减弱,特别是平均适应度以接近最佳适应度时,最佳个体与其他许多个体在选择过程中就会有大体相等的选择机会,从而使有目标的优化搜索过程变成无目标的随机漫游,影响求得全面最优解. 对于上述问题可以通过引入适应度函数定标技术来加快收敛速度和跳出局部最优点. 针对第一种情况,我们可以通过缩小相应的适应度函数值降低超常个体的竞争力;对于第二种情况,我们可以放大相应的适应度函数值以拉开个体之间的差距,提高个体间的竞争力.对适应值进行定标就是通过变换改变原适应值间的比例关系,常用的比例变换有线性变换、乘幂变换和指数变换等.

(3)选择策略

优胜劣汰的选择机制使得适应值大的个体有较大的存活机会,不同的选择策略对算法性能有较大的影响. 轮盘赌法是使用最多的选择策略,但这种策略可能会产生较大的抽样误差,于是对此提出了很多的改进方法,如繁殖池选择、Boltzmann选择、非线性排名选择、基于局部竞争机制的选择如(λ+μ)选择等等.

(4)控制参数

控制参数一般有群体大小、交换概率、变异概率等,这些参数对遗传算法性能影响较大. 在标准的遗传算法中采用经验进行估计,这将带来很大的盲目性而影响算法的全局最优性和收敛性,人们意识到这些参数应该随着遗传进化而自适应变化. 基于这一观,Davis提出自适应算子概率方法,即用自适应机制把算子概率与算子产生的个体适应性结合,高适应性值被分配高算子概率. 这种方法较好地解决了这一问题.

3.10遗传算法的应用领域

遗传算法提供了一种求解复杂系统优化问题的通用框架,它不依赖于问题的具体领域,对问题的种类有很强的鲁棒性即健壮性,所以广泛应用于很多学科.下是遗传算法的一些主要应用领域:

(1)函数优化.函数优化是遗传算法的经典应用领域,也是对遗传算法进行性能评价的常用算例.[18]很多人构造出了各种各样的复杂形式的测试函数,有连续函数好有离散函数,有凸函数也有凹函数,人们用这些几何特性各异的函数来评价遗传算法的性能. 而对于一些非线性、多模型、多目标的函数优化问题,用其他优化方法较难求解,遗传

12

算法却可以方便地得到较好的结果.

(2)组合优化. 随着问题规模的扩大,组合优化问题的搜索空间急剧扩大,有时在目前的计算机上用枚举法很难或者甚至不可能得到其精确最优解. 对于这类复杂问题,人们已意识到应把精力放在寻求其满意解上,而遗传算法则是寻求这种满意解的最佳工具之一. 实践证明,遗传算法对于组合优化中的NP完全问题非常有效.,例如,遗传算法已经在求解旅行商问题、背包问题、装箱问题、图形划分问题等方面得到成功的应用.

(3)生产调度问题. 生产调度问题在许多情况下所建立起来的数学模型难以精确求解,即使经过一些简化之后可以进行求解,也会因简化太多而使得求解结果与实际甚远. 因此,目前在现实生产中好主要靠一些经验进行调度. 遗传算法已成为解决复杂高度问题的有效工具,在单件生产车间调度、流水线生产车间调度、生产规划、任务分配等方面遗传算法都得到了有效的应用.

(4)自动控制. 在自动控制领域中许多与优化相关的问题需要求解,遗传算法的应用日益显示了良好的效果. 例如用遗传算法进行航空控制系统的优化、基于遗传算法的模糊控制器优化设计、基于遗传算法的参数辨识、利用遗传算法进行人工神经网络的结构优化设计和权值学习都显示出了遗传算法在这些领域中应用的可能性.

(5)机器人智能控制. 机器人是一类复杂的难以精确建模的人工系统,而遗传算法的起源就来自于对人工自适应系统的研究,所以机器人智能控制理所当然地成为遗传算法的一个重要应用领域. 例如遗传算法已经在移动机器人路径规划、关节机器人运动轨迹规划、机器人逆运动学求解、细胞机器人的结构优化和行动协调等方面得到研究和应用.

(6)图像处理和模式识别. 图像处理和模式识别是计算机视觉中的一个重要研究领域. 在图像处理过程中,如扫描、特征提取、图像分割等不可避免地会产生一些误差这些误差会影响到像处理和识别的效果. 如何使这些误差最小是使视觉达到实用化的重

要要求. 遗传算法在图像处理中的优化计算方面是完全胜任的. 目前已在图像恢复、图像边缘特征提取、几何形状识别等方面得到了应用.

(7)人工生命. 人工生命是用计算机等人工媒体模拟或构造出具有自然生物系统特有行为的人造系统. 自组织能力和自学习能力是人工生命的两大主要特征. 人工生命

与遗传算法有着密切的关系,基于遗传算法的进化模型是研究人工生命现象的重要理论基础. 虽然人工生命的研究尚处于启蒙阶段,但遗传算法已在其进化模型、学习模型、

13

行为模型等方面显示了初步的应用能力. 可以预见,遗传算法在人工生命及复杂自适应系统的模拟与设计、复杂系统突现性理论研究中,将得到更为深入的发展.

(8)遗传程序设计. 1989年,美国Standford大学的Koza教授发展了遗传编程的概念,其基本思想是:采用树型结构表示计算机程序,运用遗传算法的思想,通过自动生成计算机程序来解决问题. 虽然遗传编程的理论尚未成熟,应用也有一些限制,但它已成功地应用于人工智能、机器学习等领域,目前公开的遗传编程实验系统有十多个,例如,Koza开发的ADF系统,White开发的GPELST系统等.

(9)机器学习. 学习能力是高级自适应系统所应具备的能力之一. 基于遗传算法的机器学习,特别是分类器系统,在许多领域得到了应用. 例基于遗传算法的机器学习可用于调整人工神经网络的连接权,也可用于神经网络结构的优化设计.

(10)数据挖掘. 数据挖掘是近几年出现的数据库技术,它能够从大型数据库中提取隐含的、先前未知的、有潜在应用价值的知识和规则. 许多数据挖掘问题可看成是搜索问题,数据库看作是搜索空间,挖掘算法看作是搜索策略. 因此,应用遗传算法在数据库中进行搜索,对随机产生的一组规则进行进化,直到数据库能被该组规则覆盖,从而挖掘出隐含在数据库中的规则. Sunil已成功地开发了一个基于遗传算法的数据挖掘工具,利用该工具对两个飞机失事的真实数据库进行了数据挖掘实验,结果表明遗传算法是进行数据挖掘的有效方法之一.

4基于MATLAB的遗传算法实现

Matlab是一个高性能的计算软件,配备有功能强大的数学函数支持库,适用范围大,编程效率高,语句简单,功能齐备,是世界上顶级的计算与仿真程序软件. 利用Matlab 来编写遗传算法程序简单而且易于操作.

(1)编码

编码就是把一个问题的可行解从其解空间转换到遗传算法能够处理的搜索空间的

转化方法,编码形式决定了重组算子的操作. 遗传算法是对编码后的个体作选择与交叉运算,然后通过这些反复运算达到优化目标. 遗传算法首要的问题是通过编码将决策变量表示成串结构数据. 我们常用的是二进制编码,即用二进制数构成的符号串来表示每个个体. 通常根据搜索精度(sca_var)、决策变量上界(range(2)) 的和下界(range(1))来确定各个二进制字符串的长度(bit_n),搜索精度为sca_var=(range(2)-range(1))./ (2^bit_n—1),然后再随机产生一个的初始种群(be_gen),其规模为popusize. 下面用e

14

ncoding函数来实现编码和产生初始的种群:

function [be_gen,bit_n]=encoding(sca_var,range(1),range(2),popusize)

bit_n=ceil(log2 (( range(2)- range(1))./sca_var));

be_gen= randint( popusize, sum(bit_n));

(2)译码

决策变量经过编码之后,各个个体构成的种群be_gen 要通过解码才能转换成原问题空间的决策变量构成的种群vgen,这样才能计算其相应的各个适应度值.另外,译码首先要求出二进制数对应的十进制数decimal,然后根据下面的公式求出实际决策变量X: X=range(1)+decimal*sca_dec. 通常可以用decoding函数[19]来实现译码的过程:function[vgen,fitness]=decoding(fcn,be_gen,bit_n,range(1),range(2)) popusize=size(be_gen,1);

n_var=length(bit_n);

sca_dec=(range(2)- range(1))./(2^bit_n- 1);

bit_n=cumsun(bit_n);

bit_n=[0 bit_n];

for i=1:n_var

be_var(i)=be_gen(:,bits(i)+1:bit_n(i+1));

var(i)= range(1)(i)+sum(ones(popusize,1)*2.^(size(be_var(i),2)- 1:-

1:0).*be_var(i),2).*sca_dec(i);

end

vgen=[var(1,:)];

for i=1:popusize

fitness(i)=eval([fcn,’(var_gene(i,:))’] );

end

(3)选择

选择就是利用码后求得的各个个体的适应度的大小,从中选出一些适应度高的个体,并淘汰一些适应度较小的个体以生成交配池的过程. 然后再对优良的个体进行交叉和变异操作. 在选择算子中,先找出当前群体中适应度最高和最低的个体,将最佳个体bes_ind 保留并替换最差个体,直接进入下一代,将剩余个体evol_gen 按适应值比例

15

选择法进行操作,即采用轮盘赌(roulettewheel)方式来实现. 这种方式首先计算每个个体的适应值,然后计算出该适应值在群体适应值总和中所占的比例,来表示该个体被选中的概率,这样既能保证最佳个体的适应度值不会减小,最佳个体不会被交叉变异操作所破坏,也能不断提高该群体的平均适应度值. 比例选择法体现了生物进化过程中“优胜劣汰,适者生存”的思想,并且保证将优良的基因遗传给下一代. 我们可以用下面的函数来实现选择算子:

function [evol_gen,bes_ind,max_fitness]=selection(old_gen,fitness)

[min_fitn,expo(b)]=min(fitn); [max_fitn,expo(a)]=max_(fitn);

popusize=length(fitness);

bes_ind=old_gen(expo(a),:);

expo=[1:popusize];expo(expo(a))=0;expo(expo(b))=0;

expo=nonzeros(expo);

evol_gen=old_gen(expo,:);

evol_fitness=fitness(expo,:);

evol_popusize=popusize-2;

posel=evol_fitness/sum(evol_fitness);

poselcum=cusum(posel);

r=rand(1,evol_popusize);

selected=1+sum(poselcum*ones(1,evol_popusize)

(4)重组

重组算子是产生新个体的主要方法,它决定了遗传算法的全局搜索能力. 重组操作的作用是将原有的优良基因遗传给下一代个体. 并生成包含更优良基因的新个体. 通常使用的遗传算子是一点交叉法,就是按交叉概率pc(0

function [new_gen]=recombination(old_gen,pc)

[nouse,match]=sort(rand(size(old_gen,1),1));

match_gen=old_gen(match,:);

16

遗传算法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

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程序

% 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代码资料讲解

遗传算法经典学习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源代码

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程序实例

遗传算法的程序实例 如求下列函数的最大值 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函数的功能是实现目标函数的计算,其公式采用本文示例仿真,可根据不同优化问题予以修改。

基于遗传算法的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实现)

遗传算法求函数最大值(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程序实例

遗传算法程序(一): 说明: fga.m 为遗传算法的主程序; 采用二进制Gray编码,采用基于轮盘赌法的非线性排名选择, 均匀交叉,变异操作,而且还引入了倒位操作! function [BestPop,Trace]=fga(FUN,LB,UB,eranum,popsize,pCross,pMutation,pInversion,options) % [BestPop,Trace]=fmaxga(FUN,LB,UB,eranum,popsize,pcross,pmutation) % Finds a maximum of a function of several variables. % fmaxga solves problems of the form: % max F(X) subject to: LB <= X <= UB % BestPop - 最优的群体即为最优的染色体群 % Trace - 最佳染色体所对应的目标函数值 % FUN - 目标函数 % LB - 自变量下限 % UB - 自变量上限 % eranum - 种群的代数,取100--1000(默认200) % popsize - 每一代种群的规模;此可取50--200(默认100) % pcross - 交叉概率,一般取0.5--0.85之间较好(默认0.8) % pmutation - 初始变异概率,一般取0.05-0.2之间较好(默认0.1) % pInversion - 倒位概率,一般取0.05-0.3之间较好(默认0.2) % options - 1*2矩阵,options(1)=0二进制编码(默认0),option(1)~=0十进制编 %码,option(2)设定求解精度(默认1e-4) % % ------------------------------------------------------------------------ T1=clock; if nargin<3, error('FMAXGA requires at least three input arguments'); end if nargin==3, eranum=200;popsize=100;pCross=0.8;pMutation=0.1;pInversion=0.15;options=[0 1e-4];end if nargin==4, popsize=100;pCross=0.8;pMutation=0.1;pInversion=0.15;options=[0 1e-4];end if nargin==5, pCross=0.8;pMutation=0.1;pInversion=0.15;options=[0 1e-4];end if nargin==6, pMutation=0.1;pInversion=0.15;options=[0 1e-4];end if nargin==7, pInversion=0.15;options=[0 1e-4];end if find((LB-UB)>0) error('数据输入错误,请重新输入(LB

matlab遗传算法程序

matlab遗传算法程序共13个.m文件。 1、B2F.m function [B,len,v]=B2F(sol,bounds) %[B,len]=B2F(x,bounds) 二进制编码函数 %x 编码向量如x=[6 8 9]; %bounds 边界约束ru如bounds=[4 8 ;3 11;6 12;]; %B 二进制编码串 %编码长度L由bounds(2)-bounds(1)决定 %以上为例: % 编码长度向量L=[4 8 6]编成二进制L=[11 1000 110],则len=[2 4 3] % 计算B=x-bound(1)=[2 5 3]编成二进制B=[10 0101 011] n=length(sol); len=[];B=[];v=[]; L=bounds(:,2)-bounds(:,1); L=de2bi(L); for i=1:n len(i)=length(L(i,:)); end v=sol-bounds(:,1)'; for i=1:n B=[B de2bi(v(i),len(i))]; end

2、changes.m function [pops]=changes(cpop,bounds,len,p) %基因突变函数 %function [pops]=changes(pop,bounds,len,p) %pop 种群数目 %bounds 边界约束 %len 每个变量的编码长度 % 如len为[4 3 3];表示有三个变量,第一个变量的二进制编码长度为4,依次类推%p 突变概率 %pops 返回突变后的基因 %p1 基因突变数目 if isempty(p) p=0.01; end [n,m]=size(cpop); pop=cpop; p1=round(sum(len)*n*p); k=0;q=[];v=[]; while(k

遗传算法的原理及MATLAB程序实现

1 遗传算法的原理 1.1 遗传算法的基本思想 遗传算法(genetic algorithms,GA)是一种基于自然选择和基因遗传学原理,借鉴了生物进化优胜劣汰的自然选择机理和生物界繁衍进化的基因重组、突变的遗传机制的全局自适应概率搜索算法。 遗传算法是从一组随机产生的初始解(种群)开始,这个种群由经过基因编码的一定数量的个体组成,每个个体实际上是染色体带有特征的实体。染色体作为遗传物质的主要载体,其内部表现(即基因型)是某种基因组合,它决定了个体的外部表现。因此,从一开始就需要实现从表现型到基因型的映射,即编码工作。初始种群产生后,按照优胜劣汰的原理,逐代演化产生出越来越好的近似解。在每一代,根据问题域中个体的适应度大小选择个体,并借助于自然遗传学的遗传算子进行组合交叉和变异,产生出代表新的解集的种群。这个过程将导致种群像自然进化一样,后代种群比前代更加适应环境,末代种群中的最优个体经过解码,可以作为问题近似最优解。 计算开始时,将实际问题的变量进行编码形成染色体,随机产生一定数目的个体,即种群,并计算每个个体的适应度值,然后通过终止条件判断该初始解是否是最优解,若是则停止计算输出结果,若不是则通过遗传算子操作产生新的一代种群,回到计算群体中每个个体的适应度值的部分,然后转到终止条件判断。这一过程循环执行,直到满足优化准则,最终产生问题的最优解。图1-1给出了遗传算法的基本过程。 1.2 遗传算法的特点 1.2.1 遗传算法的优点 遗传算法具有十分强的鲁棒性,比起传统优化方法,遗传算法有如下优点: 1. 遗传算法以控制变量的编码作为运算对象。传统的优化算法往往直接利用控制变量的实际值的本身来进行优化运算,但遗传算法不是直接以控制变量的值,而是以控制变量的特定形式的编码为运算对象。这种对控制变量的编码处理方式,可以模仿自然界中生物的遗传和进化等机理,也使得我们可以方便地处理各种变量和应用遗传操作算子。 2. 遗传算法具有内在的本质并行性。它的并行性表现在两个方面,一是遗传

遗传算法的MATLAB程序实例讲解学习

遗传算法的M A T L A B 程序实例

遗传算法的程序实例 如求下列函数的最大值 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遗传算法工具箱函数及实例讲解(转引) gaotv5 核心函数: (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。

遗传算法GA的MATLAB代码

MATLAB实现算法代码:GA(遗传算法)——整数编码 function [BestGene,aa] = GA(MaxGeneration,GeneSize,GeneNum,pcross,pmute,minGene,maxGene) Parent = Init(GeneSize,GeneNum,minGene,maxGene); [BestGene,Parent] = KeepBest(Parent); aa = []; for i = 1:MaxGeneration [i 1/value(BestGene)] Child = chose(Parent); Child = cross(Child,pcross); Child = mute(Child,pmute,maxGene); [BestGene,Parent] = KeepBest(Child); aa = [aa;value(BestGene)]; end function GeneInit = Init(GeneSize,GeneNum,minGene,maxGene) GeneInit = []; for i = 1:GeneSize x = []; x = ceil(rand(1,GeneNum).*(maxGene-minGene)) + minGene; GeneInit = [GeneInit;x]; end GeneInit = [GeneInit;x]; function Child = chose(Parent) GeneSize = size(Parent,1); for i = 1:GeneSize x = Parent(i,:); val(i) = value(x); end ValSum = sum(val); val = val / ValSum; for i = 2:GeneSize val(i) = val(i) + val(i-1); end for i = 1:GeneSize randval = rand; if randval <= val(1) Child(i,:) = Parent(1,:); end for j = 2:GeneSize if randval > val(j-1) && randval <= val(j)

遗传算法MATLAB仿真程序

function [pso F] = PSO_2D() % FUNCTION PSO --------USE Particle Swarm Optimization Algorithm %global present; % close all; pop_size = 10; % pop_size 种群大小 part_size = 2; % part_size 粒子大小, ** =n-D gbest = zeros(1,part_size+1); % gbest 当前搜索到的最小的值 max_gen = 80; % max_gen 最大迭代次数 region=zeros(part_size,2); % 设定搜索空间范围 region=[-3,3;-3,3]; % **每一维设定不同范围 rand('state',sum(100*clock)); % 重置随机数发生器状态 arr_present = ini_pos(pop_size,part_size); % present 当前位置,随机初始化,rand()的范围为0~1 v=ini_v(pop_size,part_size); % 初始化当前速度 pbest = zeros(pop_size,part_size+1); % pbest 粒子以前搜索到的最优值,最后一列包括这些值的适应度 w_max = 0.9; % w_max 权系数最大值 w_min = 0.4; v_max = 2; % **最大速度,为粒子的范围宽度 c1 = 2; % 学习因子 c2 = 2; % 学习因子 best_record = zeros(1,max_gen); % best_record记录最好的粒子的适应度。 % ———————————————————————— % 计算原始种群的适应度,及初始化 % ———————————————————————— arr_present(:,end)=ini_fit(arr_present,pop_size,part_size); % for k=1:pop_size % present(k,end) = fitness(present(k,1:part_size)); %计算原始种群的适应度 % end pbest = arr_present; %初始化各个粒子最优值[best_value best_index] = min(arr_present(:,end)); %初始化全局最优,即适应度为全局最小的值,根据需要也可以选取为最大值 gbest = arr_present(best_index,:);

遗传算法及其MATLAB程序代码

遗传算法及其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个串结构数据作为初始点开始迭代。

标准遗传算法的MATLAB实现

%标准遗传算法 %优化函数为f=-(x-1)^2+4,其中,0<=x<=3 %编码长度为10位,编码精度为0.0029 %种群规模设为40,遗传算子分别为比例选择,单点交叉和单点变异。交叉概率0.7,变异概率0.1 %最大进化代数为200代,保优操作。 main.m initial; global G; for G=1:200 crossover; mutation; adapting; keepbest; selection; end result; %初始化函数,随机形成规模为40初始种群 initial.m pop(40,10)=0; best_individual(10)=0; %最优个体 adapt_ave(200)=0; %种群平均适应值 for i=1:40 for j=1:10 if rand>0.5 pop(i,j)=1; else pop(i,j)=0; end end end % pop clear i; clear j; %交叉操作,概率为0.7,单点交叉 crossover.m for i=1:2:39 cross_P=rand; %随机产生一个数,以比较交叉概率 if cross_P<0.9 %交叉概率为0.9 cross_pos=round(10*rand); %交叉位置为0~9,若位置为0或9,则不进行交叉操作if or(cross_pos==0,cross_pos==9) continue; end

for j=cross_pos:10 temp=pop(i,j); pop(i,j)=pop(i+1,j); pop(i+1,j)=temp; end end end clear i; clear j; clear temp; clear cross_P; clear cross_pos; %变异操作,单点变异,变异概率为0.1 mutation.m for i=1:40 if rand<0.1 %通过变异概率 M_pos=round(10*rand); if M_pos~=0 %若变异位为0则无意义 pop(i,M_pos)=1-pop(i,M_pos); end end end clear M_pos; clear i; %计算适应值 adapting.m for i=1:40 adapt(i)=0; end for i=1:40 for j=1:10 if pop(i,j)==1 adapt(i)=adapt(i)+2^(10-j); end end adapt(i)=adapt(i)*0.0029; adapt(i)=-(adapt(i)-1).^2+4; end global adapt_best; global best_pos; adapt_best=0; %最佳个体 best_pos=0; %最佳个体在种群中的位置

相关主题
文本预览
相关文档 最新文档