




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
遗传算法解非线性方程组的Matlab程序程序用MATLAB语言编写。之所以选择MATLB,是因为它简单,但又功能强大。写1行MATLAB程序,相当于写10行C+程序。在编写算法阶段,最好用MATLAB语言,算法验证以后,要进入工程阶段,再把它翻译成C+语言。本程序的算法很简单,只具有示意性,不能用于实战。非线性方程组的实例在函数(2)nonLinearSumError1(x)中,你可以用这个实例做样子构造你自己待解的非线性方程组。%注意:标准遗传算法的一个重要概念是,染色体是可能解的2进制顺序号,由这个序号在可能解的集合(解空间)中找到可能解%程序的流程如下:%程序初始化,随机生成一组可能解(第一批染色体)%1: 由可能解的序号寻找解本身(关键步骤)%2:把解代入非线性方程计算误差,如果误差符合要求,停止计算%3:选择最好解对应的最优染色体%4:保留每次迭代产生的最好的染色体,以防最好染色体丢失%5: 把保留的最好的染色体holdBestChromosome加入到染色体群中%6: 为每一条染色体(即可能解的序号)定义一个概率(关键步骤)%7:按照概率筛选染色体(关键步骤)%8:染色体杂交(关键步骤)%9:变异%10:到1%这是遗传算法的主程序,它需要调用的函数如下。%由染色体(可能解的2进制)顺序号找到可能解:%(1)x=chromosome_x(fatherChromosomeGroup,oneDimensionSet,solutionSum);%把解代入非线性方程组计算误差函数:(2)functionError=nonLinearSumError1(x);%判定程是否得解函数:(3)solution,isTrue=isSolution(x,funtionError,solutionSumError);%选择最优染色体函数:%(4)bestChromosome,leastFunctionError=best_worstChromosome(fatherChromosomeGroup,functionError);%误差比较函数:从两个染色体中,选出误差较小的染色体%(5)holdBestChromosome,holdLeastFunctionError.% =compareBestChromosome(holdBestChromosome,holdLeastFunctionError,.% bestChromosome,leastFuntionError)%为染色体定义概率函数,好的染色体概率高,坏染色体概率低%(6)p=chromosomeProbability(functionError);%按概率选择染色体函数:%(7)slecteChromosomeGroup=selecteChromome(fatherChromosomeGroup,p);%父代染色体杂交产生子代染色体函数%(8)sonChrmosomeGroup=crossChromosome(slecteChromosomeGroup,2);%防止染色体超出解空间的函数%(9)chromosomeGroup=checkSequence(chromosomeGroup,solutionSum)%变异函数%(10)fatherChromosomeGroup=varianceCh(sonChromosomeGroup,0.8,solutionN);%通过实验有如下结果:%1。染色体应当多一些%2。通过概率选择染色体,在迭代早期会有效选出优秀的染色体,使解的误差迅速降低,%但随着迭代的进行,概率选择也会导致某种染色体在基因池中迅速增加,使染色体趋同,%这就减少了物种的多样性,反而难以逼近解%3。不用概率选择,仅采用染色体杂交,采用保留优秀染色体,也可以得到解%程序开始运行clear,clc;%清理内存,清屏circleN=200;%迭代次数format long%构造可能解的空间,确定染色体的个数、长度solutionSum=4;leftBoundary=-10;rightBoundary=10;distance=1;chromosomeSum=500;solutionSumError=0.1;%solutionSum:非线性方程组的元数(待解变量的个数);leftBoundary:可能解的左边界;%rightBoundary:可能解的右边界;distance:可能解的间隔,也是解的精度%chromosomeSum:染色体的个数;solveSumError:解的误差oneDimensionSet=leftBoundary:distance:rightBoundary;%oneDimensionSet:可能解在一个数轴(维)上的集合oneDimensionSetN=size(oneDimensionSet,2);%返回oneDimensionSet中的元素个数solutionN=oneDimensionSetNsolutionSum;%解空间(解集合)中可能解的总数binSolutionN=dec2bin(solutionN);%把可能解的总数转换成二进制数chromosomeLength=size(binSolutionN,2);%由解空间中可能解的总数(二进制数)计算染色体的长度%程序初始化%随机生成初始可能解的顺序号,+1是为了防止出现0顺序号solutionSequence=fix(rand(chromosomeSum,1)*solutionN)+1;for i=1:chromosomeSum%防止解的顺序号超出解的个数if solutionSequence(i)solutionN;solutionSequence(i)=solutionN;endend%染色体是解集合中的序号,它对应一个可能解%把解的十进制序号转成二进制序号fatherChromosomeGroup=dec2bin(solutionSequence,chromosomeLength);holdLeastFunctionError=Inf;%可能解的最小误差的初值holdBestChromosome=0;%对应最小误差的染色体的初值%开始计算circle=0;while circlecircleN%开始迭代求解circle=circle+1;%记录迭代次数%1:由可能解的序号寻找解本身(关键步骤)x=chromosome_x(fatherChromosomeGroup,oneDimensionSet,solutionSum);%2:把解代入非线性方程计算误差functionError=nonLinearSumError1(x);%把解代入方程计算误差solution,minError,isTrue=isSolution(x,functionError,solutionSumError);%isSolution函数根据误差functionError判定方程是否已经解开,isTrue=1,方程得解。solution是方程的解if isTrue=1方程得解solutionminErrorcirclereturn%结束程序end%3:选择最好解对应的最优染色体bestChromosome,leastFunctionError=best_worstChromosome(fatherChromosomeGroup,functionError);%4:保留每次迭代产生的最好的染色体%本次最好解与上次最好解进行比较,如果上次最好解优于本次最好解,保留上次最好解;%反之,保留本次最好解。保留的最好染色体放在holdBestChromosome中holdBestChromosome,holdLeastFunctionError.=compareBestChromosome(holdBestChromosome,holdLeastFunctionError,.bestChromosome,leastFunctionError);%circle%minError%solution%holdLeastFunctionError%5:把保留的最好的染色体holdBestChromosome加入到染色体群中order=round(rand(1)*chromosomeSum);if order=0order=1;endfatherChromosomeGroup(order,:)=holdBestChromosome;functionError(order)=holdLeastFunctionError;%6:为每一条染色体(即可能解的序号)定义一个概率(关键步骤)%好的染色体概率高,坏的概率低。依据误差functionError计算概率p,trueP=chromosomeProbability(functionError);if trueP =Fail可能解严重不适应方程,请重新开始return%结束程序end%7:按照概率筛选染色体(关键步骤)%fa=bin2dec(fatherChromosomeGroup)%显示父染色体%从父染体中选择优秀染色体%selecteChromosomeGroup=selecteChromosome(fatherChromosomeGroup,p);%8:染色体杂交(关键步骤)%sle=bin2dec(selecteChromosomeGroup)%显示选择出来的解的序号(染色体)%用概率筛选出的染色体selecteChromosomeGroup进行杂交,产生子代染色体%sonChromosomeGroup=crossChromosome(selecteChromosomeGroup,2);%不用概率筛选出的染色体selecteChromosomeGroup进行杂交,而直接用上一代(父代)的sonChromosomeGroup=crossChromosome(fatherChromosomeGroup,2);%cro=bin2dec(sonChromosomeGroup)%显示杂交后的子代染色体sonChromosomeGroup=checkSequence(sonChromosomeGroup,solutionN);%检查杂交后的染色体是否越界%9:变异%不杂交直接变异%fatherChromosomeGroup=varianceCh(fatherChromosomeGroup,0.1,solutionN);%杂交后变异fatherChromosomeGroup=varianceCh(sonChromosomeGroup,0.1,solutionN);fatherChromosomeGroup=checkSequence(fatherChromosomeGroup,solutionN);%检查变异后的染色体是否越界end函数(1):由染色体(可能解的2进制)顺序号找到可能解%这个函数找出染色体(可能解的序号)对应的可能解xfunction x=chromosome_x(chromosomeGroup,oneDimensionSet,solutionSum)%chromosomeGroup:染色体,也是可能解的二进制序号%oneDimensionSet:一维数轴上的可能解%solutionSum:非线性方程组的元数,也就是待解方程中未知变量的个数row oneDimensionSetN=size(oneDimensionSet);%oneDimensionSetN:一维数轴上可能解的个数chromosomeSum=size(chromosomeGroup);%chromosomeSum:染色体的个数xSequence=bin2dec(chromosomeGroup);%把可能解的二进制序号(染色体)转换成十进制序号for i=1:chromosomeSum%i:染色体的编号remainder=xSequence(i);for j=1:solutionSumdProduct=oneDimensionSetN(solutionSum-j);%sNproduct:quotient=remainder/dProduct;remainder=mod(remainder,dProduct);%mod:取余函数if remainder=0oneDimensionSetOrder=quotient;%oneDimensionSetOrder:可能解在数轴上的序号elseoneDimensionSetOrder=fix(quotient)+1;%fix:取整函数endif oneDimensionSetOrder=0oneDimensionSetOrder=oneDimensionSetN;endx(i,j)=oneDimensionSet(oneDimensionSetOrder);endend函数(2):把解代入非线性方程组计算绝对误差函数:function funtionError=nonLinearSumError1(X)%方程的解是-7,5,1,-3funtionError=.abs(X(:,1).2-sin(X(:,2).3)+X(:,3).2-exp(X(:,4)-50.566253390821)+.abs(X(:,1).3+X(:,2).2-X(:,4).2+327)+.abs(cos(X(:,1).4)+X(:,2).4-X(:,3).3-624.679868769613)+.abs(X(:,1).4-X(:,2).3+2.X(:,3)-X(:,4).4-2197);函数(3):判定程是否得解函数:%判断方程是否解开function solution,minError,isTrue=isSolution(x,functionError,precision)minError,xi=min(functionError);%找到最小误差,最小误差所对应的行号solution=x(xi,:);if minErrorleastFunctionErrornewLeastFunctionError=leastFunctionError;newBestChromosome=bestChromosome;elsenewLeastFunctionError=oldLeastFunctionError;newBestChromosome=oldBestChromosome;end函数(6):为染色体定义概率函数,好的染色体概率高,坏染色体概率低%根据待解的非线性函数的误差计算染色体的概率function p,isP=chromosomeProbability(x_Error)InfN=sum(isinf(x_Error);%估计非线性方程计算的结果NaNN=sum(isnan(x_Error);if InfN0 | NaNN0isP=Fail;p=0;returnelseisP=True;errorReciprocal=1./x_Error;sumReciprocal=sum(errorReciprocal);p=errorReciprocal/sumReciprocal;%p:可能解所对应的染色体的概率end函数(7):按概率选择染色体函数:function chromosome=selecteChromosome(chromosomeGroup,p)cumuP=cumsum(p);%累积概率,也就是把每个染色体的概率映射到01的区间chromosomeSum,chromosomeLength=size(chromosomeGroup);for i=1:chromosomeSum%这个循环产生概率值rN=rand(1);if rN=1chromosome(i,:)=chromosomeGroup(chromosomeSum,:);elseif (0=rN) & (rNcumuP(1)chromosome(i,:)=chromosomeGroup(1,:);%第1条染色体被选中elsefor j=2:chromosomeSum%这个循环确定第1条以后的哪一条染色体被选中if (cumuP(j-1)=rN) & (rNsolutionSumchRs=round(rand(1)*solutionSum);if chRs=0chRs=1;enddecimalChromosomeSequence(i)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 云南省曲靖市宣威市民中2026届化学高一第一学期期末达标检测模拟试题含解析
- 2026届江西省抚州市临川区一中化学高三第一学期期末监测模拟试题含解析
- 安徽省肥东高级中学2026届高二化学第一学期期中质量跟踪监视试题含解析
- 四川省成都市成都实验高级中学2026届高三化学第一学期期末质量跟踪监视试题含解析
- 2026届吉林省汪清县汪清四中高二化学第一学期期中达标检测模拟试题含解析
- 江西省赣州市宁都县宁师中学2026届化学高三上期中综合测试模拟试题含解析
- 2026届山东省临邑县第一中学高二化学第一学期期中考试模拟试题含解析
- 广东深圳平湖外国语学校2026届化学高二第一学期期中检测模拟试题含解析
- 北京市十三中2026届高二化学第一学期期中教学质量检测模拟试题含解析
- 2026届福建省邵武市第四中学化学高三第一学期期末学业质量监测试题含解析
- 2024年中考物理压轴题专项训练:电磁继电器核心综合练(原卷版)
- 矿山事故应急报告制度
- 2024-2025学年山东省淄博市桓台县四年级上学期数学期中考试试题
- 《公路建设项目文件管理规程》
- 《实践论》(原文)毛泽东
- 佳能-600EX-相机说明书
- ISO27001信息安全管理体系培训资料
- DB34T 3678-2020 内河航道疏浚工程施工技术规程
- 《绝对值》教学课件
- 制造业智能化生产线改造方案提升生产效率
- 人教版五年级上册美术全册教学设计
评论
0/150
提交评论