三维装箱之遗传算法讲解

遗传算法

在达尔文提出来“物竞天择,适者生存”的生物进化理论的基础上,美国Michigan大学教授Jolm Holland在1975年作为第一个提出了基本遗传算法的概念,遗传算法实质上就是一种随机搜索类型的算法,又称random searchingalgorithms,这种算法所使用机制大致和生物自然界的自然选择类似,具有随机性,所以说这种算法既高效又并行且兼顾全局。但是这种算法不同于传统算法,可能是因为它不用太依赖所选参数的梯度信息,而是另行采用一种高效的方式来进行编码,有组织的、随机的进行基因变化,来得到较优的解,然后不断循环直到达到最优解。他和传统算法的相比较,有如下优点。
(1)更加宽泛的表示了问题的可行解。这种编码的方式同样的在别的一些领域同样也能适用这种编码的方式来解决来自各个领域的问题。
(2)群体处理的方式。因为这个原因,让遗传算法不仅拥有无与伦比的全局搜索能力,而且让算法自身比较容易进行并行化操作。
(3)问题的求解只需求解空间问题,而空间问题又对应的问题的解。这个优点注定了遗传算法可以在更多的领域发挥发光发热。
(4)这种算法具有较高的兼容性。几乎可以和任何当下存在的智能算法相结合,改进后的算法的性能不仅可以解决它本身领域的问题,还可以完善遗传算法本身。
这种算法的具体步骤如下所示:

第一步:编码与解码

编码实际上就是把一个可行解用一条包含了多种多样的信息的染色体来表示出来。某一个集装箱的最终可行解完全可以描述为,将一定数量的需要转载进集装箱的货物,按照一定的顺序或规则依次放入集装箱的某个位置。所以,拥有这些编码的染色体需要通过这些代码来反映有哪些货物,货物的放置位置,货物与货物之间的前后关系,以及货物是否放置。如果存在货物集合F,它当中存在货物总共n个,首先进行的第一步就是对所有的货物进行随机的编号,本文中介绍的编码后的染色体的长度为3n,由头部、中部和尾部三个部分组成。头部的基因包括了a1,a2,a3……an,其中ai代表了第i个货物的编号,并且这个编号的顺序就是后面货物装载进集装箱的顺序; 中部的基因则包括了an+1,an+2,an+3……a2n,ai和an+i这些代码表示货物i是否装进了集装箱,并且an+1只能取0和l,当an+i表示为l的时候,表示货物被装进了集装箱,否则,表示没有装进集装箱;尾部基因a2n+1,a2n+2……a2n+i……a3n,ai和a2n+i,与上面的代码所相对应,这些代码表示了货物i的放置的方向,a2n+i为0和l,当其取值为l时,表示货物与集装箱的长度方向相同,即Li//L
货物的装载方向即为与集装箱的宽相平行,即Li//W下图所示。
{a1,a2,a3|an+1,an+2,an+3|a2n+1,a2n+2,a2n+3}
染色体结构头部|中部|尾部
解码的过程是整个过程的最后一步,这一步存在的意义就是读取染色体当中的信息,下面就是所列出来的解决问题的步骤:
首先将出现致死染色体的染色体的ai+1由l改为0,这表示第i个货物将不会被装进装箱。然后找到致死染色体和出现在染色体之后的首个中部基因为0的染色体,将其值改为1,表明将此货物进行相关装箱操作,这样做的作用就是用这个货物来代替货物i来装入到集装箱当中,当然如果不存在那样的情况,则不进行任何操作。最后,就是在解决了致死染色体货物i后的货物继续相关货物装箱的操作同时更新四叉树,这就是解码的一系列过程,一直下去,我们就可以得到最后的解。

第二步:初始群体的生成

可以这么说,进行编码之后的二进制形式的位串就是一个个体,也就是所谓的一个对象,如果存在许许多多的这样的个体,就构成了所谓的种群,初始种群就是第一个形成的种群,通常情况下,它的构成方式有两种形式,一种就是通过完全随机的方式来产生。而另一种方式则是通过运用启发式的方法来构造出比较优秀的初始种群。
由编码所形成的一个串数据结构成为一个个体,如果存在多个个体就可以构成一个群体,初始群体就是指最初形成的群体,它在构造方式通常有两种,一种是由完全随机的算法产生,另外一种则是通过运用启发式方法来构造一个相对较优的初始种群。

第三步:适应度值评价

适应度值评价指的就是对个体优劣的一个评价标准。适应值越大表示最后所能得到的解的质量越高,反之亦然。不同的问题,我们所需要的适应度函数也就不同。但有一点是相同的,那就是,在优胜劣汰的筛选过程当中,适应度值的大小决定了研究问题子集的适应能力的大小。而在基本的遗传算法中,我们就是通过观察这种适应度值的大小来判定该子代是否该遗传下去。

第四步:选择

实质上,选择就是将那些适应度值较大的个体,作为父体用某种方式给筛选出来,这样做的好处就是可以为子代提供较好的基因。简单的来说在遗传算法中,如果存在初始群体的规模为M,个体的适应度值是力,i代表了各个个体在种群种的位置信息,这样做就可以得到个体被选中的概率,公式如下:

通常情况下,选择方式还包括了有排序选择方式、跨世纪精英选择方式和随机联赛选择策略方式等等,甚至有些时候还可以将他们相互结合使用。
第五步:交叉
交叉是指对两个染色体通过根据一定的规则来相互交换它内部的部分基因,经过基因交换后可以产生两个新的个体。日常生活当中,我们经常遇到的交叉方式还有算术交叉、两点交叉、均匀交叉等等,而且这些交叉方式发生的概率也被界定了下来。下面我要简单介绍的交叉方法就是双点交叉,这个方法中的双点指的就是单个染色体上随机选取出来的两个点,然后根据这两个交叉点设计出具体的交叉方法。
在所有的样本[1,3n]中我们随机抽取出来两个个体作为父体,并按顺序排列,此时如果交叉操作只发生在头部,为了保证交叉后的个体序列位不发生重复,我们通常采用以下的方式来规避这种情况。下面我们通过实列来演示个体发生交叉的操作过程。如果存在货物种群,种群的数量为6,p1和p2是被抽取出来的要进行交叉操作的两个个体染色体,交叉的点位选择在第三位到第六位。则交叉的过程表示如下:
交换前:
P1={6,3,2,5,4,1,0,0,0,0,1,0,1,1,1,0,0,1)
P2={3,5,1,2,4,6,1,0,0,1,0,0,1,0,1,0,1,0)
直接交换基因:
P1={6,3,2,2,4,6,0,0,0,0,1,0,1,1,1,0,0,1)
P2={3,5,1,5,4,1,1,0,0,1,0,0,1,0,1,0,1,0)
但是经过了交叉变换之后,我们发现在个体编码的序号当中出现了重复,这明显是不可行的,因为头部记录了货物的编号,不会存在两个货物编码一样的个体,想要解决这样的问题,操作具体可以介绍如下:
P1={5,3,1,2,4,6,0, 1,0,0,1,0,1,1,1,0,0,1)
P2={3,6,2,5,4, 1,1,0,0,1,0,0,1,0,1,0,1,0)
调整的规则:首先找出进行交叉操作后的两个个体当中出现重复的编码,然后就是将其对应起来,并行调换两个编码的位置。
同上,在所有的样本[1,3n]中我们进行和上面一样的操作,随即找出两个个体作为父体,但是交叉的位置包括了一部分头部基因,另一部分处在后面的基因,出现这种情况我们可以将它分成两部分来进行处理,一部分就是处在头部基因当中的编码作为一部分,剩下的作为一部分,这么做的具体操作过程如下所示:
交叉前:
P1={6,3,2,5,4,1,0,1,0,0,1,0,1,1,1,0,0,1)
P2={3,5,1,2,4,6,1,0,1,1,0,0,1,0,1,0,1,0)
直接进行交换后的基因:
P1={6,3,2,2,4,6,1,0,1,1,0,0,1,1,1,0,0,1)
P2={3,5,1,5,4,1,0,1,0,0,1,0,1,0,1,0,1,0)
同样的,进出交换都的基因也存在货物序号重复的情况,为了保证不出现重复的序号,这里会对头部的非交叉基因进行稍微的调整,调整的规则和第一种情况下的调整步骤类似:
P1={5,3,1,2,4,6,1,0,1,1,0,0,1,1,1,0,0,1)
P2={3,6,2,5,4,1,0,1,0,0,1,0,1,0,1,0,1,0)
第六步:变异
变异操作的方式在遗传方法当中大都以逆位排序的方式存在。在集装箱问题上,我们会遇到两种情况,第一种就是要进行变异的点位出现在头部,第二种是变异点位只出现在头部基因以后,第三种就是跨越了头部基因与后面的基因,这里我们把前面两种情况看作一种来解决,因为在这两种情况下的逆位排序并不会出现将头部基因变换至后面基因的情况,直接将变异点之间的编码全部逆位就行,而一旦出现了第三种情况,我们就需要将其划分为两个部分来解决,头部作为一部分,头部以后的作为一部分,然后分别进行逆位排序。具体变异可参考下图所示。

和生物变异不一样的是,遗传算法当中的变异概率要远远高于生物自然界发生变异的概率,这种变异的概率我们一般把它限制在0.001到0.1之间。遗传算法流程图简单操作流程如下图所示:

posted @   多见多闻  阅读(464)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2022-05-25 Unity Display 1 No cameras rendering 提示消除方法
2022-05-25 Unity3D中如何实现让3D模型显示在UI前面
点击右上角即可分享
微信分享提示