算法分析与设计.docx
- 文档编号:10852363
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:43
- 大小:151.89KB
算法分析与设计.docx
《算法分析与设计.docx》由会员分享,可在线阅读,更多相关《算法分析与设计.docx(43页珍藏版)》请在冰豆网上搜索。
算法分析与设计
成绩
数学与物理科学学院
《算法分析与设计》课程考查论文
题目 遗传算法及其应用研究
专业 信息与计算科学
班级 08调查分析
学号
姓名
任课教师 刘
完成日期2011/05/23
摘要
遗传算法(GeneticAlgorithm,GA)是近年来迅速发展起来的一种全新的随机搜索与优化算法,其基本思想基于Darwin的进化论和Mendel的遗传学。
遗传算法的广泛应用和发展潜能使很多学者深入研究遗传算法,并出版了很多关于它的书籍。
本文讲述了遗传算法的含义、基本思路及实现过程,遗传算法的核心、基本性质、特点及其存在的问题,并通过遗传算法的特点举例,对于实际应用中的问题,也希望通过遗传算法的特点来解决。
如何有效的安排各零件的加工顺序将直接关系到生产效率,也是本文所要解决的问题之一。
本文提出了实现车间调度的遗传算法的设计方案,把遗传算法相结合,充分发挥遗传算法良好的全局搜索能力通过实验验证了基于遗传算法的作业车间调度方法显著提高了搜索效率。
通过VC仿真程序的模拟仿真,系统的运行结果满足了调度要求,进一步证明了遗传算法的有效性和实用性。
关键词:
遗传算法车间调度效率仿真
目录
一、遗传算法理论及实现技术4
1.1遗传算法简介4
1.2遗传算法参数设计4
1.3遗传算法基本流程5
1.4遗传算法基本操作设计6
二、遗传算法运行参数设计9
2.1种群大小M9
2.2交叉概率Pc10
2.3变异概率Pm10
2.4算法的终止条件10
三、车间调度问题简述10
3.1车间调度问题描述10
3.2车间调度问题的特点及分类12
四、遗传算法应用于车间调度问题13
4.1车间调度实例13
4.2程序运行结果13
参考文献14
附录14
一、遗传算法理论及实现技术
1.1遗传算法简介
遗传算法(GA)是J.Holland于1975年受生物进化论的启发而提出的,GA的提出一定程度上解决了传统的基于符号处理机制的人工智能方法在知识表示、信息处理和解决组合爆炸等方面所遇到的困难,其自组织、自适应、自学习和群体进化能力使其适合于大规模复杂优化问题。
GA是一种通用的优化算法,其编码技术和遗传操作比较简单,优化不受限制性条件的约束,而其最大的显著特点则是隐含并行性和全局解空间搜索。
目前,随着计算机技术的发展,GA越来越得到人们的重视,并在机器学习、模式识别、图像处理、神经网络、优化控制、组合优化、VLSI设计、遗传学等领域得到了成功运用,尤其在生产调度领域。
1.2遗传算法参数设计
通常,遗传算法的设计是按照以下步骤进行的:
(1)确定问题的编码方案。
由于遗传算法通常不直接作用于问题的解空间,而是利用解的某种编码表示来进行进化,因此选择合理的编码机制对算法质量和效率有很大的影响。
(2)确定适应度函数。
由于遗传算法通常基于适应度函数进行遗传操作,因此,合理的适应度值能够将各个体的优劣程度得以体现,并适应算法的进化过程。
(3)算法参数的选取。
通常包括种群数目、交叉概率、进化代数等。
(4)遗传算子的设计。
通常包括初始化、选择、交叉、变异和替换操作等。
(5)确定算法的终止条件。
根据所求问题的性质在优化质量和效率方面作合理均衡或侧重。
1.3遗传算法基本流程
标准遗传算法的主要步骤可描述如下:
步骤1:
随机产生初始种群,并评价各个体的适配值(fitnessvalue);
步骤2:
判断算法收敛准则是否满足。
若满足则输出搜索结果;否则执行一下步骤;
步骤3:
根据适配值大小以一定的方式执行复制操作来从种群中选取两个个体;
步骤4:
若交叉概率Pc>ξ,则对选中个体执行交叉操作来产生两个临时个体;否则将选中父代个体作为临时个体;
步骤5:
按变异概率Pm对临时个体执行变异操作产生两个新个体;
步骤6:
返回步骤2。
标准遗传算法的流程图描述,如下图所示:
N
图1.1标准遗传算法流程框图
1.4遗传算法基本操作设计
算法的基本操作是算法的主体,也是在算法寻找最优解过程中执行操作所要遵守的基本准则,在程序设计中也是主要的工作,基本操作设计的正确性是算法可以找到局部最优解或者全局最优解的基本前提和保证,基本操作设计的合理性是程序设计顺利实现和减轻调试工作的基础,所以对于基本操作的设计也是整体方案设计的主体。
Step1:
编码设计
遗传算法的特点之一是不对求解问题的决策变量直接进行操作,而是通过对个体编码进行交叉与变异的进化运算过程,不断搜索出适应度较高的新个体,最终寻求出问题的最优解或近似最优解。
遗传算法不能直接处理问题的空间参数,必须把他们转换成遗传算法空间的由基因一定结构组成的染色体或个体,这一转换操作称为编码。
应用遗传算法计算时,遇到的首要问题就是编码,它也可以说是计算的一个关键步骤。
编码方案除了决定个体的染色体排列形式,还决定了个体从搜索空间的基因型转换到解空间的表现型时的解码方法。
编码方法也影响到交叉算子、变异算子等遗传算子的运算方法。
由此可见,编码方法在很大程度上决定了如何进行群体的遗传进化运算以及遗传进化运算的效率。
一个好的编码方法,有可能使遗传运算和操作过程简单的执行。
而一个差的编码方法,一方面影响运算精度和储存量,另一方面可能使交叉及变异等运算难以实现。
如果编码方法和交叉处理不当,在遗传算法中因交叉而生成的个体有可能成为无用解或无效解。
编码时常考虑以下三个问题:
(1)完备性。
对问题空间的任何一点有表达空间的一个点与之对应,即问题空间的所有可能解都能表示为所设计的基因编码形式。
(2)健全性。
对于表达空间中的任何一个点都有问题空间中的一个点与之对应,即任何一个基因编码都对应于一个可行解。
(3)非冗余性。
问题空间和表达空间一一对应。
编码时也要注意一定的原则,具体如下:
编码原则一:
有意义基因块编码规则。
应使用能易于产生于所求问题相关的低阶、短定义长度模式的变码方案。
该编码原则理解为应使用易于生成适应度较高的个体编码方案。
编码原则二:
最小字符集编码原则。
所设计的编码方案应采用最小字符集,以使问题得到自然的表示或描述。
常用的编码方法有二进制编码、十进制编码。
以下简要介绍各种编码方法的优缺点,并选出一种符合本次设计的编码方法。
1)二进制编码
所谓的二进制编码,就是将优化的个体一系列的二进制符号0,1,所组成的二进制的符号集合{0,1},也就是说,把问题空间的参数表示为基于字符集合{0,1}构成的字符串。
每个的个体的表示成若干个0,1。
这样的好处是:
(1)编码、解码操作简单易行;
(2)交叉、变异等遗传操作简单易行;
(3)符合最小字符集编码原则;
(4)便于利用模式定理对算法进行理论分析。
2)十进制编码
相比于二进制编码。
十进制的编码方式更接近人的思考方式,更加直观,对于优化的结果表达清楚,而且字符串的长度要小的多,对于其他的算法的操作更加易于寻址。
这里我们选择十进制编码作为我们的编码方式,原因有:
(1)十进制更加符合人的思维习惯,可以给程序的调试工作减少麻烦;
(2)可以不用解码的工作。
正因为十进制的编码方式符合人的思考习惯,就可以把由程序输出的优化结果不做任何的转化呈现在屏幕上,这样既增加了结果的可读性又可以很好对优化的结果进行理论分析;
(3)在编码的过程中就可以解决工序互不相同的问题,可以减少程序的工作量。
对于本论文的目标来说,操作的对象是由工序组成的字符串,而对于一组工件来说,其某个工件的某个工序是固定的,也是唯一的。
也就是说这样的十进制的编码设计可以在编码设计的阶段就解决了一个实际的生产约束,这样就可以避免在进行剔除重复元素的程序段,给程序的设计带来了方便。
选择了十进制编码后,还有结合本次设计的具体问题找到一种复合本次设计的编码。
车间调度问题可归结为直接编码和间接编码两种。
直接编码将各调度作为状态,通过状态演化达到寻址目的,主要包括基于操作的编码、基于工件的编码、基于工件对关系的编码、基于完成时间的编码等。
间接编码将一组工件的分配处理规则作为状态,算法优化的结果是一组最佳的分配规则序列,再由分配规则序列构造调度,主要包括基于优先权规则的编码、基于先后表的编码基于机器的编码等。
Step2:
适应度函数设计
在遗传算法中用适应度评估个体或解的优劣,这个评估个体适应度的函数称为适应度函数。
适应度高的个体遗传到下一代的概率较大;而适应度低的个体遗传到下一代的概率相对小一些。
因此,适应度函数的选取很重要,直接影响到遗传算法的收敛速度以及能否找到最优解。
一般而言,适应度函数是由目标函数变换而成的。
适应度函数设计主要满足以下条件:
(1)单值、连续、非负最大化;
(2)合理、一致性。
要求适应度函数反映对应解的优劣程度,该条件往往很难衡量;
(3)计算量小。
适应度函数设计应尽可能简单,这样可以减少计算时间和空间上的复杂性,降低计算成本;
(4)通用性强。
适应度的设计对于某类具体问题,应尽可能通用,最好无需使用者改变适应度函数中的参数。
从目前而言,这个条件应该是不属于强要求。
以下是由目标函数转换到适应度函数一种常用方法:
若目标函数为最小化问题,适应度函数可表示为:
C
0,C+f(x)
0
在上式中,f(x)为目标函数。
若目标函数为最大化问题适应度函数可表示为:
C
0,C-f(x)
0
在上式中,f(x)为目标函数。
Step3:
遗传算子设计
遗传算子中包括以下三个算子:
选择算子、交叉算子和变异算子,它们构成了遗传算法具备强大搜索能力的核心。
下面针对本次设计对这三种算子分别设计。
1)选择算子设计
适应度比例方法是目前遗传算法中最为基本也是最常用的选择方法。
它也叫赌盘轮或蒙特卡罗选择。
在该方法中各个个体的选择概率和其适应度值成正比。
其具体执行过程如下:
(1)计算出群体中所有个体的适应度的总和
;
(2)计算出每个个体相应的适应度的大小,即计算出比值
,它即为各个个体在选择操作中被选中的概率;
(3)最后再使用模拟轮盘赌操作,即产生0到1之间的随机数,来确定各个个体被选中的次数。
2)交叉算子设计
交叉是基本遗传算法重要的操作,它是由旧的个体产生新的个体的过程。
交叉算子主要包括单点交叉和两点交叉两种情况,现分别阐述如下:
(1)单点交叉
在个体串中随机设定一个交叉点,实行交叉时,该点前或后的两个个体的部分结构进行交换,并生成两个新的个体,例如下图3.4示(空格为交叉位置)。
父体A1001111
1001000子体
父体B0011000
0011111子体
图1.2单点交叉
(2)两点交叉
两点交叉的操作与单点交叉类似,只是设置了两个交叉点(依然是随机设定)两个交叉点之间的码串相互交换例如下图3.5示(空格为交叉位置)。
父体A1001111
1011011子体
父体B0011000
0001100子体
图1.3两点交叉
本次设计选用单点交叉。
3)变异算子
变异算子的基本内容是对群体中的个体串的某些基因座上的基因值作变动。
交叉之后子代经历的变异,实际上是子代基因按小概率扰动产生的变化,依据个体编码表示方法的不同,可以有以下的算法:
基本变异算子是指对群体中的个体码串随机挑选一个或多个基因并对这些基因座的基因值作变动(依变异概率作变动),二值码串中基本变异操作如图1.4所示。
变异前10011111101011变异后
图1.4两点交叉
二、遗传算法运行参数设计
2.1种群大小M
群体大小M表示群体中所含个体的数量。
当M取值较小时,可提高遗传算法的运行速度,但降低了群体的多样性,有可能会引起遗传算法的早熟现象;而当M取值较大时,又会使得遗传算法的运行效率降低。
经过参考文献,本文的种群大小M取值范围是20
100。
2.2交叉概率Pc
交叉概率Pc用于控制交叉操作的频度。
较大的交叉概率可增强遗传算法开辟新的搜索区域的能力,但群体中优良模式的个体会遭到破坏;若交叉概率取值太小,交叉产生新个体的速度较慢,从而会使搜索停滞不前。
经过参考文献,本文的交叉概率Pc取值范围是0.4
0.99之间。
2.3变异概率Pm
变异概率Pm直接影响到算法的收敛性和最终解的性能。
若变异概率取较大的值,会使得算法能够不断地搜索新的解空间,增加模式的多样性,但较大的变异概率会影响算法的收敛性;若取值太小,则变异操作产生的新个体的能力和抑制早熟现象的能力就会很差。
经过参考文献,本文中变异概率Pm的取值范围是0.0001
0.1。
2.4算法的终止条件
给定一个最大的遗传进化代数,当达到此值时,就停止运行,并将当前群体中的最佳个体作为所求问题的最优解输出。
经过参考文献本文的取值为100
1000。
三、车间调度问题简述
生产调度,即对生产过程进行作业计划,作为一个关键模块,是整个先进生产制造系统实现管理技术、运筹技术、自动化与计算机技术发展的核心。
有效的调度方法和优化技术的研究与应用,是实现先进制造和提高生产效益的基础和关键。
改善生产调度方案,可大大提高生产效益和资源利用率,进而增强企业的竞争能力。
生产调度的研究主要可分为建模和调度算法设计两方面,它是一个交叉性研究领域,涉及运筹学、数学、计算机工程、控制工程、工业工程等多个学科。
其中,建模主要研究调度模型、调度规则、目标函数等内数;本章主要介绍调度问题的描述、调度指标、调度表示、调度分类和特调、车间调度研究方法等等基本概念,为后续章节遗传算法设计作基础。
3.1车间调度问题描述
调度问题通常指对生产过程的作业计划,譬如工件在机器上的加工顺序、生产批量的划分等。
就生产方式而言,调度问题可分为开环车间(openshop)型和闭环车间(closedshop)型。
开环调度问题,也称加工排序问题,它本质上只研究工件的加工顺序,即订单所要求的产品在所有机器上的加工排序,其中订单均来源于顾客,不考虑库存的设立。
闭环调度问题除研究工件的加工顺序外,还涉及各产品批量大小的设置,即在满足生产工艺约束条件下寻找一个调度策略,使得所确定的生产批量和相应的加工顺序下的生产性能指标最优,其中顾客需求的产品均有库存提供,生产任务一般只有产品存储策略来决定。
显然,闭环调度问题较开环调度问题要复杂。
鉴于批量大小与排序间的偶合性,寻求批量大小和排序的有效同时处理方案很困难,目前处理闭环问题的常用近似方法是,首先确定量大小,然后确定加工顺序。
一般车间调度问题可以描述为n个工件在m台机器上加工,一个工件分为k道工序,每道可以在若干台机器上加工。
每一台机器在每个时间只能加工某个工件的某道工序,只能在上道工序加工完成才能开始下一道工序的加工,前者称为占用约束,后者称为顺序约束。
对于m台机器(machine){M1,….,Mm}对n个工件(job){J1,…,Jn}的加工过程,所谓调度就是分配个工件在各机器上的加工时间。
调度通常用甘特图(Ganttchart)表示,图2.1为4个工件、3台机器的面向机器的甘特图,而图2.2则是相应的面向工件的甘特图。
图2.14个工件、3台机器的面向机器的甘特图
图2.24个工件、3台机器的面向工件的甘特图
车间调度问题必须考虑加工工艺方面的影响,以下对加工工艺方面的约束作简单介绍。
(1)每道工序在固定的机床上加工。
(2)对于某一个工件,其后序工序没开始加工之前,其前边的工序不能开始加工。
(3)每道工序一旦开始就不能停止。
(4)同一时刻,每台机床上只能加工一道工序。
(5)对于一台机床上的第n道工序没开始加工或每加工完成之前,则该机床上的第n+1道工序不能开始加工。
(6)每一道工序要有明确的机床加工。
(7)每个工件的第一道工序在第一台机床上加工,第二道工序在第二台机床上加工,第三道工序在第三台机床上加工。
这种约束符合现行的加工装配型车间的准用机床工序集中的原则,以及流水线操作的要求,可以在一定程度上提高生产效率。
3.2车间调度问题的特点及分类
主要特点有:
1.复杂车间中机器、工件、缓存搬运系统之间关系复杂,建模、计算,相互影响,又相互作用。
每个工件之间又要考虑它的加工时间、完成时间以及安装时间和操作顺序等,因而相当复杂,调度问题往往是通过等式或不等式等约束条件来计算的。
随着问题规模的加大,计算量也急剧加大,所以调度问题往往没有精确的解,通常是在解答过程中寻求其最优解;
2.动态随机性调度中存在很多随机性和不确定性。
如工件的交货期变更,工件的加工完成时间,工件到达时间。
另外一些突发事件也增加的调度的难度和随机性。
如机器故障、作业交货期的变更等;
3.多约束性调度中受到很多约束条件的限制。
如缓存容量、资源数量、工件到期时间与操作顺序等。
此外,还有人为的附加因素,如机器负荷平衡等等约束条件;
4.多目标性调度的目标很多,目标之间往往又相互冲突。
如基于作业交货期的目标、基于作业完成时间的目标、基于生产成本的目标等。
按照不同的分类标准,可分为6种类型:
(1)开环车间和闭环车间;
(2)单台处理机、多台并行机、Jobshop和Flowshop;
(3)基于调度费用和调度性能的指标;
(4)确定性调度、随机性调度;
(5)静态调度、动态实时调度;
(6)有序加工,无序加工。
现代车间调度类型往往是Jobshop,Flowshop型。
3.3Jobshop和Flowshop调度问题
JobShop和FlowShop调度问题是具有特殊工件特性和加工环境的最典型和最重要的调度问题,通常是特殊的开环调度问题。
JobShop和FlowShop调度问题研究n个工件在m台机器上的加工过程,Oij表示第i个工件在第j台机器上的操作,相应的操作时间pij为已知,事先给定各个工件在各机器上的加工次序(称为技术约束条件),要求确定与技术约束条件相容的各机器上所有工件的加工次序,使加工性能指标达到最优。
若各工件的技术约束条件相同,一个JobShop调度问题就转化为较为简单的FlowShop调度问题。
进而,若各机器上各工件的加工次序也相同,则问题可以进一步转化为置换FlowShop调度问题。
在典型的JobShop调度问题中,除技术约束外,通常还假定以下条件:
(1)各工件经过其准备时间后即可开始加工;
(2)每一时刻每台机器只能加工一个工件,且每个工件只能被一台机器所加工,同时加工过程为不间断,整个加工过程中机器均有效。
(3)整个加工过程中,每个工件不能在同一台机器上加工多次;
(4)各工件必须按照工艺路线指定的次序在机器上加工。
(5)不考虑工件加工的优先权;
(6)操作允许等待,即前一个操作为完成,则后面的操作需要等待;
(7)所有机器处理的加工类型均不同;
(8)除非特殊说明,工件的加工时间事先给定,且在整个加工过程中保持不变;
(9)除非特殊说明,工件加工时间内包含加工设置时间;
(10)除非特殊说明,缓冲区容量无限大。
四、遗传算法应用于车间调度问题
4.1车间调度实例
三种工种,工种1(GZ1)的工件数是2,有3道工序;工种2(GZ2)的工件数是3,有2道工序;工种3(GZ3)的工件数是2,有2道工序。
分析总的工序,调度,总的时间。
4.2程序运行结果
运行结果如下:
参考文献
[1]严蔚敏,吴伟民.数据结构(c语言版)[M].北京:
清华大学出版社,2009.
[2]谭浩强.C++面向对象程序设计[M].北京:
清华大学出版社,2006.
[3]王晓东.计算机算法设计与分析(第3版)[M].北京:
电子工业出版社,2007.5
附录
#include"stdlib.h"
#include"stdio.h"
#include"time.h"
#definePARA1.1
#defineCYNUM10
typedefstruct{
charGZname[5];//工种的名称
intGXnum;//工序数
intGJnum;//工件数
}GZ;//工种
typedefstruct{
inttime;//每个工序所用的时间
intmachine;//每个工序所用的机器
}GX;//工序
structJCNode//定义机床任务队列的节点
{
inttasknum,lasttime,*tasklist;
structJCNode*next;
}list,*plist;
intgetGXnum(GZ*gz)
{//返回某个工种的工序数
return(gz->GXnum);
}
intgetGJnum(GZ*gz)
{//返回某个工种的工件数
return(gz->GJnum);}
intlocation(int*pDad,intpos,int*pMum)
{//寻找pDad里pos位上的基因在pMum的位置
inti,j,k=0;
int*p;
i=*(pDad+pos);
for(j=0;j<=pos;j++)
if(*(pDad+j)==i)
k++;
p=pMum;
while(k!
=0)
if(*(pMum++)==i)
k--;
return(pMum-p-1);
}
voidcrossover(floatcrossoverrate,int*pDad,int*pMum,intGXTnum)
{//杂交
intx,y,t,i,j,k,min;
floatiscross;
int*p,*q;
//求杂交的位置
x=rand()%GXTnum;
y=rand()%GXTnum;
if(x>y)
{
t=x;x=y;y=t;}
iscross=(float)(rand()%100/100.0);
if(iscross { q=(int*)malloc(sizeof(int)*(y-x+1)); p=q; for(i=x;i<=y;i++) { *(p++)=location(pDad,i,pMum);} for(i=0;i { min=*(q+i); k=i; for(j=i+1;j { if(min>*(q+j)) { min=*(q+j);k=j; } } t=*(q+i);*(q+i)=*(q+k);*(q+k)=t; } for(i=x;i<=y;i++) {t=*(pDad+i); j=*(q++); *(pDad+i)=*(pMum+j); *(pMum+j)=t; } } } intGetGenetime(int*pchromo,inti,GZ*pGZ,GX*pGX,intGZnum) { intj,k=0,t,x,sum; x=*(pchromo+i); for(j=0;j x=x-(pGZ+j)->GJnum; if(x<=0) break; } t=0; x=*(pchromo+i); for(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 分析 设计