基于距离浓度的人工免疫算法(DCAIA)求函数最值(python实现)
文章目录
- 基于距离浓度的人工免疫算法(DCAIA)求函数最值(python实现)
- 一、免疫算法理论
- 二、基于距离浓度算法的免疫机理
- 三、免疫算法对应关系
- 四、免疫算法算子
- 五、python实例
- 例(1)
- 例(2)
基于距离浓度的人工免疫算法(DCAIA)求函数最值(python实现)
免疫算法是人工免疫系统形式中应用最广法的一个部分,是兴起于2012年左右的机器学习算法,大多数的免疫算法被用于实现全局优化问题,包括组合优化、函数优化、神经网络优化等。
一、免疫算法理论
免疫算法是模仿生物免疫机制,结合基因的进化机理,人工构造出的一种新型智能优化算法。采用群体搜索策略,通过迭代计算,最终以较大的概率得到问题的最优解。相比于其他算法,免疫算法利用自身产生多样性和维持机制的特点,保证了群体多样性,克服了‘早熟’问题,可以得到全局最优解。具有自适应性,随机性并行性,全局收敛性,种群多样性等特点。
二、基于距离浓度算法的免疫机理
免疫系统是高度进化的生物系统,它的功能是针对外来抗原的输入产生识别并消灭抗原的抗体,本文提出的算法(DCAIA),借鉴了如下生物免疫特性和机理:
(1)抗体对抗原的识别是基于抗原的表位与抗体的受体的受体之间的匹配,抗体与抗原的亲和度决定了两者的匹配程度。
(2)免疫系统中同一种抗体的浓度是受到限制的,当某种抗体数量增加,达到一定浓度时,系统要对其进行抑制,同样对浓度低的抗体要进行繁殖以保证其多样性。
(3)抗体在繁殖过程中会产生高频变异,即克隆变异。以便可以识别种类繁多的抗原。
(4)抗体在识别抗原过程中,可以产生记忆,使得该抗体更快地识别抗原。在识别过程中,通过克隆变异和学习记忆,提高抗体对抗原的匹配度,亲和度成熟。
三、免疫算法对应关系
抗原 优化问题
抗体 优化问题的可行解
亲和度 可行解的质量
细胞活化 免疫选择
细胞分化 个体克隆
亲和度成熟 变异
动态维持平衡 种群刷新
四、免疫算法算子
编码方式主要为实数编码和离散编码。本文章利用基于距离浓度的人工免疫算法求解函数最值,采用实数编码。
(1)亲和度评价算子
表征抗体与抗原的结合度。通常是一个函数 a f f ( x ) aff(x) aff(x),函数的输入为一个抗体(可行解)。
(2)抗体浓度评价算子
抗体浓度通常定义为:
d e n ( a b i ) = 1 N ∑ j = 1 N S ( a b i , a b j ) den(ab_i)=\frac{1}{N}\sum_{j=1}^{N}S(ab_i,ab_j) den(abi)=N1j=1∑NS(abi,abj)
式中N为种群规模, S ( a b i , a b j ) S(ab_i,ab_j) S(abi,abj)表示抗体间相似度:
S ( a b i , a b j ) = { 1 , d i s ( a b i , a b j ) ≤ δ 0 , d i s ( a b i , a b j ) > δ 式 中 d i s ( ) 函 数 表 示 欧 氏 距 离 , δ 为 浓 度 阈 值 S(ab_i,ab_j)= \begin{cases} 1,dis(ab_i,ab_j)\leq \delta\\ 0, dis(ab_i,ab_j)> \delta \end{cases}\\ 式中dis()函数表示欧氏距离,\delta为浓度阈值 S(abi,abj)={1,dis(abi,abj)≤δ0,dis(abi,abj)>δ式中dis()函数表示欧氏距离,δ为浓度阈值
(3)激励度计算算子
抗体鼓励度是对抗体质量的最终评价结果,通常亲和度大、浓度低的抗体会得到较大的鼓励度。
本文使用以下公式:
s i m ( a b i ) = α × a f f ( a b i ) − β × d e n ( a b i ) sim(ab_i)=\alpha \times aff(ab_i)-\beta \times den(ab_i) sim(abi)=α×aff(abi)−β×den(abi)
(4)免疫选择算子
免疫选择算子根据抗体的激励度确定哪些抗体进入克隆选择操作。
(5)克隆算子
克隆算子将选中的抗体个体进行复制。
(6)变异算子
变异算子对克隆算子结果进行变异操作,以产生亲和度突变,实现局部搜索。变异算子在免疫算法中产生有潜力的新抗体,实现区域搜索的重要算子,对算法影响很大。本文采用以下公式:
T m ( a b i , j , m ) = { a b i , j , m + ( r a n d − 0.5 ) ∗ ε , r a n d < p m a b i , j , m , 其 他 ε 表 示 定 义 的 邻 域 范 围 , p m 为 变 异 概 率 T_m(ab_{i,j,m})= \begin{cases} ab_{i,j,m}+(rand-0.5)*\varepsilon , rand<p_m\\ ab_{i,j,m},其他 \end{cases}\\ \varepsilon 表示定义的邻域范围,p_m为变异概率 Tm(abi,j,m)={abi,j,m+(rand−0.5)∗ε,rand<pmabi,j,m,其他ε表示定义的邻域范围,pm为变异概率
(7)克隆抑制算子
克隆抑制算子用于对经过变异后的克隆体再进行选择,抑制亲和度低的抗体。
五、python实例
例(1)
计算函数 f ( x ) = ∑ i = 1 n x i 2 ( − 20 ≤ x i ≤ 20 ) f(x)=\sum_{i=1}^nx_i^2(-20\leq x_i \leq 20) f(x)=i=1∑nxi2(−20≤xi≤20)的最小值,其中个体x的维数n=10,这是一个简单的平方和函数,只有一个极小点x=(0,0,…,0),理论上最小值分f(0,0,…,0)=0。
#亲和度:与目标函数相关
def affinity(x):return np.sum(x**2)#激励度:根据亲和度和浓度计算,影响变异
def motivation(x,num):ND = np.zeros((1,num)) #临时数组nd = np.zeros((1,num)) #浓度for i in range(num):for j in range(num):tmp = np.sqrt(np.sum((x[:,i]-x[:,j])**2))if(tmp > detas):ND[0,i] = 0else:ND[0,i] = 1 nd[0,i] = np.sum(ND,axis=1)/num## 激励度MSLL = np.zeros((1,num))for i in range(num):tmp = affinity(x[:,i])MSLL[0,i] = tmpmtv = alphe * MSLL - beta * ndreturn mtv#变异函数
def variation(x , gen):temp = num//2first_x = np.zeros((D,temp))for i in range(temp):tx=x[:,i].reshape((10,1))tx_rpt=np.tile(tx,10)randt=np.random.rand(1)#以pm为概率变异if randt > pm:for g in range(D):for h in range(D):tx_rpt[g,h] = tx_rpt[g,h] + (np.random.rand(1) - 0.5) * (defalut / (gen+1))for j in range(D):for k in range(D):if (tx_rpt[j,k] > top) or (tx_rpt[j,k] < bottom):tx_rpt[j,k] = np.random.rand(1) * (top - bottom) + bottomtx_rpt[:,0] = tx[:,0]mvt = motivation(tx_rpt,10)index = np.argsort(mvt).flatten()temp = tx_rpt[:,index]first_x[:,i] = temp[:,0]return first_x
import numpy as np
import matplotlib.pyplot as pltD = 10 #维度
num = 100 #个体数量
top = 20 #取值上限
bottom = -20 #取值下限
alphe = 3 #激励度系数
beta = 1 #激励度系数
detas = 0.3 #浓度阈值
pm = 0.6 #变异几率
trace = [] #记录过程
defalut = top
x = np.random.rand(D,num) * (top - bottom) + bottom #10*100初始种群gen = 1
iteration = 300 #最大迭代代数
while gen<iteration:mtv = motivation(x,num) #按激励度排序index = np.argsort(mtv).flatten()sort_x = x[:,index]#变异sort_x[:,:50] = variation(sort_x[:,:50],gen)sort_x[:,50:] = np.random.rand(D,50) * (top - bottom) + bottomgen = gen+1print("\r%d/%d" % (gen,iteration),end="")x = sort_x#计算亲和度MSLL = np.zeros((1,num))for i in range(num):MSLL[0,i] = affinity(x[:,i])#按亲和度排序index = np.argsort(MSLL).flatten()x = x[:,index]#记录优化过程,此时第一个为做接近最值的结果trace.append(affinity(x[:,0]))#作图
xx = range(gen-1)
plt.plot(xx , trace)
print(trace[-1])
plt.show()
例(2)
求函数 f ( x , y ) = 5 s i n ( x y ) + x 2 + y 2 f(x,y)=5sin(xy)+x^2+y^2 f(x,y)=5sin(xy)+x2+y2的最小值,其中x的范围是[-4,4],y的取值范围是[-4,4],这是一个有多个局部极值的函数。把上例的亲和度函数更改,参数略作修改即可,详细注释参考上面。
#亲和度:与目标函数相关
def affinity(x):y = x[1]x = x[0]res = 5 * np.sin( x*y ) + x*x + y*yreturn res#激励度:根据亲和度和浓度计算,影响变异
def motivation(x,num):ND = np.zeros((1,num)) #临时nd = np.zeros((1,num)) #浓度for i in range(num):for j in range(num):tmp = np.sqrt(np.sum((x[:,i]-x[:,j])**2))if(tmp > detas):ND[0,i] = 0else:ND[0,i] = 1 nd[0,i] = np.sum(ND,axis=1)/num## 激励度MSLL = np.zeros((1,num))for i in range(num):tmp = affinity(x[:,i])MSLL[0,i] = tmpmtv = alphe * MSLL - beta * ndreturn mtv
#变异
def variation(x , gen):temp = num//2first_x = np.zeros((D,temp))for i in range(temp):tx=x[:,i].reshape((D,1))tx_rpt=np.tile(tx,10)randt=np.random.rand(1)if randt > pm:for g in range(D):for h in range(D):tx_rpt[g,h] = tx_rpt[g,h] + (np.random.rand(1) - 0.5) * (defalut / (gen+1))for j in range(D):for k in range(D):if (tx_rpt[j,k] > top) or (tx_rpt[j,k] < bottom):tx_rpt[j,k] = np.random.rand(1) * (top - bottom) + bottomtx_rpt[:,0] = tx[:,0]mvt = motivation(tx_rpt,10)index = np.argsort(mvt).flatten()temp = tx_rpt[:,index]first_x[:,i] = temp[:,0]return first_x
import numpy as np
import matplotlib.pyplot as plt
D = 2 #维度
num = 100 #个体数量
top = 4
bottom = -4
alphe = 3
beta = 1
detas = 0.3 #浓度阈值
pm = 0.6 #变异几率
trace = []
defalut = top
x = np.random.rand(D,num) * (top - bottom) + bottom #10*100gen = 1
trace = []
iteration = 80
while gen<iteration:mtv = motivation(x,num) #激励度排序index = np.argsort(mtv).flatten()sort_x = x[:,index]sort_x[:,:50] = variation(sort_x[:,:50],gen)sort_x[:,50:] = np.random.rand(D,50) * (top - bottom) + bottomgen = gen+1print("\r%d/%d" % (gen,iteration),end="")x = sort_x MSLL = np.zeros((1,num))for i in range(num):MSLL[0,i] = affinity(x[:,i])index = np.argsort(MSLL).flatten()x = x[:,index]trace.append(affinity(x[:,0]))xx = range(gen-1)
plt.plot(xx , trace)
print("\n最值:")
print(trace[-1])
plt.show()
参考:
[1].刘韬.《人工免疫系统及其数据挖掘应用研究》.中国矿业大学出版社.
[2].https://zhuanlan.zhihu.com/p/112727537
基于距离浓度的人工免疫算法(DCAIA)求函数最值(python实现)相关推荐
- 蚁群算法求最值c语言实现,蚁群算法代码(求函数最值)
<蚁群算法代码(求函数最值)>由会员分享,可在线阅读,更多相关<蚁群算法代码(求函数最值)(4页珍藏版)>请在人人文库网上搜索. 1.function F=F(x1,x2) % ...
- 蚁群算法求函数最值c语言,蚁群算法代码(求函数最值)
蚁群算法简单应用 function [F]=F(x1,x2) %目标函数 F=-(x1.^2+2*x2.^2-0.3*cos(3*pi*x1)-0.4*cos(4*pi*x2)+0.7); End f ...
- 聚类——基于距离阈值的聚类算法
基于距离阈值的聚类算法 1.最大最小距离算法 算法思想 对待分类模式样本集以最大距离选取新的聚类中心,以最小距离原则进行模式归类. 算法步骤 从N个样本集中的任选取一个样本,作为第一个聚类中心 z 1 ...
- 斐波那契法(Faboncci Method)求函数最大值的Python程序
斐波那契法(Fibonacci method)又称斐波那契分数法,是一种一维搜索的区间消去法(区间消去法(interval elimination method)求单变量函数无约束极值的较实用的一类直 ...
- Python实现遗传算法求函数最值
Python实现遗传算法求函数最值 详细源代码:GA.py 1.算法过程图解 2.详细过程举例说明 (1)待求解方程 (2)确定编码方案 主要是确定编码长度: def segment_length(s ...
- 均值定理最大值最小值公式_求函数最值问题复杂难算,只要用对方法,考试得分不用愁...
均值定理也就是我们常说的均值不等式,看到不等式这三个字,大家肯定不会觉得陌生,因为从初中开始,我们就已经接触它了,初中对于不等式的应用都是很浅显易懂的,但是到了高中,随着我们学习的知识不断加深,不等式 ...
- 二维搜索求函数极值的python程序
二维搜索,也就是优化两个未知变量,通常将二维搜索转化为一维搜索进行求解. 例题 二维搜索转一维--黄金分割 求函数二维函数A在某区间的最大值 A=( 6 - 2×l + l×cos(θ) ) × l× ...
- 读书笔记:求函数梯度的Python代码 numerical_gradient.py ← 斋藤康毅
由多元函数全部变量的偏导数汇总而成的向量称为梯度(gradient). 梯度指示的方向是各点处的函数值减小最多的方向. 下文给出了求函数 的梯度的 Python 代码. [求函数梯度的Python代 ...
- TicTacToe: 基于时序差分TD(0)算法的agent实现以及完整python实现框架
目录 1. 前言 2. TD(0) 3. 实现要点解读 3.1 Class Env 3.2 Class State 3.3 Class Agent 3.3.1 class TD0Agent(Agent ...
最新文章
- javascript—事件冒泡
- HandlerInterceptor里@Autowired对象为空的解决方法
- Redis 哨兵架构基础
- 机器人学习--智能移动机器人的有关技术演讲(浙大-熊蓉教授-2018年)
- 信息学奥赛一本通 1331:【例1-2】后缀表达式的值
- 人生重开模拟器微信小程序源码
- Asp.net如何生成html静态页面
- Netty 服务 接收新数据
- Direct3D9 Fx/HLSL的若干条有用的笔记
- JUnit5 @Tag注解示例
- c语言编写面向对象的类
- aliddns ipv6_IPv6 + aliddns 实现群晖外网控制
- 如何在论文中正确引用参考文献(自动标注)
- 我的脚本-一键禁用启用笔记本自带键盘
- python ttk style,如何改变ttk.progressBar颜色在python
- java渗透_java 渗透模型
- jAvA中deprecate,Deprecate in Java 1.6
- 新一代防泄密系统即将发布
- ios多人协作工具有哪些?支持多人同步在线使用的协同办公软件
- Add Binary 二进制求和
热门文章
- 大学物理实验报告 迈克尔逊干涉 and 三棱镜衍射
- 轮训数据库,WebSocket的前身方案:轮训API设计思路
- 信度效度难度区分度是什么意思_高考试题的效度和信度是(区分度 难度)什么意思?...
- 解决报错:WebSocket connection to ‘ws://124.207.120.104:9502/‘ failed: Error in connection establish
- 乐山市计算机学校的董事长是,乐山市计算机学校举行22周年校庆活动
- Win10日语输入法切换快捷键
- 《鬼吹灯》作者申请“鬼吹灯”商标,为什么还会被驳回?
- 《吃豆子过桥问题》——经典智力题、面试题
- atmega16 单片机 电子称重器设计 温湿度监控系统设计 proteus 仿真
- c语言编译器手机版使用说明,C语言编译器怎么用,C语言编译器使用教程