免疫算法Python实现

article/2025/9/24 13:43:32

1.流程

在这里插入图片描述 

 

免疫算法与遗传算法其实非常相似,但其独特的地方在于,免疫算法用激励度而非亲和度来衡量结果的好坏,而激励度又与抗体密度有关,这就使得密度大的抗体激励度反而小,让免疫算法有全局搜索的能力,不容易陷入局部最优,接下来我就结合代码来讲解。

2.开发环境

 【Anaconda + jupyter notebook  python 3.7.9】

3.具体实例

现有一函数f(x,y) = 5sin(xy) + x^{2} + y^{2},定义域为x\in [-4,4],y\in [-4,4],函数图像

 

 首先导入需要的包

numpy

pandas(这个好像全程没用到)

matplotlib(绘制三维图)

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

定义需要的参数

        因为所求的函数为二元,故维度为2

        choice的值表示所求的为最大还是最小值,如果求的是最大值,那么alpha就要为正,反之为负(后面会解释)

G = 100    #迭代次数
fun = '5 * sin(x * y) + x ** 2 + y ** 2'   #目标函数
choice = 'max'
dim = 2                    #维度
limit_x = [-4,4]           #x取值范围
limit_y = [-4,4]           #y取值范围
pop_size = 10              #种群规模
mutate_rate = 0.7          #变异概率
delta = 0.2                #相似度阈值
beta = 1                   #激励度系数
colone_num = 10            #克隆份数
if choice == 'max':alpha = 2              #激励度系数,求最大值为正,最小值为负
else:alpha = -2

首先定义一些函数

        传入函数表达式和自变量的值,返回函数值

def f(fun,x,y):       #函数表达式return eval(fun)

初始化种群函数

        生成一个 dim x pop_size 的矩阵,在这里即为 2 x 10,每一列代表一个个体,第一行表示x,第二行表示y。

        传入尺寸和取值范围,随机生成范围内的x,y值,公式: x = rand * (上限 - 下限) + 下限,rand为0~1之间的随机数

#初始化种群
def init_pop(dim,pop_size,*limit):pop = np.random.rand(dim,pop_size)for i in range(dim):pop[i,:] *= (limit[i][1] - limit[i][0])pop[i,:] += limit[i][0]return pop

 计算浓度

        生成的density为 1x10 维的矩阵,表示每一个个体的浓度,

        首先计算每一个个体与其他个体的相似度,计算公式即为两点间距离公式

        \sqrt{(x_{1} - x_{2})^{2} + (y_{1} - y_{2})^{2}}

        对于每一个个体,计算完相似度后可以得到一个 1x10 的矩阵,矩阵中的元素如果小于给定的阈值,则认为两个个体相似,并赋值为1,否则赋值为0。经过上述相似度判断后所得到的 1x10 矩阵中的元素只有1和0.然后将所有相似度相加,并除以总个数便得到该个体的浓度。

#计算浓度
def calc_density(pop,delta):density = np.zeros([pop.shape[1],])for i in range(pop.shape[1]):density[i] = np.sum(len(np.ones([pop.shape[1],])[np.sqrt(np.sum((pop - pop[:,i].reshape([2,1])) ** 2,axis = 0)) < delta]))return density / pop.shape[1]

计算激励度

        传入的simulation参数为亲和度(其实就是每个个体的x,y带入得到的函数值),若要求的是最大值,则alpha为正(因为值越大得到的激励度越大),否则alpha为负。减去浓度是为了全局搜索,浓度大的则激励度小,这样其他浓度小的个体也有机会进行接下来的克隆变异操作。

#计算激励度
def calc_simulation(simulation,density):return (alpha * simulation - beta * density)

变异操作

        每个个体的x,y都有一定概率变异,变异即加上一个随机数,如果超过了定义域,则重新生成,gen代表遗传的代数,代数越大,则每次变异的范围应该越小(因为繁殖代数越多,所得到的个体就越接近最优解,此时应减小变异的范围使其收敛)

#变异,随着代数增加变异范围逐渐减小
def mutate(x,gen,mutata_rate,dim,*limit):for i in range(dim):if np.random.rand() <= mutata_rate:x[i] += (np.random.rand() - 0.5) * (limit[i][1] - limit[i][0]) / (gen + 1)    #加上随机数产生变异if (x[i] > limit[i][1]) or (x[i] < limit[i][0]):      #边界检测x[i] = np.random.rand() * (limit[i][1] - limit[i][0]) + limit[i][0]

到此为止,函数已经定义完,接下来就要开始免疫迭代了

免疫循环

        首先生成初始种群pop,init_simulation表示亲和度,然后算出浓度(密度)density,根据亲和度和密度计算出激励度

pop = init_pop(dim,pop_size,limit_x,limit_y)
init_simulation = f(fun,pop[0,:],pop[1,:])
density = calc_density(pop,delta)
simulation = calc_simulation(init_simulation,density)

        接下来进行排序,按照激励度降序排列。这边的new_pop为一份拷贝,在后面需要用到,而且应该进行浅拷贝防止影响原来的pop

#进行激励度排序
index = np.argsort(-simulation)
pop = pop[:,index]
new_pop = pop.copy()    #浅拷贝
simulation = simulation[index]

        取激励度前50%的个体进行免疫操作,首先生成两个矩阵用于存放筛选出来的个体和其激励度。每一个个体都克隆10份,然后进行变异操作。变异完后保留克隆源个体。接下来对变异后的10个个体进行激励度计算并排序,筛选出最优的那个并放入先前生成的矩阵中。

        筛选出来的最优为5个,再随机生成5个个体,将两组合并即组成一个新的种群。之后重复上述操作即可

#免疫循环
for gen in range(G):best_a = np.zeros([dim,int(pop_size / 2)])   #用于保留每次克隆后亲和度最高的个体best_a_simulation = np.zeros([int(pop_size / 2),]) #保存激励度#选出激励度前50%的个体进行免疫for i in range(int(pop_size / 2)):a = new_pop[:,i].reshape([2,1])b = np.tile(a,(1,colone_num))   #克隆10份for j in range(colone_num):mutate(a,gen,mutate_rate,dim,limit_x,limit_y)b[:,0] = pop[:,i]       #保留克隆源个体#保留亲和度最高的个体b_simulation = f(fun,b[0,:],b[1,:])index = np.argsort(-b_simulation)best_a_simulation = b_simulation[index][0]    #最佳个体亲和度best_a[:,i] = b[:,index][:,0]                 #最佳个体#计算免疫种群的激励度a_density = calc_density(best_a,delta)best_a_simulation = calc_simulation(best_a_simulation,a_density)#种群刷新new_a = init_pop(2,int(pop_size / 2),limit_x,limit_y)#新生种群激励度new_a_simulation = f(fun,new_a[0,:],new_a[1,:])new_a_density = calc_density(new_a,delta)new_a_simulation = calc_simulation(new_a_simulation,new_a_density)#免疫种群与新生种群合并pop = np.hstack([best_a,new_a])simulation = np.hstack([best_a_simulation,new_a_simulation])index = np.argsort(-simulation)pop = pop[:,index]simulation = simulation[index]new_pop = pop.copy()

最后进行绘图

# 新建一个画布
figure = plt.figure(figsize = (10,8),dpi = 80)
# 新建一个3d绘图对象
ax = Axes3D(figure)
# 定义x,y 轴名称
plt.xlabel("x")
plt.ylabel("y")
for i in range(int(pop_size / 2)):ax.scatter(pop[0,i],pop[1,i],f(fun,pop[0,i],pop[1,i]),color = 'red')print('最优解:','x = ',pop[0,i],'y = ',pop[1,i],end = '\n')print('结果:','z = ',f(fun,pop[0,i],pop[1,i]))
x = np.arange(limit_x[0],limit_x[1],(limit_x[1] - limit_x[0]) / 50)
y = np.arange(limit_y[0],limit_y[1],(limit_y[1] - limit_y[0]) / 50)
x,y = np.meshgrid(x,y)
z = f(fun,x,y)
ax.plot_surface(x,y,z, rstride=1, cstride=1, color = 'green',alpha = 0.5)
plt.show()

结果是这样 

 

 可以看到免疫算法并不局限于一个最值

这是最小值的情况

 最后附上完整代码

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3DG = 100    #迭代次数
fun = '5 * sin(x * y) + x ** 2 + y ** 2'   #目标函数
choice = 'max'
dim = 2                    #维度
limit_x = [-4,4]           #x取值范围
limit_y = [-4,4]           #y取值范围
pop_size = 10              #种群规模
mutate_rate = 0.7          #变异概率
delta = 0.2                #相似度阈值
beta = 1                   #激励度系数
colone_num = 10            #克隆份数
if choice == 'max':alpha = 2              #激励度系数,求最大值为正,最小值为负
else:alpha = -2def f(fun,x,y):return eval(fun)#初始化种群
def init_pop(dim,pop_size,*limit):pop = np.random.rand(dim,pop_size)for i in range(dim):pop[i,:] *= (limit[i][1] - limit[i][0])pop[i,:] += limit[i][0]return pop#计算浓度
def calc_density(pop,delta):density = np.zeros([pop.shape[1],])for i in range(pop.shape[1]):density[i] = np.sum(len(np.ones([pop.shape[1],])[np.sqrt(np.sum((pop - pop[:,i].reshape([2,1])) ** 2,axis = 0)) < delta]))return density / pop.shape[1]#计算激励度
def calc_simulation(simulation,density):return (alpha * simulation - beta * density)#变异,随着代数增加变异范围逐渐减小
def mutate(x,gen,mutata_rate,dim,*limit):for i in range(dim):if np.random.rand() <= mutata_rate:x[i] += (np.random.rand() - 0.5) * (limit[i][1] - limit[i][0]) / (gen + 1)    #加上随机数产生变异if (x[i] > limit[i][1]) or (x[i] < limit[i][0]):      #边界检测x[i] = np.random.rand() * (limit[i][1] - limit[i][0]) + limit[i][0]pop = init_pop(dim,pop_size,limit_x,limit_y)
init_simulation = f(fun,pop[0,:],pop[1,:])
density = calc_density(pop,delta)
simulation = calc_simulation(init_simulation,density)
# print(pop)
# print(init_simulation)
# print(calc_density(pop,delta))
#进行激励度排序
index = np.argsort(-simulation)
pop = pop[:,index]
new_pop = pop.copy()    #浅拷贝
simulation = simulation[index]#免疫循环
for gen in range(G):best_a = np.zeros([dim,int(pop_size / 2)])   #用于保留每次克隆后亲和度最高的个体best_a_simulation = np.zeros([int(pop_size / 2),]) #保存激励度#选出激励度前50%的个体进行免疫for i in range(int(pop_size / 2)):a = new_pop[:,i].reshape([2,1])b = np.tile(a,(1,colone_num))   #克隆10份for j in range(colone_num):mutate(a,gen,mutate_rate,dim,limit_x,limit_y)b[:,0] = pop[:,i]       #保留克隆源个体#保留亲和度最高的个体b_simulation = f(fun,b[0,:],b[1,:])index = np.argsort(-b_simulation)best_a_simulation = b_simulation[index][0]    #最佳个体亲和度best_a[:,i] = b[:,index][:,0]                 #最佳个体#计算免疫种群的激励度a_density = calc_density(best_a,delta)best_a_simulation = calc_simulation(best_a_simulation,a_density)#种群刷新new_a = init_pop(2,int(pop_size / 2),limit_x,limit_y)#新生种群激励度new_a_simulation = f(fun,new_a[0,:],new_a[1,:])new_a_density = calc_density(new_a,delta)new_a_simulation = calc_simulation(new_a_simulation,new_a_density)#免疫种群与新生种群合并pop = np.hstack([best_a,new_a])simulation = np.hstack([best_a_simulation,new_a_simulation])index = np.argsort(-simulation)pop = pop[:,index]simulation = simulation[index]new_pop = pop.copy()# 新建一个画布
figure = plt.figure(figsize = (10,8),dpi = 80)
# 新建一个3d绘图对象
ax = Axes3D(figure)
# 定义x,y 轴名称
plt.xlabel("x")
plt.ylabel("y")
for i in range(int(pop_size / 2)):ax.scatter(pop[0,i],pop[1,i],f(fun,pop[0,i],pop[1,i]),color = 'red')print('最优解:','x = ',pop[0,i],'y = ',pop[1,i],end = '\n')print('结果:','z = ',f(fun,pop[0,i],pop[1,i]))
x = np.arange(limit_x[0],limit_x[1],(limit_x[1] - limit_x[0]) / 50)
y = np.arange(limit_y[0],limit_y[1],(limit_y[1] - limit_y[0]) / 50)
x,y = np.meshgrid(x,y)
z = f(fun,x,y)
ax.plot_surface(x,y,z, rstride=1, cstride=1, color = 'green',alpha = 0.5)
plt.show()

讲的可能不是特别清楚,也有可能有些地方理解不大对,有不懂的可以在评论区提问


http://chatgpt.dhexx.cn/article/YGXoqkpm.shtml

相关文章

免疫算法详解

基本思想是将想要求解的各类优化问题的目标函数&#xff08;约束条件&#xff09;与抗原相对应&#xff0c;找到可以与抗原进行亲和反应的抗体&#xff0c;该抗体就是要求的最优解。 最核心要解决的就是 1.计算抗原和抗体的亲和度&#xff0c;亲和度越高&#xff0c;越可能是最…

人工免疫算法总结

人工免疫算法简介 免疫系统 免疫系统是哺乳动物抵御外来病毒侵害的防御系统&#xff0c;动物的生命过程中会遇到各种伤害可能&#xff0c;免疫系统为其正常的活动起着重要的作用。免疫系统的一大特点就是用有限的资源有效地应对了数量庞大且种类多变的病毒入侵。免疫算法基于…

免疫算法小结及算法实例(附Matlab代码)

文章目录 1、免疫算法流程2、关键参数说明3、MATLAB仿真实例3.1 免疫算法求一元函数的极值3.2 免疫算法求二元函数的极值3.3 免疫算法求解旅行商问题 4、免疫算法的特点 1、免疫算法流程 与遗传算法等其他智能优化算法类似&#xff0c;免疫算法的进化寻优过程也是通过算子来实…

免疫优化算法

免疫优化算法 免疫算法是模仿生物免疫机制&#xff0c;结合基因的进化机理&#xff0c;人工构造出的一种新型智能优化算法。 它具有一般免疫系统的特征&#xff0c;采用群体搜索策略&#xff0c;通过迭代计算&#xff0c;最终以较大的概率得到问题的最优解。 相比较于其他算法…

智能优化算法之免疫算法(IA)

这里写目录标题 1. 免疫算法思想起源2. 算法原理3. 免疫算法算子3.1 算法算子3.1.1 亲和度评价算子3.1.2 抗体浓度评价算子&#xff1a;3.1.3 激励度计算算子3.1.4 免疫选择算子3.1.5 克隆算子3.1.6 变异算子3.1.7 实数编码变异算子3.1.8 离散编码变异算子3.1.9 克隆抑制算子3.…

免疫算法(Immune Algorithm,IA)实例详解

免疫算法是将免疫概念及其理论应用于遗传算法&#xff0c;在保留原算法优良特性的前提下&#xff0c;利用抗体浓度评价算子和激励度计算算子来保持群体的多样性&#xff0c;克服了一般寻优过程中&#xff08;特别是多峰值&#xff09;不可避免的“早熟”问题。 1 算法概念 免…

一文搞懂什么是免疫算法Immune Algorithm【详细介绍】

本文参考了很多张军老师《计算智能》的第七章知识。 本文来源&#xff1a;https://blog.csdn.net/qq_44186838/article/details/109181453 免疫算法 1.1 算法简介 免疫算法&#xff08;Immune Algorithm&#xff0c;IA&#xff09;&#xff1a;是指以在人工免疫系统的理论为基…

免疫算法(Immune Algorithm)详解

关于免疫算法&#xff08;IA&#xff09;&#xff0c;其功能与遗传算法、模拟退火等算法实现的功能是相同的&#xff0c;都是用来求最优解。例如求函数最值、旅行商问题等。从本质上说&#xff0c;免疫算法更像是遗传算法的一种延申。IA虽然其中借鉴了生物学&#xff08;免疫学…

免疫算法

免疫算法是受生物免疫系统的启发而推出的一种新型的智能搜索算法&#xff0c;是一种确定性和随机性选择相结合并具有"勘探"与"开采"能力的启发式随机搜索算法。 算法主要的步骤: (1)抗原识别与初始抗体产生。 (2)抗体评价 (3)免疫操作 免疫算法的特点: (1)…

闵可夫斯基距离—大白话篇幅[有错误的话请指教]

包括&#xff1a;曼哈顿距离&#xff0c;欧氏距离&#xff0c;切比雪夫距离&#xff1b; 举例子&#xff1a;两个点&#xff1a;A(1,9),B(5,8) 1&#xff0c;曼哈顿距离&#xff1a; 就是取和&#xff1a;|&#xff08;1-5&#xff09;||&#xff08;9-8&#xff09;|5;曼哈顿…

闵可夫斯基距离(LP距离)、曼哈顿距离、欧式距离、切比雪夫距离、马哈拉诺比斯距离、相关系数、夹角余弦

标题闵可夫斯基距离(LP距离)、曼哈顿距离、欧式距离、切比雪夫距离、马哈拉诺比斯距离、相关系数、夹角余弦 在聚类中&#xff0c;可以将样本集合看作是向量空间中的点的集合&#xff0c;以该空间的距离表示样本之间相似度。常用的距离有闵可夫斯基距离&#xff0c;闵可夫斯基…

【Python经典题目】闵可夫斯基距问题

题目 定义一个高维空间样本点集类HDPoints&#xff0c;须包含以下数据属性与方法属性&#xff1a; (a)数据属性self.points&#xff1a;类型为列表&#xff0c;由多个子列表构成&#xff0c;每个子列表表示高维空间中的一个数据点&#xff0c;且数据维度可以任意&#xff0c;…

欧氏距离、曼哈顿距离、切比雪夫距离、闵可夫斯基距离

转载自&#xff1a;https://baijiahao.baidu.com/s?id1577090844304882120&wfrspider&forpc 欧氏距离(Euclidean Distance) 欧氏距离是最容易直观理解的距离度量方法&#xff0c;我们小学、初中和高中接触到的两个点在空间中的距离一般都是指欧氏距离。 欧氏距离 二…

数值属性的相异性:闵可夫斯基距离

本文介绍数值属性刻画的对象之间的相异性度量&#xff0c;首先&#xff0c;应该把数据进行规范化&#xff0c;使之落入更小的值域&#xff0c;例[0&#xff0c;1]&#xff0c;[0.0,1.0] 1&#xff1a;最流行的距离度量&#xff1a;欧几里得距离 2&#xff1a;曼哈顿距离 3&…

各种距离 欧式距离、曼哈顿距离、切比雪夫距离、闵可夫斯基距离、标准欧氏距离、马氏距离、余弦距离、汉明距离、杰拉德距离、相关距离、信息熵...

1. 欧氏距离(Euclidean Distance) 欧氏距离是最容易直观理解的距离度量方法&#xff0c;我们小学、初中和高中接触到的两个点在空间中的距离一般都是指欧氏距离。 二维平面上点a(x1,y1)与b(x2,y2)间的欧氏距离: 三维空间点a(x1,y1,z1)与b(x2,y2,z2)间的欧氏距离: n维空间点a(x1…

常用的相似度计算方法----欧式距离、曼哈顿距离、马氏距离、余弦、汉明距离、切比雪夫距离、闵可夫斯基距离、马氏距离

在深度学习以及图像搜索中&#xff0c;经常要对特征值进行比对&#xff0c;得到特征的相似度&#xff0c;常见的特征值比对方法有汉明距离、余弦距离、欧式距离、曼哈顿距离、切比雪夫距离、闵可夫斯基距离、马氏距离等&#xff0c;下面对各种比对方法分别进行介绍。 目录 1汉…

机器学习部分:距离的度量(欧氏距离,曼哈顿距离,夹角余弦距离,切比雪夫距离,汉明距离,闵可夫斯基距离,马氏距离)

目录 距离计算方法 1.欧式距离EuclideanDistance 2. 曼哈顿距离(ManhattanDistance) 3. 夹角余弦 4.切比雪夫距离&#xff08;Chebyshevdistance&#xff09; 5. 汉明距离(Hamming Distance) 6. 闵可夫斯基距离(Minkowski Distance) 7. 马氏距离(Mahalanobis Distance)…

【大数据】曼哈顿距离 欧几里得距离 与 闵可夫斯基距离Minkowski Manhattan Euclidean

这里写目录标题 闵可夫斯基距离曼哈顿距离欧几里得距离 e . g . e.g. e.g. 曼哈顿距离与欧几里得距离 三种距离计算算法 闵可夫斯基距离 闵可夫斯基距离(Minkowski Dis) &#xff0c;是 曼哈顿距离(Manhattan Dis) 与 欧几里得距离(Euclidean Dis) 的一般形式。一般不常直接使…

样本相似性度量(欧几里得距离、曼哈顿距离、切比雪夫距离、闵可夫斯基距离、标准化欧氏距离)

样本相似性度量&#xff08;欧几里得距离、曼哈顿距离、切比雪夫距离、闵可夫斯基距离、标准化欧氏距离&#xff09; 在分类过程中&#xff0c;常常需要估算不同样本直接的 Similarity Measurement &#xff08;相似性度量&#xff09;。 此时常用的方法就是计算两个样本直接…

机器学习聚类算法中的闵可夫斯基距离

最近闲着没事了解一下聚类算法&#xff0c;闵可夫斯基距离真有趣&#xff0c;搞得我有点一头雾水&#xff0c;废话不多&#xff0c;上定义&#xff1a; 本文从公式上表述了欧几里得距离、曼哈顿距离、切比雪夫距离记忆闵可夫斯基距离之间的关系。 一般而言&#xff0c;定义一…