遗传算法的特点 遗传算法的基本要素
基于DEAP库的Python进化算法从入门到入土--(六)多目标遗传算法 NSGA-II
3.3.2.1在很多实际工程问题中,我们的优化目标不止一个,而是对多个目标函数求一个综合解。例如在物流配送问题中,不仅要求配送路径最短,还可能需要参与运输车辆最少等。
遗传算法的特点 遗传算法的基本要素
遗传算法的特点 遗传算法的基本要素
多目标优化问题通常具有如下特点:
对于多目标优化问题,传统方法是将原问题通过加权方式变换为单目标优化问题,进而求得解。该方法具有两大问题:
遗传算法具有多点多方向搜索的特征,在一次搜索中可以得到多个Pareto解,因此更适合求解多目标优化问题。
而当前用于求解多目标优化问题的遗传算法一般有两多目标优化问题的数学模型可以表达为:种思路:
NSGA-II(nondominated sorting genetic algorithm II)是2002年Deb提出的NSGA的改进型,这个算法主要解决了版NSGA的三个痛点:
针对这三个问题,在NSGA-II中,Deb提出了快速非支配排序算子,引入了保存精英策略,并用“拥挤距离”(crowding distance)替代了共享(sharing)。
在介绍NSGA-II的整体流程之前,我们需要先了解快速非支配排序和拥挤距离的定义。
解的支配关系与Pareto解
下图表示了解之间的支配和强支配关系:
下图表示了一个最小化问题解集中的Pareto解和Pareto弱解:
快速非支配排序步骤
快速非支配排序就是将解集分解为不同次序的Pareto前沿的过程。
它可以描述为:
DEAP内置了实现快速非支配排序作的函数 tools.emo.sortNondominated
tools.emo.sortNondominated(individuals, k, first_front_only=False)
参数:
返回:
拥挤距离的定义
在NSGA II中,为了衡量在同一个前沿中各个解质量的优劣,作者为每个解分配了一个拥挤距离。其背后的思想是 让求得的Pareto解在objective space中尽量分散 。也就有更大可能让解在Pareto前沿上均匀分布。
tools.emo.assignCrowdingDist(individuals)
参数:
返回:
比较作
根据快速非支配排序和拥挤距离计算的结果,对族群中的个体进行排序:
对两个解 ,
在每个迭代步的,将父代与子代合为一个族群,依照比较作对合并后族群中的个体进行排序,然后从中选取数量等同于父代规模的子代,这就是NSGA-II算法中的精英保存策略。
DEAP内置了实现NSGA-II中的基于拥挤度的选择函数 tools.selNSGA2 用来实现精英保存策略:
tools.selNSGA2(individuals, k, nd='standard')
参数:
返回:
这里选用ZDT3函数作为测试函数,函数可表达为:
其Pareto解集为
这里为了方便可视化取 。
下图给出了该函数在Decision Space和Objective Space中的对应:
其pareto解在Objective Space中如下图红点所示:
将结果可视化:
得到:
可以看到NSGA-II算法得到的Pareto前沿质量很高:解均匀分布在不连续前沿的各个线段上;同时在前沿以外没有个体存在。
正交试验方法、粒子群算法、遗传算法和模拟退火算法有什么不同
function [objvanumv=size(sol,2)-1;lue]=calobjvalue(pop)正交试验方法、粒子群算法、遗传算法和模拟退火算法都是优化算法,但它们在应用领域、优化目标、优化过程等方面存在一些不同。
应用领域:正交试验方法主要应用于实验设计和质量控制,通过有限数量的试验系统地测试和评估各种因素对产品或过程的影响,以确定方案。粒子群算法是一种通过模拟鸟群觅食行为而发展起来的优化算法,广泛应用于TSP这类组合优化问题、非线性整数规划问题、函数优化等领域。遗传算法则是一种基于生物进化原理的优化算法,广泛应用于机器学习、神经网络训练等领域。模拟退火算法是一种基于物理退火过程的优化算法,主要应用于组合优化问题,如VLSI、生产调度、控制工程等领域。
优化目标:正交试验方法主要是通过构建正交表,确定各因素的水平及其组合,使试验结果更加准确可靠,并分析各因素对试验结果的影响程度。粒子群算法和遗传算法都是通过模拟自然界的演化机制来搜索解,旨在找到一个解,使得该解在某种意义下。模拟退火算法则是通过赋予搜索过程一种时变且最终趋于零的概率突跳性,避免陷入局部极小并最终趋于全局。
优化过程:正交试验方法是通过构建正交表来系统地测试和评估各种因素对结果的影响,是一种统计分析方法。粒子群算法和遗传算法都是基于概率的搜索算法,通过随机初始化一群解(粒子),然后通过迭代找到解。模拟退火算法则是在每个温度都达到平衡态后逐步降低温度,通过概率突跳性跳出局部极小并最终趋于全局。
这些算法都有其独特的优点和适用范围,在解决复杂的优化问题时,通常会结合问题的特点选择合适的算法。
如何在遗传算法中设置变量约束条件
测试数据首先回答你个问题:怎么加入变量的约束条件?
单点交叉打开遗传算法工具箱的窗体中会有下图所示的选项,即是约束条件的编辑
至于添加的方式,这里要重点的提一下,首先将问题抽象成规划问题的标准形式(如果你不懂什么是标准形式的话,建议你去翻阅运筹学那本书,上告诉你什么是标准形式),然后用矩阵语言写出来,将矩阵的系数填写到线性不等约束和线性相等约束中,同时定义所求变量x的上界和下界(记住有多少个变量就有多少列,如果你发现有些条件中没有出现某些变量,那么就应该用0补足,这个是matlab解决规划问题与lingo想比较麻烦的一个地方,)。
然后回答你第二个问题:可否在m文件中添加约束条件?
当然可以,界面的东西是为了方便不熟悉matlab编程的人而设计出来的,但是其底层的算法和接口肯定是有的。
碰到不懂的函数,请记得: 函数名
ga 之后会得到一下一些函数
ga
find minimum of function using genetic algorithm
//这个是定义
syntax
// 这个是语法也即是调用的规则
x = ga(fitnessfcn,nvars)
x = ga(fitnessfcn,nvars,a,b)
x = ga(fitnessfcn,nvars,a,b,aeq,beq)
x = ga(fitnessfcn,nvars,a,b,aeq,beq,lb,ub)
x = ga(fitnessfcn,nvars,a,b,aeq,beq,lb,ub,nonlcon)
x = ga(fitnessfcn,nvars,a,b,aeq,beq,lb,ub,nonlcon,options)
x = ga(problem)
[x,fval,exitflag] = ga(...)
直接给你将最长的那个吧
x = ga(fitnessfcn,nvars,a,b,aeq,beq,lb,ub,nonlcon,options)
x是返回所求的解
fitnessfcn是适应度函数
nvars是适应度函数中所含变量的维数
a是不等式约束中变量的系数矩阵,b是不等式约束中不含变量的值矩阵
aeq是等式约束中变量的系数矩阵,beq是等式约束中不含变量的值矩阵
lb是下界,ub是上界
nonlcon 是非线性约束条件
至于options嘛
我也木有用过,其实你也可以不用管的。
懂了木有呢,亲?
1、一般有两种方法,一种是在生成初始种群时只生成满足约束的个体;另一种是随机产生个体,并且在随后的作中判断个体是否满足约束条件。
2、这是遗传算法的特点决定的;遗传算法是一种随机搜索算法,每次都因种群规模的不同、参数的不同而得到不同的结果。即便参数都相同,每次运算得到的近似解也不一定相同。一般取n次运算中的结果来作为最终的解。当然,如果你的约束条件设置不妥,或者参数设置不适当,那么也会造成每次运算的近似解相过大,且质量不高。这些都要注意。
3、我用MATLAB自己编写遗传算法来解决问题,因为其自带的工具箱比较固定,只能解决简单、典型的问题。但你的问题稍加复杂时,工具箱的作用就发挥不出来。
简单介绍一下思路:
最重要的是确定适应度函数,只要确定这个函数就很容易了,就用你不会编程,直接调用matlab的工具箱就行了。
1st.设置种群规模,并初始化种群p,并计算各个个体的适应度。
如果你用matlab来编程的话,这个可以很容易实现,会用到random('unif',a,b)这个函数吧。
例如x1的取值范围是[0,1],那么x1=random('unif',0,1).
遗传算法
end遗传算法实例:
4.3也是自己找来的,原代码有少许错误,本人都已更正了,调试运行都通过了的。
对于初学者,尤其是还没有编程经验的非常有用的一个文件
遗传算法实例
% 下面举例说明遗传算法 %
% 求下列函数的值 %
% f(x)=10sin(5x)+7cos(4x) x∈[0,10] %
% 将 x 的值用一个10位的二值形式表示为二值问题,一个10位的二值数提供的分辨率是每为 (10-0)/(2^10-1)≈0.01 。 %
% 将变量域 [0,10] 离散化为二值域 [0,1023], x=0+10b/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对矩阵的每个单元进行圆整。这样产生的初始种群。
% 2.2 计算目标函数值
% 2.2.1 将二进制数转化为十进制数(1)
%遗传算法子程序
%Name: decodebinary.m
%产生 [2^n 2^(n-1) ... 1] 的行向量,然后求和,将二进制转化为十进制
function pop2=decodebinary(pop)
[px,py]=size(pop); %求pop行和列数
for i=1:py
pop1(:,i)=2.^(py-i).pop(:,i);
pop2=sum(pop1,2); %求pop1的每行之和
% 2.2.2 将二进制编码转化为十进制数(2)
% decodechrom.m函数的功能是将染色体(或二进制编码)转换为十进制,参数spoint表示待解码的二进制串的起始位置
% (对于多个变量而言,如有两个变量,采用20为表示,每个变量10为,则个变量从1开始,另一个变量从11开始。本例为1),
% 参数1ength表示所截取的长度(本例为10)。
%遗传算法子程序
%将二进制编码转换成十进制
pop1=pop(:,spoint:spoint+length-1);
pop2=decodebinary(pop1);
% 2.2.3 计算目标函数值
% calobjvalue.m函数的功能是实现目标函数的计算,其公式采用本文示例仿真,可根据不同优化问题予以修改。
%遗传算法子程序
%Name: calobjvalue.m
%实现目标函数的计算
temp1=decodechrom(pop,1,10); %将pop每行转化成十进制数
x=temp110/1023; %将二值域 中的数转化为变量域 的数
objvalue=10sin(5x)+7cos(4x); %计算目标函数值
% 2.3 计算个体的适应值
%遗传算法子程序
%Name:calfitvalue.m
%计算个体的适应值
function fitvalue=calfitvalue(objvalue)
global Cmin;
Cmin=0;
[px,py]=size(objvalue);
for i=1:px
if objvalue(i)+Cmin>0
temp=Cmin+objvalue(i);
else
temp=0.0;
fitvalue(i)=temp;
fitvalue=fitvalue';
% 2.4 选择
% 选择或作是决定哪些个体可以进入下一代。程序中采用轮盘选择法选择,这种方法较易实现。
% 根据方程 pi=fi/∑fi=fi/fsum ,选择步骤:
% 1) 在第 t 代,由(1)式计算 fsum 和 pi
% 2) 产生 {0,1} 的随机数 rand( .),求 s=rand( .)fsum
% 3) 求 ∑fi≥s 中最小的 k ,则第 k 个个体被选中
% 4) 进行 N 次2)、3)作,得到 N 个个体,成为第 t=t+1 代种群
%遗传算法子程序
%Name: selection.m
%选择
function [newpop]=selection(pop,fitvalue)
totalfit=sum(fitvalue); %求适应值之和
fitvalue=fitvalue/totalfit; %单个个体被选择的概率
fitvalue=cumsum(fitvalue); %如 fitvalue=[1 2 3 4],则 cumsum(fitvalue)=[1 3 6 10]
[px,py]=size(pop);
ms=sort(rand(px,1)); %从小到大排列
fitin=1;
newin=1;
while newin<=px
if(ms(newin)) newpop(newin)=pop(fitin); newin=newin+1; else fitin=fitin+1; % 2.5 交叉 % 交叉(crossover),群体中的每个个体之间都以一定的概率 pc 交叉,即两个个体从各自字符串的某一位置 % x1=0100110 % x2=1010001 % 从每个个体的第3位开始交叉,交又后得到2个新的子代个体y1,y2分别为: % y1=0100001 % y2=1010110 % 这样2个子代个体就分别具有了2个父代个体的某些特征。利用交又我们有可能由父代个体在子代组合成具有更高适合度的个体。 % 事实上交又是遗传算法区别于其它传统优化方法的主要特点之一。 %遗传算法子程序 %Name: crossover.m %交叉 function [newpop]=crossover(pop,pc) [px,py]=size(pop); newpop=ones(size(pop)); for i=1:2:px-1 if(rand cpoint=round(randpy); newpop(i,:)=[pop(i,1:cpoint),pop(i+1,cpoint+1:py)]; newpop(i+1,:)=[pop(i+1,1:cpoint),pop(i,cpoint+1:py)]; else newpop(i,:)=pop(i); % 变异(mutation),基因的突变普遍存在于生物的进化过程中。变异是指父代中的每个个体的每一位都以概率 pm 翻转,即由“1”变为“0”, % 或由“0”变为“1”。遗传算法的变异特性可以使求解过程随机地搜索到解可能存在的整个空间,因此可以在一定程度上求得全局解。 %遗传算法子程序 %Name: mutation.m %变异 function [newpop]=mutation(pop,pm) [px,py]=size(pop); newpop=ones(size(pop)); for i=1:px if(rand mpoint=round(randpy); if mpoint<=0 mpoint=1; newpop(i)=pop(i); if any(newpop(i,mpoint))==0 newpop(i,mpoint)=1; else newpop(i,mpoint)=0; else newpop(i)=pop(i); % 2.7 求出群体中得适应值及其个体 %遗传算法子程序 %Name: best.m %求出群体中适应值的值 function [bestindividual,bestfit]=best(pop,fitvalue) [px,py]=size(pop); bestindividual=pop(1,:); bestfit=fitvalue(1); for i=2:px if fitvalue(i)>bestfit bestindividual=pop(i,:); bestfit=fitvalue(i); % 2.8 主程序 %遗传算法主程序 %Name:genmain05.m clear clf popsize=20; %群体大小 chromlength=10; %字符串长度(个体长度) pc=0.6; %交叉概率 pm=0.001; %变异概率 pop=initpop(popsize,chromlength); %随机产生初始群体 for i=1:20 %20为迭代次数 [objvalue]=calobjvalue(pop); %计算目标函数 fitvalue=calfitvalue(objvalue); %计算群体中每个个体的适应度 [newpop]=selection(pop,fitvalue); % [newpop]=crossover(pop,pc); %交叉 [newpop]=mutation(pop,pc); %变异 [bestindividual,bestfit]=best(pop,fitvalue); %求出群体中适应值的个体及其适应值 y(i)=max(bestfit); n(i)=i; pop5=bestindividual; x(i)=decodechrom(pop5,1,chromlength)10/1023; pop=newpop; fplot('10sin(5x)+7cos(4x)',[0 10]) hold on plot(x,y,'r') hold off [z index]=max(y); %计算值及其位置 x5=x(index)%计算值对应的x值 y=z 【问题】求f(x)=x 10sin(5x) 7cos(4x)的值,其中0<=x<=9 【分析】选择二进制编码,种群中的个体数目为10,二进制编码长度为20,交叉概率为0.95,变异概率为0.08 【程序清单】 %编写目标函数 function[sol,eval]=fitness(sol,options) x=sol(1); eval=x 10sin(5x) 7cos(4x); %把上述函数存储为fitness.m文件并放在工作目录下 initPop=initializega(10,[0 9],'fitness');%生成初始种群,大小为10 [x endPop,bPop,trace]=ga([0 9],'fitness',[],initPop,[1e-6 1 1],'maxGenTerm',25,'normGeomSelect',... [0.08],['arithXover'],[2],'nonUnifMutation',[2 25 3]) %25次遗传迭代 运算借过为:x = 7.8562 24.8553(当x为7.8562时,f(x)取值24.8553) 遗传算法实例2 【问题】在-5<=Xi<=5,i=1,2区间内,求解 f(x1,x2)=-20exp(-0.2sqrt(0.5(x1.^2 x2.^2)))-exp(0.5(cos(2pix1) cos(2pix2))) 22.71282的最小值。 【分析】种群大小10,代数1000,变异率0.1,交叉率0.3 【程序清单】 %源函数的matlab代码 function [eval]=f(sol) numv=size(sol,2); %适应度函数的matlab代码 function [sol,eval]=fitness(sol,options) eval=f(x); eval=-eval; %遗传算法的matlab代码 [p,endPop,bestSols,trace]=ga(bounds,'fitness') 注:前两个文件存储为m文件并放在工作目录下,运行结果为 p = 0.0000 -0.0000 0.0055 大家可以直接绘出f(x)的图形来大概看看f(x)的最值是多少,也可是使用优化函数来验证。matlab命令行执行命令: fplot('x 10sin(5x) 7cos(4x)',[0,9]) evalops是传递给适应度函数的参数,opts是二进制编码的精度,termops是选择maxGenTerm结束函数时传递个maxGenTerm的参数,即遗传代数。xoverops是传递给交叉函数的参数。mutops是传递给变异函数的参数。 【问题】求f(x)=x+10sin(5x)+7cos(4x)的值,其中0<=x<=9 【分析】选择二进制编码,种群中的个体数目为10,二进制编码长度为20,交叉概率为0.95,变异概率为0.08 【程序清单】 %编写目标函数 function[sol,eval]=fitness(sol,options) x=sol(1); eval=x+10sin(5x)+7cos(4x); %把上述函数存储为fitness.m文件并放在工作目录下 initPop=initializega(10,[0 9],'fitness');%生成初始种群,大小为10 [x endPop,bPop,trace]=ga([0 9],'fitness',[],initPop,[1e-6 1 1],'maxGenTerm',25,'normGeomSelect',... [0.08],['arithXover'],[2],'nonUnifMutation',[2 25 3]) %25次遗传迭代 运算借过为:x = 7.8562 24.8553(当x为7.8562时,f(x)取值24.8553) 遗传算法实例2 【问题】在-5<=Xi<=5,i=1,2区间内,求解 f(x1,x2)=-20exp(-0.2sqrt(0.5(x1.^2+x2.^2)))-exp(0.5(cos(2pix1)+cos(2pix2)))+22.71282的最小值。 【分析】种群大小10,代数1000,变异率0.1,交叉率0.3 【程序清单】 %源函数的matlab代码 function [eval]=f(sol) numv=size(sol,2); eval=-20exp(-0.2sqrt(sum(x.^2)/numv)))-exp(sum(cos(2pix))/numv)+22.71282; %适应度函数的matlab代码 function [sol,eval]=fitness(sol,options) eval=f(x); eval=-eval; %遗传算法的matlab代码 [p,endPop,bestSols,trace]=ga(bounds,'fitness') 注:前两个文件存储为m文件并放在工作目录下,运行结果为 p = 0.0000 -0.0000 0.0055 大家可以直接绘出f(x)的图形来大概看看f(x)的最值是多少,也可是使用优化函数来验证。matlab命令行执行命令: fplot('x+10sin(5x)+7cos(4x)',[0,9]) evalops是传递给适应度函数的参数,opts是二进制编码的精度,termops是选择maxGenTerm结束函数时传递个maxGenTerm的参数,即遗传代数。xoverops是传递给交叉函数的参数。mutops是传递给变异函数的参数。 打字不易,如满意,望采纳。 遗传算法的基本步骤是:1、初始化 2、个体评价;3、选择运算;4、交叉运算; 5、变异运算,将变异算子作用于群体;6、终止条件判断。 2,遗传算法直接以适应度作为搜索信息,无需导数等其他辅助信息; 3,遗传算法使用多个点的搜索信息,具有隐含并行性; 4,它没有使用非确定性规则,而是DEAP中内置了计算拥挤距离的函数 tools.emo.assignCrowdingDist采用了概率搜索技术。 遗传算法(Genetic Algorithm)是一类借鉴生物界的进化规律(适者生存,优胜劣汰遗传机制)演化而来的随机化搜索方法。它是由美国的J.Holland1975年首先提出,其主要特点是直接对结构对象进行作,不存在求导和函数连续性的限定; 具有内在的隐并行性和更好的全局寻优能力;采用概率化的寻优方法,能自动获取和指导优化的搜索空间,自适应地调整搜索方向,不需要确定的规则。遗传算法的这些性质,已被人们广泛地应用于组合优化、机器学习、信号处理、自适应控制和人工生命等领域。 它是现代有关智能计算中的关键技术。 [读音][yí chuán] 部 首 辶 笔 画 12 五 行 木 繁 体 遗 五 笔 KHx=sol(1:numv);GP 释义词目:遗传 《二刻拍案惊奇》卷十八:“这迷而不悟,却是为何?只因制造之,其方未尝不是仙家的遗传。” 罗家伦 《是爱情还是苦痛》:“他说:‘我听得长辈说,女子总是靠丈夫的。’我好容易收来一点爱情,把他这一句遗传的话,又吓走了一大半。” 郁达夫 《出奔》:“结婚之后的 董婉珍 ,处处都流露了她的这一种自父祖遗传下来的小节的伶俐。” 陈学昭《工作着是美丽的》上卷二四:“在精明能干这一点上,她的三个孩子都得了母亲的优良遗传。” 目录 摘要 IAbstract II 引言 1章 基本遗传算法 21.1 遗传算法的产生及发展 31.2 基本原理 31.3 遗传算法的特点 31.4 基本遗传算法描述 51.5 遗传算法构造流程 6第二章 遗传算法的实现技术 62.1 编码方法 72.1.1 二进制编码 72.1.2 格雷码编码 72.1.3 符点数编码 82.1.4 参数编码 82.2 适应度函数 10 2.3 选择算子 10 2.4 交叉算子 10 2.4.1 单点交叉算子 10 2.4.2 双点交叉算子 11 2.4.3 均匀交叉算子 11 2.4.4 部分映射交叉 11 2.4.5 顺序交叉 12 2.5 变异算子 12 2.6 运行参数 12 2.7 约束条件的处理方法 13 2.8 遗传算法流程图 14 第三章 遗传算法在TSP上的应用 15 15 3.2 对TSP的遗传基因编码方法 16 3.3 针对TSP的遗传作算子 3.3.1 选择算子 3.3.1.1 选择 3.3.1.2 保存策略选择 3.3.2 交叉算子 20 20 3.3.2.2 部分映射交叉 21 3.3.3 变异算子 23 3.4 TSP的混和遗传算法 第四章 实例分析 27 4.1 27 4.2 测试结果 27 结果分析 27 摘要 TSP (Treling Salean Problem)旅行商问题是一类典型的NP完全问题,遗传算法是解决NP问题的一种较理想的方法。文章首先介绍了基本遗传算法的基本原理、特点及其基本实现技术;接着针对TSP 问题,论述了遗传算法在编码表示和遗传算子(包括选择算子、交叉算子变异算子这三种算子)等方面的应用情况,分别指出几种常用的编码方法的优点和缺点,并且结合TSP的运行实例详细分析了基本遗传算法的4个运行参数群体大小、遗传算法的终止进化代数、交叉概率、变异概率,对遗传算法的求解结果和求解效率的影响,经过多次的测试设定出了它们一组比较合理的取值。,简单说明了混合遗传算法在求解TSP问题中的应用并对遗传算法解决TSP问题的前景提出了展望。 :TSP 遗传算法 遗传算子 编码 @@@需要的话按我的名字找我吧 详谈改进的遗传算法求解柔性作业车间调度问题论文 0 引言 作业车间调度问题(Job-shop scheng problem,JSP)是研究生产线调度问题最常用的模型之一,也是实现先进制造和提高生产效率的基础和关键. 柔性作业车间调度问题( Flexible jobshopscheng problem,FJSP)是传统作业车间调度问题的扩展,在传统的作业车间调度问题中,每个工件的加工工序是确定的,每一道工序的加工机器和加工时间也是确定的,而在柔性作业车间调度问题中,每个工件的每一道工序可以在多个可选择的加工机器上进行加工,并且不同的加工机器所需要的加工时间是不同的,增加了调度的灵活性,比较符合生产的实际情况. 柔性作业车间调度问题已经被证明是更复杂的NP-Hard 问题,因而难以取得解. 目前,求解FJSP 的常用方法有搜索( TS),模拟退火(SA)和遗传算法(GA)等. 其中遗传算法以其作简单、鲁棒性强、搜索全局解速度快等特点,在生产调度领域得到了广泛的应用. 1 柔性作业车间调度模型设有n 个待加工工件J(J1,J2,…,Jn),在m台设备上加工M(M1,M2,…,Mm),每个工件Ji有Pi(Pi1,Pi2,…,Pin) 道工序,每道工序可在一台或多台设备上加工,同一道工序在不同设备上加工的时间可能不等,工序Pik的可选机器集为Mik(Mik 罬),每台设备的加工时间从0 开始,加工完所有工件的完成时间为ETMi . 本文以最小化完工时间为性能指标,其目标函数为:f(x) = min(max(ETMi)),1 ≤ i ≤ m模型需满足如下约束条件:(1)同一工件的工序加工顺序确定;(2)每道工序必须在它的上一道工序加工完成后才能开始加工;(3)每道工序只能选择一台设备进行作;(4)每台设备在同一时间只能加工一个工件的一道工序;(5)每道工序在设备上作时都不允许被中断;(6) 不同工件工序之间没有先后约束条件.一个包含3 个工件、5 台机器的FJSP 的问题. 2 算法的设计 (1) 基因编码 常用的遗传算法编码方案有二进制编码、格雷码编码、矩阵编码、自然数编码等,本文采用自然数编码,每条染色体表示一个可行解,同时采用双层编码,层编码为基于工件的工序编码,编码长度为所有工件工序之和,基因值代表工件号,基因值出现的次数代表该工件的工序总数,第二层编码为对应于层工件工序的机器编码,所以编码长度也为所有工件工序之和.染色体表示的工序顺序为(O31,O11,O12,O21,O22,O32,O13,O33),染色体表示的机器序列为(M2,M4,M2,M1,M4,M5,M3,M4). (2)产生初始种群 初始种群的优良对生物进化会产生很大的影响,本文对初始种群的机器选择进行了改进,首先随机生成初始种群的工序编码,工序编码生成后就要对应生成机器编码,每个工件工序在对应可选机器集中选择机器时,是以不同的概率的来选择不同的机器,机器加工时间短的以大概率被选择,相比之下,机器加工时间长的以小概率被选择,这样既保证了机器选择的随机性,也优化了初始种群. (3)适应度函数的确定 本文以最小化完工时间为目标函数,故选择全部工件完工时间作为评价种群优劣的标准,设n 个待加工工件在m(M1,M2,…,Mm) 台设备上加工,所有加工工件工序在设备上的完工时间为ETMi(i = 1,2,…,m),T = max(E遗传算法是一种可用于复杂系统优化的一种搜索算法,与传统的算法相比,具有以下4个特点:1,它是以决策变量的编码作为运算对象;TMi),则适应度函数fi = 1 /T,T 越小,则适应度越大,即个体越优. (4)选择 选择作的目的是为了保留优良个体,使他们可以遗传到下一代. 本文采用精英保留策略和法相结合的方法,对父代个体和子代个体进行选择时直接将个体和次优个体遗传到下一代,然后对剩余的个体采用法进行选择,选择出p - 2 个个体到下一代进行遗传作. 若种群规模为p,个体i 的适应度为fi,则个体i 被选择的概率pi为pi = fi /Σpk = 1fk即适应度越高的个体被选择的概率就越大. (5)交叉 交叉作是产生新个体的主要方法,提高全局搜索能力. 本文采用单点交叉方式,即随机产生一个交叉点,交换交叉点后的基因. 从种群中随机选择两个个体,交换两个个体工序编码的交叉点后面的基因,将交叉后工件多余的工序替换为其他工件缺失的工序;机器部分则按交叉前工件工序所选择的机器进行相应调整以保证其子代染色体的`合法性. (6)变异 变异作的目的是改变算法的局部搜索能力,有助于维持进化群体的多样性,防止过早陷入局部. 本文采用互换方式,即随机产生两个变异点,交换两点的基因值. 从种群中随机选择一个个体,对该个体的工序编码部分随机产生两个变异点,交换两点的基因值,同时将交换的基因位所对应的机器号也进行交换. 6 × 6(6 个工件,6 台机器) FJSP的加工工序,机器选择和加工时间矩阵表. 分别用标准遗传算法和本文提出的改进遗传算法对工件最小化完工时间进行优化计算,并分析优化计算结果. 遗传算法采用以下参数:种群规模为100,进化代数为100,交叉概率Pc = 0. 8,变异概率Pm =0. 1. 算法运行10 次,标准遗传算法的完工时间为20,收敛代数为75 代左右;改进遗传算法的完工时间为16,收敛代数为35 代左右. 改进遗传算法既缩短了工件完工时间,也加快了收敛代数. 从而验证了改进遗传算法的可行性 传统遗传算法在进行种群初始化时采用的大多是随机选择方式,而本文提出了一种新的种群初始化方法,提高了种群初始解的质量. 26对改进遗传算法进行了仿真实验,并将结果与标准遗传算法进行比较,结果表明了本算法的优越性和可行性. ; 适应度函数的选取直接影响到遗传算法的收敛速度以及能否找到解,因为遗传算法在进化搜索中基本不利用外部信息,仅以适应度函数为依据,利用种群每个个体的适应度来进行搜索。 因为适应度函数的复杂度是遗传算法复杂度的主要组成部分,所以适应度函数的设计应尽可能简单,使计算的时间复杂度最小。 遗传算法评价一个解的好坏不是取决于它的解的结构,而是取决于该解的适应度值。这正体现了遗传算法“优胜劣汰”的特点。遗传算法不需要适应度函数满足连续可微等条件,要求是针对输入可计算出能加以比较的非负结果。 相关function pop2=decodechrom(pop,spoint,length)内容解释 遗传算法是计算数学中用于解决化的搜索算法,是进化算法的一种。进化算法最初是借鉴了进化生物学中的一些现象而发展起来的,这些现象包括遗传、突变、自然选择以及杂交等。遗传算法通常实现方式为一种计算机模拟。 对于一个化问题,一定数量的候选解(称为个体)的抽象表示(称为染色体)的种群向更好的解进化。传统上,解用二进制表示(即0和1的串),但也可以用其他表示方法。 进化从完全随机个体的种群开始,之后一代一代发生。在每一代中,整个种群的适应度被评价,从当前种群中随机地选择多个个体(基于它们的适应度),通过自然选择和突变产生新的生命种群,该种群在算法的下一次迭代中成为当前种群。怎么用遗传算法求超材料
●适应度函数我有一个物理实验,有3个参数,需要找到解,我有一个想法是利用遗传算法找解。
遗传算法是由美国J. Holland 于1975 年提出的,是一种模拟自然进化过程的一种优化算法. 由于传统的遗传算法存在着较大的缺陷,国内外学者已从不同角度对其进行了改进,本文对传统遗传算法的初始种群进行了改进,以提高初始解的质量.遗传拼音
17C语言遗传算法在求解TSP问题 +源代码
% 2.6 变异详谈改进的遗传算法求解柔性作业车间调度问题论文
遗传算法中怎么构建适应度函数?
[x,fval] = ga(...)
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系 836084111@qq.com 删除。