遗传算法MATLAB实现代码

合集下载

基于遗传算法的BP神经网络MATLAB代码

基于遗传算法的BP神经网络MATLAB代码

基于遗传算法的BP神经网络MATLAB代码以下是基于遗传算法的BP神经网络的MATLAB代码,包括网络初始化、适应度计算、交叉运算、突变操作和迭代训练等。

1.网络初始化:```matlabfunction net = initialize_network(input_size, hidden_size, output_size)net.input_size = input_size;net.hidden_size = hidden_size;net.output_size = output_size;net.hidden_weights = rand(hidden_size, input_size);net.output_weights = rand(output_size, hidden_size);net.hidden_biases = rand(hidden_size, 1);net.output_biases = rand(output_size, 1);end```2.适应度计算:```matlabfunction fitness = calculate_fitness(net, data, labels)output = forward_propagation(net, data);fitness = sum(sum(abs(output - labels)));end```3.前向传播:```matlabfunction output = forward_propagation(net, data)hidden_input = net.hidden_weights * data + net.hidden_biases;hidden_output = sigmoid(hidden_input);output_input = net.output_weights * hidden_output +net.output_biases;output = sigmoid(output_input);endfunction result = sigmoid(x)result = 1 ./ (1 + exp(-x));end```4.交叉运算:```matlabfunction offspring = crossover(parent1, parent2)point = randi([1 numel(parent1)]);offspring = [parent1(1:point) parent2((point + 1):end)]; end```5.突变操作:```matlabfunction mutated = mutation(individual, mutation_rate) for i = 1:numel(individual)if rand < mutation_ratemutated(i) = rand;elsemutated(i) = individual(i);endendend```6.迭代训练:```matlabfunction [best_individual, best_fitness] =train_network(data, labels, population_size, generations, mutation_rate)input_size = size(data, 1);hidden_size = round((input_size + size(labels, 1)) / 2);output_size = size(labels, 1);population = cell(population_size, 1);for i = 1:population_sizepopulation{i} = initialize_network(input_size, hidden_size, output_size);endbest_individual = population{1};best_fitness = calculate_fitness(best_individual, data, labels);for i = 1:generationsfor j = 1:population_sizefitness = calculate_fitness(population{j}, data, labels);if fitness < best_fitnessbest_individual = population{j};best_fitness = fitness;endendselected = selection(population, data, labels);for j = 1:population_sizeparent1 = selected{randi([1 numel(selected)])};parent2 = selected{randi([1 numel(selected)])};offspring = crossover(parent1, parent2);mutated_offspring = mutation(offspring, mutation_rate);population{j} = mutated_offspring;endendendfunction selected = selection(population, data, labels) fitnesses = zeros(length(population), 1);for i = 1:length(population)fitnesses(i) = calculate_fitness(population{i}, data, labels);end[~, indices] = sort(fitnesses);selected = population(indices(1:floor(length(population) / 2)));end```这是一个基于遗传算法的简化版BP神经网络的MATLAB代码,使用该代码可以初始化神经网络并进行迭代训练,以获得最佳适应度的网络参数。

利用MATLAB编制的遗传算法代码

利用MATLAB编制的遗传算法代码

function gaTSPCityNum=30;[dislist,Clist]=tsp(CityNum);inn=100; %初始种群大小¡gnmax=1000; %最大概率pc=0.8; %交叉概率pm=0.8; %变异概率%产生初始种群for i=1:inns(i,:)=randperm(CityNum);end[f,p]=objf(s,dislist);gn=1;while gn<gnmax+1for j=1:2:innseln=sel(s,p); %选择操作scro=cro(s,seln,pc); %交叉操作scnew(j,:)=scro(1,:);scnew(j+1,:)=scro(2,:);smnew(j,:)=mut(scnew(j,:),pm); %变异操作smnew(j+1,:)=mut(scnew(j+1,:),pm);ends=smnew; %产生了新的种群[f,p]=objf(s,dislist); %计算新种群的适应度%记录当前代最好和平均的适应度[fmax,nmax]=max(f);ymean(gn)=1000/mean(f);ymax(gn)=1000/fmax;%记录当前代的最佳个体x=s(nmax,:);drawTSP(Clist,x,ymax(gn),gn,0);gn=gn+1;%pause;endgn=gn-1;figure(2);plot(ymax,'r'); hold on;plot(ymean,'b');grid;title('ËÑË÷¹ý³Ì');legend('×îÓŽâ','ƽ¾ù½â');end%------------------------------------------------%计算适应度函数function [f,p]=objf(s,dislist);inn=size(s,1); %读取种群大小¡for i=1:innf(i)=CalDist(dislist,s(i,:)); %计算函数值,即适应度endf=1000./f';%计算选择概率fsum=0;for i=1:innfsum=fsum+f(i)^15;endfor i=1:innps(i)=f(i)^15/fsum;end%计算累积概率p(1)=ps(1);for i=2:innp(i)=p(i-1)+ps(i);endp=p';end%--------------------------------------------------function pcc=pro(pc);test(1:100)=0;l=round(100*pc);test(1:l)=1;n=round(rand*99)+1;pcc=test(n);end%--------------------------------------------------%“选择”操作function seln=sel(s,p);inn=size(p,1);%从种群中选择两个个体for i=1:2r=rand; %产生一个随机数prand=p-r;j=1;while prand(j)<0j=j+1;endseln(i)=j; %选中个体的序号endend%------------------------------------------------%“交叉”操作function scro=cro(s,seln,pc);bn=size(s,2);pcc=pro(pc); %根据交叉概率决定是否进行交叉操作,1则是,0则否scro(1,:)=s(seln(1),:);scro(2,:)=s(seln(2),:);if pcc==1c1=round(rand*(bn-2))+1; %在[1,bn-1]范围内随机产生一个交叉位 c2=round(rand*(bn-2))+1;chb1=min(c1,c2);chb2=max(c1,c2);middle=scro(1,chb1+1:chb2);scro(1,chb1+1:chb2)=scro(2,chb1+1:chb2);scro(2,chb1+1:chb2)=middle;for i=1:chb1while find(scro(1,chb1+1:chb2)==scro(1,i))zhi=find(scro(1,chb1+1:chb2)==scro(1,i));y=scro(2,chb1+zhi);scro(1,i)=y;endwhile find(scro(2,chb1+1:chb2)==scro(2,i))zhi=find(scro(2,chb1+1:chb2)==scro(2,i));y=scro(1,chb1+zhi);scro(2,i)=y;endendfor i=chb2+1:bnwhile find(scro(1,1:chb2)==scro(1,i))zhi=find(scro(1,1:chb2)==scro(1,i));y=scro(2,zhi);scro(1,i)=y;endwhile find(scro(2,1:chb2)==scro(2,i))zhi=find(scro(2,1:chb2)==scro(2,i));y=scro(1,zhi);scro(2,i)=y;endendendend%--------------------------------------------------%“变异”操作function snnew=mut(snew,pm);bn=size(snew,2);snnew=snew;pmm=pro(pm); %¸根据变异概率决定是否进行变异操作,1则是,0则否if pmm==1c1=round(rand*(bn-2))+1; %在[1,bn-1]范围内随机产生一个变异位 c2=round(rand*(bn-2))+1;chb1=min(c1,c2);chb2=max(c1,c2);x=snew(chb1+1:chb2);snnew(chb1+1:chb2)=fliplr(x); endend。

遗传算法matlab代码

遗传算法matlab代码

function youhuafunD=code;N=50; % Tunablemaxgen=50; % Tunablecrossrate=0.5; %Tunablemuterate=0.08; %Tunablegeneration=1;num = length(D);fatherrand=randint(num,N,3);score = zeros(maxgen,N);while generation<=maxgenind=randperm(N-2)+2; % 随机配对交叉A=fatherrand(:,ind(1:(N-2)/2));B=fatherrand(:,ind((N-2)/2+1:end));% 多点交叉rnd=rand(num,(N-2)/2);ind=rnd tmp=A(ind);A(ind)=B(ind);B(ind)=tmp;% % 两点交叉% for kk=1:(N-2)/2% rndtmp=randint(1,1,num)+1;% tmp=A(1:rndtmp,kk);% A(1:rndtmp,kk)=B(1:rndtmp,kk);% B(1:rndtmp,kk)=tmp;% endfatherrand=[fatherrand(:,1:2),A,B];% 变异rnd=rand(num,N);ind=rnd [m,n]=size(ind);tmp=randint(m,n,2)+1;tmp(:,1:2)=0;fatherrand=tmp+fatherrand;fatherrand=mod(fatherrand,3);% fatherrand(ind)=tmp;%评价、选择scoreN=scorefun(fatherrand,D);% 求得N个个体的评价函数score(generation,:)=scoreN;[scoreSort,scoreind]=sort(scoreN);sumscore=cumsum(scoreSort);sumscore=sumscore./sumscore(end);childind(1:2)=scoreind(end-1:end);for k=3:N tmprnd=rand;tmpind=tmprnd difind=[0,diff(tmpind)];if ~any(difind)difind(1)=1;endchildind(k)=scoreind(logical(difind));endfatherrand=fatherrand(:,childind);generation=generation+1;end% scoremaxV=max(score,[],2);minV=11*300-maxV;plot(minV,'*');title('各代的目标函数值');F4=D(:,4);FF4=F4-fatherrand(:,1);FF4=max(FF4,1);D(:,5)=FF4;save DData Dfunction D=codeload youhua.mat% properties F2 and F3F1=A(:,1);F2=A(:,2);F3=A(:,3);if (max(F2)>1450)||(min(F2)<=900)error('DATA property F2 exceed it''s range (900,1450]') end% get group property F1 of data, according to F2 value F4=zeros(size(F1));for ite=11:-1:1index=find(F2<=900+ite*50);F4(index)=ite;endD=[F1,F2,F3,F4];function ScoreN=scorefun(fatherrand,D)F3=D(:,3);F4=D(:,4);N=size(fatherrand,2);FF4=F4*ones(1,N);FF4rnd=FF4-fatherrand;FF4rnd=max(FF4rnd,1);ScoreN=ones(1,N)*300*11;% 这里有待优化for k=1:NFF4k=FF4rnd(:,k);for ite=1:11F0index=find(FF4k==ite);if ~isempty(F0index)tmpMat=F3(F0index);tmpSco=sum(tmpMat);ScoreBin(ite)=mod(tmpSco,300);endendScorek(k)=sum(ScoreBin);endScoreN=ScoreN-Scorek;遗传算法实例:% 下面举例说明遗传算法%% 求下列函数的最大值%% f(x)=10*sin(5x)+7*cos(4x) x∈[0,10] %% 将x 的值用一个10位的二值形式表示为二值问题,一个10位的二值数提供的分辨率是每为(10-0)/(2^10-1)≈0.01 。

遗传算法matlab程序代码

遗传算法matlab程序代码

遗传算法matlab程序代码遗传算法是一种优化算法,用于在给定的搜索空间中寻找最优解。

在Matlab中,可以通过以下代码编写一个基本的遗传算法:% 初始种群大小Npop = 100;% 搜索空间维度ndim = 2;% 最大迭代次数imax = 100;% 初始化种群pop = rand(Npop, ndim);% 最小化目标函数fun = @(x) sum(x.^2);for i = 1:imax% 计算适应度函数fit = 1./fun(pop);% 选择操作[fitSort, fitIndex] = sort(fit, 'descend');pop = pop(fitIndex(1:Npop), :);% 染色体交叉操作popNew = zeros(Npop, ndim);for j = 1:Npopparent1Index = randi([1, Npop]);parent2Index = randi([1, Npop]);parent1 = pop(parent1Index, :);parent2 = pop(parent2Index, :);crossIndex = randi([1, ndim-1]);popNew(j,:) = [parent1(1:crossIndex),parent2(crossIndex+1:end)];end% 染色体突变操作for j = 1:NpopmutIndex = randi([1, ndim]);mutScale = randn();popNew(j, mutIndex) = popNew(j, mutIndex) + mutScale;end% 更新种群pop = [pop; popNew];end% 返回最优解[resultFit, resultIndex] = max(fit);result = pop(resultIndex, :);以上代码实现了一个简单的遗传算法,用于最小化目标函数x1^2 + x2^2。

遗传算法优化相关MATLAB算法实现

遗传算法优化相关MATLAB算法实现

遗传算法优化相关MATLAB算法实现遗传算法(Genetic Algorithm,GA)是一种基于生物进化过程的优化算法,能够在空间中找到最优解或接近最优解。

它模拟了自然选择、交叉和变异等进化操作,通过不断迭代的方式寻找最佳的解。

遗传算法的主要步骤包括:初始化种群、评估适应度、选择、交叉、变异和更新种群等。

在MATLAB中,可以使用遗传算法工具箱(Genetic Algorithm & Direct Search Toolbox)来实现遗传算法的优化。

下面以实现一个简单的函数优化为例进行说明。

假设我们要优化以下函数:```f(x)=x^2-2x+1```首先,我们需要定义适应度函数,即上述函数f(x)。

在MATLAB中,可以使用如下代码定义适应度函数:```MATLABfunction fitness = myFitness(x)fitness = x^2 - 2*x + 1;end```接下来,我们需要自定义遗传算法的参数,包括种群大小、迭代次数、交叉概率和变异概率等。

在MATLAB中,可以使用如下代码定义参数:```MATLABpopulationSize = 100; % 种群大小maxGenerations = 100; % 迭代次数crossoverProbability = 0.8; % 交叉概率mutationProbability = 0.02; % 变异概率```然后,我们需要定义遗传算法的上下界范围。

在本例中,x的范围为[0,10]。

我们可以使用如下代码定义范围:```MATLABlowerBound = 0; % 下界upperBound = 10; % 上界```接下来,我们可以使用遗传算法工具箱中的`ga`函数进行遗传算法的优化。

如下所示:```MATLAB```最后,我们可以得到最优解x和最优值fval。

在本例中,我们得到的结果应该接近1以上只是一个简单的例子,实际应用中可能需要根据具体问题进行参数的设定和函数的定义。

matlab 自带的粒子群和遗传算法

matlab 自带的粒子群和遗传算法

matlab 自带的粒子群和遗传算法粒子群优化算法(Particle Swarm Optimization, PSO)和遗传算法(Genetic Algorithm, GA)是两种常用的进化计算算法,常用于求解优化问题。

在 MATLAB 中,内置了对这两种算法的支持。

粒子群优化算法是一种通过模拟鸟群或鱼群的行为方式来进行优化的算法。

该算法通过维护一个粒子群,每个粒子代表一个解,通过迭代优化粒子的位置来逐步寻找最优解。

在MATLAB 中,可以使用 `pso` 函数来实现粒子群优化算法。

```matlab[x, fval] = pso(@objective, nvars, lb, ub)```其中 `@objective` 是目标函数的句柄,`nvars` 是变量个数,`lb` 和 `ub` 分别是各个变量的下界和上界。

函数返回的 `x` 是最优解,`fval` 是最优解对应的目标函数值。

遗传算法是一种通过模拟生物进化过程来进行优化的算法。

该算法通过定义适应度函数来评价每个个体的适应度,并使用遗传操作(交叉、变异、选择)来进化种群,从而逐步寻找最优解。

在 MATLAB 中,可以使用 `ga` 函数来实现遗传算法。

```matlab[x, fval] = ga(@objective, nvars, [], [], [], [], lb, ub)```其中 `@objective` 是目标函数的句柄,`nvars` 是变量个数,`lb` 和 `ub` 分别是各个变量的下界和上界。

函数返回的 `x` 是最优解,`fval` 是最优解对应的目标函数值。

在使用这两种算法时,需要自定义目标函数 `@objective` 来适应具体的优化问题。

目标函数的输入是一个向量,表示待优化的变量,输出是一个标量,表示对应变量的适应度或目标函数值。

以下是一个示例,使用粒子群优化算法和遗传算法来求解一个简单的函数优化问题:```matlab% Objective functionfunction f = objective(x)f = sin(x) + cos(2*x);end% Particle swarm optimizationnvars = 1; % Number of variableslb = -10; % Lower bound of variableub = 10; % Upper bound of variable[x_pso, fval_pso] = pso(@objective, nvars, lb, ub);% Genetic algorithm[x_ga, fval_ga] = ga(@objective, nvars, [], [], [], [], lb, ub);disp("Particle Swarm Optimization:")disp("Best solution: " + x_pso)disp("Objective value: " + fval_pso)disp("Genetic Algorithm:")disp("Best solution: " + x_ga)disp("Objective value: " + fval_ga)```在上述示例中,首先定义了一个简单的目标函数 `objective`,然后分别使用粒子群优化算法和遗传算法来求解最优化问题。

遗传算法matlab源代码

遗传算法matlab源代码

方案一的程序编码函数主文件:function[Xp,LC1,LC2,LC3]=CLBGA8(M,Pm) %%%陈璐斌编程,解决VRP问题(带时间窗)%%输入参数%M遗传进化迭代次数%Pm变异概率%%输出参数%Xp最优个体%LC1目标收敛曲线%LC2平均适应度收敛曲线%LC3最优适应度收敛曲线%%%变量初始化Xp=zeros(1,5);LC1=zeros(1,M);LC2=zeros(1,M);LC3=zeros(1,M);Best=inf;%%编码方式-第一步:产生初始种群N=10;%N 种群规模farm=cell(1,N);%存储种群的细胞结构k=1;while (N-k>=0)G=randperm(5);%产生5个客户的全排列farm{k}=G;k=k+1;end%%%进化迭代计数器counter=1;while counter<=M%%第二步:交叉%交叉采用双亲双子单点交叉N=10;%种群规模newfarm=cell(1,2*N-4);%存储子代的细胞结构Ser=randperm(N);%两两随机配对表生成for i=1:(N-2)%避免交叉概率为1 A=farm{Ser(i)};B=farm{Ser(i+1)};%取出父代P0=unidrnd(5);%随机选择交叉点aa=zeros(1,5);bb=zeros(1,5);A_=A;B_=B;for ii=1:5-P0aa(ii)=B(P0+ii);endfor ii=1:5-P0for iiii=1:5if(B(P0+ii)==A_(iiii))A_(iiii)=0;endendendfor iii=6-P0:5for iiii=1:5if(A_(iiii)~=0)aa(iii)=A_(iiii);A_(iiii)=0;breakendendendfor ii=1:5-P0bb(ii)=A(P0+ii);endfor ii=1:5-P0for iiii=1:5if(A(P0+ii)==B_(iiii))B_(iiii)=0;endendendfor iii=6-P0:5for iiii=1:5if(B_(iiii)~=0)bb(iii)=B_(iiii);B_(iiii)=0;breakendendend%产生子代newfarm{2*i-1}=aa;newfarm{2*i}=bb;endFARM=[farm,newfarm];%新旧种群合并%%第三步:选择复制%%计算当前种群适应度并存储N=10;SYZ=zeros(1,3*N-4);syz=zeros(1,3*N-4);for i=1:(3*N-4)x=FARM{i};SYZ(i)=clb8(x);end%%选择复制,较优的N个个体复制到下一代k=1;while k<=(3*N-4)maxSYZ=max(SYZ);posSYZ=find(SYZ==maxSYZ);POS=posSYZ(1);k=k+1;farm{k}=FARM{POS};syz(k)=SYZ(POS);SYZ(POS)=0;end%记录和更新,更新最优个体,记录收敛曲线数据maxsyz=max(syz);meansyz=mean(syz);pos=find(syz==maxsyz);LC2(counter+1)=meansyz;if maxsyzBest=maxsyz;Xp=farm{pos(1)};endLC3(counter+1)=Best;d=[0,6.4,3.2,3.9,3.7,2;6.4,0,2.9,2.1,4.5,4.1;3.2,2.9,0,1.5,3.3,1.2;3.9,2.1,1.5,0,3.6,2.6;3.7,4.5,3.3,3.6 ,0,3.8;...2.0,4.1,1.2,2.6,3.8,0;];%距离矩阵t=[0,0.16,0.08,0.1,0.09,0.05;0.16,0,0.07,0.05,0.11,0.1;0.08,0.07,0,0.04,0.08,0.03;...0.1,0.05,0.04,0,0.09,0.07;0.09,0.11,0.08,0.09,0,0.10;0.05,0.1,0.03,0.07,0.1,0;];%行驶时间矩阵w=[0.15,0.2,0.18,0.25,0.22];%服务时间矩阵%%时间窗向量early=[0.15,0.3,0.7,0.4,0.7];xx=x;%取出染色体j=1;%分工点初始化%%取距离向量d1,d2d1=zeros(1,6);d1(1)=d(1,xx(1)+1);for i=1:4d1(i+1)=d(xx(i)+1,xx(i+1)+1);endd1(6)=d(xx(5)+1,1);%%时间窗计算T=t(1,xx(1)+1);pun1=0;if T<early(xx(1))pun1=early(xx(1))-T;T=early(xx(1));endT=T+w(xx(1));for i=2:5T=T+t(xx(i-1)+1,xx(i)+1);if T<early(xx(i))pun1=pun1+early(xx(i))-T;T=early(xx(i));endT=T+w(xx(5));endF=sum(10.*d1)+sum(10.*d2)+20*pun1; LC1(counter+1)=F;%%第四步:变异N=10;for i=1:Nif Pm>randAA=farm{i};POS1=unidrnd(5);POS2=unidrnd(5);temp=AA(POS1);AA(POS1)=AA(POS2);AA(POS2)=temp;farm{i}=AA;endendcounter=counter+1;end%%第五步:绘制收敛曲线图figure(2);plot(LC1);xlabel('迭代次数');ylabel('目标的值');title('目标的收敛曲线');figure(3);plot(LC2);xlabel('迭代次数');ylabel('适应度函数的平均值');title('平均适应度函数的收敛曲线');plot(LC3);xlabel('迭代次数');ylabel('适应度函数的最优值');title('最优适应度函数的收敛曲线');适应度文件:%%计算载重量和时间窗%%适应度函数计算function Fitness=clb8(x)d=[0,6.4,3.2,3.9,3.7,2;6.4,0,2.9,2.1,4.5,4.1;3.2,2.9,0,1.5,3.3,1.2;3.9,2.1,1.5,0,3.6,2.6;3.7,4.5,3.3,3.6 ,0,3.8;...2.0,4.1,1.2,2.6,3.8,0;];%距离矩阵t=[0,0.16,0.08,0.1,0.09,0.05;0.16,0,0.07,0.05,0.11,0.1;0.08,0.07,0,0.04,0.08,0.03;...0.1,0.05,0.04,0,0.09,0.07;0.09,0.11,0.08,0.09,0,0.10;0.05,0.1,0.03,0.07,0.1,0;];%行驶时间矩阵w=[0.15,0.2,0.18,0.25,0.22];%服务时间矩阵%%时间窗向量early=[0.15,0.3,0.7,0.4,0.7];xx=x;%取出染色体j=1;%分工点初始化%%取距离向量d1,d2d1=zeros(1,6);d1(1)=d(1,xx(1)+1);for i=1:4d1(i+1)=d(xx(i)+1,xx(i+1)+1);endd1(6)=d(xx(5)+1,1);%%时间窗计算T=t(1,xx(1)+1);pun1=0;if T<early(xx(1))pun1=early(xx(1))-T;T=early(xx(1));endT=T+w(xx(1));T=T+t(xx(i-1)+1,xx(i)+1);if T<early(xx(i))pun1=pun1+early(xx(i))-T;T=early(xx(i));endT=T+w(xx(5));endF=sum(10.*d1)+sum(10.*d2)+20*pun1;Fitness=1/F;计算时间文件:function[T]=TOTALT(Xp1)Xp=Xp1;t=[0,0.16,0.08,0.1,0.09,0.05;0.16,0,0.07,0.05,0.11,0.1;0.08,0.07,0,0.04,0.08,0.03;...0.1,0.05,0.04,0,0.09,0.07;0.09,0.11,0.08,0.09,0,0.10;0.05,0.1,0.03,0.07,0.1,0;];%行驶时间矩阵w=[0.15,0.2,0.18,0.25,0.22];%服务时间矩阵%%时间窗向量early=[0.15,0.3,0.7,0.4,0.7];T=t(1,Xp(1)+1);if T<early(Xp(1))T=early(Xp(1));endT=T+w(Xp(1));for i=2:5T=T+t(Xp(i-1)+1,Xp(i)+1);if T<early(Xp(i))T=early(Xp(1));endT=T+w(Xp(i));endT=T+t(1,Xp(5)+1);方案二的程序编码主函数文件:function[Xp,LC1,LC2,LC3]=CLBGA9(M,Pm)%%%陈璐斌编程,解决VRP问题(带时间窗)%%输入参数%M遗传进化迭代次数%Pm变异概率%%输出参数%Xp最优个体%LC1子目标2收敛曲线%LC2平均适应度收敛曲线%LC3最优适应度收敛曲线%%%变量初始化Xp=zeros(1,6);LC1=zeros(1,M);LC2=zeros(1,M);LC3=zeros(1,M);Best=inf;%%编码方式-第一步:产生初始种群N=10;%N 种群规模%Q=[2.4,3.3,2.1,2.7,2.3,1.6,2.0,1.2,3.6,1.9];%需求矩阵farm=cell(1,N);%存储种群的细胞结构k=1;while (N-k>=0)G=randperm(6);%产生6个客户的全排列farm{k}=G;k=k+1;end%%%进化迭代计数器counter=1;while counter<=M%%第二步:交叉%交叉采用双亲双子单点交叉N=10;%种群规模newfarm=cell(1,2*N-4);%存储子代的细胞结构Ser=randperm(N);%两两随机配对表生成for i=1:(N-2)%避免交叉概率为1A=farm{Ser(i)};B=farm{Ser(i+1)};%取出父代P0=unidrnd(6);%随机选择交叉点aa=zeros(1,6);bb=zeros(1,6);A_=A;B_=B;for ii=1:6-P0aa(ii)=B(P0+ii);endfor ii=1:6-P0for iiii=1:6if(B(P0+ii)==A_(iiii))A_(iiii)=0;endendendfor iii=7-P0:6for iiii=1:6if(A_(iiii)~=0)aa(iii)=A_(iiii);A_(iiii)=0;breakendendendfor ii=1:6-P0bb(ii)=A(P0+ii);endfor ii=1:6-P0for iiii=1:6if(A(P0+ii)==B_(iiii))B_(iiii)=0;endendendfor iii=7-P0:6for iiii=1:6if(B_(iiii)~=0)bb(iii)=B_(iiii);B_(iiii)=0;breakendendend%产生子代newfarm{2*i-1}=aa;newfarm{2*i}=bb;endFARM=[farm,newfarm];%新旧种群合并%%第三步:选择复制%%计算当前种群适应度并存储N=10;SYZ=zeros(1,3*N-4);syz=zeros(1,3*N-4);for i=1:(3*N-4)x=FARM{i};SYZ(i)=clb9(x);end%%选择复制,较优的N个个体复制到下一代k=1;while k<=(3*N-4)maxSYZ=max(SYZ);posSYZ=find(SYZ==maxSYZ);POS=posSYZ(1);k=k+1;farm{k}=FARM{POS};syz(k)=SYZ(POS);SYZ(POS)=0;end%记录和更新,更新最优个体,记录收敛曲线数据maxsyz=max(syz);meansyz=mean(syz);pos=find(syz==maxsyz);LC2(counter+1)=meansyz;if maxsyzBest=maxsyz;Xp=farm{pos(1)};endLC3(counter+1)=Best;d=[0,6.4,3.2,3.9,3.7,35,2;6.4,0,2.9,2.1,4.5,32.5,4.1;3.2,2.9,0,1.5,3.3,35.7,1.2;3.9,2.1,1.5,0,3.6,34.5,2.6;...3.7,4.5,3.3,3.6,0,37,3.8;35,32.5,35.7,34.5,37,0,38.5;2,4.1,1.2,2.6,3.8,38.5,0];%距离矩阵t=[0,0.16,0.08,0.1,0.1,0.88,0.05;0.16,0,0.07,0.05,0.11,0.81,0.1;0.08,0.07,0,0.04,0.08,0.9,0.03;...0.1,0.05,0.04,0,0.09,0.86,0.07;0.1,0.11,0.08,0.09,0,0.92,0.1;0.88,0.81,0.9,0.86,0.92,0,0.96;...0.05,0.1,0.03,0.07,0.1,0.96,0;];%行驶时间矩阵w=[0.15,0.2,0.18,0.25,0.2,0.22];%服务时间矩阵%%时间窗向量early=[0.15,0.3,0.7,0.4,0.7,0.6];xx=x;%取出染色体j=1;%分工点初始化%%取距离向量d1,d2d1=zeros(1,7);d1(1)=d(1,xx(1)+1);for i=1:5d1(i+1)=d(xx(i)+1,xx(i+1)+1);endd1(7)=d(xx(6)+1,1);%%时间窗计算T=t(1,xx(1)+1);pun1=0;if T<early(xx(1))pun1=early(xx(1))-T;T=early(xx(1));endT=T+w(xx(1));for i=2:6T=T+t(xx(i-1)+1,xx(i)+1);if T<early(xx(i))pun1=pun1+early(xx(i))-T;T=early(xx(i));endT=T+w(xx(6));endF=sum(10.*d1) +20*pun1;LC1(counter+1)=F;%%第四步:变异N=10;for i=1:Nif Pm>randAA=farm{i};POS1=unidrnd(6);POS2=unidrnd(6);temp=AA(POS1);AA(POS1)=AA(POS2);AA(POS2)=temp;farm{i}=AA;endendcounter=counter+1;end%%第五步:绘制收敛曲线图figure(2);plot(LC1);xlabel('迭代次数');ylabel('目标的值');title('目标的收敛曲线');figure(3);plot(LC2);xlabel('迭代次数');ylabel('适应度函数的平均值');title('平均适应度函数的收敛曲线');figure(4);plot(LC3);xlabel('迭代次数');ylabel('适应度函数的最优值');title('最优适应度函数的收敛曲线');适应度文件:%%计算载重量和时间窗%%适应度函数计算function Fitness=clb9(x)d=[0,6.4,3.2,3.9,3.7,35,2;6.4,0,2.9,2.1,4.5,32.5,4.1;3.2,2.9,0,1.5,3.3,35.7,1.2;3.9,2.1,1.5,0,3.6,34.5,2.6;...3.7,4.5,3.3,3.6,0,37,3.8;35,32.5,35.7,34.5,37,0,38.5;2,4.1,1.2,2.6,3.8,38.5,0];%距离矩阵t=[0,0.16,0.08,0.1,0.1,0.88,0.05;0.16,0,0.07,0.05,0.11,0.81,0.1;0.08,0.07,0,0.04,0.08,0.9,0.03;...0.1,0.05,0.04,0,0.09,0.86,0.07;0.1,0.11,0.08,0.09,0,0.92,0.1;0.88,0.81,0.9,0.86,0.92,0,0.96;...0.05,0.1,0.03,0.07,0.1,0.96,0;];%行驶时间矩阵w=[0.15,0.2,0.18,0.25,0.2,0.22];%服务时间矩阵%%时间窗向量early=[0.15,0.3,0.7,0.4,0.7,0.6];late=[2.5,3.4,3.3,2.7,2.5,4.5];xx=x;%取出染色体j=1;%分工点初始化%%取距离向量d1,d2d1=zeros(1,7);d1(1)=d(1,xx(1)+1);for i=1:5d1(i+1)=d(xx(i)+1,xx(i+1)+1);endd1(7)=d(xx(6)+1,1);%%时间窗计算T=t(1,xx(1)+1);pun1=0;if T<early(xx(1))pun1=early(xx(1))-T;T=early(xx(1));endT=T+w(xx(1));for i=2:6T=T+t(xx(i-1)+1,xx(i)+1);if T<early(xx(i))pun1=pun1+early(xx(i))-T;T=early(xx(i));endT=T+w(xx(6));endF=sum(10.*d1) +20*pun1;Fitness=1/F;计算时间文件:function[T]=TOTALT2(Xp1)Xp=Xp1;t=[0,0.16,0.08,0.1,0.1,0.88,0.05;0.16,0,0.07,0.05,0.11,0.81,0.1;0.08,0.07,0,0.04,0.08,0.9,0.03;...0.1,0.05,0.04,0,0.09,0.86,0.07;0.1,0.11,0.08,0.09,0,0.92,0.1;0.88,0.81,0.9,0.86,0.92,0,0.96;... 0.05,0.1,0.03,0.07,0.1,0.96,0;];%行驶时间矩阵w=[0.15,0.2,0.18,0.25,0.2,0.22];%服务时间矩阵%%时间窗向量early=[0.15,0.3,0.7,0.4,0.7,0.6];T=t(1,Xp(1)+1);if T<early(Xp(1))T=early(Xp(1));endT=T+w(Xp(1));for i=2:6T=T+t(Xp(i-1)+1,Xp(i)+1);if T<early(Xp(i))T=early(Xp(1));endT=T+w(Xp(i));endT=T+t(1,Xp(6)+1)。

遗传算法的MATLAB实现实例

遗传算法的MATLAB实现实例

遗传算法(Genetic Algorithm)的MATLAB应用实例To use Optimization Toolbox software, you need to1 Define your objective function in the MATLAB language, as a function file or anonymous function.2 Define your constraint(s) as a separate file or anonymous function.首先建立目标函数的M文件;例1:如目标函数 min 100( )+ ;Function File for Objective FunctionA function file is a text file containing MATLAB commands with the extension .m. Create a new function file in any text editor, or use the built-in MATLAB Editor as follows:(1)At the command line enter:edit (想要建立的.m文件的文件名)The MATLAB Editor opens.(2) In the editor enter:function f = rosenbrock(x)f = 100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;(3) Save the file by selecting File > Save.把M文件保存在MATLAB默认的工作目录中;在命令行中输入命令:cd ,就可以得到MATLAB默认的工作目录。

To check that the M-file returns the correct value, enter rosenbrock ([1 1])ans =注释:如果想建立rosenbrock.m文件,那么步骤1变为edit rosenbrock。

遗传算法matlab程序

遗传算法matlab程序

遗传算法matlab程序编码>> function ret=Code(lenchrom,bound)%本函数将变量编码成染色体,用于随机初始化一个种群% lenchrom input : 染色体长度% bound input : 变量的取值范围% ret output: 染色体的编码值flag=0;while flag==0pick=rand(1,length(lenchrom));ret=bound(:,1)'+(bound(:,2)-bound(:,1))'.*pick; %线性插值,编码结果以实数向量存入ret 中flag=test(lenchrom,bound,ret); %检验染色体的可行性end交叉操作function ret=Cross(pcross,lenchrom,chrom,sizepop,bound)%本函数完成交叉操作% pcorss input : 交叉概率% lenchrom input : 染色体的长度% chrom input : 染色体群% sizepop input : 种群规模% ret output : 交叉后的染色体for i=1:sizepop %每一轮for循环中,可能会进行一次交叉操作,染色体是随机选择的,交叉位置也是随机选择的,%但该轮for循环中是否进行交叉操作则由交叉概率决定(continue 控制)% 随机选择两个染色体进行交叉pick=rand(1,2);while prod(pick)==0pick=rand(1,2);endindex=ceil(pick.*sizepop);% 交叉概率决定是否进行交叉pick=rand;while pick==0pick=rand;endif pick>pcrosscontinue;endflag=0;while flag==0% 随机选择交叉位pick=rand;while pick==0pick=rand;endpos=ceil(pick.*sum(lenchrom)); %随机选择进行交叉的位置,即选择第几个变量进行交叉,注意:两个染色体交叉的位置相同pick=rand; %交叉开始v1=chrom(index(1),pos);v2=chrom(index(2),pos);chrom(index(1),pos)=pick*v2+(1-pick)*v1;chrom(index(2),pos)=pick*v1+(1-pick)*v2; %交叉结束flag1=test(lenchrom,bound,chrom(index(1),:)); %检验染色体1的可行性flag2=test(lenchrom,bound,chrom(index(2),:)); %检验染色体2的可行性if flag1*flag2==0flag=0;else flag=1;end %如果两个染色体不是都可行,则重新交叉endendret=chrom;解码function ret=Decode(lenchrom,bound,code,opts)% 本函数对染色体进行解码% lenchrom input : 染色体长度% bound input : 变量取值范围% code input :编码值% opts input : 解码方法标签% ret output: 染色体的解码值switch optscase 'binary' % binary codingfor i=length(lenchrom):-1:1data(i)=bitand(code,2^lenchrom(i)-1); %并低十位,然后将低十位转换成十进制数存在data(i)里面code=(code-data(i))/(2^lenchrom(i)); %低十位清零,然后右移十位endret=bound(:,1)'+data./(2.^lenchrom-1).*(bound(:,2)-bound(:,1))'; %分段解码,以实数向量的形式存入ret中case 'grey' % grey codingfor i=sum(lenchrom):-1:2code=bitset(code,i-1,bitxor(bitget(code,i),bitget(code,i-1)));endfor i=length(lenchrom):-1:1data(i)=bitand(code,2^lenchrom(i)-1);code=(code-data(i))/(2^lenchrom(i));endret=bound(:,1)'+data./(2.^lenchrom-1).*(bound(:,2)-bound(:,1))'; %分段解码,以实数向量的形式存入ret中case 'float' % float codingret=code; %解码结果就是编码结果(实数向量),存入ret中end适应度函数function error = fun(x,inputnum,hiddennum,outputnum,net,inputn,outputn)%该函数用来计算适应度值%x input 个体%inputnum input 输入层节点数%outputnum input 隐含层节点数%net input 网络%inputn input 训练输入数据%outputn input 训练输出数据%error output 个体适应度值%提取w1=x(1:inputnum*hiddennum);B1=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);w2=x(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*out putnum);B2=x(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hid dennum+hiddennum*outputnum+outputnum);%网络进化参数net.trainParam.epochs=20;net.trainParam.lr=0.1;net.trainParam.goal=0.00001;net.trainParam.show=100;net.trainParam.showWindow=0;%网络权值赋值net.iw{1,1}=reshape(w1,hiddennum,inputnum);net.lw{2,1}=reshape(w2,outputnum,hiddennum);net.b{1}=reshape(B1,hiddennum,1);net.b{2}=B2;。

遗传算法GA的MATLAB代码

遗传算法GA的MATLAB代码

MATLAB实现算法代码:GA(遗传算法)——整数编码function [BestGene,aa] = GA(MaxGeneration,GeneSize,GeneNum,pcross,pmute,minGene,maxGene)Parent = Init(GeneSize,GeneNum,minGene,maxGene);[BestGene,Parent] = KeepBest(Parent);aa = [];for i = 1:MaxGeneration[i 1/value(BestGene)]Child = chose(Parent);Child = cross(Child,pcross);Child = mute(Child,pmute,maxGene);[BestGene,Parent] = KeepBest(Child);aa = [aa;value(BestGene)];endfunction GeneInit = Init(GeneSize,GeneNum,minGene,maxGene)GeneInit = [];for i = 1:GeneSizex = []; x = ceil(rand(1,GeneNum).*(maxGene-minGene)) + minGene;GeneInit = [GeneInit;x];endGeneInit = [GeneInit;x];function Child = chose(Parent)GeneSize = size(Parent,1);for i = 1:GeneSizex = Parent(i,:);val(i) = value(x);endValSum = sum(val);val = val / ValSum;for i = 2:GeneSizeval(i) = val(i) + val(i-1);endfor i = 1:GeneSizerandval = rand;if randval <= val(1)Child(i,:) = Parent(1,:);endfor j = 2:GeneSizeif randval > val(j-1) && randval <= val(j)Child(i,:) = Parent(j,:);break;endendendChild(end,:) = Parent(end,:);function Child = cross(Parent,pcross)[GeneSize,GeneNum] = size(Parent);GeneSize = GeneSize - 1;Child = Parent;for i = 1:GeneSize/2if rand < pcrossflag = 0;while( flag==0 )randval1 = floor((GeneNum-1)*rand) + 1;randval2 = floor((GeneNum-1)*rand) + 1;if randval1 ~= randval2flag = 1;endendtemp = Child(2*i-1,randval1:randval2);Child(2*i-1,randval1:randval2) = Child(2*i,randval1:randval2);Child(2*i,randval1:randval2) = temp;endendfunction Child = mute(Parent,pmute,maxGene)[GeneSize,GeneNum] = size(Parent);GeneSize = GeneSize - 1;Child = Parent;for i = 1:GeneSizeif rand < pmuterandval = ceil((GeneNum-1)*rand) + 1;Child(i,randval) = maxGene(randval) - Child(i,randval) + 1;endendfunction [BestGene,Parent] = KeepBest(Child)[GeneSize,GeneNum] = size(Child);for i = 1:GeneSizex = Child(i,:);val(i) = value(x);endBigVal = val(1);flag = 1;for i = 2:GeneSizeif BigVal < val(i)BigVal = val(i);flag = i;endendBestGene = Child(flag,:); Parent = Child;Parent(1,:) = BestGene; Parent(end,:) = BestGene;。

遗传算法的matlab代码

遗传算法的matlab代码

遗传算法的matlab代码摘要:遗传算法是一种基于自然选择和遗传学原理的优化算法。

本文将介绍如何在MATLAB中实现遗传算法,并使用一个简单的例子来说明其应用。

1. 引言遗传算法(Genetic Algorithm, GA)是一种基于自然选择和遗传学原理的优化算法。

它模拟了自然界中生物的进化过程,通过不断地搜索、适应和优化,最终找到问题的最优解。

MATLAB是一种广泛使用的编程语言和软件环境,它提供了丰富的数学计算和可视化工具,使得在MATLAB中实现遗传算法变得相对简单。

2. 遗传算法的基本原理遗传算法主要包括以下几个步骤:1) 初始化:随机生成一组候选解(称为种qun)。

2) 选择:从种qun中按照一定的概率选择出优秀的个体进行繁殖。

3) 交叉:从选择出的个体中随机选择两个进行交叉操作,生成新的后代。

4) 变异:对后代进行变异操作,以增大种qun的多样性。

5) 迭代:重复进行选择、交叉和变异操作,直到达到预设的迭代次数或满足其他终止条件。

3. MATLAB实现遗传算法在MATLAB中实现遗传算法,可以使用自带的gaoptimset和ga函数。

下面是一个简单的例子,说明如何在MATLAB中实现遗传算法。

```matlab```% 定义目标函数fitnessFunction = @(x) x(1)^2 + x(2)^2; % 最小化目标函数```% 定义变量范围lb = [-10, -10]; % 变量下界ub = [10, 10]; % 变量上界```% 初始化参数populationSize = 100; % 种qun大小maxIterations = 500; % 最da迭代次数crossoverRate = 0.8; % 交叉概率mutationRate = 0.1; % 变异概率elitismRate = 0.1; % 精英策略概率```% 初始化种qunpopulation = ga(fitnessFunction, lb, ub, populationSize, maxIterations, elitismRate, crossoverRate, mutationRate);```% 可视化结果figure;plot(population.Fitness,'r');hold on;plot(population.Gen,'g');xlabel('Generation');ylabel('Fitness');title('遗传算法进化过程');```4. 结果分析通过上述代码,我们可以在MATLAB中实现一个简单的遗传算法。

遗传算法matlab代码

遗传算法matlab代码

function youhuafunD=code;N=50; % Tunablemaxgen=50; % Tunablecrossrate=0.5; %Tunablemuterate=0.08; %Tunablegeneration=1;num = length(D);fatherrand=randint(num,N,3);score = zeros(maxgen,N);while generation<=maxgenind=randperm(N-2)+2; % 随机配对交叉A=fatherrand(:,ind(1:(N-2)/2));B=fatherrand(:,ind((N-2)/2+1:end));% 多点交叉rnd=rand(num,(N-2)/2);ind=rnd tmp=A(ind);A(ind)=B(ind);B(ind)=tmp;% % 两点交叉% for kk=1:(N-2)/2% rndtmp=randint(1,1,num)+1;% tmp=A(1:rndtmp,kk);% A(1:rndtmp,kk)=B(1:rndtmp,kk);% B(1:rndtmp,kk)=tmp;% endfatherrand=[fatherrand(:,1:2),A,B];% 变异rnd=rand(num,N);ind=rnd [m,n]=size(ind);tmp=randint(m,n,2)+1;tmp(:,1:2)=0;fatherrand=tmp+fatherrand;fatherrand=mod(fatherrand,3);% fatherrand(ind)=tmp;%评价、选择scoreN=scorefun(fatherrand,D);% 求得N个个体的评价函数score(generation,:)=scoreN;[scoreSort,scoreind]=sort(scoreN);sumscore=cumsum(scoreSort);sumscore=sumscore./sumscore(end);childind(1:2)=scoreind(end-1:end);for k=3:Ntmprnd=rand;tmpind=tmprnd difind=[0,diff(tmpind)];if ~any(difind)difind(1)=1;endchildind(k)=scoreind(logical(difind));endfatherrand=fatherrand(:,childind);generation=generation+1;end% scoremaxV=max(score,[],2);minV=11*300-maxV;plot(minV,'*');title('各代的目标函数值');F4=D(:,4);FF4=F4-fatherrand(:,1);FF4=max(FF4,1);D(:,5)=FF4;save DData Dfunction D=codeload youhua.mat% properties F2 and F3F1=A(:,1);F2=A(:,2);F3=A(:,3);if (max(F2)>1450)||(min(F2)<=900)error('DATA property F2 exceed it''s range (900,1450]') end% get group property F1 of data, according to F2 value F4=zeros(size(F1));for ite=11:-1:1index=find(F2<=900+ite*50);F4(index)=ite;endD=[F1,F2,F3,F4];function ScoreN=scorefun(fatherrand,D)F3=D(:,3);F4=D(:,4);N=size(fatherrand,2);FF4=F4*ones(1,N);FF4rnd=FF4-fatherrand;FF4rnd=max(FF4rnd,1);ScoreN=ones(1,N)*300*11;% 这里有待优化for k=1:NFF4k=FF4rnd(:,k);for ite=1:11F0index=find(FF4k==ite);if ~isempty(F0index)tmpMat=F3(F0index);tmpSco=sum(tmpMat);ScoreBin(ite)=mod(tmpSco,300);endendScorek(k)=sum(ScoreBin);endScoreN=ScoreN-Scorek;遗传算法实例:% 下面举例说明遗传算法%% 求下列函数的最大值%% f(x)=10*sin(5x)+7*cos(4x) x∈[0,10] %% 将x 的值用一个10位的二值形式表示为二值问题,一个10位的二值数提供的分辨率是每为(10-0)/(2^10-1)≈0.01 。

遗传算法matlab代码

遗传算法matlab代码

遗传算法matlab代码function youhuafunD=code;N=50; % Tunablemaxgen=50; % Tunablecrossrate=0.5; %Tunablemuterate=0.08; %Tunable generation=1;num = length(D);fatherrand=randint(num,N,3);score = zeros(maxgen,N);while generation<=maxgenind=randperm(N-2)+2; % 随机配对交叉A=fatherrand(:,ind(1:(N-2)/2));B=fatherrand(:,ind((N-2)/2+1:end));% 多点交叉rnd=rand(num,(N-2)/2);ind=rnd tmp=A(ind);A(ind)=B(ind);B(ind)=tmp;% % 两点交叉% for kk=1:(N-2)/2% rndtmp=randint(1,1,num)+1;% tmp=A(1:rndtmp,kk);% A(1:rndtmp,kk)=B(1:rndtmp,kk);% B(1:rndtmp,kk)=tmp;% endfatherrand=[fatherrand(:,1:2),A,B];% 变异rnd=rand(num,N);ind=rnd [m,n]=size(ind);tmp=randint(m,n,2)+1;tmp(:,1:2)=0;fatherrand=tmp+fatherrand;fatherrand=mod(fatherrand,3);% fatherrand(ind)=tmp;%评价、选择scoreN=scorefun(fatherrand,D);% 求得N个个体的评价函数score(generation,:)=scoreN;[scoreSort,scoreind]=sort(scoreN);sumscore=cumsum(scoreSort);sumscore=sumscore./sumscore(end);childind(1:2)=scoreind(end-1:end);for k=3:N tmprnd=rand;tmpind=tmprnd difind=[0,diff(tmpind)];if ~any(difind)difind(1)=1;endchildind(k)=scoreind(logical(difind));endfatherrand=fatherrand(:,childind);generation=generation+1;end% scoremaxV=max(score,[],2);minV=11*300-maxV;plot(minV,'*');title('各代的目标函数值');F4=D(:,4);FF4=F4-fatherrand(:,1);FF4=max(FF4,1);D(:,5)=FF4;save DData Dfunction D=codeload youhua.mat% properties F2 and F3F1=A(:,1);F2=A(:,2);F3=A(:,3);if (max(F2)>1450)||(min(F2)<=900)error('DATA property F2 exceed it''s range (900,1450]') end % get group property F1 of data, according to F2 value F4=zeros(size(F1));for ite=11:-1:1index=find(F2<=900+ite*50);F4(index)=ite;endD=[F1,F2,F3,F4];function ScoreN=scorefun(fatherrand,D)F3=D(:,3);F4=D(:,4);N=size(fatherrand,2);FF4=F4*ones(1,N);FF4rnd=FF4-fatherrand;FF4rnd=max(FF4rnd,1);ScoreN=ones(1,N)*300*11;% 这里有待优化for k=1:NFF4k=FF4rnd(:,k);for ite=1:11F0index=find(FF4k==ite);if ~isempty(F0index)tmpMat=F3(F0index);tmpSco=sum(tmpMat);ScoreBin(ite)=mod(tmpSco,300);endendScorek(k)=sum(ScoreBin);endScoreN=ScoreN-Scorek;遗传算法实例:% 下面举例说明遗传算法%% 求下列函数的最大值%% f(x)=10*sin(5x)+7*cos(4x) x∈[0,10] %% 将x 的值用一个10位的二值形式表示为二值问题,一个10位的二值数提供的分辨率是每为(10-0)/(2^10-1)≈0.01 。

遗传算法matlab代码

遗传算法matlab代码

遗传算法matlab代码以下是一个简单的遗传算法的MATLAB 代码示例:matlab复制代码% 遗传算法参数设置pop_size = 50; % 种群大小num_vars = 10; % 变量数目num_generations = 100; % 进化的代数mutation_rate = 0.01; % 变异率crossover_rate = 0.8; % 交叉率% 初始化种群population = rand(pop_size, num_vars);% 开始进化for i = 1:num_generations% 计算适应度fitness = evaluate_fitness(population);% 选择操作selected_population = selection(population, fitness);% 交叉操作offspring_population = crossover(selected_population,crossover_rate);% 变异操作mutated_population = mutation(offspring_population,mutation_rate);% 生成新种群population = [selected_population; mutated_population];end% 选择最优解best_solution = population(find(fitness == max(fitness)), :);% 适应度函数function f = evaluate_fitness(population)f = zeros(size(population));for i = 1:size(population, 1)f(i) = sum(population(i, :));endend% 选择函数function selected_population = selection(population, fitness)% 轮盘赌选择total_fitness = sum(fitness);probabilities = fitness / total_fitness;selected_indices = zeros(pop_size, 1);for i = 1:pop_sizer = rand();cumulative_probabilities = cumsum(probabilities);for j = 1:pop_sizeif r <= cumulative_probabilities(j)selected_indices(i) = j;break;endendendselected_population = population(selected_indices, :);end% 交叉函数function offspring_population = crossover(parental_population, crossover_rate)offspring_population = zeros(size(parental_population));num_crossovers = ceil(size(parental_population, 1) *crossover_rate);crossover_indices = randperm(size(parental_population, 1),num_crossovers);以下是另一个一个简单的遗传算法的MATLAB 代码示例:matlab复制代码% 初始化种群population = rand(nPopulation, nGenes);% 进化迭代for iGeneration = 1:nGeneration% 计算适应度fitness = evaluateFitness(population);% 选择父代parentIdx = selection(fitness);parent = population(parentIdx, :);% 交叉产生子代child = crossover(parent);% 变异子代child = mutation(child);% 更新种群population = [parent; child];end% 评估最优解bestFitness = -Inf;for i = 1:nPopulationf = evaluateFitness(population(i, :));if f > bestFitnessbestFitness = f;bestIndividual = population(i, :);endend% 可视化结果plotFitness(fitness);其中,nPopulation和nGenes分别是种群大小和基因数;nGeneration是迭代次数;evaluateFitness函数用于计算个体的适应度;selection函数用于选择父代;crossover函数用于交叉产生子代;mutation函数用于变异子代。

遗传算法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;endendnewpop;clear cpoint12;clear cpoint22;clear randnum;clear int;for ium=1:popsizevector1=newpop(ium,:);obj1(ium)=hanshu(hromlength,vector1,phen);endclear ium;obj1max=max(obj1);for ar=1:popsizeif obj1(ar)==obj1maxnewpop(ar,:)=opti;endend%遗传操作结束二.粒子群算法源程序:%------初始格式化-------------------------------------------------- clear all;clc;format long;%------给定初始化条件---------------------------------------------- c1=1.4962;%学习因子1c2=1.4962;%学习因子2w=0.7298;%惯性权重MaxDT=100;%最大迭代次数D=2;%搜索空间维数(未知数个数)N=40;%初始化群体个体数目eps=10^(-6);%设置精度(在已知最小值时候用)%------初始化种群的个体(可以在这里限定位置和速度的范围)------------ for i=1:Nfor j=1:Dx(i,j)=randn;%随机初始化位置v(i,j)=randn;%随机初始化速度endend%------先计算各个粒子的适应度,并初始化Pi和Pg---------------------- for i=1:Np(i)=fitness(x(i,:),D);y(i,:)=x(i,:);endpg=x(1,:);%Pg为全局最优for i=2:Nif fitness(x(i,:),D)<FITNESS(pg,D)pg=x(i,:);endend%------进入主要循环,按照公式依次迭代,直到满足精度要求------------ for t=1:MaxDTtfor i=1:Nv(i,:)=w*v(i,:)+c1*rand*(y(i,:)-x(i,:))+c2*rand*(pg-x(i,:)); x(i,:)=x(i,:)+v(i,:);if fitness(x(i,:),D)<p(i)p(i)=fitness(x(i,:),D);y(i,:)=x(i,:);endif p(i)<FITNESS(pg,D)pg=y(i,:);endendPbest(t)=fitness(pg,D);end%------进入主要循环,按照公式依次迭代,直到满足精度要求------------ for t=1:MaxDTfor i=1:Nv(i,:)=w*v(i,:)+c1*rand*(y(i,:)-x(i,:))+c2*rand*(pg-x(i,:));x(i,:)=x(i,:)+v(i,:);if fitness(x(i,:),D)<p(i)p(i)=fitness(x(i,:),D);y(i,:)=x(i,:);endif p(i)<FITNESS(pg,D)pg=y(i,:);endendPbest(t)=fitness(pg,D);end%------最后给出计算结果disp('*************************************************************') disp('函数的全局最优位置为:')Solution=pg'disp('最后得到的优化极值为:')Result=fitness(pg,D)disp('*************************************************************') [X,Y]=meshgrid(-500:2:500);Z=X.*sin(sqrt(X))+Y.*(sin(sqrt(Y)));hold oncontour(X,Y,Z)plot(x(:,1),x(:,2),'*');hold off标准文档实用文案。

遗传算法Matlab源代码

遗传算法Matlab源代码

遗传算法Matlab源代码完整可以运行的数值优化遗传算法源代码function[X,MaxFval,BestPop,Trace]=fga(FUN,bounds,MaxEranum,PopSiz e,options,pCross,pMutation,pInversion)%[X,MaxFval,BestPop,Trace]=fga(FUN,bounds,MaxEranum,PopSiz e,options,pCross,pMutation,pInversion)% Finds a maximum of a function of several variables.% fga solves problems of the form:% max F(X) subject to: LB = X = UB (LB=bounds(:,1),UB=bounds(:,2))% X - 最优个体对应自变量值% MaxFval - 最优个体对应函数值% BestPop - 最优的群体即为最优的染色体群% Trace - 每代最佳个体所对应的目标函数值% FUN - 目标函数% bounds - 自变量范围% MaxEranum - 种群的代数,取50--500(默认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 nargin2, error('FMAXGA requires at least three input arguments'); endif nargin==2, MaxEranum=150;PopSize=100;options=[1 1e-4];pCross=0.85;pMutation=0.1;pInversion=0.25;endif nargin==3, PopSize=100;options=[1 1e-4];pCross=0.85;pMutation=0.1;pInversion=0.25;endif nargin==4, options=[1 1e-4];pCross=0.85;pMutation=0.1;pInversion=0.25;endif nargin==5, pCross=0.85;pMutation=0.1;pInversion=0.25;endif nargin==6, pMutation=0.1;pInversion=0.25;endif nargin==7, pInversion=0.25;endif (options(1)==0|options(1)==1)find((bounds(:,1)-bounds(:,2))0)error('数据输入错误,请重新输入:');end% 定义全局变量global m n NewPop children1 children2 VarNum% 初始化种群和变量precision = options(2);bits = ceil(log2((bounds(:,2)-bounds(:,1))' ./ precision));%由设定精度划分区间VarNum = size(bounds,1);[Pop] = InitPop(PopSize,bounds,bits,options);%初始化种群[m,n] = size(Pop);fit = zeros(1,m);NewPop = zeros(m,n);children1 = zeros(1,n);children2 = zeros(1,n);pm0 = pMutation;BestPop = zeros(MaxEranum,n);%分配初始解空间BestPop,TraceTrace = zeros(1,MaxEranum);完整可以运行的数值优化遗传算法源代码Lb = ones(PopSize,1)*bounds(:,1)';Ub = ones(PopSize,1)*bounds(:,2)';%二进制编码采用多点交叉和均匀交叉,并逐步增大均匀交叉概率%浮点编码采用离散交叉(前期)、算术交叉(中期)、AEA重组(后期)OptsCrossOver = [ones(1,MaxEranum)*options(1);...round(unidrnd(2*(MaxEranum-[1:MaxEranum]))/MaxEranum)]';%浮点编码时采用两种自适应变异和一种随机变异(自适应变异发生概率为随机变异发生的2倍)OptsMutation = [ones(1,MaxEranum)*options(1);unidrnd(5,1,MaxEranum)]';if options(1)==3D=zeros(n);CityPosition=bounds;D = sqrt((CityPosition(:, ones(1,n)) - CityPosition(:, ones(1,n))').^2 +...(CityPosition(:,2*ones(1,n)) - CityPosition(:,2*ones(1,n))').^2 );end%========================================================================== % 进化主程序%%===================================== ===================================== eranum = 1;H=waitbar(0,'Please wait...');while(eranum=MaxEranum)for j=1:mif options(1)==1%eval(['[fit(j)]=' FUN '(Pop(j,:));']);%但执行字符串速度比直接计算函数值慢fit(j)=feval(FUN,Pop(j,:));%计算适应度elseif options(1)==0%eval(['[fit(j)]=' FUN '(b2f(Pop(j,:),bounds,bits));']);fit(j)=feval(FUN,(b2f(Pop(j,:),bounds,bits)));elsefit(j)=-feval(FUN,Pop(j,:),D);endend[Maxfit,fitIn]=max(fit);%得到每一代最大适应值Meanfit(eranum)=mean(fit);BestPop(eranum,:)=Pop(fitIn,:);Trace(eranum)=Maxfit;if options(1)==1Pop=(Pop-Lb)./(Ub-Lb);%将定义域映射到[0,1]:[Lb,Ub]--[0,1] ,Pop--(Pop-Lb)./(Ub-Lb)endswitch round(unifrnd(0,eranum/MaxEranum))%进化前期尽量使用实行锦标赛选择,后期逐步增大非线性排名选择case {0} [selectpop]=TournamentSelect(Pop,fit,bits);%锦标赛选择case {1}[selectpop]=NonlinearRankSelect(Pop,fit,bits);%非线性排名选择end完整可以运行的数值优化遗传算法源代码[CrossOverPop]=CrossOver(selectpop,pCross,OptsCrossOver(er anum,:));%交叉[MutationPop]=Mutation(CrossOverPop,fit,pMutation,VarNum,O ptsMutation(eranum,:)); %变异[InversionPop]=Inversion(MutationPop,pInversion);%倒位%更新种群if options(1)==1Pop=Lb+InversionPop.*(Ub-Lb);%还原PopelsePop=InversionPop;endpMutation=pm0+(eranum^3)*(pCross/2-pm0)/(eranum^4); %逐步增大变异率至1/2交叉率percent=num2str(round(100*eranum/MaxEranum));waitbar(eranum/MaxEranum,H,['Evolution complete ',percent,'%']);eranum=eranum+1;endclose(H);% 格式化输出进化结果和解的变化情况t=1:MaxEranum;plot(t,Trace,t,Meanfit);legend('解的变化','种群的变化');title('函数优化的遗传算法');xlabel('进化世代数');ylabel('每一代最优适应度');[MaxFval,MaxFvalIn]=max(Trace);if options(1)==1|options(1)==3X=BestPop(MaxFvalIn,:);elseif options(1)==0X=b2f(BestPop(MaxFvalIn,:),bounds,bits);endhold on;plot(MaxFvalIn,MaxFval,'*');text(MaxFvalIn+5,MaxFval,['FMAX=' num2str(MaxFval)]);str1=sprintf(' Best generation:\n %d\n\n Best X:\n %s\n\n MaxFval\n %f\n',...MaxFvalIn,num2str(X),MaxFval);disp(str1);% -计时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_t ime(4)-1;end完整可以运行的数值优化遗传算法源代码str2=sprintf('elapsed_time\n %d (h) %d (m) %.4f (s)',elapsed_time(4),elapsed_time(5),elapsed_time(6));disp(str2);%===================================== ===================================== % 遗传操作子程序%%===================================== ===================================== % -- 初始化种群--% 采用浮点编码和二进制Gray编码(为了克服二进制编码的Hamming悬崖缺点)function [initpop]=InitPop(popsize,bounds,bits,options)numVars=size(bounds,1);%变量数目rang=(bounds(:,2)-bounds(:,1))';%变量范围if options(1)==1initpop=zeros(popsize,numVars);initpop=(ones(popsize,1)*rang).*(rand(popsize,numVars))+(ones (popsize,1)*bounds(:,1)');elseif options(1)==0precision=options(2);%由求解精度确定二进制编码长度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);i1时,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 individualelsefor i=1:popsizeinitpop(i,:)=randperm(numVars);%为Tsp问题初始化种群endend% -- 二进制串解码--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 [NewPop]=NonlinearRankSelect(OldPop,fit,bits) global m n NewPopfit=fit';selectprob=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=[0 cumsum(newfit)];%计算各选择概率之和rNums=rand(m,1);newIn=1;while(newIn=m)NewPop(newIn,:)=OldPop(length(find(rNums(newIn)newfit)),:);newIn=newIn+1;end% -- 锦标赛选择(含精英选择) --function [NewPop]=TournamentSelect(OldPop,fit,bits)global m n NewPopnum=floor(m./2.^(1:10));num(find(num==0))=[];L=length(num);a=sum(num);b=m-a;PopIn=1;while(PopIn=L)r=unidrnd(m,num(PopIn),2^PopIn);[LocalMaxfit,In]=max(fit(r),[],2);SelectIn=r((In-1)*num(PopIn)+[1:num(PopIn)]');NewPop(sum(num(1:PopIn))-num(PopIn)+1:sum(num(1:PopIn)),:)=OldPop(SelectIn,:);PopIn=PopIn+1;r=[];In=[];LocalMaxfit=[];endif b1NewPop((sum(num)+1):(sum(num)+b-1),:)=OldPop(unidrnd(m,1,b-1),:);end[GlobalMaxfit,I]=max(fit);%保留每一代中最佳个体NewPop(end,:)=OldPop(I,:);% -- 交叉操作--function [NewPop]=CrossOver(OldPop,pCross,opts)global m n NewPopr=rand(1,m);完整可以运行的数值优化遗传算法源代码y1=find(rpCross);y2=find(r=pCross);len=length(y1);if len==1|(len2mod(len,2)==1)%如果用来进行交叉的染色体的条数为奇数,将其调整为偶数y2(length(y2)+1)=y1(len);y1(len)=[];endi=0;if length(y1)=2if opts(1)==1%浮点编码交叉while(i=length(y1)-2)NewPop(y1(i+1),:)=OldPop(y1(i+1),:);NewPop(y1(i+2),:)=OldPop(y1(i+2),:);if opts(2)==0n1%discret crossoverPoints=sort(unidrnd(n,1,2));NewPop(y1(i+1),Points(1):Points(2))=OldPop(y1(i+2),Points(1):Po ints(2));NewPop(y1(i+2),Points(1):Points(2))=OldPop(y1(i+1),Points(1):Po ints(2));elseif opts(2)==1%arithmetical crossoverPoints=round(unifrnd(0,pCross,1,n));CrossPoints=find(Points==1);r=rand(1,length(CrossPoints));NewPop(y1(i+1),CrossPoints)=r.*OldPop(y1(i+1),CrossPoints)+(1 -r).*OldPop(y1(i+2),CrossPoints);NewPop(y1(i+2),CrossPoints)=r.*OldPop(y1(i+2),CrossPoints)+(1 -r).*OldPop(y1(i+1),CrossPoints); else %AEA recombination Points=round(unifrnd(0,pCross,1,n));CrossPoints=find(Points==1);v=unidrnd(4,1,2);NewPop(y1(i+1),CrossPoints)=(floor(10^v(1)*OldPop(y1(i+1),Cro ssPoints))+...10^v(1)*OldPop(y1(i+2),CrossPoints)-floor(10^v(1)*OldPop(y1(i+2),CrossPoints)))/10^v(1);NewPop(y1(i+2),CrossPoints)=(floor(10^v(2)*OldPop(y1(i+2),Cro ssPoints))+...10^v(2)*OldPop(y1(i+1),CrossPoints)-floor(10^v(2)*OldPop(y1(i+1),CrossPoints)))/10^v(2);endi=i+2;endelseif opts(1)==0%二进制编码交叉while(i=length(y1)-2)if opts(2)==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),:)); endi=i+2;endelse %Tsp问题次序杂交for i=0:2:length(y1)-2xPoints=sort(unidrnd(n,1,2));NewPop([y1(i+1)y1(i+2)],xPoints(1):xPoints(2))=OldPop([y1(i+2)y1(i+1)],xPoints(1):xPoints(2));完整可以运行的数值优化遗传算法源代码%NewPop(y1(i+2),xPoints(1):xPoints(2))=OldPop(y1(i+1),xPo ints(1):xPoints(2));temp=[OldPop(y1(i+1),xPoints(2)+1:n)OldPop(y1(i+1),1:xPoints(2))];for del1i=xPoints(1):xPoints(2)temp(find(temp==OldPop(y1(i+2),del1i)))=[];endNewPop(y1(i+1),(xPoints(2)+1):n)=temp(1:(n-xPoints(2)));NewPop(y1(i+1),1:(xPoints(1)-1))=temp((n-xPoints(2)+1):end);temp=[OldPop(y1(i+2),xPoints(2)+1:n)OldPop(y1(i+2),1:xPoints(2))];for del2i=xPoints(1):xPoints(2)temp(find(temp==OldPop(y1(i+1),del2i)))=[];endNewPop(y1(i+2),(xPoints(2)+1):n)=temp(1:(n-xPoints(2)));NewPop(y1(i+2),1:(xPoints(1)-1))=temp((n-xPoints(2)+1):end);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,fit,pMutation,VarNum,opts) global m n NewPopNewPop=OldPop;r=rand(1,m);MutIn=find(r=pMutation);L=length(MutIn);完整可以运行的数值优化遗传算法源代码i=1;if opts(1)==1%浮点变异maxfit=max(fit);upfit=maxfit+0.05*abs(maxfit);if opts(2)==1|opts(2)==3while(i=L)%自适应变异(自增或自减)Point=unidrnd(n);T=(1-fit(MutIn(i))/upfit)^2;q=abs(1-rand^T);%if q1%按严格数学推理来说,这段程序是不能缺少的% q=1%endp=OldPop(MutIn(i),Point)*(1-q);if unidrnd(2)==1NewPop(MutIn(i),Point)=p+q;elseNewPop(MutIn(i),Point)=p;endi=i+1;endelseif opts(2)==2|opts(2)==4%AEA变异(任意变量的某一位变异)while(i=L)Point=unidrnd(n);T=(1-abs(upfit-fit(MutIn(i)))/upfit)^2;v=1+unidrnd(1+ceil(10*T));%v=1+unidrnd(5+ceil(10*eranum/MaxEranum));q=mod(floor(OldPop(MutIn(i),Point)*10^v),10);NewPop(MutIn(i),Point)=OldPop(MutIn(i),Point)-(q-unidrnd(9))/10^v;i=i+1;endelsewhile(i=L)Point=unidrnd(n);if round(rand)NewPop(MutIn(i),Point)=OldPop(MutIn(i),Point)*(1-rand);elseNewPop(MutIn(i),Point)=OldPop(MutIn(i),Point)+(1-OldPop(MutIn(i),Point))*rand; endi=i+1;endendelseif opts(1)==0%二进制串变异if L=1while i=Lk=unidrnd(n,1,VarNum); %设置变异点数(=变量数)for j=1:length(k)if NewPop(MutIn(i),k(j))==1NewPop(MutIn(i),k(j))=0;else完整可以运行的数值优化遗传算法源代码NewPop(MutIn(i),k(j))=1;endendi=i+1;endendelse%Tsp变异if opts(2)==1|opts(2)==2|opts(2)==3|opts(2)==4numMut=ceil(pMutation*m);r=unidrnd(m,numMut,2);[LocalMinfit,In]=min(fit(r),[],2);SelectIn=r((In-1)*numMut+[1:numMut]');while(i=numMut)mPoints=sort(unidrnd(n,1,2));if mPoints(1)~=mPoints(2)NewPop(SelectIn(i),1:mPoints(1)-1)=OldPop(SelectIn(i),1:mPoints(1)-1);NewPop(SelectIn(i),mPoints(1):mPoints(2)-1)=OldPop(SelectIn(i),mPoints(1)+1:mPoints(2));NewPop(SelectIn(i),mPoints(2))=OldPop(SelectIn(i),mPoints(1));NewPop(SelectIn(i),mPoints(2)+1:n)=OldPop(SelectIn(i),mPoints( 2)+1:n);elseNewPop(SelectIn(i),:)=OldPop(SelectIn(i),:);endi=i+1;endr=rand(1,m);MutIn=find(r=pMutation);L=length(MutIn);while i=LmPoints=sort(unidrnd(n,1,2));rIn=randperm(mPoints(2)-mPoints(1)+1);NewPop(MutIn(i),mPoints(1):mPoints(2))=OldPop(MutIn(i),mPoin ts(1)+rIn-1);i=i+1;endendend% -- 倒位操作--function [NewPop]=Inversion(OldPop,pInversion)global m n NewPopNewPop=OldPop;r=rand(1,m);PopIn=find(r=pInversion);len=length(PopIn);if len=1while(i=len)d=sort(unidrnd(n,1,2));完整可以运行的数值优化遗传算法源代码NewPop(PopIn(i),d(1):d(2))=OldPop(PopIn(i),d(2):-1:d(1)); i=i+1;。

遗传算法Matlab代码

遗传算法Matlab代码

遗传算法优缺点遗传算法的优点:1. 与问题领域无关切快速随机的搜索能力。

2. 搜索从群体出发,具有潜在的并行性,可以进行多个个体的同时比较,robust.3. 搜索使用评价函数启发,过程简单4. 使用概率机制进行迭代,具有随机性。

5. 具有可扩展性,容易与其他算法结合。

缺点是:1。

没有能够及时利用网络的反馈信息,故算法的搜索速度比较慢,要得要较精确的解需要较多的训练时间。

2。

算法对初始种群的选择有一定的依赖性,能够结合一些启发算法进行改进。

3。

算法的并行机制的潜在能力没有得到充分的利用,这也是当前遗传算法的一个研究热点方向。

核心函数:(1)function [pop]=initializega(num,bounds,eevalFN,eevalOps,options)--初始种群的生成函数【输出参数】pop--生成的初始种群【输入参数】num--种群中的个体数目bounds--代表变量的上下界的矩阵eevalFN--适应度函数eevalOps--传递给适应度函数的参数options--选择编码形式(浮点编码或是二进制编码)[precision F_or_B],如precision--变量进行二进制编码时指定的精度F_or_B--为1时选择浮点编码,否则为二进制编码,由precision指定精度)(2)function [x,endPop,bPop,traceInfo] = ga(bounds,evalFN,evalOps,startPop,opts,...termFN,termOps,selectFN,selectOps,xOverFNs,xOverOps,mutFNs,mutOps)--遗传算法函数【输出参数】x--求得的最优解endPop--最终得到的种群bPop--最优种群的一个搜索轨迹【输入参数】bounds--代表变量上下界的矩阵evalFN--适应度函数evalOps--传递给适应度函数的参数startPop-初始种群opts[epsilon prob_ops display]--opts(1:2)等同于initializega的options参数,第三个参数控制是否输出,一般为0。

遗传算法MATLAB完整代码

遗传算法MATLAB完整代码

遗传算法解决简单问题%主程序:用遗传算法求解y=200*exp*x).*sin(x)在区间[-2,2]上的最大值clc;clear all;close all;global BitLengthglobal boundsbeginglobal boundsendbounds=[-2,2];precision=;boundsbegin=bounds(:,1);boundsend=bounds(:,2);%计算如果满足求解精度至少需要多长的染色体BitLength=ceil(log2((boundsend-boundsbegin)'./precision));popsize=50; %初始种群大小Generationmax=12; %最大代数pcrossover=; %交配概率pmutation=; %变异概率%产生初始种群population=round(rand(popsize,BitLength));%计算适应度,返回适应度Fitvalue和累计概率cumsump [Fitvalue,cumsump]=fitnessfun(population);Generation=1;while Generation<Generationmax+1for j=1:2:popsize%选择操作seln=selection(population,cumsump);%交叉操作scro=crossover(population,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=scnew; %产生了新的种群%计算新种群的适应度[Fitvalue,cumsump]=fitnessfun(population);%记录当前代最好的适应度和平均适应度[fmax,nmax]=max(Fitvalue);fmean=mean(Fitvalue);ymax(Generation)=fmax;ymean(Generation)=fmean;%记录当前代的最佳染色体个体x=transform2to10(population(nmax,:));%自变量取值范围是[-2,2],需要把经过遗传运算的最佳染色体整合到[-2,2]区间xx=boundsbegin+x*(boundsend-boundsbegin)/(power((boundsend),BitLength)-1);xmax(Generation)=xx;Generation=Generation+1;endGeneration=Generation-1;Bestpopulation=xx;Besttargetfunvalue=targetfun(xx);%绘制经过遗传运算后的适应度曲线。

matlab智能算法代码

matlab智能算法代码

matlab智能算法代码MATLAB是一种功能强大的数值计算和科学编程软件,它提供了许多智能算法的实现。

下面是一些常见的智能算法及其在MATLAB中的代码示例:1. 遗传算法(Genetic Algorithm):MATLAB中有一个专门的工具箱,称为Global Optimization Toolbox,其中包含了遗传算法的实现。

以下是一个简单的遗传算法示例代码:matlab.% 定义目标函数。

fitness = @(x) x^2;% 设置遗传算法参数。

options = gaoptimset('Display', 'iter','PopulationSize', 50);% 运行遗传算法。

[x, fval] = ga(fitness, 1, options);2. 粒子群优化算法(Particle Swarm Optimization):MATLAB中也有一个工具箱,称为Global Optimization Toolbox,其中包含了粒子群优化算法的实现。

以下是一个简单的粒子群优化算法示例代码:matlab.% 定义目标函数。

fitness = @(x) x^2;% 设置粒子群优化算法参数。

options = optimoptions('particleswarm', 'Display','iter', 'SwarmSize', 50);% 运行粒子群优化算法。

[x, fval] = particleswarm(fitness, 1, [], [], options);3. 支持向量机(Support Vector Machine):MATLAB中有一个机器学习工具箱,称为Statistics and Machine Learning Toolbox,其中包含了支持向量机的实现。

遗传算法matlab程序代码

遗传算法matlab程序代码

function [R,Rlength]= GA_TSP(xyCity,dCity,Population,nPopulation,pCrossover,percent,pMutation,generation,nR,rr,rang eCity,rR,moffspring,record,pi,Shock,maxShock)clear allA=load('d.txt');AxyCity=[A(1,:);A(2,:)]; %x,y为各地点坐标xyCityfigure(1)grid onhold onscatter(xyCity(1,:),xyCity(2,:),'b+')grid onnCity=50;nCityfor i=1:nCity %计算城市间距离for j=1:nCitydCity(i,j)=abs(xyCity(1,i)-xyCity(1,j))+abs(xyCity(2,i)-xyCity(2,j));endend %计算城市间距离xyCity; %显示城市坐标dCity %显示城市距离矩阵%初始种群k=input('取点操作结束'); %取点时对操作保护disp('-------------------')nPopulation=input('种群个体数量:'); %输入种群个体数量if size(nPopulation,1)==0nPopulation=50; %默认值endfor i=1:nPopulationPopulation(i,:)=randperm(nCity-1); %产生随机个体endPopulation %显示初始种群pCrossover=input('交叉概率:'); %输入交叉概率percent=input('交叉部分占整体的百分比:'); %输入交叉比率pMutation=input('突变概率:'); %输入突变概率nRemain=input('最优个体保留最大数量:');pi(1)=input('选择操作最优个体被保护概率:');%输入最优个体被保护概率pi(2)=input('交叉操作最优个体被保护概率:');pi(3)=input('突变操作最优个体被保护概率:');maxShock=input('最大突变概率:');if size(pCrossover,1)==0pCrossover=0.85;endif size(percent,1)==0percent=0.5;endif size(pMutation,1)==0pMutation=0.05;endShock=0;rr=0;Rlength=0;counter1=0;counter2=0;R=zeros(1,nCity-1);[newPopulation,R,Rlength,counter2,rr]=select(Population,nPopulation,nCity,dCity,Rlength,R,coun ter2,pi,nRemain);R0=R;record(1,:)=R;rR(1)=Rlength;Rlength0=Rlength;generation=input('算法终止条件A.最多迭代次数:');%输入算法终止条件if size(generation,1)==0generation=200;endnR=input('算法终止条件B.最短路径连续保持不变代数:');if size(nR,1)==0nR=10;endwhile counter1<generation&counter2<nRif counter2<nR*1/5Shock=0;elseif counter2<nR*2/5Shock=maxShock*1/4-pMutation;elseif counter2<nR*3/5Shock=maxShock*2/4-pMutation;elseif counter2<nR*4/5Shock=maxShock*3/4-pMutation;elseShock=maxShock-pMutation;endcounter1newPopulationoffspring=crossover(newPopulation,nCity,pCrossover,percent,nPopulation,rr,pi,nRemain);offspringmoffspring=Mutation(offspring,nCity,pMutation,nPopulation,rr,pi,nRemain,Shock);[newPopulation,R,Rlength,counter2,rr]=select(moffspring,nPopulation,nCity,dCity,Rlength,R,coun ter2,pi,nRemain);counter1=counter1+1;rR(counter1+1)=Rlength;record(counter1+1,:)=R;endR0;Rlength0;R;Rlength;minR=min(rR);disp('最短路经出现代数:')rr=find(rR==minR)disp('最短路经:')record(rr,:);mR=record(rr(1,1),:)disp('终止条件一:')counter1disp('终止条件二:')counter2disp('最短路经长度:')minRdisp('最初路经长度:')rR(1)figure(2)plotaiwa(xyCity,mR,nCity)figure(3)i=1:counter1+1;plot(i,rR(i))grid onfunction[newPopulation,R,Rlength,counter2,rr]=select(Population,nPopulation,nCity,dCity,Rlength,R,coun ter2,pi,nRemain)Distance=zeros(nPopulation,1); %零化路径长度Fitness=zeros(nPopulation,1); %零化适应概率Sum=0; %路径长度for i=1:nPopulation %计算个体路径长度for j=1:nCity-2Distance(i)=Distance(i)+dCity(Population(i,j),Population(i,j+1));end %对路径长度调整,增加起始点到路径首尾点的距离Distance(i)=Distance(i)+dCity(Population(i,1),nCity)+dCity(Population(i,nCity-1),nCity);Sum=Sum+Distance(i); %累计总路径长度end %计算个体路径长度if Rlength==min(Distance)counter2=counter2+1;elsecounter2=0;endRlength=min(Distance); %更新最短路径长度Rlength;rr=find(Distance==Rlength);R=Population(rr(1,1),:); %更新最短路径for i=1:nPopulationFitness(i)=(max(Distance)-Distance(i)+0.001)/(nPopulation*(max(Distance)+0.001)-Sum); %适应概率=个体/总和。

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

%%以下代码可直接复制粘贴到m文档运行
clc;
clear all;
%输入数据
for i=1:4000
input(i,:)=10*rand(1,2)-5;
output(i)=input(i,1)^2+input(i,2)^2;
end
output=output';
k = rand(1,4000);
[m,n] = sort(k);%m是数值排序,n是对应的位置
%找出训练数据和预测数据
input_train = input(n(1:3900),:)';
output_train = output(n(1:3900),:)';
input_test = input(n(3901:4000),:)';
output_test = output(n(3901:4000),:)';
%%数据归一化
[gui_1_input,gui_1_inputs] =
mapminmax(input_train);%gui_1_inputs是一个包含最大最小值等信息的结构体
[gui_1_output,gui_1_outputs] = mapminmax(output_train);
%构建神经网络
net = newff(gui_1_input,gui_1_output,5); %5是隐含层节点数net.trainParam.epochs = 100;%训练次数
net.trainParam.lr = 0.1;%学习速率
net.trainParam.goal = 0.0000004;%训练目标最小误差
%%bp神经网络训练
net = train(net,gui_1_input,gui_1_output);
%测试样本归一化
gui_1_input_test =
mapminmax('apply',input_test,gui_1_inputs);%"apply"根据
input数据进行归一化
%%Bp神经网络预测
yuce = sim(net,gui_1_input_test);
%预测结果反归一化
Bp_output =
mapminmax('reverse',yuce,gui_1_outputs);%reverse表示根据output进行反归一化
%网络存储
save data net gui_1_inputs gui_1_outputs
%网络预测图形
figure(1)
plot(Bp_output,'og');
hold on
plot(output_test,'-*');
legend('预测输出','期望输出');
title('bp 网络预测输出');
xlabel('样本');
ylabel('输出');。

相关文档
最新文档