【车间调度】基于matlab免疫遗传算法求解多目标生产调度问题【含Matlab源码 710期】

举报
海神之光 发表于 2022/05/29 02:53:14 2022/05/29
【摘要】 一、生产调度简介 1 车间调度定义 车间调度是指给定一个加工任务,根据已有的生产条件,对有限的系统资源进行分配,对产品的加工步骤进行安排,使得某项性能指标最优。在实际生产过程中,所涉及的约束条件主要有:...

一、生产调度简介

1 车间调度定义
车间调度是指给定一个加工任务,根据已有的生产条件,对有限的系统资源进行分配,对产品的加工步骤进行安排,使得某项性能指标最优。在实际生产过程中,所涉及的约束条件主要有:机器的加工能力,机器的数量,加工的产品数量,产品的加工顺序,产品的交货时间,生产原料的数量,成本限制,机器故障,产品投产期等。考虑的性能指标主要有:产品交货时间最短,加工时间最短,生产周期最短,成本最少,设备利用率最高等,实际的生产过程一般要平衡多个性能指标[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小时。
M5加工O13消耗8小时,工件J2加工时间20+8=28小时。
总的完工时间就是max(22,28)=28小时。

2 柔性作业车间调度
柔性作业车间带调度实例(参考自高亮老师论文
《改进遗传算法求解柔性作业车间调度问题》——机械工程学报)
在这里插入图片描述
相比于传统作业车间调度,柔性作业车间调度放宽了对加工机器的约束,更符合现实生产情况,每个工序可选加工机器变成了多个,可以由多个加工机器中的一个加工。比如上表中的实例,J1的O12工序可以选择M2和M4加工,加工时间分别是8小时和4小时,但是并不一定选择M4加工,最后得出来的总的完工时间就更短,所以,需要调度算法求解优化。

相比于传统作业车间,柔性车间作业调度的调度任务不仅要确定工序的加工顺序,而且需要确定每道工序的机器分配。比如,确定了O21->O22->O11->O23->O12->O13的加工顺序,我们并不能相应工序的加工机器,所以还应该确定对应的[M1、M3、M5]->[M1、M2、M3]->[M1、M2、M3、M4、M5]->[M2、M3、M4、M5]->[M2、M4]->[M1、M3、M4、M5]的机器组合。调度的目的还是总的完工时间最短(也可以是其他目标,比如机器最大负荷最短、总的机器负荷最短)

二、免疫算法简介

1引言
“Immune”(免疫)一词是从拉丁文衍生而来的。很早以前,人们就注意到传染病患者痊愈后,对该病会有不同程度的免疫力。在医学上,免疫是指机体接触抗原性异物的一种生理反应。1958年澳大利亚学者Burnet率先提出了与免疫算法(Immune Algorithm, I A) 相关的理论――克隆选择原理[1] 。1973年Jer ne提出免疫系统的模型[2] , 他基于Burnet的克隆选择学说, 开创了独特型网络理论, 给出了免疫系统的数学框架,并采用微分方程建模来仿真淋巴细胞的动态变化。
1986年Farm al等人基于免疫网络学说理论构造出的免疫系统的动态模型,展示了免疫系统与其他人工智能方法相结合的可能性,开创了免疫系统研究的先河。他们先利用一组随机产生的微分方程建立起
人工免疫系统,再通过采用适应度阈值过滤的方法去掉方程组中那些不合适的微分方程,对保留下来的微分方程则采用交叉、变异、逆转等遗传操作产生新的微分方程,经过不断的迭代计算,直到找到最佳的一组微分方程为止。
从此以后,对免疫算法的研究在国际上引起越来越多学者的兴趣。几十年来,与之相关的研究成果已经涉及非线性最优化、组合优化、控制工程、机器人、故障诊断、图像处理等诸多领域[3-6].免疫算法是模仿生物免疫机制,结合基因的进化机理,人工构造出的一种新型智能优化算法。它具有一般免疫系统的特征,采用群体搜索策略,通过迭代计算,最终以较大的概率得到问题的最优解。相比较于其他算法,免疫算法利用自身产生多样性和维持机制的特点,保证了种群的多样性,克服了一般寻优过程(特别是多峰值的寻优过程)中不可避免的“早熟”问题,可以求得全局最优解。免疫算法具有自适应性、随机性、并行性、全局收敛性、种群多样性等优点。

2 免疫算法理论
生物免疫系统是一个复杂的自适应系统。免疫系统能够识别出病原体,具有学习、记忆和模式识别能力,因此可以借鉴其信息处理机制来解决科学和工程问题。免疫算法正是基于生物免疫系统识别外部
病原体并产生抗体对抗病原体的学习机制而提出的,由此诞生了基于免疫原理的智能优化方法研究这一新的研究方向。

2.1生物免疫系统
传统免疫是指机体抗感染的防御能力,而现代免疫则指机体免疫系统识别和排除抗原性异物,从而维持机体生理平衡和稳定的功能。免疫是机体的一种生理反应,当病原体(即抗原)进入人体时,这些抗原将刺激免疫细胞(淋巴B细胞、T细胞)产生一种抵抗该病原生物的特殊蛋白质一一抗体。抗体能将该病原生物消灭,并在将病原生物消灭之后,仍存留在人体内。当同样的病原生物再次侵入人体时,该
病原生物就会很快地被体内存留的抗体消灭[7].
免疫学相关概念
免疫
免疫是指机体对自身和异体识别与响应过程中产生的生物学效应的总和,正常情况下是一种维持机体循环稳定的生理性功能。生物机体识别异体抗原,对其产生免疫响应并清除;机体对自身抗原不产生
免疫响应。
抗原
抗原是一种能够刺激机体产生免疫应答并能与应答产物结合的物质。它不是免疫系统的有机组成部分,但它是启动免疫应答的始动因素。
抗体
抗体是一种能够进行特异识别和清除抗原的免疫分子,其中具有抗细菌和抗毒素免疫功能的球蛋白物质,故抗体也称免疫球蛋白分子,它是由B细胞分化成的浆细胞所产生的。
T细胞和B细胞
T细胞和B细胞是淋巴细胞的主要组成部分。B细胞受到抗原刺激后,可增殖分化为大量浆细胞,而浆细胞具有合成和分泌抗体的功能。但是,B细胞不能识别大多数抗原,必须借助能识别抗原的辅助性
T细胞来辅助B细胞活化,产生抗体。
生物免疫系统机理
生物免疫系统是由免疫分子、免疫组织和免疫细胞组成的复杂系统。这些组成免疫系统的组织和器官分布在人体各处,用来完成各种免疫防卫功能,它们就是人们熟知的淋巴器官和淋巴组织。
免疫识别
免疫识别是免疫系统的主要功能,识别的本质是区分“自己”和“非己”。免疫识别是通过淋巴细胞上的抗原受体与抗原的结合来实现的。
免疫学习
免疫识别过程同时也是一个学习的过程,学习的结果是免疫细胞的个体亲和度提高、群体规模扩大,并且最优个体以免疫记忆的形式得到保存。
免疫记忆
当免疫系统初次遇到一种抗原时,淋巴细胞需要一定的时间进行调整以更好地识别抗原,并在识别结束后以最优抗体的形式保留对该抗原的记忆信息。而当免疫系统再次遇到相同或者结构相似的抗原
时,在联想记忆的作用下,其应答速度大大提高。
克隆选择
免疫应答和免疫细胞的增殖在一个特定的匹配阈值之上发生。当淋巴细胞实现对抗原的识别,B细胞被激活并增殖复制产生克隆B细胞,随后克隆细胞经历变异过程,产生对抗原具有特异性的抗体。
个体多样性
根据免疫学知识,免疫系统有100多种不同的蛋白质,但外部潜在的抗原和待识别的模式种类有1000多种。要实现数量级远远大于自身的抗原识别,需要有效的多样性个体产生机制。抗体多样性的生物
机制主要包括免疫受体库的组合式重整、体细胞高频突变以及基因转换等。
分布式和自适应性
免疫系统的分布式特性首先取决于病原的分布式特性,即病原是分散在机体内部的。由于免疫应答机制是通过局部细胞的交互作用而不存在集中控制,所以免疫系统的分布式进一步增强了其自适应特
性。所有这些免疫系统的重要信息处理特点为信息和计算领域的应用提供了有力的支撑。

2.2免疫算法概念
免疫算法是受生物免疫系统的启发而推出的一种新型的智能搜索算法。它是一种确定性和随机性选择相结合并具有“勘探”与“开采”能力的启发式随机搜索算法。免疫算法将优化问题中待优化的问题对应免疫应答中的抗原,可行解对应抗体(B细胞),可行解质量对应免疫细胞与抗原的亲和度。如此则可以将优化问题的寻优过程与生物免疫系统识别抗原并实现抗体进化的过程对应起来,将生物免疫应答中的进化过程抽象为数学上的进化寻优过程,形成一种智能优化算法。
免疫算法是对生物免疫系统机理抽象而得的,算法中的许多概念和算子与免疫系统中的概念和免疫机理存在着对应关系。免疫算法与生物免疫系统概念的对应关系如表1所示。由于抗体是由B细胞产生
的,在免疫算法中对抗体和B细胞不做区分,都对应为优化问题的可行解。
表1免疫算法与生物免疫系统概念的对应关系
在这里插入图片描述
根据上述的对应关系,模拟生物免疫应答的过程形成了用于优化计算的免疫算法。算法主要包含以下几大模块:
(1)抗原识别与初始抗体产生。根据待优化问题的特点设计合适的抗体编码规则,并在此编码规则下利用问题的先验知识产生初始抗体种群。
(2)抗体评价。对抗体的质量进行评价,评价准则主要为抗体亲和度和个体浓度,评价得出的优质抗体将进行进化免疫操作,劣质抗体将会被更新。
(3)免疫操作。利用免疫选择、克隆、变异、克隆抑制、种群刷新等算子模拟生物免疫应答中的各种免疫操作,形成基于生物免疫系统克隆选择原理的进化规则和方法,实现对各种最优化问题的寻优搜
索。

2.3免疫算法的特点
免疫算法是受免疫学启发,模拟生物免疫系统功能和原理来解决复杂问题的自适应智能系统,它保留了生物免疫系统所具有的若干特点[8],包括:
(1)全局搜索能力。模仿免疫应答过程提出的免疫算法是一种具有全局搜索能力的优化算法,免疫算法在对优质抗体邻域进行局部搜索的同时利用变异算子和种群刷新算子不断产生新个体,探索可行解
区间的新区域,保证算法在完整的可行解区间进行搜索,具有全局收敛性能。
(2)多样性保持机制。免疫算法借鉴了生物免疫系统的多样性保持机制,对抗体进行浓度计算,并将浓度计算的结果作为评价抗体个体优劣的一个重要标准:它使浓度高的抗体被抑制,保证抗体种群具有很好的多样性,这也是保证算法全局收敛性能的一个重要方面。
(3)鲁棒性强。基于生物免疫机理的免疫算法不针对特定问题,而且不强调算法参数设置和初始解的质量,利用其启发式的智能搜索机制,即使起步于劣质解种群,最终也可以搜索到问题的全局最优解,对问题和初始解的依赖性不强,具有很强的适应性和鲁棒性。
(4)并行分布式搜索机制。免疫算法不需要集中控制,可以实现并行处理。而且,免疫算法的优化进程是一种多进程的并行优化,在探求问题最优解的同时可以得到问题的多个次优解,即除找到问题的最佳解决方案外,还会得到若干较好的备选方案,尤其适合于多模态的优化问题。

2.4免疫算法算子
与遗传算法等其他智能优化算法类似,免疫算法的进化寻优过程也是通过算子来实现的。免疫算法的算子包括:亲和度评价算子、抗体浓度评价算子、激励度计算算子、免疫选择算子、克隆算子、变异
算子、克隆抑制算子和种群刷新算子等[9].由于算法的编码方式可能为实数编码、离散编码等,不同编码方式下的算法算子也会有所不同。
亲和度评价算子
亲和度表征免疫细胞与抗原的结合强度,与遗传算法中的适应度类似。亲和度评价算子通常是一个函数aff(x) :SER, 其中S为问题的可行解区间,R为实数域。函数的输入为一个抗体个体(可行解),输出即为亲和度评价结果。亲和度的评价与问题具体相关,针对不同的优化问题,应该在理解问题实质的前提下,根据问题的特点定义亲和度评价函数。通常函数优化问题可以用函数值或对函数值的简单处理(如取倒数、相反数等)作为亲和度评价,而对于组合优化问题或应用中更为复杂的优化问题,则需要具体问题具体分析。
抗体浓度评价算子
抗体浓度表征抗体种群的多样性好坏。抗体浓度过高意味着种群中非常类似的个体大量存在,则寻优搜索会集中于可行解区间的一个区域,不利于全局优化。因此优化算法中应对浓度过高的个体进行抑
制,保证个体的多样性。
抗体浓度通常定义为:
在这里插入图片描述
在这里插入图片描述
免疫选择算子
免疫选择算子根据抗体的激励度确定选择哪些抗体进入克隆选择操作。在抗体群中激励度高的抗体个体具有更好的质量,更有可能被选中进行克隆选择操作,在搜索空间中更有搜索价值。
克隆算子
在这里插入图片描述
离散编码算法变异算子
离散编码算法以二进制编码为主,其变异策略是从变异源抗体串中随机选取几位元,改变位元的取值(取反),使其落在离散空间变异源的邻域。
克隆抑制算子
克隆抑制算子用于对经过变异后的克隆体进行再选择,抑制亲和度低的抗体,保留亲和度高的抗体进入新的抗体种群。在克隆抑制的过程中,克隆算子操作的源抗体与克隆体经变异算子作用后得到的临
时抗体群共同组成一个集合,克隆抑制操作将保留此集合中亲和度最高的抗体,抑制其他抗体。
由于克隆变异算子操作的源抗体是种群中的优质抗体,而克隆抑制算子操作的临时抗体集合中又包含了父代的源抗体,因此在免疫算法的算子操作中隐含了最优个体保留机制。
种群刷新算子
种群刷新算子用于对种群中激励度较低的抗体进行刷新,从抗体种群中删除这些抗体并以随机生成的新抗体替代,有利于保持抗体的多样性,实现全局搜索,探索新的可行解空间区域。

3免疫算法种类
3.1克隆选择算法
Castro提出了基于免疫系统的克隆选择理论的克隆选择算法[10] ,该算法是模拟免疫系统学习过程的进化算法。免疫应答产生抗体是免疫系统的学习过程,抗原被一些与之匹配的B细胞识别,这些B细胞分裂,产生的子B细胞在母细胞的基础上发生变化,以寻求与抗原匹配更好的B细胞,与抗原匹配更好的子B细胞再分裂……如此循环往复,最后找到与抗原完全匹配的B细胞,B细胞变成浆细胞产生抗体,这一过程就是克隆选择过程,克隆选择算法模拟这一过程进行优化。
3.2免疫遗传算法
Chun等人提出了一种免疫算法, 实质上是改进的遗传算法[11] .根据体细胞和免疫网理论改进了遗传算法的选择操作,从而保持了群体的多样性,提高算法的全局寻优能力。通过在算法中加入免疫记忆
功能,提高了算法的收敛速度。免疫遗传算法把抗原看作目标函数,将抗体看作问题的可行解,抗体与抗原的亲和度看作可行解的适应度。免疫遗传算法引入了抗体浓度的概念,并用信息熵来描述,表示群体中相似可行解的多少。免疫遗传算法根据抗体与抗原的亲和度和抗体的浓度进行选择操作,亲和度高且浓度小的抗体选择率大,这样就抑制了群体中浓度高的抗体,保持了群体的多样性。
3.3反向选择算法
免疫系统中的T细胞在胸腺中发育,与自身蛋白质发生反应的未成熟T细胞被破坏掉,所以成熟的T细胞具有忍耐自身的性质,不与自身蛋白质发生反应,只与外来蛋白质产生反应,以此来识别“自己”与“非己”,这就是所谓的反向选择原理。Forrest基于反向选择原理提出了反向选择算法, 用于进行异常检
测[12].算法主要包括两个步骤:首先,产生一个检测器集合,其中每一个检测器与被保护的数据不匹配:其次,不断地将集合中的每一个检测器与被保护数据相比较,如果检测器与被保护数据相匹配,则判定数据发生了变化。

3.4疫苗免疫算法
焦李成等人基于免疫系统的理论提出了基于疫苗的免疫算法[13].该算法是在遗传算法中加入免疫算子,以提高算法的收敛速度并防止群体退化。免疫算子包括疫苗接种和免疫选择两个部分,前者为了提高亲和度,后者为了防止种群退化。理论分析表明这种免疫算法是收敛的。
疫苗免疫算法的基本步骤是:随机产生NP个个体构成初始父代群体;根据先验知识抽取疫苗;计算当前父代种群所有个体的亲和度,并进行停止条件的判断:对当前的父代群体进行变异操作,生成子代
群体:对子代群体进行疫苗接种操作,得到新种群;对新群体进行免疫选择操作,得到新一代父本,并进入免疫循环。

4免疫算法流程
目前还没有统一的免疫算法及框图,下面介绍一种含有4.2.4节免疫算子的算法流程,分为以下几个步骤:
(1)首先进行抗原识别,即理解待优化的问题,对问题进行可行性分析,提取先验知识,构造出合适的亲和度函数,并制定各种约束条件。
(2)然后产生初始抗体群,通过编码把问题的可行解表示成解空间中的抗体,在解的空间内随机产生一个初始种群。
(3)对种群中的每一个可行解进行亲和度评价。
(4)判断是否满足算法终止条件:如果满足条件,则终止算法寻优过程,输出计算结果:否则,继续寻优运算。
(5)计算抗体浓度和激励度。
(6)进行免疫处理,包括免疫选择、克隆、变异和克隆抑制。

免疫选择:根据种群中抗体的亲和度和浓度计算结果选择优质抗体,使其活化:
克隆:对活化的抗体进行克隆复制,得到若干副本;变异:对克隆得到的副本进行变异操作,使其发生亲和度突变;
克隆抑制:对变异结果进行再选择,抑制亲和度低的抗体,保留亲和度高的变异结果。
(7)种群刷新,以随机生成的新抗体替代种群中激励度较低的抗体,形成新一代抗体,转步骤(3)。
免疫算法运算流程如图1所示。
在这里插入图片描述
免疫算法中的进化操作是采用了基于免疫原理的进化算子实现的,如免疫选择、克隆、变异等。而且算法中增加了抗体浓度和激励度的计算,并将抗体浓度作为评价个体质量的一个标准,有利于保持个体多样性,实现全局寻优。

5 关键参数说明
下面介绍一下免疫算法的主要参数,它在程序设计与调试中起着至关重要的作用。免疫算法主要包括以下关键参数:
抗体种群大小NP
抗体种群保留了免疫细胞的多样性,从直观上看,种群越大,免疫算法的全局搜索能力越好,但是算法每代的计算量也相应增大。在大多数问题中,NP取10~100较为合适,一般不超过200。
免疫选择比例
免疫选择的抗体的数量越多,将产生更多的克隆,其搜索能力越强,但是将增加每代的计算量。一般可以取抗体种群大小NP的10%~50%。
抗体克隆扩增的倍数
克隆的倍数决定了克隆扩增的细胞的数量,从而决定了算法的搜索能力,主要是局部搜索能力。克隆倍数数值越大,局部搜索能力越好,全局搜索能力也有一定提高,但是计算量也随之增大,一般取5~
10倍。
种群刷新比例
细胞的淘汰和更新是产生抗体多样性的重要机制,因而对免疫算法的全局搜索能力产生重要影响。每代更新的抗体一般不超过抗体种群的50%。
最大进化代数G
最大进化代数G是表示免疫算法运行结束条件的一个参数,表示免疫算法运行到指定的进化代数之后就停止运行,并将当前群体中的最佳个体作为所求问题的最优解输出。一般6取100~500。

三、部分源代码

%% 清空环境
clc;clear

%% 下载数据
load scheduleData Jm T JmNumber Q
%工序 时间

%% 基本参数
NIND=40;        %个体数目
MAXGEN=80;      %最大遗传代数
GGAP=0.9;       %代沟
XOVR=0.8;       %交叉率
MUTR=0.1;       %变异率
gen=0;          %代计数器
%PNumber 工件个数 MNumber  工序个数
[PNumber MNumber]=size(Jm);  
trace=zeros(2, MAXGEN);      %寻优结果的初始值
WNumber=PNumber*MNumber;     %工序总个数

%% 初始化
Number=zeros(1,PNumber);     % PNumber 工件个数
for i=1:PNumber
    Number(i)=MNumber;         %MNumber工序个数
end

% 代码2层,第一层工序,第二层机器
Chrom=zeros(NIND,2*WNumber);
for j=1:NIND
    WPNumberTemp=Number;
    for i=1:WNumber
        
        %随机产成工序
        val=unidrnd(PNumber);
        while WPNumberTemp(val)==0
            val=unidrnd(PNumber);
        end
        
        %第一层代码表示工序
        Chrom(j,i)= val;
        WPNumberTemp(val)=WPNumberTemp(val)-1;
        
        %2层代码表示机器
        Temp=Jm{val,MNumber-WPNumberTemp(val)};
        SizeTemp=length(Temp);
        %随机产成工序机器
        Chrom(j,i+WNumber)= unidrnd(SizeTemp);
        
    end
end
 
%计算目标函数值
[PVal ObjV P S]=cal(Chrom,JmNumber,T,Jm);  

%% 循环寻找
while gen<MAXGEN
    
    %分配适应度值
    FitnV=ranking(ObjV);  
    %选择操作
    SelCh=select('rws', Chrom, FitnV, GGAP);       
    %交叉操作
    SelCh=across(SelCh,XOVR,Jm,T);          
    %变异操作
    SelCh=aberranceJm(SelCh,MUTR,Jm,T);            
    
    %计算目标适应度值
    [PVal ObjVSel P S]=cal(SelCh,JmNumber,T,Jm);   
    %重新插入新种群
    [Chrom ObjV] =reins(Chrom, SelCh,1, 1, ObjV, ObjVSel);       
    %代计数器增加
    gen=gen+1;       
    
    %保存最优值
    trace(1, gen)=min(ObjV);       
    trace(2, gen)=mean(ObjV);  
    
    % 记录最佳值
    if gen==1
        Val1=PVal;
        Val2=P;
        MinVal=min(ObjV);%最小时间
        STemp=S;
    end
    %记录 最小的工序
    if MinVal> trace(1,gen)
        Val1=PVal;
        Val2=P;
        MinVal=trace(1,gen);
        STemp=S;
    end
    
end

% 当前最佳值
PVal=Val1; %工序时间
P=Val2;  %工序 
S=STemp; %调度基因含机器基因

%% 描绘解的变化
figure(1)
plot(trace(1,:));
hold on;
plot(trace(2,:),'-.');grid;
legend('解的变化','种群均值的变化');

%% 显示最优解
figure(2);
MP=S(1,PNumber*MNumber+1:PNumber*MNumber*2);
for i=1:WNumber  
    val= P(1,i);
    a=(mod(val,100)); %工序
    b=((val-a)/100); %工件
    Temp=Jm{b,a};
    mText=Temp(MP(1,i));
    
    x1=PVal(1,i);
    x2=PVal(2,i);
    
    y1=mText-1;
    y2=mText;
    PlotRec(x1,x2,mText);
    
    PlotRec(PVal(1,i),PVal(2,i),mText);
    hold on;
    function NewChrom=across(Chrom,XOVR,Jm,T)

% Chrom=[1 3 2 3 1 2 1 3 2; 
%     1 1 2 3 3 1 2 3 2;
%     1 3 2 3 2 2 1 3 1;
%     1 3 3 3 1 2 1 2 2;
% ]; 
%   XOVR=0.7;

[NIND,WNumber]=size(Chrom);
WNumber=WNumber/2;
NewChrom=Chrom;%初始化新种群

[PNumber MNumber]=size(Jm);
Number=zeros(1,PNumber);
for i=1:PNumber
  Number(i)=1;
end

%随机选择交叉个体(洗牌交叉)
SelNum=randperm(NIND);   

Num=floor(NIND/2);%交叉个体配对数
for i=1:2:Num
    if XOVR>rand; 
        Pos=unidrnd(WNumber);%交叉位置
        while Pos==1
            Pos=unidrnd(WNumber);
        end
        %取两交叉的个体
        S1=Chrom(SelNum(i),1:WNumber);
        S2=Chrom(SelNum(i+1),1:WNumber); 
        S11=S2;S22=S1; %初始化新的个体     
        %新个体中间片断的COPY      
        S11(1:Pos)=S1(1:Pos);      
        S22(1:Pos)=S2(1:Pos);        
        %比较S11相对S1,S22相对S2多余和缺失的基因
        S3=S11;S4=S1;
        S5=S22;S6=S2;
        for j=1:WNumber         
           Pos1=find(S4==S3(j),1);
           Pos2=find(S6==S5(j),1);
           if Pos1>0
               S3(j)=0;
               S4(Pos1)=0;
           end                         
           if Pos2>0
               S5(j)=0;
               S6(Pos2)=0;
           end
        end
        for j=1:WNumber          
          if S3(j)~=0 %多余的基因          
            Pos1=find(S11==S3(j),1);        
            Pos2=find(S4,1);%查找缺失的基因
            S11(Pos1)=S4(Pos2);%用缺失的基因修补多余的基因
            S4(Pos2)=0;       
          end 
          if S5(j)~=0              
            Pos1=find(S22==S5(j),1); 
            Pos2=find(S6,1);           
            S22(Pos1)=S6(Pos2);
            S6(Pos2)=0;          
          end  
        end                         

        % 保存交叉前的机器 基因
        S1=Chrom(SelNum(i),:);
        S2=Chrom(SelNum(i+1),:); 
       
        for k=1:WNumber            
            Pos1=Find(S11(k),S1);           
            S11(WNumber+k)=S1(WNumber+Pos1);
            S1(Pos1)=0;
            
            Pos1=Find(S22(k),S2);           
            S22(WNumber+k)=S2(WNumber+Pos1);
            S2(Pos1)=0;
        end

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203

四、运行结果

在这里插入图片描述
在这里插入图片描述

五、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016.
[2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017.

文章来源: qq912100926.blog.csdn.net,作者:海神之光,版权归原作者所有,如需转载,请联系作者。

原文链接:qq912100926.blog.csdn.net/article/details/115461325

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。