基于遗传算法的PID参数整定的MATLAB程序代码
- 格式:doc
- 大小:136.50 KB
- 文档页数:17
遗传算法在调节控制系统参数中的应用【摘要】自动化控制系统多采用PID 控制器来调节系统稳定性和动态性,PID 的Kp,Ki,Kd 参数需要合理选择方能达到目标。
遗传算法是一种模拟生物进化寻求最优解的有效算法,本文通过利用GAbx 工具箱实现对控制电机的PID 进行参数优化,利用matlab 的仿真功能可以观察控制效果。
1. 直流伺服电机模型 1.1物理模型图1 直流伺服电机的物理模型αu ---电枢输入电压(V ) a R ---电枢电阻(Ω) S L ---电枢电感(H ) q u ---感应电动势(V ) g T ---电机电磁转矩(N m ⋅) J---转动惯量(2m kg ⋅)B---粘性阻尼系数(s m N ⋅⋅) g i ---流过电枢的电流(A ) θ---电机输出的转角(rad )1.2传递函数利用基尔霍夫定律和牛顿第二定律得出电机基本方程并进行拉布拉斯变换)()()()()()()()()()()(2s s K s U K s I s T s Bs s Js s T s I s L R s I s U s U e q t a g g a a a a q a θθθ⋅=⋅=⋅+⋅=⋅+⋅=-式中:t K 为电机的转动常数(m N ⋅)A ;e K 为感应电动势常数(s V ⋅)radaa R s L +1S1 BJs +1i KC K)(s U a)(s U q)(s I a )(s T g)(s Ω)(s θ图2 直流伺服电机模型方框图消去中间变量得系统的开环传递函数:sK K B Js R s L K s U s s G C t a d ta ]))([()()()(+++==θ系统参数如下:s m uN B m mg J ⋅⋅=⋅=51.3,23.32A m N K K uH L R e t a a )(03.0,75.2,4⋅===Ω=2. PID 校正图3 PID 校正s K sK K s G d ip c ++=)( Kp,Ki,Kd 为比例,积分,微分系数 令Kp=15、Ki=0.8 、Kd=0.6M 文件:J=3.23E-6;B=3.51E-6; Ra=4;La=2.75E-6; Kt=0.03; num= Kt;den=[(J*La) ((J*Ra)+(La*B)) ((B*Ra)+Kt*Kt) 0]; t=0:0.001:0.2; step(num,den,t); Kp=15; Ki=0.8; Kd=0.6;numcf=[Kd Kp Ki]; dencf=[1 0];numf=conv(numcf,num); denf=conv(dencf,den);[numc,denc]=cloop(numf,denf); t=0:0.001:0.04; step(numc,denc,t);matlab 进行仿真,我们可以看出不恰当的PID 参数并不能使系统达到控制系统的要求,因此需要对PID参数进行优化。
本科生毕业设计(论文)论文题目:基于遗传算法的PID参数优化毕业设计(论文)原创性声明和使用授权说明原创性声明本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。
尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得及其它教育机构的学位或学历而使用过的材料。
对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。
作者签名:日期:指导教师签名:日期:使用授权说明本人完全了解大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。
作者签名:日期:学位论文原创性声明本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。
除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。
对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。
本人完全意识到本声明的法律后果由本人承担。
作者签名:日期:年月日学位论文版权使用授权书本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。
本人授权大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。
涉密论文按学校规定处理。
作者签名:日期:年月日导师签名:日期:年月日注意事项1.设计(论文)的内容包括:1)封面(按教务处制定的标准封面格式制作)2)原创性声明3)中文摘要(300字左右)、关键词4)外文摘要、关键词5)目次页(附件不统一编入)6)论文主体部分:引言(或绪论)、正文、结论7)参考文献8)致谢9)附录(对论文支持必要时)2.论文字数要求:理工类设计(论文)正文字数不少于1万字(不包括图纸、程序清单等),文科类论文正文字数不少于1.2万字。
控制理论与应用Control Theory and Applications《自动化技术与应用》2004年第23卷第7期用遗传算法实现PID 参数整定万佑红1,李新华2(1.南京邮电学院电子工程系,江苏 南京 210003; 2.安徽大学电子工程系,安徽 合肥 230001)摘要:PI D 参数整定一直是控制领域中的重要研究问题。
本文在M AT LAB 平台上将遗传算法应用于PI D 参数的自动整定,算法实例仿真取得了良好的效果,为PI D 参数整定方法提供了一种新的尝试。
关键词:PI D 参数;遗传算法中图分类号:TP27312 文献标识码:A 文章编号:100327241(2004)0720007202PID Tu nin g Bas e d O n Ge netic Alg orit h m sWAN You -hong 1,LI Xin -hua 2(1.E lectronics Department of Nanjing University of P osting T echnology ,Nanjing 210003,China ;2.E lectronics Department of AnHui University ,Hefei 230001,China )Abstract :A new method to s olve the tuning of PI D paramrters is proposed in this paper.I t is showed that g ood control effect can be obtained by usingG enetic Alg orithms (G A ).K ey w ords :PI D paramrters ;G A1 引言PI D 控制无需知道被控对象的数学模型,算法简单,鲁棒性好且可靠性高,因此成为一种获得广泛应用的控制策略。
PID控制是工业过程控制中应用最广的策略之一,因此PID控制器参数的优化成为人们关注的问题,它直接影响控制效果的好坏,并和系统的安全、经济运行有着密不可分的关系。
目前PID参数的优化方法有很多,如间接寻优法、梯度法、爬山法等,而在热工系统中单纯形法专家整定法则应用较广。
虽然这些方法都具有良好的寻优特性,但存在着一些弊端,单纯形法对初值比较敏感,容易陷入局部最优化解,造成寻优失败。
专家整定法则需要太多的经验,不同的目标函数对应不同的经验,而整理知识库则是一项长时间的工程。
因此我们选取了遗传算法来进行参数寻优,该方法是一种不需要任何初始信息并可以寻求全局最优解的、高效的优化组合方法。
采用遗传算法进行PID三个系数的整定,具有以下优点:(1)与单纯形法相比,遗传算法同样具有良好的寻优特性,且克服了单纯形法参数初值的敏感性。
在初始条件选择不当的情况下,遗传算法在不需要给出调节器初始参数的情况下,仍能寻找到合适的参数,使控制目标满足要求。
同时单纯形法难以解决多值函数问题以及在多参数寻优(串级系统)中,容易造成寻优失败或时间过长,而遗传算法的特性决定了它能很好地客服以上问题。
(2)与专家整定相比,它具有操作方便、速度快的优点,不需要复杂的规则,只通过字串进行简单地复制、交叉、变异,便可达到寻优。
避免了专家整定法中前期大量的知识库整理工作及大量的仿真实验。
(3)遗传算法是从许多点开始并行操作,在解空间进行高效启发式搜索,克服了从单点出发的弊端及搜索的盲目性,从而使寻优速度更快,避免了过早陷入局部最优解。
(4)遗传算法不仅适用于单目标寻优,而且也适用于多目标寻优,根据不同的控制系统,针对一个或多个目标,遗传算法均能在规定的范围内寻找到合适参数。
遗传算法作为一种全局优化算法,得到越来越广泛的应用。
近年来,遗传算法在控制上的应用日益增多。
二、基于遗传算法的PID整定原理1、参数的确定及表示首先确定参数范围,该范围一般是由用户给定,然后由精度的要求,对其进行编码。
引言PID操纵器结构简单且鲁棒性强,在操纵领域一直被普遍应用。
运算机的进展为在线辩识提供了条件,从而也为在线整定PID参数提供了可能。
PID操纵是工业进程中应用最普遍的策略之一,因此PID 操纵器参数的优化成为人们关注的问题,它直接阻碍操纵成效的好坏,并和系统的平安、经济运行有着密不可分的关系。
目前PID参数的优化方式很多,如:间接寻优法,梯度法,登山法等,而在热工系统中单纯形法、专家整定法那么应用普遍。
尽管二者都具有良好的寻优特性,但却存在一些短处,单纯刑法对初值比较灵敏,容易陷入局部最优解,造成寻优失败。
专家整定法那么需要太多体会,不同的目标函数对应不同的体会,而整理知识库是一项长时刻的工程。
因此咱们选取遗传算法来进行参数寻优,该方式是一种不需要任何初始信息并能够寻求全局最优解的高效的优化组合方式。
第一章:遗传算法和PID操纵原理简介一遗传算法简介大体原理遗传算法是依照生物进化的模型提出的一种优化算法。
遗传算法是从代表问题可能潜在解集的一个群组(popuation)开始的,而一个种群那么由通过基因(gene)编码(coding)的必然数量的个体(individual)组成。
每一个个体事实上是染色体(chromosome)带有特点的实体。
染色体作为遗传物质的要紧载体,即多个基因组合,其内部表现(即基因型)是某种基因组合,它决定了个体的形状的外部表现。
因此,在一开始需要实现从表现型到基因型的映射即编码工作。
由于仿照基因编码的工作很复杂,咱们往往进行简化,如二进制编码。
初代种群产生以后,依照适者生存和优胜劣汰的原理,逐代(genetation)演化产生出愈来愈好的近似解。
在每一代,依照问题域中个体的适应度(fitness)大小挑选(selection)个体,并借助于自然遗传学的遗传算子(genetic operator)进行组合交叉.(crossover)和变异(mutation),产生出代表新的解集的种群。
摘要本文使用的是遗传算法对PID控制器参数的整定,PID控制器是过程控制中应用最为广泛的控制方法,PID控制理论成熟、算法简单、鲁棒性好、可靠性高。
控制器参数的选择决定了控制的稳定性和快速性,关乎系统的可靠性。
因此,PID 控制器参数整定问题是自动控制领域研究的一个重要内容。
实际工业生产过程往往具有非线性、时变性,人工试凑的参数整定方法往往整定不良、性能不佳,对运行工况的适应性很差。
本文基于遗传算法对数字PID控制器进行参数整定,可以提高优化性能,缩短整定时间。
关键词:数字PID控制器;参数整定;遗传算法;二次性能指标1引言PID控制作为比较成熟的控制技术广泛应用于工业生产过程,目前绝大多数底层控制都采用PID控制器。
实际应用中控制器的参数往往采用实验试凑的方法人工整定,该方法往往整定不良、性能不佳,而且对运行工况的适应性很差。
近年来随着计算机技术的广泛应用,人工智能算法PID整定策略发展迅速,如模糊PID、专家PID、神经元网络PID以及遗传算法等。
这些算法能够实现提高优化性能,缩短整定时间,实际应用方便的控制目标。
2PID控制器PID控制器是将偏差的比例(P)、积分(I)、微分(D)通过线性组合构成控制量,对被控对象进行控制的。
模拟PID控制的系统原理图如图1所示。
图1. 模拟PID 控制的系统原理图模拟PID 控制规律为位置式:()()()()01=++tp DI de t u t k e t e t dt T T dt ⎡⎤⎢⎥⎣⎦⎰(1) 当系统采样周期为T 时,对上式离散化处理,可得到离散位置式PID 控制表达式:()()()()()=1--1=++kp i dj e k e k u k k e k k e j T k T ∑(2) 式中=/i p I k k T ,=d p D k k T 。
增量式PID 控制表达式可以表示为:()()()=-1+u k u k u k ∆(3)()()()()()()()()()=--1++-2-1+-2p i d u k k e k e k k e k k e k e k e k ∆(4)3 遗传算法遗传算法(Genetic Algorithm )是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,将达尔文生物进化理论引入参数寻优之中,适应度高的个体越容易被保留,经过若干代数遗传操作,种群各个体的适应度不断提高,直至满足一定的极限条件,获得优化问题最优解。
matlab自整定pid算法
MATLAB中有多种方法可以自整定PID算法,以下是其中两
种常见的方法:
1. Ziegler-Nichols方法:
- 首先,将PID控制器的P和I增益设置为零,将D增益设置
为一个较小的非零值。
- 增加P增益,直到系统出现持续的高频振荡。
记录下此时的
P增益,记为Ku。
- 根据振荡的周期T,计算出临界增益Kc:Kc = 0.6 * Ku。
- 将PID控制器的增益重新设置为零,根据以下公式计算PID
控制器的增益:Kp = 0.6 * Kc,Ki = 1.2 / (T * Kc),Kd = 0.075 / (T * Kc)。
- 将这些增益值设置到PID控制器中,进行实际的控制。
2. AMIGO方法:
- 首先,收集系统的开环响应数据,包括输入信号和输出信号。
- 使用AMIGO工具箱读取数据并进行预处理。
- 选择合适的模型结构,例如一阶传递函数、二阶传递函数等。
- 使用AMIGO工具箱中的模型校准方法,例如最小二乘法或
极大似然法,将模型参数校准到实际数据中。
- 根据得到的模型参数,计算PID控制器的增益值。
- 将这些增益值设置到PID控制器中,进行实际的控制。
根据具体的系统和要求,可以选择适合的自整定方法,并使用MATLAB进行实现。
遗传算法matlab程序代码遗传算法是一种优化算法,用于在给定的搜索空间中寻找最优解。
在Matlab中,可以通过以下代码编写一个基本的遗传算法:% 初始种群大小Npop = 100;% 搜索空间维度ndim = 2;% 最大迭代次数imax = 100;% 初始化种群pop = rand(Npop, ndim);% 最小化目标函数fun = @(x) sum(x.^2);for i = 1:imax% 计算适应度函数fit = 1./fun(pop);% 选择操作[fitSort, fitIndex] = sort(fit, 'descend');pop = pop(fitIndex(1:Npop), :);% 染色体交叉操作popNew = zeros(Npop, ndim);for j = 1:Npopparent1Index = randi([1, Npop]);parent2Index = randi([1, Npop]);parent1 = pop(parent1Index, :);parent2 = pop(parent2Index, :);crossIndex = randi([1, ndim-1]);popNew(j,:) = [parent1(1:crossIndex),parent2(crossIndex+1:end)];end% 染色体突变操作for j = 1:NpopmutIndex = randi([1, ndim]);mutScale = randn();popNew(j, mutIndex) = popNew(j, mutIndex) + mutScale;end% 更新种群pop = [pop; popNew];end% 返回最优解[resultFit, resultIndex] = max(fit);result = pop(resultIndex, :);以上代码实现了一个简单的遗传算法,用于最小化目标函数x1^2 + x2^2。
遗传算法及其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)。
遗传算法程序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'); endif nargin==3, eranum=200;popsize=100;pCross=0.8;pMutation=0.1;pInversion=0.15;options=[0 1e-4];endif nargin==4, popsize=100;pCross=0.8;pMutation=0.1;pInversion=0.15;options=[0 1e-4];endif nargin==5, pCross=0.8;pMutation=0.1;pInversion=0.15;options=[0 1e-4];endif nargin==6, pMutation=0.1;pInversion=0.15;options=[0 1e-4];endif nargin==7, pInversion=0.15;options=[0 1e-4];endif find((LB-UB)>0)error('数据输入错误,请重新输入(LB<UB):');ends=sprintf('程序运行需要约%.4f 秒钟时间,请稍等......',(eranum*popsize/1000));disp(s);global m n NewPop children1 children2 VarNumbounds=[LB;UB]';bits=[];VarNum=size(bounds,1);precision=options(2);%由求解精度确定二进制编码长度bits=ceil(log2((bounds(:,2)-bounds(:,1))' ./ precision));%由设定精度划分区间[Pop]=InitPopGray(popsize,bits);%初始化种群[m,n]=size(Pop);NewPop=zeros(m,n);children1=zeros(1,n);children2=zeros(1,n);pm0=pMutation;BestPop=zeros(eranum,n);%分配初始解空间BestPop,TraceTrace=zeros(eranum,length(bits)+1);i=1;while i<=eranumfor j=1:mvalue(j)=feval(FUN(1,:),(b2f(Pop(j,:),bounds,bits)));%计算适应度end[MaxValue,Index]=max(value);BestPop(i,:)=Pop(Index,:);Trace(i,1)=MaxValue;Trace(i,(2:length(bits)+1))=b2f(BestPop(i,:),bounds,bits);[selectpop]=NonlinearRankSelect(FUN,Pop,bounds,bits);%非线性排名选择[CrossOverPop]=CrossOver(selectpop,pCross,round(unidrnd(eranum-i)/eranum));%采用多点交叉和均匀交叉,且逐步增大均匀交叉的概率%round(unidrnd(eranum-i)/eranum)[MutationPop]=Mutation(CrossOverPop,pMutation,VarNum);%变异[InversionPop]=Inversion(MutationPop,pInversion);%倒位Pop=InversionPop;%更新pMutation=pm0+(i^4)*(pCross/3-pm0)/(eranum^4);%随着种群向前进化,逐步增大变异率至1/2交叉率p(i)=pMutation;i=i+1;endt=1:eranum;plot(t,Trace(:,1)');title('函数优化的遗传算法');xlabel('进化世代数(eranum)');ylabel('每一代最优适应度(maxfitness)');[MaxFval,I]=max(Trace(:,1));X=Trace(I,(2:length(bits)+1));hold on; plot(I,MaxFval,'*');text(I+5,MaxFval,['FMAX=' num2str(MaxFval)]);str1=sprintf('进化到%d 代,自变量为%s 时,得本次求解的最优值%f\n对应染色体是:%s',I,num2str(X),MaxFval,num2str(BestPop(I,:)));disp(str1);%figure(2);plot(t,p);%绘制变异值增大过程T2=clock;elapsed_time=T2-T1;if elapsed_time(6)<0elapsed_time(6)=elapsed_time(6)+60; elapsed_time(5)=elapsed_time(5)-1;endif elapsed_time(5)<0elapsed_time(5)=elapsed_time(5)+60;elapsed_time(4)=elapsed_time(4)-1;end %像这种程序当然不考虑运行上小时啦str2=sprintf('程序运行耗时%d 小时%d 分钟%.4f 秒',elapsed_time(4),elapsed_time(5),elapsed_time(6));disp(str2);%初始化种群%采用二进制Gray编码,其目的是为了克服二进制编码的Hamming悬崖缺点function [initpop]=InitPopGray(popsize,bits)len=sum(bits);initpop=zeros(popsize,len);%The whole zero encoding individualfor i=2:popsize-1pop=round(rand(1,len));pop=mod(([0 pop]+[pop 0]),2);%i=1时,b(1)=a(1);i>1时,b(i)=mod(a(i-1)+a(i),2)%其中原二进制串:a(1)a(2)...a(n),Gray串:b(1)b(2)...b(n)initpop(i,:)=pop(1:end-1);endinitpop(popsize,:)=ones(1,len);%The whole one encoding individual%解码function [fval] = b2f(bval,bounds,bits)% fval - 表征各变量的十进制数% bval - 表征各变量的二进制编码串% bounds - 各变量的取值范围% bits - 各变量的二进制编码长度scale=(bounds(:,2)-bounds(:,1))'./(2.^bits-1); %The range of the variablesnumV=size(bounds,1);cs=[0 cumsum(bits)];for i=1:numVa=bval((cs(i)+1):cs(i+1));fval(i)=sum(2.^(size(a,2)-1:-1:0).*a)*scale(i)+bounds(i,1);end%选择操作%采用基于轮盘赌法的非线性排名选择%各个体成员按适应值从大到小分配选择概率:%P(i)=(q/1-(1-q)^n)*(1-q)^i, 其中P(0)>P(1)>...>P(n), sum(P(i))=1function [selectpop]=NonlinearRankSelect(FUN,pop,bounds,bits)global m nselectpop=zeros(m,n);fit=zeros(m,1);for i=1:mfit(i)=feval(FUN(1,:),(b2f(pop(i,:),bounds,bits)));%以函数值为适应值做排名依据endselectprob=fit/sum(fit);%计算各个体相对适应度(0,1)q=max(selectprob);%选择最优的概率x=zeros(m,2);x(:,1)=[m:-1:1]';[y x(:,2)]=sort(selectprob);r=q/(1-(1-q)^m);%标准分布基值newfit(x(:,2))=r*(1-q).^(x(:,1)-1);%生成选择概率newfit=cumsum(newfit);%计算各选择概率之和rNums=sort(rand(m,1));fitIn=1;newIn=1;while newIn<=mif rNums(newIn)<newfit(fitIn)selectpop(newIn,:)=pop(fitIn,:);newIn=newIn+1;elsefitIn=fitIn+1;endend%交叉操作function [NewPop]=CrossOver(OldPop,pCross,opts)%OldPop为父代种群,pcross为交叉概率global m n NewPopr=rand(1,m);y1=find(r<pCross);y2=find(r>=pCross);len=length(y1);if len>2&mod(len,2)==1%如果用来进行交叉的染色体的条数为奇数,将其调整为偶数y2(length(y2)+1)=y1(len);y1(len)=[];endif length(y1)>=2for i=0:2:length(y1)-2if opts==0[NewPop(y1(i+1),:),NewPop(y1(i+2),:)]=EqualCrossOver(OldPop(y1(i+1),:),OldPop(y1(i+2),:));else[NewPop(y1(i+1),:),NewPop(y1(i+2),:)]=MultiPointCross(OldPop(y1(i+1),:),OldPop(y1(i+2),:));endendendNewPop(y2,:)=OldPop(y2,:);%采用均匀交叉function [children1,children2]=EqualCrossOver(parent1,parent2)global n children1 children2hidecode=round(rand(1,n));%随机生成掩码crossposition=find(hidecode==1);holdposition=find(hidecode==0);children1(crossposition)=parent1(crossposition);%掩码为1,父1为子1提供基因children1(holdposition)=parent2(holdposition);%掩码为0,父2为子1提供基因children2(crossposition)=parent2(crossposition);%掩码为1,父2为子2提供基因children2(holdposition)=parent1(holdposition);%掩码为0,父1为子2提供基因%采用多点交叉,交叉点数由变量数决定function [Children1,Children2]=MultiPointCross(Parent1,Parent2)global n Children1 Children2 VarNumChildren1=Parent1;Children2=Parent2;Points=sort(unidrnd(n,1,2*VarNum));for i=1:VarNumChildren1(Points(2*i-1):Points(2*i))=Parent2(Points(2*i-1):Points(2*i));Children2(Points(2*i-1):Points(2*i))=Parent1(Points(2*i-1):Points(2*i));end%变异操作function [NewPop]=Mutation(OldPop,pMutation,VarNum)global m n NewPopr=rand(1,m);position=find(r<=pMutation);len=length(position);if len>=1for i=1:lenk=unidrnd(n,1,VarNum); %设置变异点数,一般设置1点for j=1:length(k)if OldPop(position(i),k(j))==1OldPop(position(i),k(j))=0;elseOldPop(position(i),k(j))=1;endendendendNewPop=OldPop;%倒位操作function [NewPop]=Inversion(OldPop,pInversion)global m n NewPopNewPop=OldPop;r=rand(1,m);PopIn=find(r<=pInversion);len=length(PopIn);if len>=1for i=1:lend=sort(unidrnd(n,1,2));if d(1)~=1&d(2)~=nNewPop(PopIn(i),1:d(1)-1)=OldPop(PopIn(i),1:d(1)-1);NewPop(PopIn(i),d(1):d(2))=OldPop(PopIn(i),d(2):-1:d(1));NewPop(PopIn(i),d(2)+1:n)=OldPop(PopIn(i),d(2)+1:n);endend end。
遗传算法的matlab代码摘要:遗传算法是一种基于自然选择和遗传学原理的优化算法。
本文将介绍如何在MATLAB中实现遗传算法,并使用一个简单的例子来说明其应用。
1. 引言遗传算法(Genetic Algorithm, GA)是一种基于自然选择和遗传学原理的优化算法。
它模拟了自然界中生物的进化过程,通过不断地搜索、适应和优化,最终找到问题的最优解。
MATLAB是一种广泛使用的编程语言和软件环境,它提供了丰富的数学计算和可视化工具,使得在MATLAB中实现遗传算法变得相对简单。
2. 遗传算法的基本原理遗传算法主要包括以下几个步骤:1) 初始化:随机生成一组候选解(称为种qun)。
2) 选择:从种qun中按照一定的概率选择出优秀的个体进行繁殖。
3) 交叉:从选择出的个体中随机选择两个进行交叉操作,生成新的后代。
4) 变异:对后代进行变异操作,以增大种qun的多样性。
5) 迭代:重复进行选择、交叉和变异操作,直到达到预设的迭代次数或满足其他终止条件。
3. MATLAB实现遗传算法在MATLAB中实现遗传算法,可以使用自带的gaoptimset和ga函数。
下面是一个简单的例子,说明如何在MATLAB中实现遗传算法。
```matlab```% 定义目标函数fitnessFunction = @(x) x(1)^2 + x(2)^2; % 最小化目标函数```% 定义变量范围lb = [-10, -10]; % 变量下界ub = [10, 10]; % 变量上界```% 初始化参数populationSize = 100; % 种qun大小maxIterations = 500; % 最da迭代次数crossoverRate = 0.8; % 交叉概率mutationRate = 0.1; % 变异概率elitismRate = 0.1; % 精英策略概率```% 初始化种qunpopulation = ga(fitnessFunction, lb, ub, populationSize, maxIterations, elitismRate, crossoverRate, mutationRate);```% 可视化结果figure;plot(population.Fitness,'r');hold on;plot(population.Gen,'g');xlabel('Generation');ylabel('Fitness');title('遗传算法进化过程');```4. 结果分析通过上述代码,我们可以在MATLAB中实现一个简单的遗传算法。
function youhuafunD=code;N=50; % Tunablemaxgen=50; % Tunablecrossrate=0.5; %Tunablemuterate=0.08; %Tunablegeneration=1;num = length(D);fatherrand=randint(num,N,3);score = zeros(maxgen,N);while generation<=maxgenind=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;% endfatherrand=[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:Ntmprnd=rand;tmpind=tmprnd difind=[0,diff(tmpind)];if ~any(difind)difind(1)=1;endchildind(k)=scoreind(logical(difind));endfatherrand=fatherrand(:,childind);generation=generation+1;end% scoremaxV=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 Dfunction D=codeload youhua.mat% properties F2 and F3F1=A(:,1);F2=A(:,2);F3=A(:,3);if (max(F2)>1450)||(min(F2)<=900)error('DATA property F2 exceed it''s range (900,1450]') end% get group property F1 of data, according to F2 value F4=zeros(size(F1));for ite=11:-1:1index=find(F2<=900+ite*50);F4(index)=ite;endD=[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;% 这里有待优化for k=1:NFF4k=FF4rnd(:,k);for ite=1:11F0index=find(FF4k==ite);if ~isempty(F0index)tmpMat=F3(F0index);tmpSco=sum(tmpMat);ScoreBin(ite)=mod(tmpSco,300);endendScorek(k)=sum(ScoreBin);endScoreN=ScoreN-Scorek;遗传算法实例:% 下面举例说明遗传算法%% 求下列函数的最大值%% f(x)=10*sin(5x)+7*cos(4x) x∈[0,10] %% 将x 的值用一个10位的二值形式表示为二值问题,一个10位的二值数提供的分辨率是每为(10-0)/(2^10-1)≈0.01 。
遗传算法matlab代码function youhuafunD=code;N=50; % Tunablemaxgen=50; % Tunablecrossrate=0.5; %Tunablemuterate=0.08; %Tunable generation=1;num = length(D);fatherrand=randint(num,N,3);score = zeros(maxgen,N);while generation<=maxgenind=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;% endfatherrand=[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(tmpind)];if ~any(difind)difind(1)=1;endchildind(k)=scoreind(logical(difind));endfatherrand=fatherrand(:,childind);generation=generation+1;end% scoremaxV=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 Dfunction D=codeload youhua.mat% properties F2 and F3F1=A(:,1);F2=A(:,2);F3=A(:,3);if (max(F2)>1450)||(min(F2)<=900)error('DATA property F2 exceed it''s range (900,1450]') end % get group property F1 of data, according to F2 value F4=zeros(size(F1));for ite=11:-1:1index=find(F2<=900+ite*50);F4(index)=ite;endD=[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;% 这里有待优化for k=1:NFF4k=FF4rnd(:,k);for ite=1:11F0index=find(FF4k==ite);if ~isempty(F0index)tmpMat=F3(F0index);tmpSco=sum(tmpMat);ScoreBin(ite)=mod(tmpSco,300);endendScorek(k)=sum(ScoreBin);endScoreN=ScoreN-Scorek;遗传算法实例:% 下面举例说明遗传算法%% 求下列函数的最大值%% f(x)=10*sin(5x)+7*cos(4x) x∈[0,10] %% 将x 的值用一个10位的二值形式表示为二值问题,一个10位的二值数提供的分辨率是每为(10-0)/(2^10-1)≈0.01 。
遗传算法matlab代码以下是一个简单的遗传算法的MATLAB 代码示例:matlab复制代码% 遗传算法参数设置pop_size = 50; % 种群大小num_vars = 10; % 变量数目num_generations = 100; % 进化的代数mutation_rate = 0.01; % 变异率crossover_rate = 0.8; % 交叉率% 初始化种群population = rand(pop_size, num_vars);% 开始进化for i = 1:num_generations% 计算适应度fitness = evaluate_fitness(population);% 选择操作selected_population = selection(population, fitness);% 交叉操作offspring_population = crossover(selected_population,crossover_rate);% 变异操作mutated_population = mutation(offspring_population,mutation_rate);% 生成新种群population = [selected_population; mutated_population];end% 选择最优解best_solution = population(find(fitness == max(fitness)), :);% 适应度函数function f = evaluate_fitness(population)f = zeros(size(population));for i = 1:size(population, 1)f(i) = sum(population(i, :));endend% 选择函数function selected_population = selection(population, fitness)% 轮盘赌选择total_fitness = sum(fitness);probabilities = fitness / total_fitness;selected_indices = zeros(pop_size, 1);for i = 1:pop_sizer = rand();cumulative_probabilities = cumsum(probabilities);for j = 1:pop_sizeif r <= cumulative_probabilities(j)selected_indices(i) = j;break;endendendselected_population = population(selected_indices, :);end% 交叉函数function offspring_population = crossover(parental_population, crossover_rate)offspring_population = zeros(size(parental_population));num_crossovers = ceil(size(parental_population, 1) *crossover_rate);crossover_indices = randperm(size(parental_population, 1),num_crossovers);以下是另一个一个简单的遗传算法的MATLAB 代码示例:matlab复制代码% 初始化种群population = rand(nPopulation, nGenes);% 进化迭代for iGeneration = 1:nGeneration% 计算适应度fitness = evaluateFitness(population);% 选择父代parentIdx = selection(fitness);parent = population(parentIdx, :);% 交叉产生子代child = crossover(parent);% 变异子代child = mutation(child);% 更新种群population = [parent; child];end% 评估最优解bestFitness = -Inf;for i = 1:nPopulationf = evaluateFitness(population(i, :));if f > bestFitnessbestFitness = f;bestIndividual = population(i, :);endend% 可视化结果plotFitness(fitness);其中,nPopulation和nGenes分别是种群大小和基因数;nGeneration是迭代次数;evaluateFitness函数用于计算个体的适应度;selection函数用于选择父代;crossover函数用于交叉产生子代;mutation函数用于变异子代。
附页:一.遗传算法源程序:clc;clear;population;%评价目标函数值for uim=1:popsizevector=population(uim,:);obj(uim)=hanshu(hromlength,vector,phen); end%obj%min(obj)clear uim;objmin=min(obj);for sequ=1:popsizeif obj(sequ)==objminopti=population(sequ,:);endendclear sequ;fmax=22000;%==for gen=1:maxgen%选择操作%将求最小值的函数转化为适应度函数for indivi=1:popsizeobj1(indivi)=1/obj(indivi);endclear indivi;%适应度函数累加总合total=0;for indivi=1:popsizetotal=total+obj1(indivi);endclear indivi;%每条染色体被选中的几率for indivi=1:popsizefitness1(indivi)=obj1(indivi)/total;endclear indivi;%各条染色体被选中的范围for indivi=1:popsizefitness(indivi)=0;for j=1:indivifitness(indivi)=fitness(indivi)+fitness1(j);endendclear j;fitness;%选择适应度高的个体for ranseti=1:popsizeran=rand;while (ran>1||ran<0)ran=rand;endran;if ran<=fitness(1)newpopulation(ranseti,:)=population(1,:);elsefor fet=2:popsizeif (ran>fitness(fet-1))&&(ran<=fitness(fet))newpopulation(ranseti,:)=population(fet,:);endendendendclear ran;newpopulation;%交叉for int=1:2:popsize-1popmoth=newpopulation(int,:);popfath=newpopulation(int+1,:);popcross(int,:)=popmoth;popcross(int+1,:)=popfath;randnum=rand;if(randnum< P>cpoint1=round(rand*hromlength);cpoint2=round(rand*hromlength);while (cpoint2==cpoint1)cpoint2=round(rand*hromlength);endif cpoint1>cpoint2tem=cpoint1;cpoint1=cpoint2;cpoint2=tem;endcpoint1;cpoint2;for term=cpoint1+1:cpoint2for ss=1:hromlengthif popcross(int,ss)==popfath(term)tem1=popcross(int,ss);popcross(int,ss)=popcross(int,term);popcross(int,term)=tem1;endendclear tem1;endfor term=cpoint1+1:cpoint2for ss=1:hromlengthif popcross(int+1,ss)==popmoth(term)tem1=popcross(int+1,ss);popcross(int+1,ss)=popcross(int+1,term);popcross(int+1,term)=tem1;endendclear tem1;endendclear term;endclear randnum;popcross;%变异操作newpop=popcross;for int=1:popsizerandnum=rand;if randnumcpoint12=round(rand*hromlength);cpoint22=round(rand*hromlength);if (cpoint12==0)cpoint12=1;endif (cpoint22==0)cpoint22=1;endwhile (cpoint22==cpoint12)cpoint22=round(rand*hromlength);if cpoint22==0;cpoint22=1;endendtemp=newpop(int,cpoint12);newpop(int,cpoint12)=newpop(int,cpoint22);newpop(int,cpoint22)=temp;endendnewpop;clear cpoint12;clear cpoint22;clear randnum;clear int;for ium=1:popsizevector1=newpop(ium,:);obj1(ium)=hanshu(hromlength,vector1,phen);endclear ium;obj1max=max(obj1);for ar=1:popsizeif obj1(ar)==obj1maxnewpop(ar,:)=opti;endend%遗传操作结束二.粒子群算法源程序:%------初始格式化-------------------------------------------------- clear all;clc;format long;%------给定初始化条件---------------------------------------------- c1=1.4962;%学习因子1c2=1.4962;%学习因子2w=0.7298;%惯性权重MaxDT=100;%最大迭代次数D=2;%搜索空间维数(未知数个数)N=40;%初始化群体个体数目eps=10^(-6);%设置精度(在已知最小值时候用)%------初始化种群的个体(可以在这里限定位置和速度的范围)------------ for i=1:Nfor j=1:Dx(i,j)=randn;%随机初始化位置v(i,j)=randn;%随机初始化速度endend%------先计算各个粒子的适应度,并初始化Pi和Pg---------------------- for i=1:Np(i)=fitness(x(i,:),D);y(i,:)=x(i,:);endpg=x(1,:);%Pg为全局最优for i=2:Nif fitness(x(i,:),D)<FITNESS(pg,D)pg=x(i,:);endend%------进入主要循环,按照公式依次迭代,直到满足精度要求------------ for t=1:MaxDTtfor i=1:Nv(i,:)=w*v(i,:)+c1*rand*(y(i,:)-x(i,:))+c2*rand*(pg-x(i,:)); x(i,:)=x(i,:)+v(i,:);if fitness(x(i,:),D)<p(i)p(i)=fitness(x(i,:),D);y(i,:)=x(i,:);endif p(i)<FITNESS(pg,D)pg=y(i,:);endendPbest(t)=fitness(pg,D);end%------进入主要循环,按照公式依次迭代,直到满足精度要求------------ for t=1:MaxDTfor i=1:Nv(i,:)=w*v(i,:)+c1*rand*(y(i,:)-x(i,:))+c2*rand*(pg-x(i,:));x(i,:)=x(i,:)+v(i,:);if fitness(x(i,:),D)<p(i)p(i)=fitness(x(i,:),D);y(i,:)=x(i,:);endif p(i)<FITNESS(pg,D)pg=y(i,:);endendPbest(t)=fitness(pg,D);end%------最后给出计算结果disp('*************************************************************') disp('函数的全局最优位置为:')Solution=pg'disp('最后得到的优化极值为:')Result=fitness(pg,D)disp('*************************************************************') [X,Y]=meshgrid(-500:2:500);Z=X.*sin(sqrt(X))+Y.*(sin(sqrt(Y)));hold oncontour(X,Y,Z)plot(x(:,1),x(:,2),'*');hold off标准文档实用文案。
基于遗传算法的PID整定原理及matlab仿真程序主程序:chap5_2.m%ga(通用算法)程序优化EPID参数;closeall;globalrinyouttimef尺寸=30;codel=3;minx(1)=zeros(1);maxx(1)=20*ones(1);minx(2)=zeros(1);maxx(2)=1.0*ones(1);minx( 3)=zeros(1);maxx(3)=1.0*ones(1);kpid(:,1)=minx(1)+(maxx(1)-minx(1))*rand(大小,1);kpid(:,2)=minx(2)+(maxx(2)-minx(2))*rand(大小,1);kpid(:,3)=minx(3)+(maxx(3)-minx(3))*rand(大小,1);g=100;bsj=0;%***************开始转动***************分叉g=1:1:gtime(kg)=kg;%******步骤1:evaluatebestj****fori=1:1:sizekpidi=kpid(i,:);[kpidi,bsj]=chap5_2f(kpidi,bsj);bsji(i)=bsj;终止[oderji,indexji]=sort(bsji);bestj(kg)=oderji(1);bj=bestj(kg);ji=bsji+1e-10;%避免变零fi=1./ji;%cm=最大值(ji);%fi=cm-ji;[oderfi,indexfi]=排序(fi);%排列Fismalltobiggerbestfi=oderfi(大小);%letbestfi=最大值(fi)bests=kpid(indexfi(size),:);%letbests=e(m),mistheindexfibelongtomax(fi)kgbjbests%******step2:selectandreproductoperation******fi_sum=sum(fi);fi_u大小=(奥德菲/fi_u总和)*大小;fi_s=floor(fi_size);%selectingbiggerfivaluer=size-sum(fi_s);rest=fi_u-size-fi_u-s;[restvalue,index]=sort(rest);fori=尺寸:-1:尺寸-r+1fi_s(index(i))=fi_s(index(i))+1;%addingresttoequalsizeendk=1;fori=size:-1:1%selectthesizethandreproducefirstlyforj=1:1:fi_s(i)tempe(k,:)=kpid(indexfi(i),:);%选择和生产k=k+1;%kisusedtoreproduceendend%************步骤3:交叉操作************pc=0.90;fori=1:2:(1号)温度=rand;ifpc>temp%crossoverconditionalfa=rand;tempe(i,:)=alfa*kpid(i+1,:)+(1-alfa)*kpid(i,:);tempe(i+1,:)=alfa*kpid(i,:)+(1-alfa)*kpid(i+1,:);恩登tempe(size,:)=bests;kpid=tempe;%************步骤4:突变操作***************pm=0.10-[1:1:大小]**(0.01)/size;%biggerfi,smallerpmpm_uurand=rand(大小,代码);平均值=(最大值+最小值)/2;dif=(maxx-minx);fori=1:1:sizeforj=1:1:codelifpm(i)>pm_rand(i,j)%mutationconditiontempe(i,j)=mean(j)+dif(j)*(rand-0.5);endendend%最佳个人温度(尺寸:)=最佳;kpid=tempe;endbestfibestsbest_j=bestj(g)figure(1);情节(时间,bestj);xlabel(’times’);ylabel(’bestj’);figure(2);绘图(timef,rin,'r',timef,yout,'b');xlabel(“时间”);伊拉贝尔(“林,你”);子程序:chap5_2f.m函数[kpidi,bsj]=pid_gaf(kpidi,bsj)globalrinyoutTimets=0.001;sys=tf(400[1,50,0]);dsys=c2d(sys,ts,'z');[num,den]=tfdata(dsys,’v’);rin=1.0;u_1=0.0;u_2=0.0;y_1=0.0;y_2=0.0;x=[0,0,0]';b=0;error_1=0;tu=1;s=0;p=100;fork=1:1:ptimef(k)=k*ts;r(k)=rin;u(k)=kpidi(1)*x(1)+kpidi(2)*x(2)+kpidi(3)*x(3);ifu(k)>=10u(k)=10;end如果u(k)<=-10u(k)=-10;终止yout(k)=-den(2)*y_1-den(3)*y_2+num(2)*u_1+num(3)*u_2;error(k)=r(k)-yout(k);%------------PID参数的返回----------------u_2=u_1;u_1=u(k);y_2=y_1;y_1=yout(k);x(1)=error(k);%calculatingpx(2)=(error(k)-error_1)/ts;%calculatingdx(3)=x(3)+error(k)*ts;%calculatingi错误2=错误1;误差1=误差(k);如果s==0ifyout(k)>0.95&yout(k)<1.05tu=timef(k);s=1;endendendfori=1:1:pji(i)=0.999*abs(error(i))+0.01*u(i)^2*0.1;b=b+ji(i);ifi>1 erry(i)=yout(i)-yout(i-1);费里(i)<0b=b+100*abs(erry(i));endendendbsj=b+0.2*tu*10;。
基于遗传算法的PID参数整定1引言传统的比例、积分、微分控制,即PID控制具有算法简单、鲁棒性好和可靠性高等优点,已经被广泛用于工业生产过程。
但工程实际中,PID控制器的比例、积分和微分调节参数往往采用实验加试凑的方法由人工整定。
这不仅需要熟练的技巧,往往还相当费时。
更为重要的是,当被控对象特性发生变化,需要控制器参数作相应调整时,PID控制器没有自适应能力,只能依靠人工重新整定参数,由于经验缺乏,整定结果往往达不到最优值,难以满足实际控制的要求。
考虑生产过程的连续性以及参数整定费事费力,这种整定实际很难进行。
所以,人们从工业生产实际需要出发,基于常规PID控制器的基本原理,对其进行了各种各样的改进。
近年来许多学者提出了基于各种智能算法的PID整定策略,比如模糊PID、神经元网络PID等等。
然而,这些先进算法都要求对被控对象有很多的先验知识,在实际应用中往往难于做到。
随着计算技术的发展,遗传算法有了很大的发展。
将遗传算法用于控制器参数整定,已成为遗传算法的重要应用之一。
本文介绍基于遗传算法的PID参数整定设计方法。
这是一种寻求全局最优的控制器优化方法,且无需对目标函数微分,可提高参数优化效果,简化计算过程。
仿真实例表明该方法与其他传统寻优方法相比,在优化效果上具有一定的优势。
2遗传算法简介2.1 遗传算法的基本原理遗传算法是John H.Holland根据生物进化的模型提出的一种优化算法。
自然选择学说是进化论的中心内容。
根据进化论,生物的发展进化主要有三个原因:即遗传、变异和选择。
遗传算法基于自然选择和基因遗传学原理的搜索方法,将“优胜劣汰,适者生存”的生物进化原理引入待优化参数形成的编码串群体中,按照一定的适应度函数及一系列遗传操作对各个体进行筛选,从而使适应度高的个体被保留下来,组成新的群体;新群体包含上一代的大量信息,并且引入了新的优于上一代的个体。
这样周而复始,群体中各个体适应度不断提高,直至满足一定的极限条件。
此时,群体中适应度最高的个体即为待优化问题的最优解。
遗传算法通过对参数空间编码并用随机选择作为工具来引导搜索过程朝着更高效的方向发展。
正是由于遗传算法独特的工作原理,使它能够在复杂空间进行全局优化搜索,具有较强的鲁棒性。
另外,遗传算法对于搜索空问,基本上不需要什么限制性的假设(如连续、可微及单峰等)。
而其它优化算法,如解析法,往往只能得到局部最优解而非全局最优解,且需要目标函数连续光滑及可微;枚举法虽然克服了这些缺点,但计算效率太低,对于一个实际问题常由于搜索空间太大而不能将所有情况都搜索到;即使很著名的动态规划法,也遇到“指数爆炸”问题,对于中等规模和适度复杂性的问题常常无能为力。
2.2 遗传算法的特点同常规优化算法相比,遗传算法有以下特点:1)遗传算法是对参数的编码进行操作,而不对参数本身。
首先基于一个有限的字母表,把最优化问题的自然参数集编码为有限长度的字符串。
2)遗传算法是从许多点开始并行操作的,而不局限于一点,有效防止搜索过程收敛于局部最优解。
3)遗传算法通过目标函数来计算适应度,不需要其他推导和附加信息,对问题的依赖性较小。
4)遗传算法的寻优规则是由概率决定的,而非确定性的。
5)遗传算法在解空间进行高效启发式搜索,而非盲目地穷举或完全随机搜索。
6)遗传算法对于待寻优的函数基本无限制,它不要求函数连续和可微,可以是数学解析式所表达的显函数,又可以是映射矩阵甚至是神经网络等隐函数,因而应用范围较广。
7)遗传算法具有并行计算的特点,因而可以通过大规模并行计算来提高计算速度。
8)遗传算法计算简单,功能强,更适合大规模复杂问题的优化。
3 遗传算法的基本操作3.1 复制复制是从一个旧种群中选择生命力强的个体位串产生新种群的过程。
根据位串的适配值拷贝,也就是指具有高适配值的位串更有可能在下一代中产生一个或多个子孙。
它模仿了自然现象,应用了达尔文的适者生存理论。
复制操作可以通过随机方法来实现。
若用计算机程序来实现,可考虑首先产生0~1之间均匀分布的随机数,若某串的复制概率为40%,则产生的随机数在0~0.40之间时,该串被复制,否则被淘汰。
此外,还可以通过计算方法实现,其中较典型的几种方法为适应度比例法、期望值法、排位次序法等。
适应度比例法较常用。
3.2 交叉复制操作能从旧种群中选择出优秀者,但不能创造新的染色体。
而交叉模拟了生物进化过程中的繁殖现象,通过两个染色体的交换组合,来产生新的优良品种。
它的过程为:在匹配池中任选两个染色体,随机选择一点或多点交换点位置;交换双亲染色体交换点右边的部分,即可得到两个新的染色体数字串。
交换体现了自然界中信息交换的思想。
交叉有一点交叉、多点交叉、还有一致交叉、顺序交叉和周期交叉。
一点交叉是最基本的方法,应用较广,它是指染色体切断点有一处,例如:A:101100 1110->101100 0101B:001010 0101->001010 11103.3 变异变异运算用来模拟生物在自然界的遗传环境中由于各种偶然因素的基因突变,它以很小的概率随机地改变遗传基因(表示染色体的符号串的某一位)的值。
在染色体以二进制编码的系统中,它随机地将染色体的某一基因由1变为0,或由0变为1。
若只有选择和交叉,而没有变异,则无法在初始基因组合以外的空间进行搜索,使进化过程在早期就陷入局部解而进入终止过程,从而影响解的质量。
为了在尽可能大的空间中获得质量较高的优化解,必须采用变异操作。
4 基于遗传算法的PID控制设计4.1 遗传算法整定PID参数的优点采用遗传算法进行PID三个系数的整定,具有以下优点:1)与单纯形法相比,遗传算法同样具有良好的寻优特性,且它克服了单纯形法的初值敏感性。
在初始条件选择不当的情况下,遗传算法在不需要给出调节器初始参数的情况下,仍能寻找到合适的参数,使控制目标满足要求。
同时单纯形法难以解决多值函数问题以及在多参数寻优(如串级系统)中,容易造成寻优失败或时间过长,而遗传算法的特性决定了它能很好地克服以上问题。
2)与专家整定法相比,它具有操作方便,速度快的优点,不需要复杂的规则,只需要对字符串进行复制、交叉、变异运算,便可达到寻优。
避免了专家整定法中前期大量的知识库整理工作以及大量的仿真实验。
3)遗传算法是从许多点开始并行操作,在解空间进行高效启发式搜索,克服了从单点出发的弊端以及搜索的盲目性,从而提高运算速度,避免了过早陷入局部最优解(如图1所示)。
4)遗传算法不仅适用于单目标寻优,而且也适用于多目标寻优。
根据不同的控制系统,针对一个或多个目标,遗传算法均能在规定的范围内寻找到合适参数。
遗传算法作为一种全局优化算法,得到了越来越广泛的应用。
近年来,遗传算法在控制上的应用日益增多。
图1 遗传算法的运算过程4.2 基于遗传算法整定PID参数的步骤(1)确定决策变量和约束条件我们知道,PID控制的三个系数为Kp 、Ki 、Kd,我们可以根据参数的物理意义和经验来确定它们的取值范围,即约束条件。
(2)建立优化模型为获取满意的过渡过程动态特性,采用误差绝对值时间积分性能指标作为参数选择最小目标函数。
为防止控制量过大,在目标函数中加入控制输入的平方项。
最后选用以下公式作为参数选择的最优指标: J=⎰∞++03221))()((u t w dt t u w t e w式中,有e(t)为系统误差,u(t)为控制器输出,u t 为上升时间,1w ,2w ,3w 为加权值。
同时,为避免超调,采用遗传算法的处罚功能,即一旦超调,将超调量作为最优指标的一项,此时最优指标为:如果 e(t)<0 则 J=⎰∞+++034221))()()((u t w dt t e w t u w t e w 其中,4w 为加权值,且4w »1w 。
(3)确定编码和解码方法。
遗传算法有二进制、格雷码、浮点数和实数编码方法。
用实数编码无需解码,但进行遗传操作时不太方便;用二进制编码方法,遗传操作方便,解码处理后即可得到最优解。
(4)确定个体评价方法,即确定个体适应度函数(Fitness Function )。
评价个体适应度的一般过程是:对个体编码串进行解码处理后,可得到个体的表现型;由表现型可计算出对应个体的目标函数值;根据最优问题的类型,有目标函数值按一定的转换规则可求出个体的适应度。
(5)确定遗传算法的运行参数根据实际情况确定群体大小M 、遗传代数kg 、交叉概率Pc 、变异概率Pm 和权值1w ,2w ,3w ,4w 的大小。
本文取M=30,kg=100,Pc=0.9,Pm 不固定,1w =0.9992w =0.001 ,3w =2 ,4w =100。
编写遗传算法程序,并进行仿真,从而得到优化后的PID 参数。
5遗传算法整定PID 参数的编程实现与仿真5.1 工业对象的数学建模由于工业领域中的被控对象一般为一阶或二阶环节,因此,在本文里我们拟定受控对象的传递函数为如下: G(s)= 1s 60e s80-+其中采样时间为20s 。
5.2 遗传算法整定PID 参数的实现与控制效果5.2.1 编写最优指标的M 文件利用遗传算法整定PID 参数,首先,最核心的是要编写最优指标的m 文件。
m 文件里主要是一个函数,函数里包含了受控对象以及性能指标的程序实现。
它是联系遗传算法与PID 整定环节的桥梁。
具体程序见附件。
根据4.2的步骤(2)可以得出目标函数J 如下: J=⎰∞++03221))()((u t w dt t u w t e w e(t)≥0 J=⎰∞+++034221))()()((u t w dt t e w t u w t e w e(t)<0MATLAB 程序实现:for i=1:1:PJi(i)=0.999*abs(error(i))+0.001*u(i)^2;B=B+Ji(i);if i>1erry(i)=yout(i)-yout(i-1);if erry(i)<0B=B+100*abs(erry(i));endendendBsJ=B+2*tu;在控制系统里要求目标函数的值越小越好。
然而,在遗传算法里是按照最大化方向进行搜索的。
因此,设计适应度函数为:F=1/J.主程序的编程实现也比较简单,具体如下:Ji=BsJi+1e-10; %避免分母为零fi=1./Ji;在MATLAB 程序里用此句来调用函数:[Kpidi,BsJ]=fitness(Kpidi,BsJ);因此,在写完m 文件时,应把文件命名为fitness.m 。
另外一个也是非常重要的,那就是传递函数的生成与定义输出,实现如下: 由于传递函数为:G(s)= 1s 60e s80-Z 变换后可得G(z)=165.70-z 835.20 程序实现: ts=20; %采样时间20ssys=tf(1,[60,1],’inputdelay’,80); %生成传递函数G(s)dsys=c2d(sys,ts,'z'); %Z 变换G(z)[num,den]=tfdata(dsys,'v'); %返回z 变换后的各项系数其中:num(1)=0 num(2)=0.2835den(1)=1 den(2)=-0.7165)()(z U z Y =G(z)= 165.70-z 835.20,从而 U(z)*0.2835=Y(z)(z-0.7165)即U(z)*num(2)=Y(z)(z+den(2))写成差分方程为:y(k+1)=-den(2)y(k)+num(2)u(k)差分方程在程序可以如下实现:yout(k)=-den(2)*y_1+num(2)*u_1;u_1=u(k);y_1=yout(k);5.2.1 编写主程序主程序里是遗传算法的实现,其中最重要的是三个遗传操作:复制、交叉、变异。