author:魏静崎
2023年10月21日
免疫算法求函数最优解的实际应用
简述
免疫算法和遗传算法区别不是很大,除了之前的突变、交叉操作,新增了一个接种疫苗的操作——即每次选取一部分较优解(抗原、记忆细胞、浆细胞)复制选优后与随机解混合,从中选取较优解(抗原),再进行重复操作。
不过在免疫算法选择的步骤中,对遗传算法中由“适应度”进行选择的方法做了很大改进,引出了“亲和度”(affinity)、”抗体浓度”(density)、”激励度”(simulation)这三个在选择操作中的重要概念。其中的激励度是由亲和度与抗体浓度进行计算的。亲和度与抗体浓度是由这些解来计算的。亲合度代表了这些解与最优解的接近程度,抗体浓度本质上是一个解与集合中其它所有的解当中距离比较近(或者说比较相似)的解的个数,再除以集合中解的总数总数就是这个解的浓度。因此需要一种距离度量方法来判定相近的阈值。
激励度simulation = alpha * affinity - beta * density就说明density值越大,其simulation就越小,就越可能不被选中。因此浓度越低,激励度会越好,越容易被选中。
免疫算法在每次对抗体克隆后会对所有克隆进行变异,变异是概率事件。
算法实现
$$
通过免疫算法寻找一个函数 f(x) = sin(3x) - (x-1)² (x∈(0, 4))的最优解:
$$
1 | """ |
可以发现,随着循环的进行,结果逐渐逼近最优解,我们这时应该逐渐减小变异概率pm,当达到最优时,我们并不希望它继续变异,这样不容易稳定在最优解,因此可以设置*pm[i]=pm[0]/c[i]*,即第i次循环的变异概率为初始的突变概率pm除以循环次数。
- 本文作者: 魏静崎
- 本文链接: https://slightwjq.github.io/2024/10/06/免疫算法/
- 版权声明: 该文章来源及最终解释权归作者所有