装配生产线任务平衡问题的遗传算法MATLAB源代码
最新21装配生产线任务平衡问题的遗传算法MATLAB源代码汇总
21装配生产线任务平衡问题的遗传算法M A T L A B源代码装配生产线任务平衡问题的遗传算法MATLAB源代码下面的源码实现了装配生产线任务平衡优化问题(ALB问题)的遗传算法,算法主要参考下面这篇文献,并对其进行了改进。
陈永卿,潘刚,李平.基于混合遗传算法的装配线平衡[J].机电工程,2008,25(4):60-62.。
function[BestX,BestY,BestZ,AllFarm,LC1,LC2,LC3,LC4,LC5]=GSAALB(M,N,Pm,Pd,K,t0, alpha,TaskP,TaskT,TaskV,RT,RV)% GreenSim团队——专业级算法设计&代写程序% 欢迎访问GreenSim团队主页→/greensim%% 装配生产线任务平衡问题的遗传算法%% 输入参数列表% M------------遗传算法进化代数% N------------种群规模,取偶数% Pm-----------变异概率调节参数% Pd-----------变异程度调节参数,0<Pd<1,越大,变异的基因位越多% K------------同一温度下状态跳转次数% T0-----------初始温度% Alpha--------降温系数% Beta---------浓度均衡系数% TaskP--------任务优先矩阵,n×n矩阵,Pij=1表示任务i需在j之前完成,Pij=0时任务i和j没有优先关系% TaskT--------任务时间属性,n×1向量% TaskV--------任务体积属性,n×1向量% RT-----------时间节拍约束% RV-----------工位体积约束%% 输出参数列表% BestX--------最好个体的编码% BestY--------最好个体对应的装配方案% BestZ--------最好个体的目标函数值% LC1----------最优个体适应值的收敛曲线,M×1% LC2----------种群平均适应值的收敛曲线,M×1% LC3----------工位个数收敛曲线,M×1% LC4----------时间利用率及平衡度综合度量参数收敛曲线,M×1% LC5----------空间利用率及平衡度综合度量参数收敛曲线,M×1% AllFarm------各代种群的集合,M×1的细胞结构%% -----------------------初始化----------------------------------n=size(TaskP,1);[AA,BB]=QJHJ(TaskP);%调用子函数,建立每一个任务的前任务集和后任务集farm=Initialization(N,TaskP,AA,BB);%调用子函数,种群初始化%输出参数初始化BestX=zeros(1,n);BestY=zeros(1,n);BestZ=0;LC1=zeros(M,1);LC2=zeros(M,1);LC3=zeros(M,1);LC4=zeros(M,1);LC5=zeros(M,1);AllFarm=cell(M,1);%控制参数初始化m=1;%迭代计数器t=t0;%温度指示器BestPos=1;%初始时任意指定被保护个体%% -----------------------迭代过程---------------------------------while m<=M%设置停止条件%% ----------------------变异退火算子------------------------------for i=1:Nif rand>Pm&&i~=BestPos%如果随机数大于变异概率门限值,并且不属于保护个体,就对其实施变异I=farm(i,:);%取出该个体k=1;while k<=K%每一个温度下的状态转移次数%调用变异子函数J=Mutation(I,Pd,AA,BB);%调用计算适应值子函数[YI,ZI,FI,TGWI,VGWI,f1I,f2I]=Fitness(I,TaskT,TaskV,RT,RV);[YJ,ZJ,FJ,TGWJ,VGWJ,f1J,f2J]=Fitness(J,TaskT,TaskV,RT,RV);if FJ>FIfarm(i,:)=J;elseif rand<exp((FJ-FI)/(FI*t))farm(i,:)=J;elsefarm(i,:)=I;endk=k+1;endendend%% -----------------------交叉算子---------------------------------newfarm=zeros(size(farm));Ser=randperm(N);%用这个函数保证随机配对for i=1:2:(N-1)FA=farm(Ser(i),:);FB=farm(Ser(i+1),:);[SA,SB]=CrossOver(FA,FB);newfarm(i,:)=SA;newfarm(i+1,:)=SB;end%新旧种群合并FARM=[farm;newfarm];%% -----------------------选择复制---------------------------------FIT_Y=zeros(2*N,n);FIT_Z=zeros(2*N,1);FIT_F=zeros(2*N,1);FIT_f1=zeros(2*N,1);FIT_f2=zeros(2*N,1);fit_Y=zeros(N,n);fit_Z=zeros(N,1);fit_F=zeros(N,1);fit_f1=zeros(N,1);fit_f2=zeros(N,1);for i=1:(2*N)XX=FARM(i,:);[Y,Z,F,TGW,VGW,f1,f2]=Fitness(XX,TaskT,TaskV,RT,RV); FIT_Y(i,:)=Y;FIT_Z(i)=Z;FIT_F(i)=F;FIT_f1(i)=f1;FIT_f2(i)=f2;endSer=randperm(2*N);for i=1:Nff1=FIT_F(Ser(2*i-1));ff2=FIT_F(Ser(2*i));if ff1>=ff2farm(i,:)=FARM(Ser(2*i-1),:);fit_Y(i,:)=FIT_Y(Ser(2*i-1),:);fit_Z(i)=FIT_Z(Ser(2*i-1));fit_F(i)=FIT_F(Ser(2*i-1));fit_f1(i)=FIT_f1(Ser(2*i-1));fit_f2(i)=FIT_f2(Ser(2*i-1));elsefarm(i,:)=FARM(Ser(2*i),:);fit_Y(i,:)=FIT_Y(Ser(2*i),:);fit_Z(i)=FIT_Z(Ser(2*i));fit_F(i)=FIT_F(Ser(2*i));fit_f1(i)=FIT_f1(Ser(2*i));fit_f2(i)=FIT_f2(Ser(2*i));endend%% -----------------------记录与更新------------------------------- maxF=max(fit_F);meanF=mean(fit_F);LC1(m)=maxF;LC2(m)=meanF;pos=find(fit_F==maxF);BestPos=pos(1);BestX=farm(BestPos,:);BestY=fit_Y(BestPos,:);BestZ=fit_Z(BestPos);LC3(m)=fit_Z(BestPos);LC4(m)=fit_f1(BestPos);LC5(m)=fit_f2(BestPos);AllFarm{m}=farm;disp(m);m=m+1;t=t*alpha;end源代码运行结果展示。
利用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遗传算法求解车间调度问题分析及实现源码⽬录⼀、车间调度简介1 车间调度定义2 传统作业车间调度⼆、遗传算法简介1 遗传算法概述2 遗传算法的特点和应⽤3 遗传算法的基本流程及实现技术3.1 遗传算法的基本流程3.2 遗传算法的实现技术4 遗传算法的基本原理4.1 模式定理4.2 积⽊块假设三、部分源代码四、运⾏结果五、matlab版本及参考⽂献⼀、车间调度简介1 车间调度定义车间调度是指根据产品制造的合理需求分配加⼯车间顺序,从⽽达到合理利⽤产品制造资源、提⾼企业经济效益的⽬的。
车间调度问题从数学上可以描述为有n个待加⼯的零件要在m台机器上加⼯。
问题需要满⾜的条件包括每个零件的各道⼯序使⽤每台机器不多于1次,每个零件都按照⼀定的顺序进⾏加⼯。
2 传统作业车间调度传统作业车间带调度实例有若⼲⼯件,每个⼯件有若⼲⼯序,有多个加⼯机器,但是每道⼯序只能在⼀台机器上加⼯。
对应到上⾯表格中的实例就是,两个⼯件,⼯件J1有三道⼯序,⼯序Q11只能在M3上加⼯,加⼯时间是5⼩时。
约束是对于⼀个⼯件来说,⼯序的相对顺序不能变。
O11->O12->O13。
每时刻,每个⼯件只能在⼀台机器上加⼯;每个机器上只能有⼀个⼯件。
调度的任务则是安排出⼯序的加⼯顺序,加⼯顺序确定了,因为每道⼯序只有⼀台机器可⽤,加⼯的机器也就确定了。
调度的⽬的是总的完⼯时间最短(也可以是其他⽬标)。
举个例⼦,⽐如确定了O21->O22->O11->O23->O12->O13的加⼯顺序之后,我们就可以根据加⼯机器的约束,计算出总的加⼯时间。
M2加⼯O21消耗6⼩时,⼯件J2当前加⼯时间6⼩时。
M1加⼯O22消耗9⼩时,⼯件J2当前加⼯时间6+9=15⼩时。
M3加⼯O11消耗5⼩时,⼯件J1当前加⼯时间5⼩时。
M4加⼯O23消耗7⼩时,⼯件J2加⼯时间15+7=22⼩时。
M1加⼯O12消耗11⼩时,但是要等M1加⼯完O22之后才开始加⼯O12,所以⼯件J1的当前加⼯时间为max(5,9)+11=20⼩时。
遗传算法matlab程序代码
遗传算法matlab程序代码
遗传算法(GA)是一种用于求解优化问题的算法,其主要思想是模拟
生物进化过程中的“选择、交叉、变异”操作,通过模拟这些操作,来寻
找最优解。
Matlab自带了GA算法工具箱,可以直接调用来实现遗传算法。
以下是遗传算法Matlab程序代码示例:
1.初始化
首先定义GA需要优化的目标函数f,以及GA算法的相关参数,如种
群大小、迭代次数、交叉概率、变异概率等,如下所示:
options = gaoptimset('PopulationSize',10,...
'Generations',50,...
2.运行遗传算法
运行GA算法时,需要调用MATLAB自带的ga函数,将目标函数、问
题的维度、上下界、约束条件和算法相关参数作为输入参数。
其中,上下
界和约束条件用于限制空间,防止到无效解。
代码如下:
[某,fval,reason,output,population] = ga(f,2,[],[],[],[],[-10,-10],[10,10],[],options);
3.结果分析
最后,将结果可视化并输出,可以使用Matlab的plot函数绘制出目
标函数的值随迭代次数的变化,如下所示:
plot(output.generations,output.bestf)
某label('Generation')
ylabel('Best function value')
总之,Matlab提供了方便易用的GA算法工具箱,开发者只需要根据具体问题定义好目标函数和相关参数,就能够在短时间内快速实现遗传算法。
遗传算法应用实例及matlab程序
遗传算法应用实例及matlab程序遗传算法是一种模拟自然进化过程的优化算法,在多个领域都有广泛的应用。
下面将以一个经典的实例,车间调度问题,来说明遗传算法在实际问题中的应用,并给出一个基于MATLAB的实现。
车间调度问题是一个经典的组合优化问题,它是指在给定一系列任务和一台机器的情况下,如何安排任务的执行顺序,以便最小化任务的完成时间或最大化任务的完成效率。
这个问题通常是NP困难问题,因此传统的优化算法往往难以找到全局最优解。
遗传算法能够解决车间调度问题,其基本思想是通过模拟生物进化的过程,不断演化和改进任务的调度顺序,以找到最优解。
具体步骤如下:1. 初始种群的生成:生成一批初始调度方案,每个方案都表示为一个染色体,一般采用随机生成的方式。
2. 个体适应度的计算:根据染色体中任务的执行顺序,计算每个调度方案的适应度值,一般使用任务完成时间作为适应度度量。
3. 选择操作:根据个体的适应度,采用选择策略选择一部分优秀个体作为父代。
4. 交叉操作:对选中的个体进行交叉操作,生成新的子代个体。
5. 变异操作:对子代个体进行变异操作,引入随机性,增加搜索空间的广度。
6. 替换操作:用新的个体替换原来的个体,形成新一代的种群。
7. 迭代过程:重复执行选择、交叉、变异和替换操作,直到达到预定的终止条件。
下面给出基于MATLAB的实现示例:matlabfunction [best_solution, best_fitness] =genetic_algorithm(num_generations, population_size) % 初始化种群population = generate_population(population_size);for generation = 1:num_generations% 计算适应度fitness = calculate_fitness(population);% 选择操作selected_population = selection(population, fitness);% 交叉操作crossed_population = crossover(selected_population);% 变异操作mutated_population = mutation(crossed_population);% 替换操作population = replace(population, selected_population, mutated_population);end% 找到最优解[~, index] = max(fitness);best_solution = population(index,:);best_fitness = fitness(index);endfunction population = generate_population(population_size) % 根据问题的具体要求,生成初始种群population = randi([1, num_tasks], [population_size, num_tasks]); endfunction fitness = calculate_fitness(population)% 根据任务执行顺序,计算每个调度方案的适应度% 这里以任务完成时间作为适应度度量fitness = zeros(size(population, 1), 1);for i = 1:size(population, 1)solution = population(i,:);% 计算任务完成时间completion_time = calculate_completion_time(solution);% 适应度为任务完成时间的倒数fitness(i) = 1 / completion_time;endendfunction selected_population = selection(population, fitness) % 根据适应度值选择父代个体% 这里采用轮盘赌选择策略selected_population = zeros(size(population));for i = 1:size(population, 1)% 计算选择概率prob = fitness / sum(fitness);% 轮盘赌选择selected_population(i,:) = population(find(rand <= cumsum(prob), 1),:);endendfunction crossed_population = crossover(selected_population) % 对选中的个体进行交叉操作% 这里采用单点交叉crossed_population = zeros(size(selected_population));for i = 1:size(selected_population, 1) / 2parent1 = selected_population(2*i-1,:);parent2 = selected_population(2*i,:);% 随机选择交叉点crossover_point = randi([1, size(parent1,2)]);% 交叉操作crossed_population(2*i-1,:) = [parent1(1:crossover_point), parent2(crossover_point+1:end)];crossed_population(2*i,:) = [parent2(1:crossover_point), parent1(crossover_point+1:end)];endendfunction mutated_population = mutation(crossed_population) % 对子代个体进行变异操作% 这里采用单点变异mutated_population = crossed_population;for i = 1:size(mutated_population, 1)individual = mutated_population(i,:);% 随机选择变异点mutation_point = randi([1, size(individual,2)]);% 变异操作mutated_population(i,mutation_point) = randi([1, num_tasks]);endendfunction new_population = replace(population, selected_population, mutated_population)% 根据选择、交叉和变异得到的个体替换原来的个体new_population = mutated_population;for i = 1:size(population, 1)if ismember(population(i,:), selected_population, 'rows')% 保留选择得到的个体continue;else% 随机选择一个父代个体进行替换index = randi([1, size(selected_population,1)]);new_population(i,:) = selected_population(index,:);endendend该示例代码实现了车间调度问题的遗传算法求解过程,具体实现了种群的初始化、适应度计算、选择、交叉、变异和替换等操作。
遗传算法MATLAB完整代码(不用工具箱)
遗传算法MATLAB完整代码(不用工具箱)遗传算法解决简单问题%主程序:用遗传算法求解y=200*exp(-0.05*x).*sin(x)在区间[-2,2]上的最大值clc;clear all;close all;global BitLengthglobal boundsbeginglobal boundsendbounds=[-2,2];precision=0.0001;boundsbegin=bounds(:,1);boundsend=bounds(:,2);%计算如果满足求解精度至少需要多长的染色体BitLength=ceil(log2((boundsend-boundsbegin)'./precision));popsize=50; %初始种群大小Generationmax=12; %最大代数pcrossover=0.90; %交配概率pmutation=0.09; %变异概率%产生初始种群population=round(rand(popsize,BitLength));%计算适应度,返回适应度Fitvalue和累计概率cumsump[Fitvalue,cumsump]=fitnessfun(population);Generation=1;while Generation<generationmax+1< p="">for 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函数的源程序
end
end
end
%确定下一代父代个体
%确定实际子代个体数值
chi_fact=zeros(x_num,chi_num*3);
for j=1:x_num
chi_fact(j,:)=x_range(j,1)+(x_range(j,2)-x_range(j,1))*chi(j,:);
par=chi(:,chi_ada_no(1:par_num));
end ');
par_fac_exc(:,1)=x_range(:,1)+(x_range(:,2)-x_range(:,1)).*par(:,1);%父代个体最优函数值
par_fun_exc=fun(par_fac_exc);
%输出父代样本实际值
par_fact=zeros(x_num,par_num);
for i=1:x_num
par_fact(i,:)=x_range(i,1)+(x_range(i,2)-x_range(i,1))*par(i,:);
if chi_ran(3)<0.5
chi(j,i)=chi_ran(1)*par(j,chi_sel1)+(1-chi_ran(1))*par(j,chi_sel2);
else
chi(j,i)=chi_ran(2)*par(j,chi_sel1)+(1-chi_ran(2))*par(j,chi_sel2);
%例子2:
%fun=@(x) sum(x.*x-cos(18*x))+5;
%x_range=[-1,1;-1,1;-1,1;-1,1;-1,1];
遗传算法程序源代码matlab
遗传算法程序matlab本程序收集于网络,本人并未进行过运行,如有问题请与作者联系,如有侵权请告之遗传算法程序:说明: fga.m 为遗传算法的主程序; 采用二进制Gray编码,采用基于轮盘赌法的非线性排名选择, 均匀交叉,变异操作,而且还引入了倒位操作!function [BestPop,Trace]=fga(FUN,LB,UB,eranum,popsize,pCross,pMutation,pInversion,options) % [BestPop,Trace]=fmaxga(FUN,LB,UB,eranum,popsize,pcross,pmutation)% Finds a maximum of a function of several variables.% fmaxga solves problems of the form:% max F(X) subject to: LB <= X <= UB% BestPop - 最优的群体即为最优的染色体群% Trace - 最佳染色体所对应的目标函数值% FUN - 目标函数% LB - 自变量下限% UB - 自变量上限% eranum - 种群的代数,取100--1000(默认200)% popsize - 每一代种群的规模;此可取50--200(默认100)% pcross - 交叉概率,一般取0.5--0.85之间较好(默认0.8)% pmutation - 初始变异概率,一般取0.05-0.2之间较好(默认0.1)% pInversion - 倒位概率,一般取0.05-0.3之间较好(默认0.2)% options - 1*2矩阵,options(1)=0二进制编码(默认0),option(1)~=0十进制编%码,option(2)设定求解精度(默认1e-4)%% ------------------------------------------------------------------------T1=clock;if nargin<3, error('FMAXGA requires at least three input arguments'); endif nargin==3, eranum=200;popsize=100;pCross=0.8;pMutation=0.1;pInversion=0.15;options=[0 1e-4];endif nargin==4, popsize=100;pCross=0.8;pMutation=0.1;pInversion=0.15;options=[0 1e-4];endif nargin==5, pCross=0.8;pMutation=0.1;pInversion=0.15;options=[0 1e-4];endif nargin==6, pMutation=0.1;pInversion=0.15;options=[0 1e-4];endif nargin==7, pInversion=0.15;options=[0 1e-4];endif find((LB-UB)>0)error('数据输入错误,请重新输入(LB<UB):');ends=sprintf('程序运行需要约%.4f 秒钟时间,请稍等......',(eranum*popsize/1000));disp(s);global m n NewPop children1 children2 VarNumbounds=[LB;UB]';bits=[];VarNum=size(bounds,1);precision=options(2);%由求解精度确定二进制编码长度bits=ceil(log2((bounds(:,2)-bounds(:,1))' ./ precision));%由设定精度划分区间[Pop]=InitPopGray(popsize,bits);%初始化种群[m,n]=size(Pop);NewPop=zeros(m,n);children1=zeros(1,n);children2=zeros(1,n);pm0=pMutation;BestPop=zeros(eranum,n);%分配初始解空间BestPop,TraceTrace=zeros(eranum,length(bits)+1);i=1;while i<=eranumfor j=1:mvalue(j)=feval(FUN(1,:),(b2f(Pop(j,:),bounds,bits)));%计算适应度end[MaxValue,Index]=max(value);BestPop(i,:)=Pop(Index,:);Trace(i,1)=MaxValue;Trace(i,(2:length(bits)+1))=b2f(BestPop(i,:),bounds,bits);[selectpop]=NonlinearRankSelect(FUN,Pop,bounds,bits);%非线性排名选择[CrossOverPop]=CrossOver(selectpop,pCross,round(unidrnd(eranum-i)/eranum));%采用多点交叉和均匀交叉,且逐步增大均匀交叉的概率%round(unidrnd(eranum-i)/eranum)[MutationPop]=Mutation(CrossOverPop,pMutation,VarNum);%变异[InversionPop]=Inversion(MutationPop,pInversion);%倒位Pop=InversionPop;%更新pMutation=pm0+(i^4)*(pCross/3-pm0)/(eranum^4);%随着种群向前进化,逐步增大变异率至1/2交叉率p(i)=pMutation;i=i+1;endt=1:eranum;plot(t,Trace(:,1)');title('函数优化的遗传算法');xlabel('进化世代数(eranum)');ylabel('每一代最优适应度(maxfitness)');[MaxFval,I]=max(Trace(:,1));X=Trace(I,(2:length(bits)+1));hold on; plot(I,MaxFval,'*');text(I+5,MaxFval,['FMAX=' num2str(MaxFval)]);str1=sprintf('进化到%d 代,自变量为%s 时,得本次求解的最优值%f\n对应染色体是:%s',I,num2str(X),MaxFval,num2str(BestPop(I,:)));disp(str1);%figure(2);plot(t,p);%绘制变异值增大过程T2=clock;elapsed_time=T2-T1;if elapsed_time(6)<0elapsed_time(6)=elapsed_time(6)+60; elapsed_time(5)=elapsed_time(5)-1;endif elapsed_time(5)<0elapsed_time(5)=elapsed_time(5)+60;elapsed_time(4)=elapsed_time(4)-1;end %像这种程序当然不考虑运行上小时啦str2=sprintf('程序运行耗时%d 小时%d 分钟%.4f 秒',elapsed_time(4),elapsed_time(5),elapsed_time(6));disp(str2);%初始化种群%采用二进制Gray编码,其目的是为了克服二进制编码的Hamming悬崖缺点function [initpop]=InitPopGray(popsize,bits)len=sum(bits);initpop=zeros(popsize,len);%The whole zero encoding individualfor i=2:popsize-1pop=round(rand(1,len));pop=mod(([0 pop]+[pop 0]),2);%i=1时,b(1)=a(1);i>1时,b(i)=mod(a(i-1)+a(i),2)%其中原二进制串:a(1)a(2)...a(n),Gray串:b(1)b(2)...b(n)initpop(i,:)=pop(1:end-1);endinitpop(popsize,:)=ones(1,len);%The whole one encoding individual%解码function [fval] = b2f(bval,bounds,bits)% fval - 表征各变量的十进制数% bval - 表征各变量的二进制编码串% bounds - 各变量的取值范围% bits - 各变量的二进制编码长度scale=(bounds(:,2)-bounds(:,1))'./(2.^bits-1); %The range of the variablesnumV=size(bounds,1);cs=[0 cumsum(bits)];for i=1:numVa=bval((cs(i)+1):cs(i+1));fval(i)=sum(2.^(size(a,2)-1:-1:0).*a)*scale(i)+bounds(i,1);end%选择操作%采用基于轮盘赌法的非线性排名选择%各个体成员按适应值从大到小分配选择概率:%P(i)=(q/1-(1-q)^n)*(1-q)^i, 其中P(0)>P(1)>...>P(n), sum(P(i))=1function [selectpop]=NonlinearRankSelect(FUN,pop,bounds,bits)global m nselectpop=zeros(m,n);fit=zeros(m,1);for i=1:mfit(i)=feval(FUN(1,:),(b2f(pop(i,:),bounds,bits)));%以函数值为适应值做排名依据endselectprob=fit/sum(fit);%计算各个体相对适应度(0,1)q=max(selectprob);%选择最优的概率x=zeros(m,2);x(:,1)=[m:-1:1]';[y x(:,2)]=sort(selectprob);r=q/(1-(1-q)^m);%标准分布基值newfit(x(:,2))=r*(1-q).^(x(:,1)-1);%生成选择概率newfit=cumsum(newfit);%计算各选择概率之和rNums=sort(rand(m,1));fitIn=1;newIn=1;while newIn<=mif rNums(newIn)<newfit(fitIn)selectpop(newIn,:)=pop(fitIn,:);newIn=newIn+1;elsefitIn=fitIn+1;endend%交叉操作function [NewPop]=CrossOver(OldPop,pCross,opts)%OldPop为父代种群,pcross为交叉概率global m n NewPopr=rand(1,m);y1=find(r<pCross);y2=find(r>=pCross);len=length(y1);if len>2&mod(len,2)==1%如果用来进行交叉的染色体的条数为奇数,将其调整为偶数y2(length(y2)+1)=y1(len);y1(len)=[];endif length(y1)>=2for i=0:2:length(y1)-2if opts==0[NewPop(y1(i+1),:),NewPop(y1(i+2),:)]=EqualCrossOver(OldPop(y1(i+1),:),OldPop(y1(i+2),:));else[NewPop(y1(i+1),:),NewPop(y1(i+2),:)]=MultiPointCross(OldPop(y1(i+1),:),OldPop(y1(i+2),:));endendendNewPop(y2,:)=OldPop(y2,:);%采用均匀交叉function [children1,children2]=EqualCrossOver(parent1,parent2)global n children1 children2hidecode=round(rand(1,n));%随机生成掩码crossposition=find(hidecode==1);holdposition=find(hidecode==0);children1(crossposition)=parent1(crossposition);%掩码为1,父1为子1提供基因children1(holdposition)=parent2(holdposition);%掩码为0,父2为子1提供基因children2(crossposition)=parent2(crossposition);%掩码为1,父2为子2提供基因children2(holdposition)=parent1(holdposition);%掩码为0,父1为子2提供基因%采用多点交叉,交叉点数由变量数决定function [Children1,Children2]=MultiPointCross(Parent1,Parent2)global n Children1 Children2 VarNumChildren1=Parent1;Children2=Parent2;Points=sort(unidrnd(n,1,2*VarNum));for i=1:VarNumChildren1(Points(2*i-1):Points(2*i))=Parent2(Points(2*i-1):Points(2*i));Children2(Points(2*i-1):Points(2*i))=Parent1(Points(2*i-1):Points(2*i));end%变异操作function [NewPop]=Mutation(OldPop,pMutation,VarNum)global m n NewPopr=rand(1,m);position=find(r<=pMutation);len=length(position);if len>=1for i=1:lenk=unidrnd(n,1,VarNum); %设置变异点数,一般设置1点for j=1:length(k)if OldPop(position(i),k(j))==1OldPop(position(i),k(j))=0;elseOldPop(position(i),k(j))=1;endendendendNewPop=OldPop;%倒位操作function [NewPop]=Inversion(OldPop,pInversion)global m n NewPopNewPop=OldPop;r=rand(1,m);PopIn=find(r<=pInversion);len=length(PopIn);if len>=1for i=1:lend=sort(unidrnd(n,1,2));if d(1)~=1&d(2)~=nNewPop(PopIn(i),1:d(1)-1)=OldPop(PopIn(i),1:d(1)-1);NewPop(PopIn(i),d(1):d(2))=OldPop(PopIn(i),d(2):-1:d(1));NewPop(PopIn(i),d(2)+1:n)=OldPop(PopIn(i),d(2)+1:n);endend end。
遗传算法的Matlab7.0程序实现
function pop=encoding(popsize,stringlength,dimension)pop=round(rand(popsize.dimension*string—length+1));function new—pop=cross~over(pop,popsize,stringlength,dimension)match=round(rand(1,popsize)*(popsize一1))+1;for i=1:popsize .["childl,child2]=cross—running(pop (i,:),pop(match(i),:),stringlength,di—mension);new—pop(2*i——1:2*i,:)=[-childl}child2];endfunction[childl,child2]=eross—running(par—entl,parent2,stringlength,dimension)cpoint=round((stringlength--1)*rand(1,di—…mension))+l;for j=1:dimensionchildl((j一1)*stringlength+1:j*string—length)=[parentl((j一1)*stringlength+1:(j一1)*stringlength+cpoint(j))parent2((j一1)* stringlength+cpoint(j)+1:j*stringlength)];child2((j一1)*stringlength+1:j-'k string—length)=[parent2((j一1)*stringlength+1:(j一1)*stringlength+cpoint(j))parentl((j一1)-'k stringlength+cpoint(j)+1:j*stringlength)];endfunction new—pop 2 mutation(new—pop,string—length,dimension,pm)new—popsize=size(new—pop,1);for i一1:new—popsizeif rand<pmmpoint--round(rand(1.dimension)*(string—length一1))+1;for j=1:dimensionnew—pop(i,(j一1)-'k stringlength+mpoint (j))一1一new—pop(i,(j一1)*stringlength+ mpoint(j));endendendfunction pop—decoding(pop,stringlength,dimen—sion,X—bound)popsize=size(pop,1);temp--2.‘(stringlength一1:一1:0)/(2‘string—length--1);for i一1:dimensionbound(i)=X—bound(i,2)一x—bound(i,1);endfor i=1:popsizeforj=1:dimensionm(:,j)一pop(i,stringlength*(j一1)+1:stringlength*j);endx2temp*m ox—x.*bound+x—bound(:,1)’;’pop(i,dimension*stringlength+1)一funname (x);Endfunction selected=selection(pop,popsize,string—length,dimension)popsize—new2size(pop,1);r=rand(1,popsize):fitness=pop(:,dimension*stringlength+1);fitness=fitness/sum(fitness);fitness=cumsum(fitness);for i=l:popsizef0√~1:popsize~newi j--a.“if,(i)三:fit:00110110,则解码后selected(i':) ,,‘。
遗传算法的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实现源程序
clc;clear;%各份订单基本数据phen=[1 2 3 4 5 6 7 8 9 10 11 12 13 1441,52,-23,-46,-143,-74,-56,101,73,74,95,86,-35,3265,23,-76,104,34,38,4,-23,55,-49,39,89,-86,527716,9887,12188,8819,4002,6119,3284,4607,5600,4587,9821,13024,6547,26 84500,400,1000,120,0,235,654,241,0,361,120,254,300,1501,4,2,2,4,4,3,3,3,1,4,5,1,32.7,1.8,4,2.5,1.6,1,3.6,5,4.2,1.9,6.4,2.8,1.4,8];hromlength=14;popsize=30;maxgen=500; p c=0.8;pm=0.04;for kem=1:popsizepopulation(kem,:)=randperm(hromlength);endpopulation;%评价目标函数值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(fe t,:);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(in t+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;endendclear population;clear objmin;clear objmean;%遗传操作结束population=newpop;for ium=1:popsizevector2=population(ium,:);obj(ium)=object(hromlength,vector2,phen); endobjmin=min(obj);objmean=mean(obj);clear opti;for sequ1=1:popsizeif obj(sequ1)==objminopti=population(sequ1,:);endendsolution=objmin;final(gen)=objmin;final1(gen)=objmean;endoptisolutionplot(final);hold on;plot(final1,'--')hold off%目标函数值子函数function[cost]=hanshu(hromlength,vector,phen)wmax=20000;ct=1.2;ch=0.5;for num=1:hromlengthline=vector(num);s(:,num)=phen(:,line);endm=1;cshort=0;chold=0;ctrans=0;while m<=hromlengthj=m;weight=s(4,j);day=s(6,j);dis=sqrt(s(2,j)^2+s(3,j)^2);while ((j< P>weight=weight+s(4,j+1);if (s(6,j+1)< P>cshort=(s(5,j+1))*(s(7,j+1))*0.1+cshor t;chold=(s(4,j+1))*ch+chold;enddis=sqrt((s(2,j)-s(2,j+1))^2+(s(3,j)-s(3,j+1)) ^2);j=j+1;enddis=dis+sqrt(s(2,j)^2+s(3,j)^2);ctrans=ctrans+dis*weight*ct;m=j+1;endcost=cshort+chold+ctrans;。
遗传算法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源码
0,0,0,0,0,0,0
];
%物料搬运的频率
F=[
0,2,2,1,0,2,1;
0,0,2,1,1,2,2;
0,0,0,2,1,2,1;
0,0,0,0,2,1,2;
0,0,0,0,0,2,1;
0,0,0,0,0,0,1;
0,0,0,0,0,0,0
];
%物流量
Q=[0,10,6,8,4,6,1;
X=BESTX{max_gen};
disp('遗传算法输出的最优结果为');
disp(X);
figure(4)
PlotFigure(X,Li,Wi,L,W);
function
[BESTX,BESTY,ALLX,ALLY]=GAUCP2(K,N,Pm,LB,UB,PL,PW,PLi,PWi,PP,PF,PQ, PV,PminDX,PminDY,Pkc,Pkt,PLambda,PK)
Ser=randperm(N);%两两随机配对的配对表
A=farm(:,Ser(1));
B=farm(:,Ser(2));
P0=unidrnd(M-1);
a=[A(1:P0,:);B((P0+1):end,:)];%产生子代a
b=[B(1:P0,:);A((P0+1):end,:)];%产生子代b
newfarm(:,2*N-1)=a;%加入子代种群
ylabel('Fitness'); xlabel('Iterations');
legend('Best Fitness','Average Fitness','FontName','Times Roman','FontSize',10)
21装配生产线任务平衡问题的遗传算法MATLAB源代码
装配生产线任务平衡问题的遗传算法MATLAB源代码下面的源码实现了装配生产线任务平衡优化问题(ALB问题)的遗传算法,算法主要参考下面这篇文献,并对其进行了改进。
陈永卿,潘刚,李平.基于混合遗传算法的装配线平衡[J].机电工程,2008,25(4):60-62.。
function[BestX,BestY,BestZ,AllFarm,LC1,LC2,LC3,LC4,LC5]=GSAALB(M,N,Pm,Pd,K,t0,alpha,TaskP, TaskT,TaskV,RT,RV)% GreenSim团队——专业级算法设计&代写程序% 欢迎访问GreenSim团队主页→/greensim%% 装配生产线任务平衡问题的遗传算法%% 输入参数列表% M------------遗传算法进化代数% N------------种群规模,取偶数% Pm-----------变异概率调节参数% Pd-----------变异程度调节参数,0<Pd<1,越大,变异的基因位越多% K------------同一温度下状态跳转次数% T0-----------初始温度% Alpha--------降温系数% Beta---------浓度均衡系数% TaskP--------任务优先矩阵,n×n矩阵,Pij=1表示任务i需在j之前完成,Pij=0时任务i 和j没有优先关系% TaskT--------任务时间属性,n×1向量% TaskV--------任务体积属性,n×1向量% RT-----------时间节拍约束% RV-----------工位体积约束%% 输出参数列表% BestX--------最好个体的编码% BestY--------最好个体对应的装配方案% BestZ--------最好个体的目标函数值% LC1----------最优个体适应值的收敛曲线,M×1% LC2----------种群平均适应值的收敛曲线,M×1% LC3----------工位个数收敛曲线,M×1% LC4----------时间利用率及平衡度综合度量参数收敛曲线,M×1% LC5----------空间利用率及平衡度综合度量参数收敛曲线,M×1% AllFarm------各代种群的集合,M×1的细胞结构%% -----------------------初始化----------------------------------n=size(TaskP,1);[AA,BB]=QJHJ(TaskP);%调用子函数,建立每一个任务的前任务集和后任务集farm=Initialization(N,TaskP,AA,BB);%调用子函数,种群初始化%输出参数初始化BestX=zeros(1,n);BestY=zeros(1,n);BestZ=0;LC1=zeros(M,1);LC2=zeros(M,1);LC3=zeros(M,1);LC4=zeros(M,1);LC5=zeros(M,1);AllFarm=cell(M,1);%控制参数初始化m=1;%迭代计数器t=t0;%温度指示器BestPos=1;%初始时任意指定被保护个体%% -----------------------迭代过程---------------------------------while m<=M%设置停止条件%% ----------------------变异退火算子------------------------------for i=1:Nif rand>Pm&&i~=BestPos%如果随机数大于变异概率门限值,并且不属于保护个体,就对其实施变异I=farm(i,:);%取出该个体k=1;while k<=K%每一个温度下的状态转移次数%调用变异子函数J=Mutation(I,Pd,AA,BB);%调用计算适应值子函数[YI,ZI,FI,TGWI,VGWI,f1I,f2I]=Fitness(I,TaskT,TaskV,RT,RV);[YJ,ZJ,FJ,TGWJ,VGWJ,f1J,f2J]=Fitness(J,TaskT,TaskV,RT,RV);if FJ>FIfarm(i,:)=J;elseif rand<exp((FJ-FI)/(FI*t))farm(i,:)=J;elsefarm(i,:)=I;endk=k+1;endendend%% -----------------------交叉算子---------------------------------newfarm=zeros(size(farm));Ser=randperm(N);%用这个函数保证随机配对for i=1:2:(N-1)FA=farm(Ser(i),:);FB=farm(Ser(i+1),:);[SA,SB]=CrossOver(FA,FB);newfarm(i,:)=SA;newfarm(i+1,:)=SB;end%新旧种群合并FARM=[farm;newfarm];%% -----------------------选择复制--------------------------------- FIT_Y=zeros(2*N,n);FIT_Z=zeros(2*N,1);FIT_F=zeros(2*N,1);FIT_f1=zeros(2*N,1);FIT_f2=zeros(2*N,1);fit_Y=zeros(N,n);fit_Z=zeros(N,1);fit_F=zeros(N,1);fit_f1=zeros(N,1);fit_f2=zeros(N,1);for i=1:(2*N)XX=FARM(i,:);[Y,Z,F,TGW,VGW,f1,f2]=Fitness(XX,TaskT,TaskV,RT,RV);FIT_Y(i,:)=Y;FIT_Z(i)=Z;FIT_F(i)=F;FIT_f1(i)=f1;FIT_f2(i)=f2;endSer=randperm(2*N);for i=1:Nff1=FIT_F(Ser(2*i-1));ff2=FIT_F(Ser(2*i));if ff1>=ff2farm(i,:)=FARM(Ser(2*i-1),:);fit_Y(i,:)=FIT_Y(Ser(2*i-1),:);fit_Z(i)=FIT_Z(Ser(2*i-1));fit_F(i)=FIT_F(Ser(2*i-1));fit_f1(i)=FIT_f1(Ser(2*i-1));fit_f2(i)=FIT_f2(Ser(2*i-1));elsefarm(i,:)=FARM(Ser(2*i),:);fit_Y(i,:)=FIT_Y(Ser(2*i),:);fit_Z(i)=FIT_Z(Ser(2*i));fit_F(i)=FIT_F(Ser(2*i));fit_f1(i)=FIT_f1(Ser(2*i));fit_f2(i)=FIT_f2(Ser(2*i));endend%% -----------------------记录与更新------------------------------- maxF=max(fit_F);meanF=mean(fit_F);LC1(m)=maxF;LC2(m)=meanF;pos=find(fit_F==maxF);BestPos=pos(1);BestX=farm(BestPos,:);BestY=fit_Y(BestPos,:);BestZ=fit_Z(BestPos);LC3(m)=fit_Z(BestPos);LC4(m)=fit_f1(BestPos);LC5(m)=fit_f2(BestPos);AllFarm{m}=farm;disp(m);m=m+1;t=t*alpha;end源代码运行结果展示。
遗传算法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函数用于变异子代。
02流水线车间生产调度的遗传算法MATLAB源代码
流水线车间生产调度的遗传算法MATLAB源代码n个任务在流水线上进行m个阶段的加工,每一阶段至少有一台机器且至少有一个阶段存在多台机器,并且同一阶段上各机器的处理性能相同,在每一阶段各任务均要完成一道工序,各任务的每道工序可以在相应阶段上的任意一台机器上加工,已知任务各道工序的处理时间,要求确定所有任务的排序以及每一阶段上机器的分配情况,使得调度指标(一般求Makespan)最小。
function [Zp,Y1p,Y2p,Y3p,Xp,LC1,LC2]=JSPGA(M,N,Pm,T,P)%--------------------------------------------------------------------------% JSPGA.m% 流水线型车间作业调度遗传算法% GreenSim团队——专业级算法设计&代写程序% 欢迎访问GreenSim团队主页→/greensim%--------------------------------------------------------------------------% 输入参数列表% M 遗传进化迭代次数% N 种群规模(取偶数)% Pm 变异概率% T m×n的矩阵,存储m个工件n个工序的加工时间% P 1×n的向量,n个工序中,每一个工序所具有的机床数目% 输出参数列表% Zp 最优的Makespan值% Y1p 最优方案中,各工件各工序的开始时刻,可根据它绘出甘特图% Y2p 最优方案中,各工件各工序的结束时刻,可根据它绘出甘特图% Y3p 最优方案中,各工件各工序使用的机器编号% Xp 最优决策变量的值,决策变量是一个实数编码的m×n矩阵% LC1 收敛曲线1,各代最优个体适应值的记录% LC2 收敛曲线2,各代群体平均适应值的记录% 最后,程序还将绘出三副图片:两条收敛曲线图和甘特图(各工件的调度时序图)%第一步:变量初始化[m,n]=size(T);%m是总工件数,n是总工序数Xp=zeros(m,n);%最优决策变量LC1=zeros(1,M);%收敛曲线1LC2=zeros(1,N);%收敛曲线2%第二步:随机产生初始种群farm=cell(1,N);%采用细胞结构存储种群for k=1:NX=zeros(m,n);for j=1:nfor i=1:mX(i,j)=1+(P(j)-eps)*rand;endfarm{k}=X;endcounter=0;%设置迭代计数器while counter<M%停止条件为达到最大迭代次数%第三步:交叉newfarm=cell(1,N);%交叉产生的新种群存在其中Ser=randperm(N);for i=1:2:(N-1)A=farm{Ser(i)};%父代个体Manner=unidrnd(2);%随机选择交叉方式if Manner==1cp=unidrnd(m-1);%随机选择交叉点%双亲双子单点交叉a=[A(1:cp,:);B((cp+1):m,:)];%子代个体b=[B(1:cp,:);A((cp+1):m,:)];elsecp=unidrnd(n-1);%随机选择交叉点b=[B(:,1:cp),A(:,(cp+1):n)];endnewfarm{i}=a;%交叉后的子代存入newfarmnewfarm{i+1}=b;end%新旧种群合并FARM=[farm,newfarm];%第四步:选择复制FITNESS=zeros(1,2*N);fitness=zeros(1,N);plotif=0;for i=1:(2*N)X=FARM{i};Z=COST(X,T,P,plotif);%调用计算费用的子函数FITNESS(i)=Z;end%选择复制采取两两随机配对竞争的方式,具有保留最优个体的能力 Ser=randperm(2*N);for i=1:Nf2=FITNESS(Ser(2*i));if f1<=f2farm{i}=FARM{Ser(2*i-1)};fitness(i)=FITNESS(Ser(2*i-1));elsefarm{i}=FARM{Ser(2*i)};end%记录最佳个体和收敛曲线minfitness=min(fitness)meanfitness=mean(fitness)LC1(counter+1)=minfitness;%收敛曲线1,各代最优个体适应值的记录 LC2(counter+1)=meanfitness;%收敛曲线2,各代群体平均适应值的记录 pos=find(fitness==minfitness);Xp=farm{pos(1)};%第五步:变异for i=1:Nif Pm>rand;%变异概率为PmX=farm{i};I=unidrnd(m);J=unidrnd(n);X(I,J)=1+(P(J)-eps)*rand;farm{i}=X;endendfarm{pos(1)}=Xp;counter=counter+1end%输出结果并绘图figure(1);plotif=1;X=Xp;[Zp,Y1p,Y2p,Y3p]=COST(X,T,P,plotif);figure(2);plot(LC1);figure(3);plot(LC2);function [Zp,Y1p,Y2p,Y3p]=COST(X,T,P,plotif)% JSPGA的内联子函数,用于求调度方案的Makespan值% 输入参数列表% X 调度方案的编码矩阵,是一个实数编码的m×n矩阵% T m×n的矩阵,存储m个工件n个工序的加工时间% P 1×n的向量,n个工序中,每一个工序所具有的机床数目% plotif 是否绘甘特图的控制参数% 输出参数列表% Zp 最优的Makespan值% Y1p 最优方案中,各工件各工序的开始时刻% Y2p 最优方案中,各工件各工序的结束时刻% Y3p 最优方案中,各工件各工序使用的机器编号%第一步:变量初始化[m,n]=size(X);Y1p=zeros(m,n);Y2p=zeros(m,n);Y3p=zeros(m,n);%第二步:计算第一道工序的安排Q1=zeros(m,1);Q2=zeros(m,1);R=X(:,1);%取出第一道工序Q3=floor(R);%向下取整即得到各工件在第一道工序使用的机器的编号%下面计算各工件第一道工序的开始时刻和结束时刻for i=1:P(1)%取出机器编号pos=find(Q3==i);%取出使用编号为i的机器为其加工的工件的编号lenpos=length(pos);if lenpos>=1Q1(pos(1))=0;if lenpos>=2for j=2:lenposQ1(pos(j))=Q2(pos(j-1));Q2(pos(j))=Q2(pos(j-1))+T(pos(j),1);endendendendY1p(:,1)=Q1;Y3p(:,1)=Q3;%第三步:计算剩余工序的安排for k=2:nR=X(:,k);%取出第k道工序Q3=floor(R);%向下取整即得到各工件在第k道工序使用的机器的编号%下面计算各工件第k道工序的开始时刻和结束时刻for i=1:P(k)%取出机器编号pos=find(Q3==i);%取出使用编号为i的机器为其加工的工件的编号lenpos=length(pos);if lenpos>=1EndTime=Y2p(pos,k-1);%取出这些机器在上一个工序中的结束时刻POS=zeros(1,lenpos);%上一个工序完成时间由早到晚的排序for jj=1:lenposPOS(jj)=ppp(1);EndTime(ppp(1))=Inf;end%根据上一个工序完成时刻的早晚,计算各工件第k道工序的开始时刻和结束时刻Q1(pos(POS(1)))=Y2p(pos(POS(1)),k-1);Q2(pos(POS(1)))=Q1(pos(POS(1)))+T(pos(POS(1)),k);%前一个工件的结束时刻if lenpos>=2for j=2:lenposQ1(pos(POS(j)))=Y2p(pos(POS(j)),k-1);%预定的开始时刻为上一个工序的结束时刻if Q1(pos(POS(j)))<Q2(pos(POS(j-1)))%如果比前面的工件的结束时刻还早Q1(pos(POS(j)))=Q2(pos(POS(j-1)));endendendendendY1p(:,k)=Q1;Y2p(:,k)=Q2;Y3p(:,k)=Q3;end%第四步:计算最优的Makespan值Y2m=Y2p(:,n);Zp=max(Y2m);%第五步:绘甘特图if plotiffor i=1:mfor j=1:nmPoint1=Y1p(i,j);mPoint2=Y2p(i,j);mText=m+1-i;PlotRec(mPoint1,mPoint2,mText);Word=num2str(Y3p(i,j));%text(0.5*mPoint1+0.5*mPoint2,mText-0.5,Word);hold onx1=mPoint1;y1=mText-1;x2=mPoint2;y2=mText-1;x4=mPoint1;y4=mText;%fill([x1,x2,x3,x4],[y1,y2,y3,y4],'r');fill([x1,x2,x3,x4],[y1,y2,y3,y4],[1,0.5,1]);text(0.5*mPoint1+0.5*mPoint2,mText-0.5,Word);endendendfunction PlotRec(mPoint1,mPoint2,mText)% 此函数画出小矩形% 输入:% mPoint1 输入点1,较小,横坐标% mPoint2 输入点2,较大,横坐标% mText 输入的文本,序号,纵坐标vPoint = zeros(4,2) ;vPoint(1,:) = [mPoint1,mText-1];vPoint(2,:) = [mPoint2,mText-1];vPoint(3,:) = [mPoint1,mText];vPoint(4,:) = [mPoint2,mText];plot([vPoint(1,1),vPoint(2,1)],[vPoint(1,2),vPoint(2,2)]); hold on ;plot([vPoint(1,1),vPoint(3,1)],[vPoint(1,2),vPoint(3,2)]); plot([vPoint(2,1),vPoint(4,1)],[vPoint(2,2),vPoint(4,2)]); plot([vPoint(3,1),vPoint(4,1)],[vPoint(3,2),vPoint(4,2)]);。
车间作业调度问题遗传算法Matlab源码
newfarm{i+1}=b;
end
%新旧种群合并
FARM=[farm,newfarm];
%第四步:选择复制
FITNESS=zeros(1,2*N);
else
cp=unidrnd(n-1);%随机选择交叉点
a=[A(:,1:cp),B(:,(cp+1):n)];%双亲双子单点交叉
b=[B(:,1:cp),A(:,(cp+1):n)];
end
%--------------------------------------------------------------------------
% 输入参数列表
% M 遗传进化迭代次数
% N 种群规模(取偶数)
% Pm 变异概率
% T m×n的矩阵,存储m个款式n个工组的加工时间
pos=find(fitness==minfitness);
Xp=farm{pos(1)};
%第五步:变异
for i=1:N
if Pm>rand;%变异概率为Pm
X=farm{i};
I=unidrnd(m);
Ser=randperm(2*N);
for i=1:N
f1=FITNESS(Ser(2*i-1));
f2=FITNESS(Ser(2*i));
if f1<=f2
farm{i}=FARM{Ser(2*i-1)};
fitness=zeros(1,N);
plotif=0;
for i=1:(2*N)
X=FARM{i};
遗传算法经典MATLAB代码
遗传算法经典学习Matlab代码遗传算法实例:也是自己找来的,原代码有少许错误,本人都已更正了,调试运行都通过了的。
对于初学者,尤其是还没有编程经验的非常有用的一个文件遗传算法实例% 下面举例说明遗传算法%% 求下列函数的最大值%% f(x)=10*sin(5x)+7*cos(4x) x∈[0,10]%% 将x 的值用一个10位的二值形式表示为二值问题,一个10位的二值数提供的分辨率是每为(10-0)/(2^10-1)≈0.01。
%% 将变量域[0,10] 离散化为二值域[0,1023], x=0+10*b/1023, 其中 b 是[0,1023] 中的一个二值数。
%% %%--------------------------------------------------------------------------------------------------------------%%--------------------------------------------------------------------------------------------------------------%% 编程%-----------------------------------------------% 2.1初始化(编码)% initpop.m函数的功能是实现群体的初始化,popsize表示群体的大小,chromlength表示染色体的长度(二值数的长度),% 长度大小取决于变量的二进制编码的长度(在本例中取10位)。
%遗传算法子程序%Name: initpop.m%初始化function pop=initpop(popsize,chromlength)pop=round(rand(popsize,chromlength)); % rand随机产生每个单元为{0,1} 行数为popsize,列数为chromlength的矩阵,% roud对矩阵的每个单元进行圆整。
遗传算法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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
装配生产线任务平衡问题的遗传算法MATLAB源代码
下面的源码实现了装配生产线任务平衡优化问题(ALB问题)的遗传算法,算法主要参考下面这篇文献,并对其进行了改进。
陈永卿,潘刚,李平.基于混合遗传算法的装配线平衡[J].机电工程,2008,25(4):60-62.。
function
[BestX,BestY,BestZ,AllFarm,LC1,LC2,LC3,LC4,LC5]=GSAALB(M,N,Pm,Pd,K,t0,alpha,Tas kP,TaskT,TaskV,RT,RV)
% GreenSim团队——专业级算法设计&代写程序
% 欢迎访问GreenSim团队主页→/greensim
%% 装配生产线任务平衡问题的遗传算法
%% 输入参数列表
% M------------遗传算法进化代数
% N------------种群规模,取偶数
% Pm-----------变异概率调节参数
% Pd-----------变异程度调节参数,0<Pd<1,越大,变异的基因位越多
% K------------同一温度下状态跳转次数
% T0-----------初始温度
% Alpha--------降温系数
% Beta---------浓度均衡系数
% TaskP--------任务优先矩阵,n×n矩阵,Pij=1表示任务i需在j之前完成,Pij=0时任务i和j没有优先关系
% TaskT--------任务时间属性,n×1向量
% TaskV--------任务体积属性,n×1向量
% RT-----------时间节拍约束
% RV-----------工位体积约束
%% 输出参数列表
% BestX--------最好个体的编码
% BestY--------最好个体对应的装配方案
% BestZ--------最好个体的目标函数值
% LC1----------最优个体适应值的收敛曲线,M×1
% LC2----------种群平均适应值的收敛曲线,M×1
% LC3----------工位个数收敛曲线,M×1
% LC4----------时间利用率及平衡度综合度量参数收敛曲线,M×1
% LC5----------空间利用率及平衡度综合度量参数收敛曲线,M×1
% AllFarm------各代种群的集合,M×1的细胞结构
%% -----------------------初始化----------------------------------
n=size(TaskP,1);
[AA,BB]=QJHJ(TaskP);%调用子函数,建立每一个任务的前任务集和后任务集
farm=Initialization(N,TaskP,AA,BB);%调用子函数,种群初始化
%输出参数初始化
BestX=zeros(1,n);
BestY=zeros(1,n);
BestZ=0;
LC1=zeros(M,1);
LC2=zeros(M,1);
LC3=zeros(M,1);
LC4=zeros(M,1);
LC5=zeros(M,1);
AllFarm=cell(M,1);
%控制参数初始化
m=1;%迭代计数器
t=t0;%温度指示器
BestPos=1;%初始时任意指定被保护个体
%% -----------------------迭代过程---------------------------------
while m<=M%设置停止条件
%% ----------------------变异退火算子------------------------------
for i=1:N
if rand>Pm&&i~=BestPos
%如果随机数大于变异概率门限值,并且不属于保护个体,就对其实施变异 I=farm(i,:);%取出该个体
k=1;
while k<=K%每一个温度下的状态转移次数
%调用变异子函数
J=Mutation(I,Pd,AA,BB);
%调用计算适应值子函数
[YI,ZI,FI,TGWI,VGWI,f1I,f2I]=Fitness(I,TaskT,TaskV,RT,RV);
[YJ,ZJ,FJ,TGWJ,VGWJ,f1J,f2J]=Fitness(J,TaskT,TaskV,RT,RV);
if FJ>FI
farm(i,:)=J;
elseif rand<exp((FJ-FI)/(FI*t))
farm(i,:)=J;
else
farm(i,:)=I;
end
k=k+1;
end
end
end
%% -----------------------交叉算子---------------------------------
newfarm=zeros(size(farm));
Ser=randperm(N);%用这个函数保证随机配对
for i=1:2:(N-1)
FA=farm(Ser(i),:);
FB=farm(Ser(i+1),:);
[SA,SB]=CrossOver(FA,FB);
newfarm(i,:)=SA;
newfarm(i+1,:)=SB;
end
%新旧种群合并
FARM=[farm;newfarm];
%% -----------------------选择复制--------------------------------- FIT_Y=zeros(2*N,n);
FIT_Z=zeros(2*N,1);
FIT_F=zeros(2*N,1);
FIT_f1=zeros(2*N,1);
FIT_f2=zeros(2*N,1);
fit_Y=zeros(N,n);
fit_Z=zeros(N,1);
fit_F=zeros(N,1);
fit_f1=zeros(N,1);
fit_f2=zeros(N,1);
for i=1:(2*N)
XX=FARM(i,:);
[Y,Z,F,TGW,VGW,f1,f2]=Fitness(XX,TaskT,TaskV,RT,RV);
FIT_Y(i,:)=Y;
FIT_Z(i)=Z;
FIT_F(i)=F;
FIT_f1(i)=f1;
FIT_f2(i)=f2;
end
Ser=randperm(2*N);
for i=1:N
ff1=FIT_F(Ser(2*i-1));
ff2=FIT_F(Ser(2*i));
if ff1>=ff2
farm(i,:)=FARM(Ser(2*i-1),:);
fit_Y(i,:)=FIT_Y(Ser(2*i-1),:);
fit_Z(i)=FIT_Z(Ser(2*i-1));
fit_F(i)=FIT_F(Ser(2*i-1));
fit_f1(i)=FIT_f1(Ser(2*i-1));
fit_f2(i)=FIT_f2(Ser(2*i-1));
else
farm(i,:)=FARM(Ser(2*i),:);
fit_Y(i,:)=FIT_Y(Ser(2*i),:);
fit_Z(i)=FIT_Z(Ser(2*i));
fit_F(i)=FIT_F(Ser(2*i));
fit_f1(i)=FIT_f1(Ser(2*i));
fit_f2(i)=FIT_f2(Ser(2*i));
end
end
%% -----------------------记录与更新-------------------------------
maxF=max(fit_F);
meanF=mean(fit_F);
LC1(m)=maxF;
LC2(m)=meanF;
pos=find(fit_F==maxF);
BestPos=pos(1);
BestX=farm(BestPos,:);
BestY=fit_Y(BestPos,:);
BestZ=fit_Z(BestPos);
LC3(m)=fit_Z(BestPos);
LC4(m)=fit_f1(BestPos);
LC5(m)=fit_f2(BestPos);
AllFarm{m}=farm;
disp(m);
m=m+1;
t=t*alpha;
end
源代码运行结果展示
(本资料素材和资料部分来自网络,仅供参考。
请预览后才下载,期待您的好评与关注!)。