免疫优化算法Python实现

免疫算法

免疫算法是模仿生物免疫机制,结合基因的进化机理,人工构造出的一种新型智能优化算法。

  • 它具有一般免疫系统的特征,采用群体搜索策略,通过迭代计算,最终以较大的概率得到问题的最优解。

  • 相比较于其他算法,免疫算法利用自身产生多样性和维持机制的特点,保证了种群的多样性,克服了一般寻优过程(特别是多峰值的寻优过程)中不可避免的“早熟”问题,可以求得全局最优解。

  • 免疫算法具有自适应性、随机性、并行性、全局收敛性、种群多样性等优点。

2.算法原理

在这里插入图片描述
根据上述的对应关系,模拟生物免疫应答的过程形成了用于优化计算的免疫算法。算法主要包含以下几大模块:

  • 抗原识别与初始抗体产生。根据待优化问题的特点设计合适的抗体编码规则,并在此编码规则下利用问题的先验知识产生初始抗体种群。
  • 抗体评价。对抗体的质量进行评价,评价准则主要为抗体亲和度和个体浓度,评价得出的优质抗体将进行进化免疫操作,劣质抗体将会被更新
  • 免疫操作。利用免疫选择、克隆、变异、克隆抑制、种群刷新等算子模拟生物免疫应答中的各种免疫操作,形成基于生物免疫系统克隆选择原理的进化规则和方法,实现对各种最优化问题的寻优搜索。

3. 免疫算法算子

免疫算法的算子包括:亲和度评价算子、抗体浓度评价算子、激励度计算算子、免疫选择算子、克隆算子、变异算子、克隆抑制算子和种群刷新算子等。由于算法的编码方式可能为实数编码、离散编码等,不同编码方式下的算法算子也会有所不同。

3.1亲和度评价算子

亲和度评价表征算子免疫细胞与抗原的结合强度。
亲和度评价算子通常是一个函数aff(x): S∈R
其中 S为问题的可行解区间,R为实数域。函数的输入为一个抗体个体(可行解),输出即为亲和度评价结果。

3.2抗体浓度评价算子:

抗体浓度评价表征算子抗体种群的多样性好坏。抗体浓度过高意味着种群中非常类似的个体大量存在,不利于全局优化。
抗体浓度通常定义为
在这里插入图片描述

3.3激励度计算算子

抗体激励度是对抗体质量的最终评价结果,需要综合考虑抗体亲和度和抗体浓度,通常亲和度大、浓度低的抗体会得到较大的激励度。

抗体激励度的计算通常可以利用抗体亲和度和抗体浓度的评价结果进行简单的数学运算得到,如
在这里插入图片描述
a、b 为计算参数,可以根据实际情况确定。

3.4 免疫选择算子

免疫选择算子根据抗体的激励度确定选择哪些抗体进入克隆选择操作

在抗体群中激励度高的抗体个体具有更好的质量,更有可能被选中进行克隆选择操作,在搜索空间中更有搜索价值。

3.5 克隆算子

克隆算子将免疫选择算子选中的抗体个体进行复制。克隆算子可以描述为:
在这里插入图片描述
clone(abi)为mi个与abi相同的克隆构成的集合,mi为抗体克隆数目,可以事先确定,也可以动态自适应计算。

3.6 变异算子

  • 实数编码变异算子:实数编码算法的变异策略是在变异源个体中加入一个小扰动,使其稍偏离原来的位置,落入源个体邻域中的另一个位置,实现变异源邻域的搜索。实数编码算法变异算子可以描述:
  • 在这里插入图片描述
  • 在这里插入图片描述
  • 离散编码变异算子:
    离散编码算法以二进制编码为主,其变异策略是从变异源抗体串中随机选取几位元,改变位元的取值(取反),使其落在离散空间变异源的邻域。

变异算子对克隆算子得到的抗体克隆结果进行变异操作,以产生亲和度突变,实现局部搜索。
变异算子是免疫算法中产生有潜力的新抗体、实现区域搜索的重要算子,它对算法的性能有很大影响。
变异算子也和算法的编码方式相关,实数编码的算法和离散编码的算法采用不同的变异算子。

3.7克隆抑制算子

克隆抑制算子用于对经过变异后的克隆体进行再选择,抑制亲和度低的抗体,保留亲和度高的抗体进入新的抗体种群

在克隆抑制的过程中,克隆算子操作的源抗体与克隆体经变异算子作用后得到的临时抗体群共同组成一个集合,克隆抑制操作将保留此集合中亲和度最高的抗体,抑制其他抗体。

由于克隆变异算子操作的源抗体是种群中的优质抗体,而克隆抑制算子操作的临时抗体集合中又包含了父代的源抗体,因此在免疫算法的算子操作中隐含了最优个体保留机制。

3.8种群刷新算子

种群刷新算子用于对种群中激励度较低的抗体进行刷新
从抗体种群中删除这些抗体并以随机生成的新抗体替代,
有利于保持抗体的多样性,实现全局搜索,探索新的可行解空间区域

4.算法流程

目前还没有统一的免疫算法及框图,下面介绍一种含有以上免疫算子的算法流程,分为以下几个步骤:
(1)首先进行抗原识别,即理解待优化的问题,对问题进行可行性分析,提取先验知识,构造出合适的亲和度函数,并制定各种约束条件。

(2)然后产生初始抗体群,通过编码把问题的可行解表示成解空间中的抗体,在解的空间内随机产生一个初始种群。

(3)对种群中的每一个可行解进行亲和度评价。

(4)判断是否满足算法终止条件:如果满足条件则终止算法寻优过程,输出计算结果;否则继续寻优运算。

(5)计算抗体浓度和激励度。

(6)进行免疫处理,包括免疫选择、克隆、变异和克隆抑制。

免疫选择: 根据种群中抗体的亲和度和浓度计算结果选择优质抗体,使其活化;

克隆: 对活化的抗体进行克隆复制,得到若干副本;

变异: 对克隆得到的副本进行变异操作,使其发生亲和度突变;

克隆抑制: 对变异结果进行再选择,抑制亲和度低的抗体,保留亲和度高的 变异结果。

(7)种群刷新,以随机生成的新抗体替代种群中激励度较低的抗体,形成新一代抗体,转步骤(3)。

免疫算法运算流程如下图所示:
在这里插入图片描述

5.关键参数说明

在这里插入图片描述

6.算法特点

全局搜索能力。模仿免疫应答过程提出的免疫算法是一种具有全局搜索能力的优化算法
多样性保持机制。对抗体进行浓度计算,并将浓度计算的结果作为评价抗体个体优劣的一个重要标准;它使浓度高的抗体被抑制,保证抗体种群具有很好的多样性,这也是保证算法全局收敛性能的一个重要方面。
鲁棒性强。基于生物免疫机理的免疫算法不针对特定问题,而且不强调算法参数设置和初始解的质量,利用其启发式的智能搜索机制,即使起步于劣质解种群,最终也可以搜索到问题的全局最优解,对问题和初始解的依赖性不强,具有很强的适应性和鲁棒性。
并行分布式搜索机制。免疫算法不需要集中控制,可以实现并行处理。尤其适合于多模态的优化问题。

Python代码实现

import numpy as np
from scipy import spatial
import matplotlib.pyplot as plt

num_points = 50

points_coordinate = np.random.rand(num_points, 2)  # generate coordinate of points
distance_matrix = spatial.distance.cdist(points_coordinate, points_coordinate, 	metric='euclidean')
def cal_total_distance(routine):
	'''The objective function. input routine, return total distance.
	cal_total_distance(np.arange(num_points))
	'''
	num_points, = routine.shape
	return sum([distance_matrix[routine[i % num_points], routine[(i + 1) % num_points]] 	for i in range(num_points)])

from sko.IA import IA_TSP

ia_tsp = IA_TSP(func=cal_total_distance, n_dim=num_points, size_pop=500, 	max_iter=800, prob_mut=0.2,
                T=0.7, alpha=0.95)

best_points, best_distance = ia_tsp.run()
print(best_points)
print(best_distance)
fig, ax = plt.subplots(1, 2)
best_points_ = np.concatenate([best_points, [best_points[0]]])
best_points_coordinate = points_coordinate[best_points_, :]
ax[0].plot(best_points_coordinate[:, 0], best_points_coordinate[:, 1], 'o-r')
ax[1].plot(ia_tsp.generation_best_Y)
plt.show()

在这里插入图片描述
[31 45 8 32 28 10 2 7 22 21 15 16 26 19 46 1 39 6 14 33 36 23 38 20
24 34 30 37 9 4 42 48 47 11 49 29 0 27 44 40 25 41 43 18 3 13 5 35
12 17]
[5.37233227]

可以看到效果还是非常好的

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值