在遗传算法中,称为“适应度”(或“评估”)函数的函数用于确定染色体的“适应度”。创建一个好的适应度函数是遗传算法中具有挑战性的任务之一。你将如何创建一个良好的健身功能?
如何打造良好的健身功能?
根据我的经验,适应度函数是一种定义遗传算法目标的方法。它提供了一种比较两种解决方案的“好”程度的方法,例如,用于配偶选择和从总体中删除“坏”解决方案。
适应度函数也可以是一种结合约束的方法,您可能对适应度环境的形状具有先验知识,或者您的交叉/重组算子在该适应度环境中的工作方式。
例如,适应度函数可以包括硬约束,例如“基因 x、y 和 z 必须都停留在表面的一侧“如果基因值位于表面的错误一侧,则通过将适应度值分配为零。但是,在这种情况下,通过分配在表面处为零并随着基因值在表面的错误一侧远离表面。
不同的适应度函数可用于配偶选择与删除“坏”试验解决方案。例如,两个潜在父母 A 和 B 之间的“交配适应性”可以是两个父母之间差异程度的函数。通过为显着不同的配对提供交配优势,可以迫使种群保持相当多样化,从而探索更大的解决方案空间区域,或者避免收敛到局部(次优)适应度最大值。同时,通常的适应度会从人群中剔除低适应度的个体,并推动向高适应度的进化。
通常更重要的是用于表示试验解决方案的一组变量(“基因”),基因在“染色体”中的排列方式,以及来自两个亲本的基因组合形成新试验解决方案的方式. 由于您没有询问这些事情,因此我不会在此答案中详细介绍,但是如果您在单独的问题中提出,我将提供详细的答案。
没有神奇的公式
如本答案中所述,适应度函数的定义取决于问题,因为它本质上决定了您正在寻找的解决方案,并且它引发了与您在强化学习中定义奖励函数时遇到的问题类似的问题,例如适应度错误指定(实际上,奖励函数和适应度函数的概念是相似的,尽管在某些情况下,适应度函数更类似于监督学习问题中的成本函数:例如,看看用于解决符号回归的适应度函数)。适应度函数的设计是一个工程问题,从某种意义上说,您需要考虑您正在寻找的解决方案,以及什么代表了好的和坏的解决方案。所以,我不能给你一个神奇的公式来定义所有问题的适应度函数,但我可以给你一些有用的信息来指导适应度函数的设计。
什么是适应度函数?
让我们从定义开始。适应度函数是将染色体表示映射为一个标量值(一个实数)的函数,它量化了染色体的质量(即解),所以它是形式的函数
在哪里是染色体的空间(其中染色体是适用于评估和修改的问题解决方案的数字编码)。
不同类型的优化问题
有不同的优化问题会影响适应度函数 [ 1 ] 的定义,例如
- 无约束:这是适应度函数与您的目标函数相对应的最简单情况
- 约束:在这种情况下,您的适应度函数可能由两个项组成:原始目标和惩罚项(惩罚不满足约束的解决方案)
- 多目标:您有多个适应度函数(每个目标一个),最终的适应度函数是这些多个适应度函数的组合;在这种情况下,您会经常遇到诸如帕累托最优之类的术语
- 动态(或噪声),解决方案的适应度可能随时间变化或取决于某些噪声分量(例如高斯噪声)
编码和适应度函数
在遗传算法(一种进化算法)中,通常假设染色体是二进制的(即是二进制数组的空间),因此这可能会限制您评估它们的方式。
在其他进化方法中,解决方案可能以不同的方式编码,并代表不同的东西,而不仅仅是数字的集合。特别是,在遗传编程中,解决方案就是程序,因此适应度应该与您正在寻找的程序应该完成的事情相对应。例如,如果您正在寻找一个解析表达式(例如多项式),它可以使用另一个表达式最小化平方误差,那么适合度将是例如平方误差。
有关详细信息,请参阅 [ 1 ] 的第 10.3 节(第 180 页) 。
便宜的健身评估
在设计适应度函数时,您应该寻找的最理想的属性之一是评估个体适应度的成本有多低。理想情况下,适应度评估应该非常便宜,以使进化算法可行且实用。如果对一个人进行评估需要 1 年时间,那么你什么也做不了。或者,如果精确适应度的计算过于昂贵,您可以近似个人的适应度。
绝对和相对措施
适应度函数可以提供对染色体(或解决方案)质量的绝对或相对(相对于群体中的其他染色体或其他竞争群体)的测量。相对适应度函数用于协同进化算法,适用于无法绝对测量解决方案质量的情况 [ 1 ]。
健身分享
还有适应度共享的概念(参见 [ 1 ] 的第 9.6.1 节,第 165 页),其中个人的适应度可以根据其他个体的适应度进行调整
进一步阅读
除了 [ 1 ] 有几个关于进化计算的章节之外,您还可以查看进化计算 2:高级算法和运算符。从标题和摘要(以及我快速阅读的其他部分)来看,论文《进化机器人中的健身功能:调查和分析》(2009 年)似乎也很有用。