CSDN编辑器里面没有MATLAB选项,所以我为了注释更清楚,用的是//,大家不要被误解了呀,算法看代码就好了

1 免疫算法的精髓

  • 生物免疫系统:动态性免疫、自适应免疫
  • 免疫算法-保证信息的无害性、有效、抵御垃圾信息

2 理解免疫算法

生物名词 对应计算机
抗原 要解决的问题
抗原识别 问题识别
抗体 最优解
抗体增加 利用遗传算法产生新的最优解
记忆细胞产生抗体 联想过去的成功
淋巴细胞分化 优良解或者记忆能力的保持
细胞抑制 候选解的消除

3 免疫算法原理

遗传算法的交叉和变异有一定的盲目性,容易早熟收敛,因此引入免疫算法,对遗传算法全局搜索的过程进行一定强度的干预,提高算法的效率。

4 MatLab代码详解

  • 首先要进行初始化种群
%D是维度,NP是种群数目,XMin是取值下限,XMax是取值上限
function pOp = InitialPop(D,NP,XMin,XMax)pOp = rand(D,NP)*(XMax-XMin)+XMin;
end
  • 然后计算一下初始种群的抗原和抗体的亲和度,这里和遗传算法的适应度很像,其实就是函数的值
//计算函数的值
func Eval = EvalFunc(x)Eval = 5*sin(x(1)*x(2))+x(1)*x(1)+x(2)*x(2);
end//计算抗体和抗原之间的亲和度
func MSLL = EvalMSLL()for np = 1:NPMSLL(np) = EvalFunc(f(:,np));end
end
  • 然后免疫算法比较独特就是引入了个体的浓度,这样可以保证他的全局搜索性,因为浓度高的个体的数目会被抑制,这样不会在一个局部解反复搜索。
//计算个体浓度
for np = 1:NPfor j=1:NPnd(j) = sqrt(sum((f(:,np)-f(:,j)).^2));if nd(j)<detas   //detas=0.2;相似度阈值                          nd(j) = 1;elsend(j) = 0;endendND(j) = sum(nd)/NP;
end//计算个体的激励度
//alfa和belta都是激励度的系数
//浓度高的个体被抑制,与抗原亲和度高的个体被激励
MSLL = alfa*MSLL — belta*ND;
  • 按照激励度对个体进行排序
[SortMSLL,Index] = sort(MSLL);
Sortf = f(:,Index);

-免疫循环

while gen<Gfor i=1:NP/2a = Sortf(:,i);Na = repmat(a,1,Nc1);//Nc1是复制的个数,本来a是2*1的,复制以后Na变成了2*5enddeta = deta0/gen;//变异操作for j = 1:Ncfor ii = 1:Dif rand<pmNa(ii,j) = Na(ii,j)+(rand-0.5)*deta;end//边界条件处理if (Na(ii,j)<XMin) | (Na(ii,j)>XMax)Na(ii,j) = rand*(XMax-XMin)+XMin;endendendNa(:,1) = Sortf(:,i);//保留亲和度最高的个体for j = a:Nc1NaMSLL(j) = func2(Na(:,j));end[NaSortMSLL,Index] = sort(NaMSLL);aMSLL(i) = NaSortMSLL(1);NaSortf = Na(:,Index);af(:,i) = NaSortf(:,1);
end
  • 免疫种群激励度
for np = 1:NP/2for j = 1:NP/2nda(j) = sqrt(sum((af(:,np)-af(:,j)).^2));if nda(j) <detasnda(j) = 1;elsenda(j) = 0;endendaND(np) = sum(nda)/NP/2;
end
aMSLL = alfa*aMSLL - belta*aND;

-种群刷新

bf = rand(D,NP/2)*(XMax-XMin)+XMin;
for i=1:NP/2bMSLL(np) = func2(bf(:,np))
end
  • 免疫种群与新种群合并
f1 = [af,bf];
MSLL1 = [aMSLL,MSLL];
[SortMSLL,Index] = sort(MSLL);
Sortf = f1(:,Index);
gen = gen + 1;
trace(gen) = func2(Sortf(:,1));

奉上源码

上面是我自己在CDSN上敲的,CSDN代码编辑还不是很舒服,肯定会有一些错误,所以把源码给大家贴在这里,其实算法分步骤去理解也没那么难,奥里给。

%%%%%%%%%%%%%%%%%免疫算法求函数极值%%%%%%%%%%%%%%%%%%%%
%%智能算法专题设计 shiyan42.m
% 蚁群算法求解函数极值问题
% 2020/10/22
%%%%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%%%%
clear all;                                %清除所有变量
close all;                                %清图
clc;                                      %清屏
D=2;                                      %免疫个体维数
NP=50;                                    %免疫个体数目
Xs=4;                                     %取值上限
Xx=-4;                                    %取值下限
G=200;                                    %最大免疫代数
pm=0.7;                                   %变异概率
alfa=2;                                   %激励度系数
belta=1;                                  %激励度系数
detas=0.2;                                %相似度阈值
gen=0;                                    %免疫代数
Ncl=5;                                    %克隆个数
deta0=0.5*Xs;                             %邻域范围初值
%%%%%%%%%%%%%%%%%%%%%%%初始种群%%%%%%%%%%%%%%%%%%%%%%%%
f=rand(D,NP)*(Xs-Xx)+Xx;
for np=1:NPMSLL(np) = func2(f(:,np));
end
%%%%%%%%%%%%%%%%%计算个体浓度和激励度%%%%%%%%%%%%%%%%%%%
for np=1:NPfor j=1:NP     nd(j) = sum(sqrt((f(:,np)-f(:,j)).^2));if nd(j)<detasnd(j)=1;elsend(j)=0;endendND(np)=sum(nd)/NP;
end
MSLL =  alfa*MSLL - belta*ND;
%%%%%%%%%%%%%%%%%%%激励度按升序排列%%%%%%%%%%%%%%%%%%%%%%
[SortMSLL,Index] = sort(MSLL);
Sortf = f(:,Index);
%%%%%%%%%%%%%%%%%%%%%%%%免疫循环%%%%%%%%%%%%%%%%%%%%%%%%
while gen<Gfor i=1:NP/2%%%%%%%%选激励度前NP/2个体进行免疫操作%%%%%%%%%%%a = Sortf(:,i);Na = repmat(a,1,Ncl);deta = deta0/gen;for j = 1:Nclfor ii = 1:D%%%%%%%%%%%%%%%%%变异%%%%%%%%%%%%%%%%%%%if rand<pmNa(ii,j) = Na(ii,j)+(rand-0.5)*deta;end%%%%%%%%%%%%%%边界条件处理%%%%%%%%%%%%%%%if (Na(ii,j)>Xs)  |  (Na(ii,j)<Xx)Na(ii,j) = rand * (Xs-Xx)+Xx;endendendNa(:,1)=Sortf(:,i);               %保留克隆源个体%%%%%%%%%%克隆抑制,保留亲和度最高的个体%%%%%%%%%%for j=1:NclNaMSLL(j) = func2(Na(:,j));end[NaSortMSLL,Index]=sort(NaMSLL);aMSLL(i) =NaSortMSLL(1);NaSortf=Na(:,Index);af(:,i)=NaSortf(:,1);end %%%%%%%%%%%%%%%%%%%%免疫种群激励度%%%%%%%%%%%%%%%%%%%for np=1:NP/2for j=1:NP/2nda(j)=sum(sqrt((af(:,np)-af(:,j)).^2));         if nda(j)<detasnda(j)=1;elsenda(j)=0;endendaND(np)=sum(nda)/NP/2;endaMSLL =  alfa*aMSLL-  belta*aND;%%%%%%%%%%%%%%%%%%%%%%%种群刷新%%%%%%%%%%%%%%%%%%%%%%%bf=rand(D,NP/2)*(Xs-Xx)+Xx;for np=1:NP/2bMSLL(np)=func2(bf(:,np));end%%%%%%%%%%%%%%%%%%%新生成种群激励度%%%%%%%%%%%%%%%%%%%%for np=1:NP/2for j=1:NP/2ndc(j)=sum(sqrt((bf(:,np)-bf(:,j)).^2));if ndc(j)<detasndc(j)=1;elsendc(j)=0;endendbND(np)=sum(ndc)/NP/2;endbMSLL =  alfa*bMSLL-  belta*bND;%%%%%%%%%%%%%%免疫种群与新生种群合并%%%%%%%%%%%%%%%%%%%f1=[af,bf];MSLL1=[aMSLL,bMSLL];[SortMSLL,Index]=sort(MSLL1);Sortf=f1(:,Index);gen=gen+1;trace(gen)=func2(Sortf(:,1));
end
%%%%%%%%%%%%%%%%%%%%%%%输出优化结果%%%%%%%%%%%%%%%%%%%%%%%%
Bestf=Sortf(:,1);                 %最优变量
trace(end);                       %最优值
figure,plot(trace)
xlabel('迭代次数')
ylabel('目标函数值')
title('亲和度进化曲线')

免疫算法(IA)MatLab代码详解相关推荐

  1. kmeans python interation flag_机器学习经典算法-logistic回归代码详解

    一.算法简要 我们希望有这么一种函数:接受输入然后预测出类别,这样用于分类.这里,用到了数学中的sigmoid函数,sigmoid函数的具体表达式和函数图象如下: 可以较为清楚的看到,当输入的x小于0 ...

  2. 天津理工大学《操作系统》实验二,存储器的分配与回收算法实现,代码详解,保姆式注释讲解

    天津理工大学<操作系统>实验二,存储器的分配与回收算法实现,代码详解,保姆式注释讲解 实验内容 1. 本实验是模拟操作系统的主存分配,运用可变分区的存储管理算法设计主存分配和回收程序,并不 ...

  3. 关于图像显著性(MR)matlab代码详解

    本代码内容是关于Saliency Detection via Graph-Based Manifold Ranking的算法详解,想要运行此代码还需要一系列的文件,单纯此代码无法演示结果的. 可以在网 ...

  4. MeanTeacher文章解读+算法流程+核心代码详解

    MeanTeacher 本博客仅做算法流程疏导,具体细节请参见原文 原文 原文链接点这里 Github 代码 Github代码点这里 解读 论文解读点这里 算法流程 代码详解 train_transf ...

  5. 【MATLAB】Parzen窗与K近邻算法原理与代码详解

    文章目录 1.非参数估计原理 2.Parzen窗 2.1.算法原理 2.2.Matlab实现与参数探究 3.K近邻 3.1.算法原理 3.2.Matlab实现与参数探究 1.非参数估计原理 \qqua ...

  6. 认知无线电matlab代码详解,认知无线电频谱感知之功率检测matlab代码.docx

    认知无线电频谱感知之功率检测matlab代码 能量检测仿真实验代码:clear all;clc;n = 5;ps = 1;SNR1 = -5;SNR2 = -8;SNR3 = -10;% Sim_Ti ...

  7. python自然语言处理实战核心技术与算法——HMM模型代码详解

    本人初学NLP,当我看着<python自然语言处理实战核心技术与算法>书上这接近200行的代码看着有点头皮发麻,于是我读了接近一天基本把每行代码的含义给读的个七七八八,考虑到可能会有人和我 ...

  8. 基于Matlab的遗传算法优化BP神经网络的算法实现(附算法介绍与代码详解)

    目录 一.内容提要 二.算法简介 2.1 遗传算法(Genetic Algorithm,GA) 2.2 BP(Back Propagation)神经网络 三.实例计算 四.代码解读 代码运行 代码获取 ...

  9. 鲸鱼算法matlab代码详解(一)

    主函数 clear all  clc SearchAgents_no=30; %此处为搜索代理的数量,也就是种群的数量 Function_name='F1'; %此处为调用目标函数的信息编号 Max_ ...

最新文章

  1. LeetCode: 104. Maximum Depth of Binary Tree
  2. 简述CISCO防火墙透明模式
  3. 启动ServerManager
  4. WH-G405tf连接公网服务器进行透传
  5. Python 入门篇-最新版python3.7.2的安装。
  6. java中跳出当前循环怎么做_在java中,如何跳出当前的多重循环?
  7. CodeForces - 224C. Bracket Sequence (栈模拟)简单做法
  8. [XML-Jsoup]Jsoup_对象的使用(Jsoup工具类,Document,Elements,Element,Node)
  9. 从四个问题透析Linux下C++编译链接
  10. 基于C++、MySQL的图书销售管理系统
  11. 软件开发过程文档规范说明书--敲重点
  12. BOSS直聘下载自己的简历要钱!而且是PDF格式 - 解决方法
  13. 链路状态路由协议-OSPF
  14. 命令 / Linux / apt remove 和 apt purge 的区别
  15. 数据库连接池种类、C3P0数据库连接池、德鲁伊数据库连接池
  16. Ubuntu命令笔记
  17. 网易员工哀叹:来公司一年,被裁员搞得没心情上班,想考公务员
  18. 怎样把计算机添加到网络打印机,电脑怎么添加打印机共享
  19. 根据网络上的视频的m3u8文件通过ffmpeg进行合成视频
  20. 【PP生产订单】入门介绍(一)

热门文章

  1. 河北省省赛重现赛-K Multiple Longest Commom Subsequence
  2. 微信小程序开发导航:精品教程+网友观点+demo源码(5月9日更新)
  3. java程序u盘照片自动复制粘贴_U盘自动复制文件
  4. 中国石油大学《浏览器/服务器系统》第一次在线作业
  5. 74HC165D驱动 2021-05-08
  6. 适合宝妈做的副业有哪些?
  7. ESP32控制舵机转动,使用blinker实现远程开关宿舍灯/宿舍门
  8. QT之QCustomPlot绘图实现8通道串口虚拟示波器
  9. 面向特定问题的开源算法管理和推荐(十五)
  10. DSPE-PEG-APRPG, APRPG-PEG-DSPE,磷脂-聚乙二醇-靶向肽APRPG