遗传算法的VB程序【精品毕业设计】(完整版)

合集下载

遗传算法程序

遗传算法程序

遗传算法程序遗传算法程序(一):说明: fga.m 为遗传算法的主程序; 采用二进制Gray编码,采用基于轮盘赌法的非线性排名选择, 均匀交叉,变异操作,而且还引入了倒位操作!function[BestPop,Trace]=fga(FUN,LB,UB,eranum,popsize,pCross,pMutati on,pInversion,options) % [BestPop,Trace]=fmaxga(FUN,LB,UB,eranum,popsize,pcross,pmu tation) % Finds a maximum ofa 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;pInversio n=0.15;options=[0 1e -4];endif nargin==4, popsize=100;pCross=0.8;pMutation=0.1;pInversion=0.15;option s=[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):');< bdsfid="91" p=""></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)=elaps ed_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 encodingindividualfor 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 variables numV=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)< bdsfid="195" p=""></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);< bdsfid="208" p=""></pcross);<>y2=find(r>=pCross);len=length(y1);if len>2&mod(len,2)==1%如果用来进行交叉的染色体的条数为奇数,将其调整为偶数 y2(length(y2)+1)=y1(len);endif length(y1)>=2for i=0:2:length(y1)-2if opts==0[NewPop(y1(i+1),:),NewPop(y1(i+2),:)]=EqualCrossOver(Old Pop(y1(i+1),:),OldPop(y1(i+2),:)) ;else[NewPop(y1(i+1),:),NewPop(y1(i+2),:)]=MultiPointCross(Old Pop(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 NewPopposition=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 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);ScoreN=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;endreturn;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:M x=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)< bdsfid="491" p=""></c_p(1)<>picked=1;return;endfor m=1:(M-1)if U>c_p(m) & U<c_p(m+1)< bdsfid="497" p=""></c_p(m+1)<>picked=m+1;break;endend全方位的两点杂交、两点变异的改进的加速遗传算法(IAGA)遗传算法优化pid参数matlab程序chap5_4m%GA(Generic Algorithm) program to optimize Parameters of PID clear all;clear all;global rin yout timefG=100;Size=30;CodeL=10;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);E=round(rand(Size,3*CodeL));%Initian Code! BsJ=0;for kg=1:1:Gtime(kg)=kg;for s=1:1:Sizem=E(s,:);y1=0;y2=0;y3=0;m1=m(1:1:CodeL);for i=1:1:CodeLy1=y1+m1(i)*2^(i-1);endKpid(s,1)=(MaxX(1)-MinX(1))*y1/1023+MinX(1); m2=m(CodeL+1:1:2*CodeL);for i=1:1:CodeLy2=y2+m2(i)*2^(i-1);endKpid(s,2)=(MaxX(2)-MinX(2))*y2/1023+MinX(2); m3=m(2*CodeL+1:1:3*CodeL);for i=1:1:CodeLy3=y3+m3(i)*2^(i-1);endKpid(s,3)=(MaxX(3)-MinX(3))*y3/1023+MinX(3); %*******Step 1:Evaluate Best J*******Kpidi=Kpid(s,:);[Kpidi,BsJ]=chap5_3f(Kpidi,BsJ);BsJi(s)=BsJ;end[OderJi,IndexJi]=sort(BsJi);BestJ(kg)=OderJi(1);BJ=BestJ(kg);Ji=BsJi+1e-10;fi=1./Ji;%Cm=max(Ji);%fi=Cm-Ji; %Avoiding deviding zero[Oderfi,Indexfi]=sort(fi);%Arranging fi small to bigger%Bestfi=Oderfi(Size); %Let Bestfi=max(fi)%BestS=Kpid(Indexfi(Size),:); %Let BestS=E(m),m is the Indexfi belong to %max(fi)Bestfi=Oderfi(Size);%Let Bestfi=max(fi)BestS=E(Indexfi(Size),:);%Let BestS=E(m),m is the Indexfi belong to max(fi)kgBJBestS;%****Step 2:Select and Reproduct Operation***fi_sum=sum(fi);fi_Size=(Oderfi/fi_sum)*Size;fi_S=floor(fi_Size); %Selecting Bigger fi valuekk=1;for i=1:1:Sizefor j=1:1:fi_S(i) %Select and ReproduceTempE(kk,:)=E(Indexfi(i),:);kk=kk+1; %kk is used to reproduceendend%**********Step 3:Crossover Operation******pc=0.06;n=ceil(20*rand);for i=1:2:(Size-1)temp=rand;if pc>tempfor j=n:1:20TempE(i,j)=E(i+1,j);TempE(i+1,j)=E(i,j);endendendTempE(Size,:)=BestS;E=TempE;%***************Step 4: Mutation Operation************** %pm=0.001;pm=0.001-[1:1:Size]*(0.001)/Size;%Bigger fi,smaller pm%pm=0.0; %No mutation%pm=0.1; %Big mutationfor i=1:1:Sizefor j=1:1:3*CodeLtemp=rand;if pm>temp %Mutation Conditionif TempE(i,j)==0TempE(i,j)=1;elseTempE(i,j)=0;Endendendend%Guarantee TempE(Size,:)belong to the best individualTempE(Size,:)=BestS;E=TempE;%*************************************************** endBestfiBestSKpidiBest_J=BestJ(G)figure(1);plot(time,BestJ);xlabel('Time');ylabel('Best J');figure(2);plot(timef,rin,'r',timef,yout,'b');xlabel('Time(s)');ylabel('ran,yout');chap5_3f.mfunction [Kpidi,BsJ]=pid_gaf(Kpidi,BsJ) global rin yout timefts=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;for k=1:1:Ptimef(k)=k*ts;r(k)=rin;u(k)=Kpidi(1)*x(1)+Kpidi(2)*x(2)+Kpidi(3)*x(3); if u(k)>=10u(k)=10;endif u(k)<=-10u(k)=-10;endyout(k)=-den(2)*y_1-den(3)*y_2+num(2)*u_1+num(3)*u_2; error(k)=r(k)-yout(k);%-------------------Return of PID parameters---------------- u_2=u_1;u_1=u(k);y_2=y_1;y_1=yout(k);x(1)=error(k); % Calculating Px(2)=(error(k)-error_1)/ts; % Dx(3)=x(3)+error(k)*ts; % Ierror_2=error_1;error_1=error(k);if s==0if yout(k)>0.95&yout(k)<1.05tu=timef(k);s=1;endendendfor i=1:1:PJi(i)=0.999*abs(error(i))+0.01*u(i)^2*0.1; B=B+Ji(i);f i>1erry(i)=yout(i)-yout(i-1);if erry(i)<0B=B+100*abs(erry(i));EndEndendBsj=B+0.2*tu*10。

完整的遗传算法函数Matlab程序【精品毕业设计】(完整版)

完整的遗传算法函数Matlab程序【精品毕业设计】(完整版)

完整的遗传算法函数Matlab程序function [x,endPop,bPop,traceInfo] = ga(bounds,eevalFN,eevalOps,startPop,opts,... termFN,termOps,selectFN,selectOps,xOverFNs,xOverOps,mutFNs,mutOps)n=nargin;if n<2 | n==6 | n==10 | n==12disp('Insufficient arguements')endif n<3 %Default eevalation opts.eevalOps=[];endif n<5opts = [1e-6 1 0];endif isempty(opts)opts = [1e-6 1 0];endif any(eevalFN<48) %Not using a .m fileif opts(2)==1 %Float gae1str=['x=c1; c1(xZomeLength)=', eevalFN ';'];e2str=['x=c2; c2(xZomeLength)=', eevalFN ';'];else %Binary gae1str=['x=b2f(endPop(j,:),bounds,bits); endPop(j,xZomeLength)=',...eevalFN ';'];endelse %Are using a .m fileif opts(2)==1 %Float gae1str=['[c1 c1(xZomeLength)]=' eevalFN '(c1,[gen eevalOps]);'];e2str=['[c2 c2(xZomeLength)]=' eevalFN '(c2,[gen eevalOps]);'];else %Binary gae1str=['x=b2f(endPop(j,:),bounds,bits);[x v]=' eevalFN ...'(x,[gen eevalOps]); endPop(j,:)=[f2b(x,bounds,bits) v];'];endendif n<6 %Default termination informationtermOps=[100];termFN='maxGenTerm';endif n<12 %Default muatation informationif opts(2)==1 %Float GAmutFNs=['boundaryMutation multiNonUnifMutation nonUnifMutation unifMutation']; mutOps=[4 0 0;6 termOps(1) 3;4 termOps(1) 3;4 0 0];else %Binary GAmutFNs=['binaryMutation'];mutOps=[0.05];endendif n<10 %默认的交叉信息if opts(2)==1 %浮点编码xOverFNs=['arithXover heuristicXover simpleXover'];xOverOps=[2 0;2 3;2 0];else %Binary GAxOverFNs=['simpleXover'];xOverOps=[0.6];endendif n<9 %Default select opts only i.e. roullete wheel.selectOps=[];endif n<8 %Default select infoselectFN=['normGeomSelect'];selectOps=[0.08];endif n<6 %默认的算法终止准则termOps=[100];termFN='maxGenTerm';endif n<4 %初始种群为空startPop=[];endif isempty(startPop) %随机生成初始种群startPop=initializega(80,bounds,eevalFN,eevalOps,opts(1:2));endif opts(2)==0 %二进制编码bits=calcbits(bounds,opts(1));endxOverFNs=parse(xOverFNs);mutFNs=parse(mutFNs);xZomeLength = size(startPop,2); %Length of the xzome=numVars+fittness numVar = xZomeLength-1; %变量数目popSize = size(startPop,1); %种群中个体数目endPop = zeros(popSize,xZomeLength); %次种群矩阵c1 = zeros(1,xZomeLength); %个体c2 = zeros(1,xZomeLength); %个体numXOvers = size(xOverFNs,1); %交叉操作次数numMuts = size(mutFNs,1); %变异操作次数epsilon = opts(1); %适应度门限值oeval = max(startPop(:,xZomeLength)); %初始种群中的最优值bFoundIn = 1;done = 0;gen = 1;collectTrace = (nargout>3);floatGA = opts(2)==1;display = opts(3);while(~done)[beval,bindx] = max(startPop(:,xZomeLength)); %当前种群的最优值best = startPop(bindx,:);if collectTracetraceInfo(gen,1)=gen; %当前代traceInfo(gen,2)=startPop(bindx,xZomeLength); %最优适应度traceInfo(gen,3)=mean(startPop(:,xZomeLength)); %平均适应度traceInfo(gen,4)=std(startPop(:,xZomeLength));endif ( (abs(beval - oeval)>epsilon) | (gen==1))if displayfprintf(1,'\n%d %f\n',gen,beval);endif floatGAbPop(bFoundIn,:)=[gen startPop(bindx,:)];elsebPop(bFoundIn,:)=[gen b2f(startPop(bindx,1:numVar),bounds,bits)... startPop(bindx,xZomeLength)];endbFoundIn=bFoundIn+1;oeval=beval;elseif displayfprintf(1,'%d ',gen);endendendPop = feeval(selectFN,startPop,[gen selectOps]); %选择操作if floatGAfor i=1:numXOvers,for j=1:xOverOps(i,1),a = round(rand*(popSize-1)+1); %一个父代个体b = round(rand*(popSize-1)+1); %另一个父代个体xN=deblank(xOverFNs(i,:)); %交叉函数[c1 c2] = feeval(xN,endPop(a,:),endPop(b,:),bounds,[gen… xOverOps(i,:)]);if c1(1:numVar)==endPop(a,(1:numVar))c1(xZomeLength)=endPop(a,xZomeLength);elseif c1(1:numVar)==endPop(b,(1:numVar))c1(xZomeLength)=endPop(b,xZomeLength);elseeeval(e1str);endif c2(1:numVar)==endPop(a,(1:numVar))c2(xZomeLength)=endPop(a,xZomeLength);elseif c2(1:numVar)==endPop(b,(1:numVar))c2(xZomeLength)=endPop(b,xZomeLength);elseeeval(e2str);endendPop(a,:)=c1;endPop(b,:)=c2;endendfor i=1:numMuts,for j=1:mutOps(i,1),a = round(rand*(popSize-1)+1);c1 = feeval(deblank(mutFNs(i,:)),endPop(a,:),bounds,[gen mutOps(i,:)]);if c1(1:numVar)==endPop(a,(1:numVar))c1(xZomeLength)=endPop(a,xZomeLength);elseeeval(e1str);endendPop(a,:)=c1;endendelse %遗传操作的统计模型for i=1:numXOvers,xN=deblank(xOverFNs(i,:));cp=find(rand(popSize,1)if rem(size(cp,1),2) cp=cp(1:(size(cp,1)-1)); endcp=reshape(cp,size(cp,1)/2,2);for j=1:size(cp,1)a=cp(j,1); b=cp(j,2);[endPop(a,:) endPop(b,:)] = feeval(xN,endPop(a,:),endPop(b,:), bounds,[gen xOverOps(i,:)]); endendfor i=1:numMutsmN=deblank(mutFNs(i,:));for j=1:popSizeendPop(j,:) = feeval(mN,endPop(j,:),bounds,[gen mutOps(i,:)]);eeval(e1str);endendend。

遗传算法解释及代码(一看就懂)【精品毕业设计】(完整版)

遗传算法解释及代码(一看就懂)【精品毕业设计】(完整版)

遗传算法( GA , Genetic Algorithm ) ,也称进化算法。

遗传算法是受达尔文的进化论的启发,借鉴生物进化过程而提出的一种启发式搜索算法。

因此在介绍遗传算法前有必要简单的介绍生物进化知识。

一.进化论知识作为遗传算法生物背景的介绍,下面内容了解即可:种群(Population):生物的进化以群体的形式进行,这样的一个群体称为种群。

个体:组成种群的单个生物。

基因 ( Gene ) :一个遗传因子。

染色体 ( Chromosome ):包含一组的基因。

生存竞争,适者生存:对环境适应度高的、牛B的个体参与繁殖的机会比较多,后代就会越来越多。

适应度低的个体参与繁殖的机会比较少,后代就会越来越少。

遗传与变异:新个体会遗传父母双方各一部分的基因,同时有一定的概率发生基因变异。

简单说来就是:繁殖过程,会发生基因交叉( Crossover ) ,基因突变( Mutation ) ,适应度( Fitness )低的个体会被逐步淘汰,而适应度高的个体会越来越多。

那么经过N代的自然选择后,保存下来的个体都是适应度很高的,其中很可能包含史上产生的适应度最高的那个个体。

二.遗传算法思想借鉴生物进化论,遗传算法将要解决的问题模拟成一个生物进化的过程,通过复制、交叉、突变等操作产生下一代的解,并逐步淘汰掉适应度函数值低的解,增加适应度函数值高的解。

这样进化N代后就很有可能会进化出适应度函数值很高的个体。

举个例子,使用遗传算法解决“0-1背包问题”的思路:0-1背包的解可以编码为一串0-1字符串(0:不取,1:取);首先,随机产生M个0-1字符串,然后评价这些0-1字符串作为0-1背包问题的解的优劣;然后,随机选择一些字符串通过交叉、突变等操作产生下一代的M个字符串,而且较优的解被选中的概率要比较高。

这样经过G代的进化后就可能会产生出0-1背包问题的一个“近似最优解”。

编码:需要将问题的解编码成字符串的形式才能使用遗传算法。

基本遗传算法【精品毕业设计】(完整版)

基本遗传算法【精品毕业设计】(完整版)

基本遗传算法【精品毕业设计】(完整版)遗传算法1、遗传算法⽣物学基础和基本理论达尔⽂⾃然选择学说认为,⽣物要⽣存下去,就必须进⾏⽣存⽃争。

⽣存⽃争包括种内⽃争、种间⽃争以及⽣物跟⽆机环境之间的⽃争三个⽅⾯。

在⽣存⽃争中,具有有利变异(mutation)的个体容易存活下来,并且有更多的机会将有利变异传给后代;具有不利变异的个体就容易被淘汰,产⽣后代的机会也少得多。

因此,凡是在⽣存⽃争中获胜的个体都是对环境适应性⽐较强的。

达尔⽂把这种在⽣存⽃争中适者⽣存,不适者淘汰的过程叫做⾃然选择。

达尔⽂的⾃然选择学说表明,遗传和变异是决定⽣物进化的内在因素。

遗传是指⽗代与⼦代之间,在性状上存在的相似现象。

变异是指⽗代与⼦代之间,以及⼦代的个体之间,在性状上或多或少地存在的差异现象。

在⽣物体内,遗传和变异的关系⼗分密切。

⼀个⽣物体的遗传性状往往会发⽣变异,⽽变异的性状有的可以遗传。

遗传能使⽣物的性状不断地传送给后代,因此保持了物种的特性,变异能够使⽣物的性状发⽣改变,从⽽适应新的环境⽽不断地向前发展。

⽣物的各项⽣命活动都有它的物质基础,⽣物的遗传与变异也是这样。

根据现代细胞学和遗传学的研究得知,遗传物质的主要载体是染⾊体(chromsome),染⾊体主要是由DNA(脱氧核糖核酸)和蛋⽩质组成,其中DNA⼜是最主要的遗传物质。

现代分⼦⽔平的遗传学的研究⼜进⼀步证明,基因(gene)是有遗传效应的⽚段,它储存着遗传信息,可以准确地复制,也能够发⽣突变,并可通过控制蛋⽩质的合成⽽控制⽣物的性状。

⽣物体⾃⾝通过对基因的复制(reproduction)和交叉(crossover),即基因分离、基因⾃由组合和基因连锁互换)的操作使其性状的遗传得到选择和控制。

同时,通过基因重组、基因变异和染⾊体在结构和数⽬上的变异产⽣丰富多采的变异现象。

需要指出的是,根据达尔⽂进化论,多种多样的⽣物之所以能够适应环境⽽得以⽣存进化,是和上述的遗传和变异⽣命现象分不开的。

自然计算遗传算法【精品毕业设计】(完整版)

自然计算遗传算法【精品毕业设计】(完整版)

自然计算大作业一.二进制编码在遗传算法中,首先要将数据进行编码,这里采用二进制的方式进行编码。

第一步,我们根据题目的介绍可以得知该函数含有两个变量,以及各自的定义域。

在二进制编码中,我们首先要先计算它的编码长度。

计算公式如下: $${2^{{m_j} - 1}} < ({b_j} - {a_j})*precision \le {2^{{m_j}}} - 1$$其中precision为精度,如小数点后5位,则precision=10^5,mj为编码长度,${x_j} \in [{a_j},{b_j}]$二.二进制解码解码即编码的逆过程:$${x_j} = {a_j} + {\rm{decimal}}(substrin{g_j}) \times \frac{{{b_j} - {a_j}}}{{{2^{{m_j}}} - 1}}$$三.种群初始化编码完成后,开始对种群初始化,为了简便采用随机地方式进行初始化。

初始群体的生成:随机产生N个初始串结构数据,每个串结构数据称为一个个体,N个个体构成了一个群体。

GA以这N个串结构数据作为初始点开始进化。

def rand_init(self):for i in range(self.code_x1_length):self.code_x1 += str(random.randint(0, 1))for i in range(self.code_x2_length):self.code_x2 += str(random.randint(0, 1))四.适应度评估适应度表明个体或解的优劣性。

不同的问题,适应度函数的定义方式也不同。

def decoding(self, code_x1, code_x2):self.x1 = self.bounds[0][0] + int(code_x1, 2) * (self.bounds[0][1] - self.bounds[0][0]) / (2 ** self.code_x1_length - 1)self.x2 = self.bounds[1][0] + int(code_x2, 2) * (self.bounds[1][1] - self.bounds[1][0]) / (2 ** self.code_x2_length - 1)五.选择选择的目的是为了从当前群体中选出优良的个体,使它们有机会作为父代为下一代繁殖子孙。

基于遗传算法的自动排课系统毕业设计【精品毕业设计】(完整版)

基于遗传算法的自动排课系统毕业设计【精品毕业设计】(完整版)
课程表问题又称时间表问题,是一个多因素的优化决策问题,也是组合规划中的典型问题,是NP完全的[1]。对于排课问题的解决,研究人员己经使用了各种不同的算法,但由于该问题的复杂性,所求解也只能是较为合理、较为满意的解。
随着人工智能的发展,特别是在计算智能领域的拓展,借鉴于生物界进化思想和遗传算法,由于其超强的并行搜索能力,以及在解决优化问题中表现出来的高度鲁棒性,它已经被广泛应用于各个领域。目前,很多研究人员已使用遗传算法来求解排课问题,如文献[20]使用遗传算法优化教室的合理利用,文献[21]的用自适应的遗传算法求解大学课表安排问题,文献[22]的基于遗传算法排课系统的设计与实现等等。这些应用说明,使用遗传算法来解决排课问题,其结果还是令人较为满意的。
1.
回溯算法也叫试探法.它是一种系统地搜索问题的解的方法,可以被认为是一个有过剪枝的DFS(深度优先搜索)过程。它按优先条件向前搜索,以达到目标,但当搜索到某一步时.发现原先的选择并不优或达不到目标。就退回一步重新选择。而满足回溯条件的某个状态点称之为回溯点。具体到计算机智能排课系统中,选优条件即为排课数学模型中的约束条件群(需求集中的元素特征与资源集中的元素特征相互作用形成的数学关系)若不满足约束条件群,该选择即为不优或达不到目标当遍历该步骤的所有可能仍未满足约束条件群.则该状态满足了回溯条件,该状态点即为回溯点。
关键词:遗传算法、自动排课、Java。
Abstract
Along with science technical and community information technical increases continuously,calculator science is gradually mature, its mighty function has behaved deep cognition, and it has entered the human social each realm erupts to flick the more and more important function, bringing our life biggest of convenience.Curriculum arrangement is an important and complicated workinginschool,so solving the problem is of great importance for teaching programming.Investigatedand studied the algorithm existed,determinethatadoptgenetic algorithm.ThroughDesign ImplementationtheAutoCourseArrangementManagementSystemBaseonGeneticAlgorithm,researched theapplicationofgenetic algorithmin theCourseArrangementManagementSystem.

(完整版)遗传算法简介及代码详解

(完整版)遗传算法简介及代码详解

遗传算法简述及代码详解声明:本文内容整理自网络,认为原作者同意转载,如有冒犯请联系我。

遗传算法基本内容遗传算法为群体优化算法,也就是从多个初始解开始进行优化,每个解称为一个染色体,各染色体之间通过竞争、合作、单独变异,不断进化。

遗传学与遗传算法中的基础术语比较染色体:又可以叫做基因型个体(individuals)群体/种群(population):一定数量的个体组成,及一定数量的染色体组成,群体中个体的数量叫做群体大小。

初始群体:若干染色体的集合,即解的规模,如30,50等,认为是随机选取的数据集合。

适应度(fitness):各个个体对环境的适应程度优化时先要将实际问题转换到遗传空间,就是把实际问题的解用染色体表示,称为编码,反过程为解码/译码,因为优化后要进行评价(此时得到的解是否较之前解优越),所以要返回问题空间,故要进行解码。

SGA采用二进制编码,染色体就是二进制位串,每一位可称为一个基因;如果直接生成二进制初始种群,则不必有编码过程,但要求解码时将染色体解码到问题可行域内。

遗传算法的准备工作:1) 数据转换操作,包括表现型到基因型的转换和基因型到表现型的转换。

前者是把求解空间中的参数转化成遗传空间中的染色体或者个体(encoding),后者是它的逆操作(decoding)2) 确定适应度计算函数,可以将个体值经过该函数转换为该个体的适应度,该适应度的高低要能充分反映该个体对于解得优秀程度。

非常重要的过程。

遗传算法基本过程为:1) 编码,创建初始群体2) 群体中个体适应度计算3) 评估适应度4) 根据适应度选择个体5) 被选择个体进行交叉繁殖6) 在繁殖的过程中引入变异机制7) 繁殖出新的群体,回到第二步实例一:(建议先看实例二)求 []30,0∈x 范围内的()210-=x y 的最小值1) 编码算法选择为"将x 转化为2进制的串",串的长度为5位(串的长度根据解的精度设 定,串长度越长解得精度越高)。

vba 遗传算法

vba 遗传算法

VBA 遗传算法简介遗传算法是一种基于模拟进化思想的优化算法,通过模拟自然选择、遗传和突变等过程,逐代改进解决方案,以寻求最优解。

VBA (Visual Basic for Applications) 是一种用于应用程序编程的宏语言,广泛应用于 Microsoft Office 套件中,包括Excel、Word、PowerPoint 等软件。

在 VBA 中利用遗传算法解决问题,可以充分发挥 VBA 在办公自动化方面的优势。

基本原理遗传算法的基本原理是模拟生物进化过程中的遗传和突变机制。

其核心思想是通过不断迭代的过程,通过选择、交叉、变异等操作,从当前的种群中选择出优秀的个体,并将其基因组合生成新的个体,最终找到最优解。

遗传算法的基本流程如下: 1. 初始化种群:随机生成初始解作为种群的个体。

2. 适应度评估:根据问题的特定目标函数对每个个体进行评估,得到适应度值。

3. 选择操作:通过适应度值选择出优秀的个体,用于下一代的繁殖。

4. 交叉操作:从选择的个体中随机选择两个个体,通过基因交叉的方式生成新的个体。

5. 变异操作:以一定概率对新生成的个体的基因进行突变。

6. 重复步骤2-5,直到满足停止条件(达到最大迭代次数或找到满意解)。

VBA 实现在 VBA 中实现遗传算法,可以利用 Excel 的操作能力和 VBA 的编程能力,进行种群的创建、适应度评估、选择、交叉、变异等操作。

初始化种群在 Excel 中,可以利用 VBA 编写宏,随机生成初始解作为种群的个体。

可以使用RandBetween()函数生成随机数,并将其分配给特定单元格,作为初始解的一部分。

Sub InitializePopulation()Dim i As IntegerDim j As IntegerDim populationSize As IntegerDim chromosomeLength As IntegerpopulationSize = 10 ' 种群大小chromosomeLength = 5 ' 基因长度' 清空种群Range("A2:E11").ClearContents' 随机生成初始解For i = 2 To populationSize + 1For j = 1 To chromosomeLengthCells(i, j).Value = Application.WorksheetFunction.RandBetween(0, 1) Next jNext iEnd Sub适应度评估在遗传算法中,适应度函数用于评估每个个体的适应度值。

(完整版)遗传算法matlab实现源程序

(完整版)遗传算法matlab实现源程序

附页:一.遗传算法源程序: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;。

遗传算法解决TSP问题的matlab程序【精品毕业设计】(完整版)

遗传算法解决TSP问题的matlab程序【精品毕业设计】(完整版)

1.遗传算法解决TSP 问题(附matlab源程序)2.知n个城市之间的相互距离,现有一个推销员必须遍访这n个城市,并且每个城市3.只能访问一次,最后又必须返回出发城市。

如何安排他对这些城市的访问次序,可使其4.旅行路线的总长度最短?5.用图论的术语来说,假设有一个图g=(v,e),其中v是顶点集,e是边集,设d=(dij)6.是由顶点i和顶点j之间的距离所组成的距离矩阵,旅行商问题就是求出一条通过所有顶7.点且每个顶点只通过一次的具有最短距离的回路。

8.这个问题可分为对称旅行商问题(dij=dji,,任意i,j=1,2,3,…,n)和非对称旅行商9.问题(dij≠dji,,任意i,j=1,2,3,…,n)。

10.若对于城市v={v1,v2,v3,…,vn}的一个访问顺序为t=(t1,t2,t3,…,ti,…,tn),其中11.ti∈v(i=1,2,3,…,n),且记tn+1= t1,则旅行商问题的数学模型为:12.min l=σd(t(i),t(i+1)) (i=1,…,n)13.旅行商问题是一个典型的组合优化问题,并且是一个np难问题,其可能的路径数目14.与城市数目n是成指数型增长的,所以一般很难精确地求出其最优解,本文采用遗传算法15.求其近似解。

16.遗传算法:17.初始化过程:用v1,v2,v3,…,vn代表所选n个城市。

定义整数pop-size作为染色体的个数18.,并且随机产生pop-size个初始染色体,每个染色体为1到18的整数组成的随机序列。

19.适应度f的计算:对种群中的每个染色体vi,计算其适应度,f=σd(t(i),t(i+1)).20.评价函数eval(vi):用来对种群中的每个染色体vi设定一个概率,以使该染色体被选中21.的可能性与其种群中其它染色体的适应性成比例,既通过轮盘赌,适应性强的染色体被22.选择产生后台的机会要大,设alpha∈(0,1),本文定义基于序的评价函数为eval(vi)=al23.pha*(1-alpha).^(i-1) 。

遗传算法的MATLAB程序实例(精编文档).doc

遗传算法的MATLAB程序实例(精编文档).doc

【最新整理,下载后即可编辑】遗传算法的程序实例如求下列函数的最大值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:pypop1(:,i)=2.^(py-1).*pop(:,i);py=py-1;endpop2=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函数的功能是实现目标函数的计算,其公式采用本文示例仿真,可根据不同优化问题予以修改。

Vb写的遗传算法程序

Vb写的遗传算法程序

Vb写的遗传算法程序这是我用vb写的遗传算法程序。

是一些通用代码,与具体问题对应的代码空出来,用的时候填进去。

根据我的经验,要想用好遗传算法,代码必须自己写,因为问题不同,编码,杂交,变异算子可能都不一样。

特别是杂交算子,需要根据问题调整,甚至创造出新的杂交方法。

而且适应度计算的代码也需要自己写,特别是带约束的优化问题see_moonlight say :Attention to your "Post format", need "Title"Option Explicit'遗传算法参数Dim GeneLength As Integer '染色体长度Dim swarmNum As Integer '种群规模Dim Pc As Double '杂交概率Dim Pm As Double '突变概率Dim maxNum As Integer '遗传算法循环次数Dim panelBool As BooleanDim tournamentBool As Boolean'种群适应度统计Dim optGene As Integer '最佳个体的位置Dim worstGene As Integer '最差个体的位置Dim sumFitness As Double '适应度总和Dim meanFitness As Double '平均适应度Dim maxFitness As Double '最大适应度Dim minFitness As Double '最小适应度Dim stdevFitness As Double '适应度标准差'Dim OriPool() As ByteDim OriPool() As Double'Dim MatePool() As ByteDim MatePool() As DoubleDim Fitness() As DoubleDim panelFitness() As DoubleDim FileNum As Integer'高斯分布随机数Function randGauss() As DoubleDim i As IntegerrandGauss = 0For i = 1 To 20randGauss = randGauss + RndNext irandGauss = (randGauss - 10) / (1.667) ^ 0.5End Function'轮盘赌博选择算子Function panelSelection(Fitness() As Double) As IntegerDim index, fir, las, i As IntegerDim temp, sum, sumFitness As Doublefir = LBound(Fitness)las = UBound(Fitness)sumFitness = 0For i = fir To lassumFitness = sumFitness + Fitness(i)Next itemp = Rnd * sumFitness '产生随机数index = fir - 1sum = 0Do While sum < tempindex = index + 1sum = sum + Fitness(index)LoopIf index = fir - 1 ThenpanelSelection = firElsepanelSelection = indexEnd IfEnd Function'锦标赛选择算子Function tournamentSele(Fitness() As Double) As Integer Dim i, j As Integeri = Int(swarmNum * Rnd + 1)j = Int(swarmNum * Rnd + 1)If Fitness(i) >= Fitness(j) ThentournamentSele = iElsetournamentSele = jEnd IfEnd Function'计算种群适应度Private Sub outFitness(oriPool() As Double, swarmNum As Integer)Dim i As IntegerDim a, b, e As DoubleFor i = 1 To swarmNum'//***计算适应度语句***//Fitness(i) = 0'//***结束***//Next isumFitness = 0maxFitness = Fitness(1)minFitness = Fitness(1)optGene = 1worstGene = 1For i = 1 To swarmNumsumFitness = sumFitness + Fitness(i)If Fitness(i) > maxFitness ThenmaxFitness = Fitness(i)optGene = iEnd IfIf Fitness(i) < minFitness ThenminFitness = Fitness(i)worstGene = iEnd IfNext imeanFitness = sumFitness / swarmNumstdevFitness = 0For i = 1 To swarmNumstdevFitness = stdevFitness + (Fitness(i) - meanFitness) ^ 2 Next istdevFitness = stdevFitness / swarmNumIf maxFitness <> meanFitness Thene = 1.5a = (e - 1) * meanFitness / (maxFitness - meanFitness)b = (1 - a) * meanFitnessFor i = 1 To swarmNumpanelFitness(i) = a * Fitness(i) + bIf panelFitness(i) < 0 ThenpanelFitness(i) = 0End IfNext iElseFor i = 1 To swarmNumpanelFitness(i) = Fitness(i)Next iEnd IfEnd SubPrivate Sub Command1_Click()Dim i, j As IntegerDim iterNum As IntegerDim coupleNum As IntegerDim wife, husband As IntegerDim mateLocation As IntegerDim tempint As IntegerDim tempdbl As DoubleDim mutationLoc As IntegerDim copySelection As IntegerDim tempRnd As DoubleDim str As StringFileNum = FreeFileOpen "C:\My Documents\panel data\result.txt" For Output As FileNumswarmNum = 20Pc = 0.8Pm = 0.001maxNum = 30panelBool = FalsetournamentBool = TrueGeneLength = 13coupleNum = CInt(swarmNum * Pc / 2)ReDim OriPool(1 T o swarmNum, 1 To GeneLength) ReDim MatePool(1 To swarmNum, 1 T o GeneLength) ReDim Fitness(1 To swarmNum)ReDim panelFitness(1 To swarmNum)'initialize originpool'RandomizeFor i = 1 To swarmNum'//***初始化种群***//'For j = 1 To GeneLength'OriPool(i, j) = Int(2 * Rnd)'Next jFor j = 1 To 9OriPool(i, j) = RndNext jFor j = 10 To 12OriPool(i, j) = 100 * RndNext jOriPool(13) = Rnd'//***初始化结束***//Next iFor iterNum = 1 To maxNumCall outFitness(oriPool, swarmNum)Print #FileNum, "第" + CStr(iterNum) + "代解" For i = 1 To swarmNumstr = ""For j = 1 To GeneLengthIf TypeName(OriPool(i, j)) = "Double" Then str = str & Format(OriPool(i, j), "0.000") & "," Elsestr = str & CStr(OriPool(i, j))End IfNext jIf TypeName(OriPool(i, 1)) = "Double" Then str = Left(str, Len(str) - 1)End IfPrint #FileNum, str, Format(Fitness(i), "0.000") Next istr = "最优个体 "For j = 1 To GeneLengthIf TypeName(OriPool(optGene, j)) = "Double" Thenstr = str & Format(OriPool(optGene, j), "0.000") & ","Elsestr = str & CStr(OriPool(optGene, j))End IfNext jIf TypeName(OriPool(optGene, GeneLength)) = "Double" Thenstr = Left(str, Len(str) - 1)End IfPrint #FileNum, str, Format(Fitness(optGene), "0.000")str = "最差个体 "For j = 1 To GeneLengthIf TypeName(OriPool(worstGene, j)) = "Double" Thenstr = str & Format(OriPool(worstGene, j), "0.000") & ","Elsestr = str & CStr(OriPool(worstGene, j))End IfNext jIf TypeName(OriPool(worstGene, GeneLength)) = "Double" Thenstr = Left(str, Len(str) - 1)End IfPrint #FileNum, str, Format(Fitness(worstGene), "0.000")str = "平均适应度 = " & Format(meanFitness, "0.000") & " ; "str = str & "适应度标准差 = " & Format(stdevFitness, "0.000") Print #FileNum, str'//***复制算子无需改动***//'copy operator'For i = 1 To swarmNumIf panelBool ThencopySelection = panelSelection(panelFitness) End IfIf tournamentBool ThencopySelection = tournamentSele(Fitness)End IfFor j = 1 To GeneLengthMatePool(i, j) = OriPool(copySelection, j)Next jNext i'//***复制算子无需改动***//'crossover operator'For i = 1 To coupleNumwife = Int(swarmNum * Rnd + 1)husband = Int(swarmNum * Rnd + 1) mateLocation = Int(GeneLength * Rnd + 1)For j = 1 To mateLocationIf TypeName(MatePool(wife, j)) = "Double" Then tempdbl = MatePool(wife, j)MatePool(wife, j) = MatePool(husband, j) MatePool(husband, j) = tempdbltempint = MatePool(wife, j)MatePool(wife, j) = MatePool(husband, j) MatePool(husband, j) = tempintEnd IfNext jNext i'mutation operator'For i = 1 To swarmNum'//***二进制编码变异***//For j = 1 To GeneLengthtempRnd = RndIf tempRnd <= Pm ThenMatePool(i, j) = (MatePool(i, j) + 1) Mod 2 End IfNext j'//***二进制编码变异结束***//Next i'//***加速器***//'//***加速器结束***//'//***将交配池的个体复制到原始池***// For i = 1 To swarmNumFor j = 1 To GeneLengthOriPool(i, j) = MatePool(i, j)Next iNext iterNumText1.Text = "the end" End Sub。

遗传算法程序设计

遗传算法程序设计

06
总结与展望
遗传算法程序设计总结
优点
遗传算法是一种基于自然选择和遗传机制的优化算法,具有全局搜索能力和鲁棒性,在解 决复杂优化问题时表现出色。
应用领域
遗传算法在多个领域得到了广泛应用,如函数优化、机器学习、生产计划、交通运输等。 通过程序设计,可以实现遗传算法的自动化求解,提高求解效率和精度。
自适应遗传算法
总结词
根据进化过程中的反馈信息动态调整算法参数,提高遗传算法的适应性和性能。
描述
自适应遗传算法通过监控种群的适应度变化、进化速度等指标,动态地调整交叉、变异等算子的操作概率、操作 方式等参数。这样可以更好地适应不同问题和环境,提高算法的收敛性和鲁棒性。
混合遗传算法
总结词
将遗传算法与其他优化算法相结合,形成更强大的混合优化策略。
化。
解码并输出最优解
解码操作
将最后一代种群中的最优个体进行解码操作,还原为问 题的解。
输出最优解
输出解码后的最优解,作为遗传算法程序设计的结果。
04
遗传算法的应用案例与实 验
函数优化问题
最值问题
遗传算法可以用于求解各种函数的最大值或最小值, 如一元函数、多元函数等。通过编码函数的参数,并 使用适应度函数评估个体的优劣,遗传算法能够高效 地在解空间中搜索最优解。
感谢您的观看
THANKS
自动化机器学习:遗传算法可以用于自动化机器 学习的特征选择、模型选择和参数调优等环节, 提高机器学习的效率和效果。
强化学习应用:遗传算法可以用于强化学习中的 策略优化,通过优化决策策略来提升强化学习任 务的性能。
总之,遗传算法程序设计在解决复杂优化问题中 发挥着重要作用,未来随着算法性能的不断提升 和应用领域的拓展,将在更多领域展现其强大潜 力。

基本遗传算法的C源程序。doc【精品毕业设计】(完整版)

基本遗传算法的C源程序。doc【精品毕业设计】(完整版)

/********************************************************** ********//* 基于基本遗传算法的函数最优化SGA.C *//* A Function Optimizer using Simple Genetic Algorithm *//* developed from the Pascal SGA code presented by David E.Goldberg *///********************************************************** ********/#include#include#include#include "graph.c"/* 全局变量*/struct individual /* 个体*/{unsigned *chrom; /* 染色体*/double fitness; /* 个体适应度*/double varible; /* 个体对应的变量值*/int xsite; /* 交叉位置*/int parent[2]; /* 父个体*/int *utility; /* 特定数据指针变量*/};struct bestever /* 最佳个体*/{unsigned *chrom; /* 最佳个体染色体*/double fitness; /* 最佳个体适应度*/double varible; /* 最佳个体对应的变量值*/int generation; /* 最佳个体生成代*/};struct individual *oldpop; /* 当前代种群*/ struct individual *newpop; /* 新一代种群*/ struct bestever bestfit; /* 最佳个体*/double sumfitness; /* 种群中个体适应度累计*/ double max; /* 种群中个体最大适应度*/ double avg; /* 种群中个体平均适应度*/ double min; /* 种群中个体最小适应度*/float pcross; /* 交叉概率*/float pmutation; /* 变异概率*/int popsize; /* 种群大小*/int lchrom; /* 染色体长度*/int chromsize; /* 存储一染色体所需字节数*/ int gen; /* 当前世代数*/int maxgen; /* 最大世代数*/int run; /* 当前运行次数*/int maxruns; /* 总运行次数*/int printstrings; /* 输出染色体编码的判断,0 -- 不输出, 1 -- 输出*/ int nmutation; /* 当前代变异发生次数*/int ncross; /* 当前代交叉发生次数*//* 随机数发生器使用的静态变量*/static double oldrand[55];static int jrand;static double rndx2;static int rndcalcflag;/* 输出文件指针*/FILE *outfp ;/* 函数定义*/void advance_random();int flip(float);rnd(int, int);void randomize();double randomnormaldeviate();float randomperc(),rndreal(float,float);void warmup_random(float);void initialize(),initdata(),initpop();void initreport(),generation(),initmalloc();void freeall(),nomemory(char *),report();void writepop(),writechrom(unsigned *);void preselect();void statistics(struct individual *);void title(),repchar (FILE *,char *,int);void skip(FILE *,int);int select();void objfunc(struct individual *);int crossover (unsigned *, unsigned *, unsigned *, unsigned *); void mutation(unsigned *);void initialize() /* 遗传算法初始化*/{/* 键盘输入遗传算法参数*/initdata();/* 确定染色体的字节长度*/chromsize = (lchrom/(8*sizeof(unsigned)));if(lchrom%(8*sizeof(unsigned))) chromsize++;/*分配给全局数据结构空间*/initmalloc();/* 初始化随机数发生器*/randomize();/* 初始化全局计数变量和一些数值*/ nmutation = 0;ncross = 0;bestfit.fitness = 0.0;bestfit.generation = 0;/* 初始化种群,并统计计算结果*/ initpop();statistics(oldpop);initreport();}void initdata() /* 遗传算法参数输入*/{char answer[2];setcolor(9);disp_hz16("种群大小(20-100):",100,150,20); gscanf(320,150,9,15,4,"%d", &popsize);if((popsize%2) != 0){fprintf(outfp, "种群大小已设置为偶数\n"); popsize++;};。

vba 遗传算法

vba 遗传算法

vba 遗传算法
VBA遗传算法是一种基于生物进化原理的优化算法,它通过模拟自然
选择、交叉、变异等过程,从种群中筛选出最优解。

在实际应用中,VBA遗传算法被广泛应用于优化问题的求解,如机器学习、数据挖掘、图像处理等领域。

VBA遗传算法的基本流程如下:
1. 初始化种群:随机生成一组初始解,作为种群的初始状态。

2. 评估适应度:根据问题的特点,设计适应度函数,对每个个体进行
评估,得到其适应度值。

3. 选择操作:根据适应度值,选择优秀的个体,作为下一代种群的父代。

4. 交叉操作:对父代个体进行交叉操作,生成新的个体。

5. 变异操作:对新个体进行变异操作,增加种群的多样性。

6. 评估适应度:对新个体进行适应度评估。

7. 选择操作:根据适应度值,选择优秀的个体,作为下一代种群的父代。

8. 终止条件:当达到预设的终止条件时,停止迭代,输出最优解。

VBA遗传算法的优点在于可以在大规模搜索空间中找到最优解,且不容易陷入局部最优解。

此外,VBA遗传算法具有较好的鲁棒性,对于问题的输入数据变化不敏感。

然而,VBA遗传算法也存在一些缺点。

首先,算法的效率较低,需要大量的计算资源和时间。

其次,算法的结果具有一定的随机性,不同的初始状态可能会得到不同的结果。

最后,算法的参数设置对结果影响较大,需要经过反复试验和调整。

总之,VBA遗传算法是一种强大的优化算法,可以应用于各种复杂的优化问题。

在实际应用中,需要根据问题的特点和实际情况,合理设计算法的参数和适应度函数,以达到最优的求解效果。

vba遗传算法

vba遗传算法

vba遗传算法
VBA遗传算法是一种基于生物进化理论的优化算法,它模拟自然界中的遗传进化过程,通过不断地进化和筛选,逐步寻找最优解。

该算法可以应用于各种问题的优化,例如机器学习、最优化问题、数据挖掘等。

在VBA中,我们可以通过编写遗传算法的代码来实现自动化优化,并且该算法具有高效性和可扩展性。

VBA遗传算法的基本原理是通过模拟基因的交叉、变异和选择等进化过程,生成新的种群,并根据适应度函数对种群进行评估。

在遗传算法的过程中,种群中的个体会不断地交叉和变异,从而产生新的后代,经过多轮迭代,逐渐趋向最优解。

在VBA中,我们可以通过编写适应度函数来评估每个个体的适应度,并根据适应度值对个体进行选择和交叉。

VBA遗传算法的应用非常广泛,它可以用于解决各种不同类型的问题。

例如,我们可以使用遗传算法来优化机器学习模型的参数,从而提高模型的预测准确率。

此外,遗传算法还可以用于优化复杂的工程问题,例如设计优化、生产调度和资源分配等。

总之,VBA遗传算法是一种非常强大和高效的优化算法,它可以应用于各种不同类型的问题,并且非常适合用于自动化优化。

如果你需要解决一个复杂的优化问题,VBA遗传算法是一个值得考虑的工具。

- 1 -。

遗传算法程序设计

遗传算法程序设计

. 1 “丹 ”悦 ime u ies y Xime 3 10 e e f tmai Xa n v ri . a n 0 6 o n t 6 Ab rc T i ppr a it dco o nwl- vl e atmc ga ig hoyporm s at hs e i n r ut n e yd e pd o i pormn tclg-rga t a s n o i f e o u r e ds n g GA eg i o i n f Ke w rs eeia oi m; utr; in y d gnt l rh src e ds o c t g t u eg
下面利用图示说明 。
图5 两个父代计算机程序
() 5控制参数设定 在遗传 程序 设计中 , 有两 个 主要的控制 参数—

体 规模和运行的 最大代数 , 另外三个次 要控制 参数是: 杂 交概率 , 深度 ( 最大 即在演 化过程中由杂交产生的树的最 大 深度 )初 始最 大深度 ( 在初始群 体中随机 产生 的树 , 即 的最大深度 ) 。
0, 1)
采用二进制数编码, 取适应度函 F 1E 其中E为能量函数, 数 = /, 杂交概率 P= . . O0, 4初始 群体M=5, 代数G 4。 0最大 = 0 编程计算结果如下表 1 .
最终权值分布
W ( , ) 一 1. 0 W 1 二 一 9 2 13二 8 4 7. . ( 4) .25 W ( 3 = 一 1 . 2 , ( 4 = 一1 . 3 2.) 3 1 3W 2,) 060 W O ,) 一 1 . W ( , ) 一1 . 4 6二 93 0, 4 5 = 8 98 4
() 3适应值度量 a 原始适应值 .
图a 最终产生的随机程序树
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

遗传算法的VB程序最近看了下遗传算法,刚看了一点,就觉得手痒,非要把程序编制出来看看效果(我现在总认为那些理论再高深,无法用计算机实现就是空话,呵呵)。

下面是我调试了好久的代码,无赖没有学过数据结构&算法,程序写的很差,单效果还是出来了,高兴,和大家共同分享下成果吧。

还是一样,不想说原理,因为这里想搞个公式上去N麻烦。

直接给点实际的东西。

具体步骤是参考《MATLAB遗传算法工具箱及应用》(西安电子科技大学出版社)16~22页的相关说明编制的,有兴趣的同学可以去看看这本书。

在程序调试成功的同时,郁闷的是工作的事情,现在好多企业久是指名不要研究生,而我又是一个四不象,本专业是热能工程,可我本专业基本上还是本科水平,大部分时间都去自学一些杂七杂八的东西去了,比如人工智能,PLC,自动控制方面,图像处理啊,可又只是懂个皮毛,现在找工作也不知道怎么给自己定位了。

有相关经历的同学可要指点我一二哦。

Option Explicit'程序实现功能:用遗传算法求函数的最大值'作者: laviewpbt'联系方式:'QQ:33184777'版本:Version 1.4.0'说明:复制请保留源作者信息,转载请说明,欢迎大家提出意见和建议Dim N2(30) As Long '用来保存2的N次方的数据Dim Script As Object '调用其Eval函数Public Enum CrossOverOnePointCrossOver '单点交叉TwoPointCrossOver '两点交叉UniformCrossOver '平均交叉End EnumPublic Enum SelectionRouletteWheelSelection '轮盘赌选择StochasticTourament '随机竞争选择RandomLeagueMatches '随机联赛选择StochasticUniversalSampleing '随机遍历取样End EnumPublic Enum EnCodingBinary '标准二进制编码Gray '格雷码End EnumPrivate Type GAinfoMax As DoubleCordinate() As DoubleEnd Type'*********************************** 二进制码转格雷码***********************************''函数名: BinaryToGray'参数: Value - 要转换的二进制数的实值'说明:如3对应的二进制表示为0011,而用格雷码表示为0010,这个函数的value为0011代表的实数' 而返回的是0010所代表的实数(2)'返回值:返回格雷码对应的二进制数的实值'源作者:黄毅'开发语言: C语言'修改者: laviewpbt'时间: 2006-11-4''*********************************** 二进制码转格雷码***********************************Public Function BinaryToGray(Value As Long) As LongDim V As Long, Max As LongDim start As Long, mEnd As Long, Temp As Long, Counter As Long Dim Flag As BooleanV = Value: Max = 1While V > 0V = V / 2Max = Max * 2WendIf Max = 0 Then Exit FunctionFlag = TruemEnd = Max - 1While start < mEndTemp = (mEnd + start - 1) / 2If Value <= Temp ThenIf Not Flag ThenCounter = Counter + (mEnd - start + 1) / 2End IfmEnd = TempFlag = TrueElseIf Flag ThenCounter = Counter + (mEnd - start + 1) / 2End IfTemp = Temp + 1start = TempFlag = FalseEnd IfWendBinaryToGray = CounterEnd Function'*********************************** 格雷码转二进制码***********************************''函数名: BinaryToGray'参数: Value - 要转换的二进制数的实值'说明:如3对应的二进制表示为0011,而用格雷码表示为0010,这个函数的value为0010代表的实数' 而返回的是0010所代表的实数(2)'返回值:返回格雷码对应的二进制数的实值'源作者:黄毅,感谢viena(维也纳nn)'开发语言: C语言'修改者: laviewpbt'时间: 2006-11-4''*********************************** 格雷码转二进制码***********************************Public Function GrayToBinary(Value As Long) As LongDim V As Long, Max As LongDim start As Long, mEnd As Long, Temp As Long, Counter As Long Dim Flag As BooleanV = Value: Max = 1While V > 0V = V / 2Max = Max * 2WendFlag = TruemEnd = Max - 1While start < mEndTemp = Counter + (mEnd - start + 1) / 2If Flag Xor (Value < Temp) ThenIf Flag Then Counter = Tempstart = (start + mEnd + 1) / 2Flag = FalseElseIf Not Flag Then Counter = TempmEnd = (start + mEnd - 1) / 2Flag = TrueEnd IfWendGrayToBinary = startEnd Function'*********************************** 十进制转转二进制码***********************************''函数名: DecToBinary'参数: Value - 要转换的十进制数'返回值:返回对应的二进制数'修改者: laviewpbt'时间: 2006-11-4''*********************************** 十进制转转二进制码***********************************Private Function DecToBinary(ByVal Value As Long) As String Dim StrTemp As StringDim ModNum As IntegerDo While Value > 0ModNum = Value Mod 2Value = Value \ 2StrTemp = ModNum & StrTempLoopDecToBinary = StrTempEnd Function'************************************* 二十进制转换**********************************''函数名: BinToDec'参数: BinCode - 二进制字符串'返回值:转换后的十进制数'说明:二进制字符串转换位十进制数'作者: laviewpbt'时间: 2006-11-3''************************************* 二十进制转换**********************************Public Function BinToDec(BinCode As String) As LongDim i As Integer, Dec As Long, Length As IntegerLength = Len(BinCode)For i = 1 To LengthIf Mid(BinCode, i, 1) = "1" ThenDec = Dec + N2(Length - i)End IfNextBinToDec = DecEnd Function'*********************************** 编码***********************************''过程名: Coding'参数: Bits - 需要编码的位数' BinGroup - 保存群体编码数据的数组'说明:编码,准确的说应该是初始化种群,对于二进制码和格雷码这个过程一样的'作者: laviewpbt'时间: 2006-11-3''*********************************** 编码***********************************Public Sub Coding(Bits As Integer, BinGroup() As String)Dim i As Integer, j As IntegerDim Temp As StringRandomizeFor i = 1 To UBound(BinGroup, 1)Temp = ""For j = 1 To BitsIf Rnd >= 0.5 ThenTemp = Temp & "1"ElseTemp = Temp & "0"End IfNextBinGroup(i) = Temp。

相关文档
最新文档