遗传算法解非线性方程组的Matlab程序

合集下载

完整的遗传算法函数Matlab程序

完整的遗传算法函数Matlab程序

完整的遗传算法函数Matlab程序遗传算法是一种模拟自然进化过程的算法,通过遗传代数操作来搜索最优解。

它是一种优化算法,可以用于解决复杂问题,例如函数优化、组合优化、机器学习等。

在Matlab 中,遗传算法可以通过使用内置函数进行实现,也可以编写自己的遗传算法函数。

以下是一个完整的遗传算法函数Matlab程序的示例:function [x_best, f_best] = GA(fit_func, nvars)% fit_func: 适应度函数句柄% nvars: 变量个数% 遗传算法参数设置pop_size = 100; % 种群大小prob_crossover = 0.8; % 交叉概率prob_mutation = 0.02; % 变异概率max_gen = 1000; % 最大迭代次数% 初始化种群pop = rand(pop_size, nvars);for i = 1:max_gen% 计算适应度for j = 1:pop_sizefitness(j) = feval(fit_func, pop(j,:));end% 找到最优个体[f_best, best_idx] = max(fitness);x_best = pop(best_idx,:);% 交叉操作for j = 1:2:pop_sizeif rand < prob_crossover% 随机选择父代idx_parent1 = randi(pop_size);idx_parent2 = randi(pop_size);parent1 = pop(idx_parent1,:);parent2 = pop(idx_parent2,:);% 交叉idx_crossover = randi(nvars-1);child1 = [parent1(1:idx_crossover) parent2(idx_crossover+1:end)];child2 = [parent2(1:idx_crossover) parent1(idx_crossover+1:end)];% 更新种群pop(j,:) = child1;pop(j+1,:) = child2;endend% 变异操作for j = 1:pop_sizeif rand < prob_mutation% 随机选择变异个体idx_mutation = randi(nvars);pop(j,idx_mutation) = rand;endendendend在上述程序中,遗传算法的参数通过设定变量的值进行设置,包括种群大小、交叉概率、变异概率和最大迭代次数等。

使用Matlab进行遗传算法优化问题求解的方法

使用Matlab进行遗传算法优化问题求解的方法

使用Matlab进行遗传算法优化问题求解的方法引言在现代科技发展的背景下,优化算法成为解决各种问题的重要工具之一。

遗传算法作为一种生物启发式算法,具有全局寻优能力和适应性强的特点,在许多领域中被广泛应用。

本文将介绍如何使用Matlab进行遗传算法优化问题求解,包括问题建模、遗传算子设计、遗传算法编码、适应度评价和求解过程控制等方面。

一、问题建模在使用遗传算法求解优化问题之前,我们首先需要将问题定义为数学模型。

这包括确定问题的目标函数和约束条件。

例如,假设我们要最小化一个多变量函数f(x),其中x=(x1,x2,...,xn),同时还有一些约束条件g(x)<=0和h(x)=0。

在Matlab中,我们可通过定义一个函数来表示目标函数和约束条件。

具体实现时,我们需要在目标函数和约束函数中设置输入参数,通过调整这些参数进行优化。

二、遗传算子设计遗传算法的核心是遗传算子的设计,包括选择(Selection)、交叉(Crossover)、变异(Mutation)和替代(Replacement)等。

选择操作通过一定的策略从种群中选择出适应度较高的个体,作为进行交叉和变异的父代个体。

交叉操作通过将两个父代个体的基因片段进行交换,产生新的子代个体。

变异操作通过改变个体某些基因的值,引入新的基因信息。

替代操作通过选择适应度较低的个体将其替换为新产生的子代个体。

三、遗传算法编码在遗传算法中,个体的编码方式决定了问题的解空间。

常见的编码方式有二进制编码和实数编码等。

当问题的变量是二进制形式时,采用二进制编码。

当问题的变量是实数形式时,采用实数编码。

在Matlab中,我们可以使用矩阵或向量来表示个体的基因型,通过制定编码方式来实现遗传算法的编码过程。

四、适应度评价适应度评价是遗传算法中判断个体优劣的指标。

在适应度评价过程中,我们将问题的目标函数和约束条件应用于个体的解,计算得到一个适应度值。

适应度值越大表示个体越优。

非线性方程组求解-Matlab-fsolve-Read

非线性方程组求解-Matlab-fsolve-Read

非线性方程组求解-Matlab-fsolve实例一:①建立文件fun.m:function y=fun(x)y=[x(1)-0.5*sin(x(1))-0.3*cos(x(2)), ...x(2) - 0.5*cos(x(1))+0.3*sin(x(2))];②>>clear;x0=[0.1,0.1];fsolve(@fun,x0,optimset('fsolve'))注:...为续行符m文件必须以function为文件头,调用符为@;文件名必须与定义的函数名相同;fsolve()主要求解复杂非线性方程和方程组,求解过程是一个逼近过程。

实例二:①建立文件fun.mfunction F=myfun(x)F=[x(1)-3*x(2)-sin(x(1));2*x(1)+x(2)-cos(x(2))];②然后在命令窗口求解:>> x0=[0;0]; %设定求解初值>> options=optimset('Display','iter'); %设定优化条件>> [x,fv]=fsolve(@myfun,x0,options) %优化求解%MATLAB显示的优化过程Norm of First-order Trust-region Iteration Func-count f(x) step optimality radius0 3 1 2 11 6 0.000423308 0.5 0.0617 12 9 5.17424e-010 0.00751433 4.55e-005 1.253 12 9.99174e-022 1.15212e-005 9.46e-011 1.25 Optimization terminated: first-order optimality is less than options.TolFun.x =0.49660.0067fv =1.0e-010 *0.31610.0018实例三:求下列非线性方程组在(0.5,0.5) 附近的数值解。

用MATLAB实现遗传算法程序

用MATLAB实现遗传算法程序

用MATLAB实现遗传算法程序一、本文概述遗传算法(Genetic Algorithms,GA)是一种模拟自然界生物进化过程的优化搜索算法,它通过模拟自然选择和遗传学机制,如选择、交叉、变异等,来寻找问题的最优解。

由于其全局搜索能力强、鲁棒性好以及易于实现并行化等优点,遗传算法在多个领域得到了广泛的应用,包括函数优化、机器学习、神经网络训练、组合优化等。

本文旨在介绍如何使用MATLAB实现遗传算法程序。

MATLAB作为一种强大的数学计算和编程工具,具有直观易用的图形界面和丰富的函数库,非常适合用于遗传算法的实现。

我们将从基本的遗传算法原理出发,逐步介绍如何在MATLAB中编写遗传算法程序,包括如何定义问题、编码、初始化种群、选择操作、交叉操作和变异操作等。

通过本文的学习,读者将能够掌握遗传算法的基本原理和MATLAB编程技巧,学会如何使用MATLAB实现遗传算法程序,并能够在实际问题中应用遗传算法求解最优解。

二、遗传算法基础遗传算法(Genetic Algorithm,GA)是一种模拟自然选择和遗传学机制的优化搜索算法。

它借鉴了生物进化中的遗传、交叉、变异等机制,通过模拟这些自然过程来寻找问题的最优解。

遗传算法的核心思想是将问题的解表示为“染色体”,即一组编码,然后通过模拟自然选择、交叉和变异等过程,逐步迭代搜索出最优解。

在遗传算法中,通常将问题的解表示为一个二进制字符串,每个字符串代表一个个体(Individual)。

每个个体都有一定的适应度(Fitness),适应度越高的个体在下一代中生存下来的概率越大。

通过选择(Selection)、交叉(Crossover)和变异(Mutation)等操作,生成新一代的个体,并重复这一过程,直到找到满足条件的最优解或达到预定的迭代次数。

选择操作是根据个体的适应度,选择出适应度较高的个体作为父母,参与下一代的生成。

常见的选择算法有轮盘赌选择(Roulette Wheel Selection)、锦标赛选择(Tournament Selection)等。

基于matlab的非线性方程组求解的方法

基于matlab的非线性方程组求解的方法

于非 线性方 程组
,
可 建 立 如 下 适 值 函 数:
(1)
有了 适 应 度, 就 可 以衡 量 种群 中 N 组 数
值的好 坏, 并从中 选择 n ( n <N) 组作 为迭 代初
值。很 显然, 对 于式( 1 ) 所描 述的 适 值函 数,
其适应度 f i t ne s s 的值越 小, 则该组数值离准
科技资讯 2008 NO. 14 SCI ENCE & TECHNOLOGY I NF ORMATI ON 基 于 ma t l a b 的 非 线 性 方 程 组 求 解 的 方 法
学术论坛
侯建志 1 战 丽娜 2 施毅 3 ( 1. 河 北省老区 建设促进 会 河 北石家 庄 0 5 0 0 0 0 ; 2 . 江麓机电 有限公 司技术中 心 湖南湘潭 4 1 1 1 0 0 )
商业 广告, 它 的推出 不仅为 了推销 产 品, 还 建 立 企 业 的 形象 。 但 是, 从 目 前 电视 上出现 的一些恶 俗广告来看 , 很多 企业已 经在品 牌的路上 迷失了方向 , 这些 企业如 果不是 没有做品牌 的打算的 话, 那就是 还 没 有 意 识 到 低俗 的 广 告 已 经 在 无 形 中 将 产 品的品 牌形象打入 了万丈深 渊, 等到发 现 的那一天已经 悔之晚矣。
并 联 机 构 在 工 作 空间 内 的 位 置 解 。 例 如 给
定一 组杆 长( 1 0 76 . 3 53 5 , 1 06 0. 8 74 6, 1 05 9.
8 01 4, 10 7 5. 46 29 , 1 0 69 . 3 92 0) , 取 种群大 小
为 20 万 , n 值 为 4 0 , 建 立 适 值 函 数

2020年遗传算法matlab程序实例精编版

2020年遗传算法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);endendend遗传算法程序(二):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 valueF4=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;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%遗传算法程序(三):%IAGAfunction best=gaclearMAX_gen=200; %最大迭代步数best.max_f=0; %当前最大的适应度STOP_f=14.5; %停止循环的适应度RANGE=[0 255]; %初始取值范围[0 255]SPEEDUP_INTER=5; %进入加速迭代的间隔advance_k=0; %优化的次数popus=init; %初始化for gen=1:MAX_genfitness=fit(popus,RANGE); %求适应度f=fitness.f;picked=choose(popus,fitness); %选择popus=intercross(popus,picked); %杂交popus=aberrance(popus,picked); %变异if max(f)>best.max_fadvance_k=advance_k+1;x_better(advance_k)=fitness.x;best.max_f=max(f);best.popus=popus;best.x=fitness.x;endif mod(advance_k,SPEEDUP_INTER)==0RANGE=minmax(x_better);RANGEadvance=0;endendreturn;function popus=init%初始化M=50;%种群个体数目N=30;%编码长度popus=round(rand(M,N));return;function fitness=fit(popus,RANGE)%求适应度[M,N]=size(popus);fitness=zeros(M,1);%适应度f=zeros(M,1);%函数值A=RANGE(1);B=RANGE(2);%初始取值范围[0 255]for m=1:Mx=0;for n=1:Nx=x+popus(m,n)*(2^(n-1));endx=x*((B-A)/(2^N))+A;for k=1:5f(m,1)=f(m,1)-(k*sin((k+1)*x+k));endendf_std=(f-min(f))./(max(f)-min(f));%函数值标准化fitness.f=f;fitness.f_std=f_std;fitness.x=x;return;function picked=choose(popus,fitness)%选择f=fitness.f;f_std=fitness.f_std;[M,N]=size(popus);choose_N=3; %选择choose_N对双亲picked=zeros(choose_N,2); %记录选择好的双亲p=zeros(M,1); %选择概率d_order=zeros(M,1);%把父代个体按适应度从大到小排序f_t=sort(f,'descend');%将适应度按降序排列for k=1:Mx=find(f==f_t(k));%降序排列的个体序号d_order(k)=x(1);endfor m=1:Mpopus_t(m,:)=popus(d_order(m),:);endpopus=popus_t;f=f_t;p=f_std./sum(f_std); %选择概率c_p=cumsum(p)'; %累积概率for cn=1:choose_Npicked(cn,1)=roulette(c_p); %轮盘赌picked(cn,2)=roulette(c_p); %轮盘赌popus=intercross(popus,picked(cn,:));%杂交endpopus=aberrance(popus,picked);%变异return;function popus=intercross(popus,picked) %杂交[M_p,N_p]=size(picked);[M,N]=size(popus);for cn=1:M_pp(1)=ceil(rand*N);%生成杂交位置p(2)=ceil(rand*N);p=sort(p);t=popus(picked(cn,1),p(1):p(2));popus(picked(cn,1),p(1):p(2))=popus(picked(cn,2),p(1):p(2));popus(picked(cn,2),p(1):p(2))=t;endreturn;function popus=aberrance(popus,picked) %变异P_a=0.05;%变异概率[M,N]=size(popus);[M_p,N_p]=size(picked);U=rand(1,2);for kp=1:M_pif U(2)>=P_a %如果大于变异概率,就不变异continue;endif U(1)>=0.5a=picked(kp,1);elsea=picked(kp,2);endp(1)=ceil(rand*N);%生成变异位置p(2)=ceil(rand*N);if popus(a,p(1))==1%0 1变换popus(a,p(1))=0;elsepopus(a,p(1))=1;endif popus(a,p(2))==1popus(a,p(2))=0;elsepopus(a,p(2))=1;endendreturn;function picked=roulette(c_p) %轮盘赌[M,N]=size(c_p);M=max([M N]);U=rand;if U<c_p(1)picked=1;return;endfor m=1:(M-1)if U>c_p(m) & U<c_p(m+1)picked=m+1;break;endend全方位的两点杂交、两点变异的改进的加速遗传算法(IAGA)%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%。

matlab中的遗传算法

matlab中的遗传算法

matlab中的遗传算法【原创版】目录一、引言二、遗传算法的基本原理1.种群概念2.适应度函数3.选择操作4.交叉操作5.变异操作三、MATLAB 中遗传算法的实现1.准备工作2.遗传算法的实现四、遗传算法的应用案例1.旅行商问题2.装载问题五、遗传算法的优缺点六、结论正文一、引言遗传算法(Genetic Algorithm,GA)是一种模拟自然界生物进化过程的优化算法,其主要思想是将进化过程中的自然选择、交叉和变异等遗传操作应用到问题的求解过程中,从而实现对问题的优化求解。

遗传算法在解决复杂问题、非线性问题以及大规模问题等方面具有较强的优势,因此在各个领域得到了广泛的应用。

本文将介绍遗传算法的基本原理以及在MATLAB 中的实现。

二、遗传算法的基本原理1.种群概念遗传算法以一个种群作为优化过程的载体。

种群中的个体代表问题的解,每个个体由一组参数表示。

在优化过程中,种群会不断进化,最终收敛到问题的最优解。

2.适应度函数适应度函数是遗传算法的核心部分,用于评价种群中个体的优劣。

适应度函数的取值范围为 [0, 1],其中 1 表示最优解,0 表示最劣解。

在遗传算法的优化过程中,适应度函数用于选择优秀的个体,从而指导种群的进化。

3.选择操作选择操作是基于适应度函数的一种选择策略,用于选择下一代的父代个体。

常见的选择方法有轮盘赌选择、锦标赛选择等。

4.交叉操作交叉操作是遗传算法中产生新个体的主要方式,通过将选中的优秀个体进行交叉操作,产生具有更好适应度的新个体。

常见的交叉方法有单点交叉、多点交叉、均匀交叉等。

5.变异操作变异操作是在遗传算法中引入随机性的一种方式,通过随机改变某些基因的值,使新个体在进化过程中具有一定的多样性。

变异操作的强度由变异概率控制。

三、MATLAB 中遗传算法的实现1.准备工作在 MATLAB 中实现遗传算法,首先需要定义适应度函数、选择操作、交叉操作和变异操作等。

此外,还需要设置遗传算法的参数,如迭代次数、种群大小、交叉概率、变异概率等。

遗传算法的Matlab实现及应用

遗传算法的Matlab实现及应用

2. 遗传算法的Matlab编程实现
Matlab是一个高性能和功能十分强大的计算与仿真软件。利用 Matlab实现遗传算法简单且易操作。 (1) 初始化 初始化的函数是init (N,chromlength),N表示种群大小, chromlength表示染色体的长度,长度取决于变量的二进制编码长度。 (2)根据评价函数计算个体适应度 由评价函数F,计算种群中个体的适应度。F作为求解问题的目标 函数,求解的目标是该函数的最大或最小值。本文是以f(x)=cos(5*x)sin(3*x)为例进行计算。 (3)选择 选择哪些个体可以进入下一代。个体在下一代种群中出现的 可能性由个体的适应度决定,适应度越高,产生后代的概率越高, 反之,被淘汰的概率越高。本文采用赌轮盘法进行选择。根据方程 ,选择步骤如下: 1)在第t代,根据上式计算f sum和 p ; 2)产生{0,1}的随机数 rand( ),求 s=rand( )* fsum; 中最小的 k,则第 k 个个体被选中; 3)求 4)进行 N 次2)、3)操作,得到N个个体,成为第t+1代种群。
图2 最佳个体的适应度变化情况 图1 f(x)函数示意图
103
算法语言
信息与电脑 China Computer&Communication
2012年6月刊
计算机软件基础数据结构之算法
邓建龙 (辽宁省大连市经济开发区大连大学信科091班 辽宁大连116622)
摘要:数据结构的主要内容是讲解信息在计算机内的寄存方式和信息的集合与整理,它经常是和算法相联系的。算法是一种可以被计算机识 别的指令,而这一指令的对象恰好是通过数据结构寄存的信息。两者的相互作用,使得计算机可以处理一些比较困难的问题,而且处理效率非常 迅速。文中,笔者将针对计算机软件基础数据结构之算法,通过其要素、特征、表示、常用算法以及设计要求等方面详细讲述。 关键词:计算机软件;数据结构;算法 中图分类号:TP311 文献标识码:A 文章编号:1003-9767(2012)06-0104-02

遗传算法解决非线性规划问题的Matlab程序

遗传算法解决非线性规划问题的Matlab程序

非线性整数规划的遗传算法Matlab程序(附图)通常,非线性整数规划是一个具有指数复杂度的NP问题,如果约束较为复杂,Matlab 优化工具箱和一些优化软件比如lingo等,常常无法应用,即使能应用也不能给出一个较为令人满意的解。

这时就需要针对问题设计专门的优化算法。

下面举一个遗传算法应用于非线性整数规划的编程实例,供大家参考!模型的形式和适应度函数定义如下:这是一个具有200个01决策变量的多目标非线性整数规划,编写优化的目标函数如下,其中将多目标转化为单目标采用简单的加权处理。

function Fitness=FITNESS(x,FARM,e,q,w)%% 适应度函数% 输入参数列表% x 决策变量构成的4×50的0-1矩阵% FARM 细胞结构存储的当前种群,它包含了个体x% e 4×50的系数矩阵% q 4×50的系数矩阵% w 1×50的系数矩阵%%gamma=0.98;N=length(FARM);%种群规模F1=zeros(1,N);F2=zeros(1,N);for i=1:Nxx=FARM{i};ppp=(1-xx)+(1-q).*xx;F1(i)=sum(w.*prod(ppp));F2(i)=sum(sum(e.*xx));endppp=(1-x)+(1-q).*x;f1=sum(w.*prod(ppp));f2=sum(sum(e.*x));Fitness=gamma*sum(min([sign(f1-F1);zeros(1,N)]))+(1-gamma)*sum(mi n([sign(f2-F2);zeros(1,N)]));针对问题设计的遗传算法如下,其中对模型约束的处理是重点考虑的地方function [Xp,LC1,LC2,LC3,LC4]=MYGA(M,N,Pm)%% 求解01整数规划的遗传算法%% 输入参数列表% M 遗传进化迭代次数% N 种群规模% Pm 变异概率%% 输出参数列表% Xp 最优个体% LC1 子目标1的收敛曲线% LC2 子目标2的收敛曲线% LC3 平均适应度函数的收敛曲线% LC4 最优适应度函数的收敛曲线%% 参考调用格式[Xp,LC1,LC2,LC3,LC4]=MYGA(50,40,0.3)%% 第一步:载入数据和变量初始化load eqw;%载入三个系数矩阵e,q,w%输出变量初始化Xp=zeros(4,50);LC1=zeros(1,M);LC2=zeros(1,M);LC3=zeros(1,M);LC4=zeros(1,M);Best=inf;%% 第二步:随机产生初始种群farm=cell(1,N);%用于存储种群的细胞结构k=0;while k %以下是一个合法个体的产生过程x=zeros(4,50);%x每一列的1的个数随机决定for i=1:50R=rand;Col=zeros(4,1);if R<0.7RP=randperm(4);%1的位置也是随机的Col(RP(1))=1;elseif R>0.9RP=randperm(4);Col(RP(1:2))=1;elseRP=randperm(4);Col(RP(1:3))=1;endx(:,i)=Col;end%下面是检查行和是否满足约束的过程,对于不满足约束的予以抛弃 Temp1=sum(x,2);Temp2=find(Temp1>20);if length(Temp2)==0k=k+1;farm{k}=x;endend%% 以下是进化迭代过程counter=0;%设置迭代计数器while counter%% 第三步:交叉%交叉采用双亲双子单点交叉newfarm=cell(1,2*N);%用于存储子代的细胞结构Ser=randperm(N);%两两随机配对的配对表A=farm{Ser(1)};%取出父代AB=farm{Ser(2)};%取出父代BP0=unidrnd(49);%随机选择交叉点a=[A(:,1:P0),B(:,(P0+1):end)];%产生子代ab=[B(:,1:P0),A(:,(P0+1):end)];%产生子代bnewfarm{2*N-1}=a;%加入子代种群newfarm{2*N}=b;%以下循环是重复上述过程for i=1:(N-1)A=farm{Ser(i)};B=farm{Ser(i+1)};P0=unidrnd(49);a=[A(:,1:P0),B(:,(P0+1):end)];b=[B(:,1:P0),A(:,(P0+1):end)];newfarm{2*i-1}=a;newfarm{2*i}=b;endFARM=[farm,newfarm];%新旧种群合并%% 第四步:选择复制FLAG=ones(1,3*N);%标志向量,对是否满足约束进行标记%以下过程是检测新个体是否满足约束for i=1:(3*N)x=FARM{i};sum1=sum(x,1);sum2=sum(x,2);flag1=find(sum1==0);flag2=find(sum1==4);flag3=find(sum2>20);if length(flag1)+length(flag2)+length(flag3)>0FLAG(i)=0;%如果不满足约束,用0加以标记endendNN=length(find(FLAG)==1);%满足约束的个体数目,它一定大于等于N NEWFARM=cell(1,NN);%以下过程是剔除不满主约束的个体kk=0;for i=1:(3*N)if FLAG(i)==1kk=kk+1;NEWFARM{kk}=FARM{i};endend%以下过程是计算并存储当前种群每个个体的适应值SYZ=zeros(1,NN);syz=zeros(1,N);for i=1:NNx=NEWFARM{i};SYZ(i)=FITNESS2(x,NEWFARM,e,q,w);%调用适应值子函数endk=0;%下面是选择复制,选择较优的N个个体复制到下一代while k minSYZ=min(SYZ);posSYZ=find(SYZ==minSYZ);POS=posSYZ(1);k=k+1;farm{k}=NEWFARM{POS};syz(k)=SYZ(POS);SYZ(POS)=inf;end%记录和更新,更新最优个体,记录收敛曲线的数据minsyz=min(syz);meansyz=mean(syz);pos=find(syz==minsyz);LC3(counter+1)=meansyz;if minsyz Best=minsyz;Xp=farm{pos(1)};endLC4(counter+1)=Best;ppp=(1-Xp)+(1-q).*Xp;LC1(counter+1)=sum(w.*prod(ppp));LC2(counter+1)=sum(sum(e.*Xp));%% 第五步:变异for i=1:Nif Pm>rand%是否变异由变异概率Pm控制AA=farm{i};%取出一个个体POS=unidrnd(50);%随机选择变异位R=rand;Col=zeros(4,1);if R<0.7RP=randperm(4);Col(RP(1))=1;elseif R>0.9RP=randperm(4);Col(RP(1:2))=1;elseRP=randperm(4);Col(RP(1:3))=1;end%下面是判断变异产生的新个体是否满足约束,如果不满足,此次变异无效 AA(:,POS)=Col;Temp1=sum(AA,2);Temp2=find(Temp1>20);if length(Temp2)==0farm{i}=AA;endendendcounter=counter+1end%第七步:绘收敛曲线图figure(1);plot(LC1);xlabel('迭代次数');ylabel('子目标1的值');title('子目标1的收敛曲线'); figure(2);plot(LC2);xlabel('迭代次数');ylabel('子目标2的值');title('子目标2的收敛曲线'); figure(3);plot(LC3);xlabel('迭代次数');ylabel('适应度函数的平均值');title('平均适应度函数的收敛曲线'); figure(4);plot(LC4);xlabel('迭代次数');ylabel('适应度函数的最优值');title('最优适应度函数的收敛曲线');贴出一幅运行得到的收敛曲线。

matlab工具箱遗传算法使用方法

matlab工具箱遗传算法使用方法

简单的遗传算法可以使用Matlab自带的遗传算法工具箱,但是要从Matlab2010版本之后才会自带这个工具箱,且调用命令也有变化,分别是gatool和optimtool。

GUI界面如下图所示:1、problem setup and results设置与结果(1)Solver:求解程序,选择要用的求解程序(遗传算法,遗传算法多目标等)(2)problem:1)fitness function适应度函数,求最小,这里的使用度函数要自己编写,书写格式是“@函数名”。

2)number of variable变量数,必须是整数,即,使用这个GUI界面的适应度函数的变量必须是[1*n]的向量,而不能是[m*n]的矩阵。

3)constraints约束4)linear inequalities线性不等式,A*x<=b形式,其中A是矩阵,b是向量5)linear equalities线性等式,A*x=b形式,其中A是矩阵,b是向量6)bounds定义域,lower下限,upper上限,列向量形式,每一个位置对应一个变量7)nonlinear constraint function非线性约束,用户定义,非线性等式必须写成c=0形式,不等式必须写成c<=0形式8)integer variable indices整型变量标记约束,使用该项时Aeq和beq必须为空,所有非线性约束函数必须返回一个空值,种群类型必须是实数编码举例,若是想让第一个、第三个、第五个变量保持是整数的话,则直接在此处填写[1 3 5] 9)run solver and view results求解use random states from previous run使用前次的状态运行,完全重复前次运行的过程和结果2、population(1)population type编码类型1)double vector实数编码,采用双精度。

整数规划的种群类型必须是实数编码。

遗传算法及其MATLAB程序代码

遗传算法及其MATLAB程序代码

遗传算法及其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程序

遗传算法解非线性方程组的Matlab程序

遗传算法解非线性方程组的Matlab程序遗传算法解非线性方程组的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,oneDimen sionSet,solutionSum);%把解代入非线性方程组计算误差函数:(2)functionError=nonLinearSumError1(x);%判定程是否得解函数:(3)[solution,isTrue]=isSolution(x,funtionError,solutionSumError);%选择最优染色体函数:%(4)[bestChromosome,leastFunctionError]=best_worstChro mosome(fatherChromosomeGroup,functionError);%误差比较函数:从两个染色体中,选出误差较小的染色体%(5)[holdBestChromosome,holdLeastFunctionError]...%=compareBestChromosome(holdBestChromosome,holdLeastFu nctionError,...% bestChromosome,leastFuntionError)%为染色体定义概率函数,好的染色体概率高,坏染色体概率低%(6)p=chromosomeProbability(functionError);%按概率选择染色体函数:%(7)slecteChromosomeGroup=selecteChromome(fatherChr omosomeGroup,p);%父代染色体杂交产生子代染色体函数%(8)sonChrmosomeGroup=crossChromosome(slecteChrom osomeGroup,2);%防止染色体超出解空间的函数%(9)chromosomeGroup=checkSequence(chromosomeGrou p,solutionSum)%变异函数%(10)fatherChromosomeGroup=varianceCh(sonChromoso meGroup,0.8,solutionN);%通过实验有如下结果:%1。

遗传算法在matlab中的实现

遗传算法在matlab中的实现

遗传算法是一种模拟自然选择与遗传机制的优化算法,它模拟了生物进化的过程,通过优化个体的基因型来达到解决问题的目的。

在工程和科学领域,遗传算法被广泛应用于求解优化问题、寻找最优解、参数优化等领域。

而MATLAB作为一款强大的科学计算软件,拥有丰富的工具箱和编程接口,为实现遗传算法提供了便利。

下面将通过以下步骤介绍如何在MATLAB中实现遗传算法:1. 引入遗传算法工具箱需要在MATLAB环境中引入遗传算法工具箱。

在MATLAB命令窗口输入"ver",可以查看当前已安装的工具箱。

如果遗传算法工具箱未安装,可以使用MATLAB提供的工具箱管理界面进行安装。

2. 定义优化问题在实现遗传算法前,需要清楚地定义优化问题:包括问题的目标函数、约束条件等。

在MATLAB中,可以通过定义一个函数来表示目标函数,并且可以采用匿名函数的形式来灵活定义。

对于约束条件,也需要进行明确定义,以便在遗传算法中进行约束处理。

3. 设置遗传算法参数在实现遗传算法时,需要对遗传算法的参数进行设置,包括种群大小、交叉概率、变异概率、迭代次数等。

这些参数的设置将会直接影响遗传算法的收敛速度和优化效果。

在MATLAB中,可以通过设置遗传算法工具箱中的相关函数来完成参数的设置。

4. 编写遗传算法主程序编写遗传算法的主程序,主要包括对适应度函数的计算、选择、交叉、变异等操作。

在MATLAB中,可以利用遗传算法工具箱提供的相关函数来实现这些操作,简化了遗传算法的实现过程。

5. 运行遗传算法将编写好的遗传算法主程序在MATLAB环境中运行,并观察优化结果。

在运行过程中,可以对结果进行实时监测和分析,以便对遗传算法的参数进行调整和优化。

通过以上步骤,可以在MATLAB中实现遗传算法,并应用于实际的优化问题与工程应用中。

遗传算法的实现将大大提高问题的求解效率与精度,为工程领域带来更多的便利与可能性。

总结:遗传算法在MATLAB中的实现涉及到了引入遗传算法工具箱、定义优化问题、设置算法参数、编写主程序和运行算法等步骤。

遗传算法及其MATLAB实现

遗传算法及其MATLAB实现
染色体 U1 适应度值 19.805119
P k
0.111180
Qk
0.111180
U2
U3 U4 U5 U6 U7 U8 U9 U10
17.370890
9.590546 29.106122 15.686001 11.900541 17.958717 19.763190 26.401669 10.252480
101111011111110
2、初始群体的产生
• 遗传算法是对群体进行的进 化操作,需要给其准备一些 起始搜索点的初始群体数据
• 初始群体太小时会产生病态 基因,且造成有效等位基因 先天缺乏 • 初始群体太大会导致结果难 以收敛且浪费资源,稳健性 下降 • 建议值0~100
假设初始种群中有10个个体,其染色体可随机生成如下:
5、新种群的交配(交叉运算)
• 交叉运算是遗传算法中产生新个体的主要操作过程,它以某一概率相互交互两个个体之间的部分染色体 • 先对群体进行随机配对,其次随机设置交叉点位置,最后再相互交换配对染色体之间的部分基因 • 交叉概率一般取0.4~0.99
①交配染色体数量的确定 交配染色体的数量等于染色体总量乘以交配概率。这里假设 交配概率 P c 为0.25,染色体总量为10条,所以 参加交配的染色 体数量为[2.5]条。符号[ ]表示取整,这里取整数2,即交配的染 色体数目为2条。 假定其分别对应U1~U10这10个个体,则其中低于交配概率0.25的U5和U7参加交配。这 样操作的原因是:交配概率越低,低于交配概率以下的随机数的数量就越少,所以参加交配 的染色体数量与交配概率可能会成正比。 ③在交配池发生交配 染色体U5和U7被选中作为交配的父辈,交配点的选择以随机数产生。交配的种类有单 点交配和多点交配,这里取单点交配。计算机随机生成一个介于0~32的整数。假设所产生 的整数为1,那么两个染色体自1位置开始分割,在染色体1位置右端部分进行交换而生成新 的子辈染色体,即 U5=[1 0011 0110 1001 0110 1000 0000 1011 1001] U7=[0 0111 0101 1100 1100 0000 0101 0100 1000] U5*=[1 0111 0101 1100 1100 0000 0101 0100 1000] U7*=[0 0011 0110 1001 0110 1000 0000 1011 1001]

遗传算法介绍并附上Matlab代码

遗传算法介绍并附上Matlab代码

1、遗传算法介绍遗传算法,模拟达尔文进化论的自然选择和遗产学机理的生物进化构成的计算模型,一种不断选择优良个体的算法。

谈到遗传,想想自然界动物遗传是怎么来的,自然主要过程包括染色体的选择,交叉,变异(不明白这个的可以去看看生物学),这些操作后,保证了以后的个基本上是最优的,那么以后再继续这样下去,就可以一直最优了。

2、解决的问题先说说自己要解决的问题吧,遗传算法很有名,自然能解决的问题很多了,在原理上不变的情况下,只要改变模型的应用环境和形式,基本上都可以。

但是遗传算法主要还是解决优化类问题,尤其是那种不能直接解出来的很复杂的问题,而实际情况通常也是这样的。

本部分主要为了了解遗传算法的应用,选择一个复杂的二维函数来进行遗传算法优化,函数显示为y=10*sin(5*x)+7*abs(x-5)+10,这个函数图像为:怎么样,还是有一点复杂的吧,当然你还可以任意假设和编写,只要符合就可以。

那么现在问你要你一下求出最大值你能求出来吗?这类问题如果用遗传算法或者其他优化方法就很简单了,为什么呢?说白了,其实就是计算机太笨了,同时计算速度又超快,举个例子吧,我把x等分成100万份,再一下子都带值进去算,求出对应的100万个y的值,再比较他们的大小,找到最大值不就可以了吗,很笨吧,人算是不可能的,但是计算机可以。

而遗传算法也是很笨的一个个搜索,只不过加了一点什么了,就是人为的给它算的方向和策略,让它有目的的算,这也就是算法了。

3、如何开始?我们知道一个种群中可能只有一个个体吗?不可能吧,肯定很多才对,这样相互结合的机会才多,产生的后代才会多种多样,才会有更好的优良基因,有利于种群的发展。

那么算法也是如此,当然个体多少是个问题,一般来说20-100之间我觉得差不多了。

那么个体究竟是什么呢?在我们这个问题中自然就是x值了。

其他情况下,个体就是所求问题的变量,这里我们假设个体数选100个,也就是开始选100个不同的x值,不明白的话就假设是100个猴子吧。

利用MATLAB实现遗传算法和MATLAB神经网络工具箱的使用

利用MATLAB实现遗传算法和MATLAB神经网络工具箱的使用

实验一利用MATLA实现遗传算法一、实验目的1、熟悉MATLA语言编程环境2、掌握MATLA语言命令3、学会利用MATLA编程实现遗传算法二、实验原理MATLA是美国Math Works公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,MATLA可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序等,主要应用于工程计算、控制设计等领域。

通过学习遗传算法原理,使用 MATLA编写程序,实现其求解策略。

三、实验内容通过MATLA编程,利用遗传算法求解:f (x) 200exp( 0.05x)sin(x), 求maxf (x),x [-2,2] .三、实验要求1 、程序设计2、调试3、实验结果4、撰写实验报告实验二MATLAB申经网络工具箱的使用一、实验目的1、掌握MATLA语言命令2、提高MATLA程序设计能力3、学会使用MATLA申经网络工具箱二、实验原理MATLA语言是Math Works公司推出的一套高性能计算机编程语言,集数学计算、图形显示、语言设计于一体,其强大的扩展功能为用户提供了广阔的应用空间。

它附带有 30多个工具箱,申经网络工具箱就是其中之一。

利用该工具箱可以方便的构建申经网络的结构模型、设计、训练等,实现申经网络算法。

三、实验内容通过MATLA编程,利用神经网络工具箱预测公路运量:公路运量主要包括公路客运量和公路货运量两个方面。

据研究,某地区的公路运量主要与该地区的人数、机动车数量和公路面积有关,上表给出了该地区20年的公路运量相关数据。

根据有关部门数据,该地区2010和2011 年的人数分别为73.39 和75.55 万人,机动车数量分别为3.9635 和4.0975 万辆,公路面积分别为0.9880和1.0268万平方千米。

请利用BP网络预测该地区2010和2011 年的公路客运量和公路货运量。

某地区20年公路运量数据三、实验要求1、程序设计2、调试3、实验结果4、撰写实验报告运用遗传算法求解函数最大值:所有的子程序为M文件%子程序:计算适应度函数,函数名称存储为fitnessfu.m function[Fitvalue,sumsump]=fitnessfun(population); global BitLengthglobal boundsbeginIfCroIfMut.mglobal boundsendpopsize=size(population,1); for i=1:popsizex=transform2to10(population(i,:));xx=boundsbegin+x*(boundsend-boundsbegin)/(power((boundsend),BitLength)-1); Fitvalue(i)=targetfun(xx); endFitvalue(i)=Fitvalue'+230; fsum=sum(Fitvalue);Pperpopulation=Fitvalue/fsum; cumsump(1)=Pperpopulation(1); for i=2:popsizecumsump(i)=cumsumo(i-1)+Pperpopulation(i); endcumsump=cumsump';%子程序:新种群交叉操作,函数名称存储为crossover.mfunction scro=crossover(population,seln,pc) BitLength=size(population,2); pcc=IfCroIfMut(pc); if pcc==1chb=round(rand*(BitLength-2))+1;scro(1,:)=[population(seln(1),1:chb),population(seln(2),chb+1:BitLength)]; scro(2,:)=[population(seln(2),1:chb),population(seln(1),chb+1:BitLength)]; else scro(1,:)=population(seln(1),:); scro(2,:)=population(seln(2),:); end% 子程序:新种群变异操作,函数名称存储为 mutation.m function snnew=mutation(snew,pmutation); BitLength=size(snew,2); snnew=snew;pmm=IfCroIfMut(pmutation); if pmm==1chb=round(rand*(BitLlength-1))+1; end%子程序:判断遗传运算是否需要进行交叉或变异,函数名称存储为 function pcc=IfCroIfMut(mutORcro); test(1:100)=0;1=round(100*mutORcro); test(1:1)=1; n=round(rand*99)+1; pcc=test(n);%子程序:新种群选择操作,函数名称存储为selection.mfunction seln=selection(population,cumsump);for i=1:2r=rand;prand=cumsump-r;j=1;whlie prand(j)<0j=j+1;end seln(i)=j; end%子程序:将二进制数转换为十进制数,函数名称存储为transform2to10.mfunction x=transform2to10(Population);BitLength=size(Population,2); x=Population(BitLength); for i=1:BitLength-1 x=x+Population(BitLength-i)*power(2,i);end%子程序:对于优化最大值或者极大值函数问题,目标函数可以作为适应度函数,%函数名称存储为targetfun.m function y=targetfun(x); y=200*exp(-0.05*x).*sin(x);涯程序:用遗传算法求解y=200*exp (-0.05*x ) .*sin (x)在[-2 2]区间上的最大值clc;clear all;close all;global BitLengthglobal boundsbeginglobal boundsendbounds=[-2 2];precision=0.0001;boundsbegin=bounds(:,1); boundsend=bounds(:,2);BitLength=cell(log2((boundsend-boundsbegin)'./precision));popsize=50;Generationnmax=12; pcrossover=0.90;pmutation=0.09; population=round(rand(popsize,BitLength));[Fitvalue,cumsump]=fitnessfun(population);cumsump Generation=1;while Generation<Generationnmax+1for j=1:2:popsize seln=selection(population,cumsump);scro=crossover(popuoation,seln,pcrossover);scnew(j,:)=scro(1,:); scnew(j+1,:)=scro(2,:);smnew(j,:)=mutation(scnew(j,:),pmutation); smnew(j+1,:)=mutation(scnew(j+1,:),pmutation); endpopulation=smnew; [Fitvalue,cumsump]=fitnessfun(population);[fmax,nmax]=max(Fitvalue); fmean=mean(Fitvalue);ymax(Generation)=fmax; ymean(Generation)=fmean;x=transform2to10(population(nmax,:));xx=boundsbegin+x*(boundsend-boundsbegin)/(power((boundsend),BitLength)-1);xmax(Generation)=xx;Generation=Generation+1;endGeneration=Generation-1;Bestpopulation=xx;Besttargetfunvalue=targetfun(xx);figure(1); hand1=plot(1:Generation,ymax);set(hand1,'linestyle','-','linewidth',1.8,'marker','*','markersize',6) hold on;hand2=polt(1:Generation,ymean);set(hand2,'color','linestyle','linewidth',1.8,'marker','h','mrkersize',6) xlabel;ylabel; xlim([1 Generationnmax]);legend;box off; hold off附件二(参考程序)利用神经网络工具箱预测公路运量:为了了解利用BP网络求解问题的过程,把问题分为六个模块处理: 1.原始数据的输入;2.数据归一化;3.网络训练;4.对原始数据进行仿真; 5.将原始数据仿真的结果与已知样本进行对比; 6. 对新数据进行仿真。

数值分析中求解非线性方程的MATLAB求解程序(6种)

数值分析中求解非线性方程的MATLAB求解程序(6种)

数值分析中求解非线性方程的MATLAB求解程序(6种)数值分析中求解非线性方程的MATLAB求解程序(6种)1.求解不动点function [k,p,err,P]=fixpt(g,p0,tol,max1)%求解方程x=g(x) 的近似值,初始值为p0%迭代式为Pn+1=g(Pn)%迭代条件为:在迭代范围内满足|k|<1(根及附近且包含初值)k为斜率P(1)=p0;for k=2:max1P(k)=feval(g,P(k-1));err=abs(P(k)-P(k-1));relerr=err/(abs(P(k))+eps);p=P(k);if (err<tol)|(relerr<tol)< p="">break;endendif k==max1disp('超过了最长的迭代次数')endP=P';2.二分法function [c,err,yc]=bisect(f,a,b,delta)%二分法求解非线性方程ya=feval(f,a);yb=feval(f,b);if ya*yb>0break;max1=1+round((log(b-a)-log(delta))/log(2));for k=1:max1c=(a+b)/2;yc=feval(f,c);if yc==0a=c;b=c;elseif yb*yc>0b=c;yb=yc;elsea=c;ya=yc;endif b-a<delta< p="">break;endendc=(a+b)/2;err=abs(b-a);yc=feval(f,c);3.试值法function [c,err,yc]=regula(f,a,b,delta,epsilon,max1) %试值法求解非线性方程%f(a)和飞(b)异号ya=feval(f,a);yb=feval(f,b);if ya*yb>0disp('Note:f(a)*f(b)>0');for k=1:max1dx=yb*(b-a)/(yb-ya);c=b-dx;ac=c-a;yc=feval(f,c);if yc==0break;elseif yb*yc>0b=c;yb=yc;elsea=c;ya=yc;enddx=min(abs(dx),ac);if abs(dx)<delta|abs(yc)<epsilon< p="">break;endendc;err=abs(b-a)/2;yc=feval(f,c);4.求解非线性方程根的近似位置function R=approot(X,epsilon)%求解根近似位置%为了粗估算方程f(x)=0在区间[a,b]的根的位置,%使用等间隔采样点(xk,f(xk))和如下的评定准则:%f(xk-1)与f(xk)符号相反,%或者|f(xk)|足够小且曲线y=f(x)的斜率在%(xk,f(xk))附近改变符号。

遗传算法的Matlab实现讲解

遗传算法的Matlab实现讲解

Matlab函数调用实现GA
• Matlab的GA函数
[x fval] = ga(@fitnessfun, nvars, [],[],[],[],[],[],[], options);
fitnessfcn — Fitness function nvars — Number of variables for the problem Aineq — Matrix for inequality constraints Bineq — Vector for inequality constraints Aeq — Matrix for equality constraints Beq — Vector for equality constraints LB — Lower bound on x UB — Upper bound on x nonlcon — Nonlinear constraint Function options — Options structure
global Cmin;
Cmin=-10^6; popsize=50; %群体大小 Gene=20; chromlength=20; %字符串长 度(个体长度) pc=0.8; %交叉概率 pm=0.01; %变异概率 Xmax=10; Xmin=0;
[bestindividual,bestfit]=best(pop,fitvalue); %求出群体中适应值最大的 个体及其适应值
Matlab函数调用实现GA
• GA函数调用步骤
第一步:编写适应度函数; 第二步:对GA参数进行设置; options = gaoptimset(‘参数名’, 参数值, …, ‘参数名’, 参数值) 例:options = gaoptimset('PopulationSize', 100) 第三步:调用GA函数; [x fval] = ga(@fitnessfun, nvars) [x fval exitflag output population scores] = ga(@fitnessfcn, nvars) [x fval] = ga(@fitnessfun, nvars, [],[],[],[],[],[],[],options);

Matlab 遗传算法及实例

Matlab 遗传算法及实例

Matlab遗传算法及实例Matlab遗传算法工具箱函数及实例讲解转:最近研究了一下遗传算法,因为要用遗传算法来求解多元非线性模型。

还好用遗传算法的工具箱予以实现了,期间也遇到了许多问题。

借此与大家分享一下。

首先,我们要熟悉遗传算法的基本原理与运算流程。

基本原理:遗传算法是一种典型的启发式算法,属于非数值算法范畴。

它是模拟达尔文的自然选择学说和自然界的生物进化过程的一种计算模型。

它是采用简单的编码技术来表示各种复杂的结构,并通过对一组编码表示进行简单的遗传操作和优胜劣汰的自然选择来指导学习和确定搜索的方向。

遗传算法的操作对象是一群二进制串(称为染色体、个体),即种群,每一个染色体都对应问题的一个解。

从初始种群出发,采用基于适应度函数的选择策略在当前种群中选择个体,使用杂交和变异来产生下一代种群。

如此模仿生命的进化进行不断演化,直到满足期望的终止条件。

运算流程:Step1:对遗传算法的运行参数进行赋值。

参数包括种群规模、变量个数、交叉概率、变异概率以及遗传运算的终止进化代数。

Step2:建立区域描述器。

根据轨道交通与常规公交运营协调模型的求解变量的约束条件,设置变量的取值范围。

Step3:在Step2的变量取值范围内,随机产生初始群体,代入适应度函数计算其适应度值。

Step4:执行比例选择算子进行选择操作。

Step5:按交叉概率对交叉算子执行交叉操作。

Step6:按变异概率执行离散变异操作。

Step7:计算Step6得到局部最优解中每个个体的适应值,并执行最优个体保存策略。

Step8:判断是否满足遗传运算的终止进化代数,不满足则返回Step4,满足则输出运算结果。

其次,运用遗传算法工具箱。

运用基于Matlab的遗传算法工具箱非常方便,遗传算法工具箱里包括了我们需要的各种函数库。

目前,基于Matlab的遗传算法工具箱也很多,比较流行的有英国设菲尔德大学开发的遗传算法工具箱GATBX、GAOT以及Math Works公司推出的GADS。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

遗传算法解非线性方程组的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=oneDimensionSetN^solutionSum;%解空间(解集合)中可能解的总数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 circle<circleN%开始迭代求解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 minError<precisionisTrue=1;elseisTrue=0;end%函数(4):选择最优染色体函数:%找出最小误差所对应的最好染色体,最大误差所对应的最坏染色体function [bestChromosome,leastFunctionError]=best_worstChromosome(chromosomeGroup,functionError) [leastFunctionError minErrorOrder]=min(functionError);%[maxFunctionError maxErrorOrder]=max(functionError);bestChromosome=chromosomeGroup(minErrorOrder,:);%worstChromosome=chromosomeGroup(maxErrorOrder,:);函数(5):误差比较函数:从两个染色体中,选出误差较小的染色体%选择最好的基因保留下来function [newBestChromosome,newLeastFunctionError]...=compareBestChromosome(oldBestChromosome,oldLeastFunctionError,...bestChromosome,leastFunctionError)if oldLeastFunctionError>leastFunctionErrornewLeastFunctionError=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 InfN>0 || NaNN>0isP='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);%累积概率,也就是把每个染色体的概率映射到0~1的区间[chromosomeSum,chromosomeLength]=size(chromosomeGroup);for i=1:chromosomeSum%这个循环产生概率值rN=rand(1);if rN==1chromosome(i,:)=chromosomeGroup(chromosomeSum,:);elseif (0<=rN) && (rN<cumuP(1))chromosome(i,:)=chromosomeGroup(1,:);%第1条染色体被选中elsefor j=2:chromosomeSum%这个循环确定第1条以后的哪一条染色体被选中if (cumuP(j-1)<=rN) && (rN<cumuP(j))chromosome(i,:)=chromosomeGroup(j,:);breakendendendend函数(8):父代染色体杂交产生子代染色体函数function sonChromosome=crossChromosome(fatherChromosome,parameter) [chromosomeSum,chromosomeLength]=size(fatherChromosome);%chromosomeSum:染色体的条数;chromosomeLength:染色体的长度switch parametercase 1%随机选择父染色体进行交叉重组for i=1:chromosomeSum/2crossDot=fix(rand(1)*chromosomeLength);%随机选择染色体的交叉点位randChromosomeSequence1=round(rand(1)*chromosomeSum);%随机产生第1条染色体的序号randChromosomeSequence2=round(rand(1)*chromosomeSum);%随机产生第2条染色体的序号,这两条染色体要进行杂交if randChromosomeSequence1==0%防止产生0序号randChromosomeSequence1=1;endif randChromosomeSequence2==0%防止产生0序号randChromosomeSequence2=1;endif crossDot==0 || crossDot==1sonChromosome(i*2-1,:)=fatherChromosome(randChromosomeSequence1,:); sonChromosome(i*2,:)=fatherChromosome(randChromosomeSequence2,:); else%执行两条染色体的交叉sonChromosome(i*2-1,:)=fatherChromosome(randChromosomeSequence1,:); %把父染色体整条传给子染色体sonChromosome(i*2-1,crossDot:chromosomeLength)=...fatherChromosome(randChromosomeSequence2,crossDot:chromosomeLength) %下一条父染色体上交叉点crossDot后的基因传给子染色体,完成前一条染色体的交叉sonChromosome(i*2,:)=fatherChromosome(randChromosomeSequence2,:); sonChromosome(i*2,crossDot:chromosomeLength)...=fatherChromosome(randChromosomeSequence1,crossDot:chromosomeLength) endendcase 2 %父染色体的第i号与第chromosomeSum+1-i号交叉for i=1:chromosomeSum/2crossDot=fix(rand(1)*chromosomeLength);%随机选择染色体的交叉点位if crossDot==0 || crossDot==1sonChromosome(i*2-1,:)=fatherChromosome(i,:);sonChromosome(i*2,:)=fatherChromosome(chromosomeSum+1-i,:);else%执行两条染色体的交叉sonChromosome(i*2-1,:)=fatherChromosome(i,:);%把父染色体整条传给子染色体sonChromosome(i*2-1,crossDot:chromosomeLength)...=fatherChromosome(chromosomeSum+1-i,crossDot:chromosomeLength);%下一条父染色体上交叉点crossDot后的基因传给子染色体,完成前一条染色体的交叉sonChromosome(i*2,:)=fatherChromosome(chromosomeSum+1-i,:); sonChromosome(i*2,crossDot:chromosomeLength)...=fatherChromosome(i,crossDot:chromosomeLength);endendcase 3 %父染色体的第i号与第i+chromosomeSum/2号交叉for i=1:chromosomeSum/2crossDot=fix(rand(1)*chromosomeLength);%随机选择染色体的交叉点位if crossDot==0 || crossDot==1sonChromosome(i*2-1,:)=fatherChromosome(i,:);sonChromosome(i*2,:)=fatherChromosome(i+chromosomeSum/2,:);else%执行两条染色体的交叉sonChromosome(i*2-1,:)=fatherChromosome(i,:);%把父染色体整条传给子染色体sonChromosome(i*2-1,crossDot:chromosomeLength)...=fatherChromosome(i+chromosomeSum/2,crossDot:chromosomeLength);%下一条父染色体上交叉点crossDot后的基因传给子染色体,完成前一条染色体的交叉sonChromosome(i*2,:)=fatherChromosome(i+chromosomeSum/2,:); sonChromosome(i*2,crossDot:chromosomeLength)...=fatherChromosome(i,crossDot:chromosomeLength);endendend函数(9):防止染色体超出解空间的函数%检测染色体(序号)是否超出解空间的函数function chromosome=checkSequence(chromosomeGroup,solutionSum) [chromosomeSum,chromosomeLength]=size(chromosomeGroup); decimalChromosomeSequence=bin2dec(chromosomeGroup);for i=1:chromosomeSum %检测变异后的染色体是否超出解空间if decimalChromosomeSequence(i)>solutionSumchRs=round(rand(1)*solutionSum);if chRs==0chRs=1;enddecimalChromosomeSequence(i)=chRs;endendchromosome=dec2bin(decimalChromosomeSequence,chromosomeLength);函数(10):变异函数%基因变异.染色体群中的1/10变异。

相关文档
最新文档