MATLAB智能算法 - Immunity Algorithm免疫算法

Immunity Algorithm免疫算法

智能算法是路线规划、深度学习等等一系列领域所使用的优化算法,是算法进阶之路的必备之路。

前言:本文主要围绕解决TSP旅行商问题展开,对于机器人的路线规划以及非线性方程求解的问题等解决方案
对于一些其他智能算法例如遗传算法解决一些现实问题都有实现!!

效果图:

效果图

1、什么是免疫算法

  将免疫概念及其理论应用于遗传算法,在保留原算法优良特性的前提下,力图有选择、有目的地利用待求问题中的一些特征信息或知识来抑制其优化过程中出现的退化现象,这种算法称为免疫算法(Immune Algorithm) IA。人工免疫算法是一种具有生成+检测 (generate and test)的迭代过程的群智能搜索算法。从理论上分析,迭代过程中,在保留上一代最佳个体的前提下,免疫算法是全局收敛的。

摘自百度百科

  也就是说,免疫算法的思想来自于生物体的免疫机制,构造具有动态性和自适应性的信息防御机制,用来抵抗外部无用的有害信息的侵入(退化解),从而保证信息的有效性和无害性(最优解)。
:退化解的来自于变异等操作过后的适应度值低于父类的解。

1.1 生物免疫系统

  在生物课上学过,免疫系统的构成元素主要是淋巴细胞,淋巴细胞包括B细胞和T细胞。

  • T细胞主要在收到抗原刺激后可以分化成淋巴母细胞,产生多种淋巴因子,引起细胞免疫反应。
  • B细胞又称为抗体形成细胞,可以产生抗体,抗体会同抗原产生一系列的反应,最后通过吞噬细胞的作用来消灭抗原。并且抗体具有专一性,而且免疫系统具备识别能力和记忆能力,可以对旧抗原做出更快的反应。

免疫系统和一般免疫算法的比较:

免疫系统免疫算法
抗原待解决的问题,例如方程最优解、TSP等等
抗体最优解
抗原识别问题识别
从记忆细胞产生抗体找到以往的成功例子
淋巴细胞的分化最优解的保持
细胞抑制剩余候选解的消除
抗体增强利用遗传算子产生新的抗体

1.2 免疫算法的基本原理

  免疫遗传算法解决了遗传算法早熟收敛的问题,有可能陷入局部最优解的情况,并且遗传算法具有一定的盲目性,尤其是在交叉和变异的过程中。容易产生相较于父类更加差的解,也就是退化现象的出现。如果在遗传算法中引入免疫的方法和概念,对遗传算法全局搜索进行干预,就避免了很多重复的工作。

  免疫算法在面对求解问题的时候,相当于面对各种抗原,可以提前注射疫苗,来一只退化的现象,从而保持优胜略汰的特点,使算法一直优化下去。

一般的免疫算法分为下面 3 种情况。

  1. 模仿免疫系统抗体与抗原的识别,结合抗体的产生过程而抽象出来的免疫算法。
  2. 基于免疫系统中的其他特殊机制抽象出来的算法,例如克隆选择算法。
  3. 和其他智能算法等其他的算法进行融合,例如免疫遗传算法。

1.3 免疫算法的基本步骤和流程

2、免疫遗传算法

  免疫遗传算法和遗传算法的结构一致,最大的不同之处在于在免疫遗传算法中引入了浓度调节机制。在进行选择操作的时候,遗传算法制只利用了适应度指标对个体进行评价;在免疫遗传算法当中,免疫遗传算法中的选择策略变为:适应度越高,浓度越小,个体复制的概率越大,反之越小。

  免疫遗传算法的基本思想就是在传统的算法基础上加入一个免疫算子,加入免疫算子的目的就是为了防止种群的退化。免疫算子有接种疫苗和免疫选择两个步骤组成。免疫遗传算法可以有效地调节选择压力。因此免疫算法可以保持种群多样性的能力。

免疫遗传算法的步骤和流程:

免疫遗传算法流程

3、免疫算法在TSP问题中的应用

  TSP问题是所有智能算法都要解决的问题,TSP问题就是旅行商问题,旅行商要遍历所有的城市,并且城市仅能通过一次,并且保证所经过的城市的路径最小。

3.1、免疫算法的结构

  对于个体的编码仍然采用和遗传算法中相同的实数编码结构。由于本例中要求路径最低,适应度函数就取为路径的倒数。

  采用单点交叉,交叉的位置随机,类似与遗传算法。每次遗传操作后,随机抽取一些个体进行注射抗体,进行免疫检测,即对接种了个体进行检测,如果适应度提高,则继续,否则就代表着在进行交叉和变异的过程中出现了退化现象,这时个体就会被父类代替,就是下面的表达式:

父类适应度 < 子类适应度 ? 子类 : 父类

3.2、求解 TSP 问题流程图

3.3、免疫遗传算法-TSP MatLab 实现

  主要是对参数进行初始化,包括对一些概率参数、初始种群矩阵,城市初始位置、城市之间的距离矩阵等等。
参数初始化:

N = 20;               
%城市的个数
M = N - 1;               
%种群的个数
pos = 50 * randn(N,2);
%%生成城市的坐标
global D;
%城市距离数据
D = zeros(N,N);
for i = 1 : Nfor j = i + 1 : Ndis = (pos(i, 1)-pos(j, 1)).^2+(pos(i, 2)-pos(j, 2)).^2;D(i, j) = dis^(0.5);D(j, i) = D(i, j);end
end%中间结果保存
global TmpResult;
TmpResult = [];
global TmpResult1;
TmpResult1 = [];[M, N] = size(D);  % 种群规模
pCharChange = 1;  % 个体换位概率
pStrChange = 0.4;  % 个体移位概率
pStrReverse = 0.4;  % 个体逆转概率
pCharReCompose = 0.4;  % 个体重组概率
MaxIterateNum = 100;  % 迭代次数mPopulation = zeros(N-1,N);
mRandM = randperm(N-1);  % 最优路径
mRandM = mRandM + 1;
for rol = 1:N-1mPopulation(rol,:) = randperm(N);%产生初始抗体
end

迭代过程:

count = 0;
figure(2);
while count < MaxIterateNum% 产生新抗体B = Mutation(mPopulation, [pCharChange pStrChange pStrReverse pCharReCompose]);% 计算新产生的抗体对应的适应度,并选择最优抗体mPopulation = SelectAntigen(mPopulation,B);% 保存每一代最优的个体best_pop(count + 1, :) = mPopulation(1, :);count = count + 1;
end

  变异过程,变异的过程主要保存移位、换位、逆转以及重组操作,这几个操作之间相互独立,最后拼接在一起后返回。
变异操作:

function result = Mutation(A, P)
[m,n] = size(A);
% 换位
n1 = round(P(1)*m);  % 变异的个体数
m1 = randperm(m);  % 混淆个体顺序
cm1 = randperm(n-1)+1;  % 个体变异的位置
B1 = zeros(n1,n);  % 保存变异后的个体
c1 = cm1(n-1);
c2 = cm1(n-2);
for s = 1:n1B1(s,:) = A(m1(s),:);tmp = B1(s,c1);B1(s,c1) = B1(s,c2);B1(s,c2) = tmp;
end% 移位
n2 = round(P(2)*m);
m2 = randperm(m);
cm2 = randperm(n-1)+1;
B2 = zeros(n2,n);
c1 = min([cm2(n-1),cm2(n-2)]);
c2 = max([cm2(n-1),cm2(n-2)]);
for s = 1:n2B2(s,:) = A(m2(s),:);B2(s,c1:c2) = DisplaceStr(B2(s,:),c1,c2);
end% 逆转
n3 = round(P(3)*m);
m3 = randperm(m);
cm3 = randperm(n-1)+1;
B3 = zeros(n3,n);
c1 = min([cm3(n-1),cm3(n-2)]);
c2 = max([cm3(n-1),cm3(n-2)]);
for s = 1:n3B3(s,:) = A(m3(s),:);tmp1 = [[c2:-1:c1]',B3(s,c1:c2)'];tmp1 = sortrows(tmp1,1);B3(s,c1:c2) = tmp1(:,2)';
end% 重组
n4 = round(P(4)*m);
m4 = randperm(m);
cm4 = randperm(n-1)+1;
B4 = zeros(n4,n);
c1 = min([cm4(n-1),cm4(n-2)]);
c2 = max([cm4(n-1),cm4(n-2)]);
for s = 1:n4B4(s,:) = A(m4(s),:);B4(s,c1:c2) = CharRecompose(B4(s,c1:c2));
end% 变异后个体拼接
result = [B1;B2;B3;B4];

上面的涉及几个函数分别是DisplaceStr()以及CharRecompose()

function result = DisplaceStr(inMatrix, startCol, endCol)
[m,n] = size(inMatrix);
if n <= 1result = inMatrix;return;
end
switch nargincase 1startCol = 1;endCol = n;case 2endCol = n;
end
mMatrix1 = inMatrix(:,(startCol + 1):endCol);
result = [mMatrix1, inMatrix(:, startCol)];function result = CharRecompose(A)
global D;
index = A(1,2:end);
tmp = A(1,1);
result = [tmp];
[m,n] = size(index);
while n>=2len = D(tmp,index(1));tmpID = 1;for s = 2:nif len > D(tmp,index(s))tmpID = s;len = D(tmp,index(s));endendtmp = index(tmpID);result = [result,tmp];index(:,tmpID) = [];[m,n] = size(index);
end
result = [result,index(1)];

  选择优秀的个体继续进行后续的操作,对于退化或者次优解进行去除。
选择抗体:

function result = SelectAntigen(A,B)
global D;
[m,n] = size(A);
[p,q] = size(B);
index = [A;B];
rr = zeros((m+p),2);
rr(:,2) = [1:(m+p)]';
for s = 1:(m+p)for t = 1:(n-1)rr(s,1) = rr(s,1)+D(index(s,t),index(s,t+1));endrr(s,1) = rr(s,1) + D(index(s,n),index(s,1));
end
rr = sortrows(rr,1);
ss = [];
tmplen = 0;
for s = 1:(m+p)if tmplen ~= rr(s,1)tmplen = rr(s,1);ss = [ss;index(rr(s,2),:)];end
end
global TmpResult;
TmpResult = [TmpResult;rr(1,1)];
global TmpResult1;
TmpResult1 = [TmpResult1;rr(end,1)];
result = ss(1:m,:);

4、结果

结果展示 结果展示

注: 为了说明方便将代码直接拆开展示如果需要源码可以直接最后的源码地址中找到。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/454606.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Rust的泛型基础与实践

什么是泛型&#xff1f; 想象一下&#xff0c;我们想定义一个函数&#xff0c;它可以用来计算任意类型数据的最大值。如果我们只考虑整数&#xff0c;我们可以这样写&#xff1a; fn max(a: i32, b: i32) -> i32 {if a > b {a} else {b} }但是&#xff0c;如果我们还想…

【每日刷题】Day142

【每日刷题】Day142 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 1219. 黄金矿工 - 力扣&#xff08;LeetCode&#xff09; 2. 980. 不同路径 III - 力扣&#xff0…

C++20中头文件ranges的使用

<ranges>是C20中新增加的头文件&#xff0c;提供了一组与范围(ranges)相关的功能&#xff0c;此头文件是ranges库的一部分。包括&#xff1a; 1.concepts: (1).std::ranges::range:指定类型为range&#xff0c;即它提供开始迭代器和结束标记(it provides a begin iterato…

MP9928模块分析

MP9928 是一款高性能的同步降压 DC/DC 转换器控制器 IC&#xff0c;具有宽输入范围。以下是其操作和关键特性的总结&#xff1a; 概述 电流模式控制&#xff1a;MP9928 使用电流模式、可编程开关频率控制架构&#xff0c;通过外部 N 沟道 MOSFET 开关来调节输出电压。 反馈和…

PRCV2024:可信AI向善发展与智能文档加速构建

目录 0 写在前面1 GAI时代的挑战&#xff1a;图像内容安全1.1 图像篡改与对抗攻击1.2 生成式图像鉴别1.3 人脸鉴伪模型体验1.4 助力可信AI向善发展 2 GAI时代的机遇&#xff1a;大模型加速器2.1 TextIn大模型加速器2.2 通用文档解析2.3 文本向量模型 3 总结 0 写在前面 中国模…

认识一下:__asm { int 80h; LINUX - sys_fork }

这行代码 __asm { int 80h; LINUX - sys_fork } 使用了汇编语言的语法来直接调用 Linux 系统调用 fork。下面是对这行代码的详细解析&#xff1a; 代码解析 __asm: 这是一个用于嵌入汇编代码的指令&#xff0c;通常在 C 或 C 代码中使用&#xff0c;允许开发者直接插入汇编语言…

信息安全系统设计第七周

文章目录 密码系统设计学习内容AI 对学习内容的总结&#xff08;1分&#xff09;要求总结 第10章&#xff1a;身份认证和PKI理论基础第11章&#xff1a;实战PKI对 AI 总结的反思与补充&#xff08;2分&#xff09;要求反思与补充 学习思维导图&#xff08;2分&#xff09;要求思…

Pytorch 实现图片分类

CNN 网络适用于图片识别&#xff0c;卷积神经网络主要用于图片的处理识别。卷积神经网络&#xff0c;包括一下几部分&#xff0c;输入层、卷积层、池化层、全链接层和输出层。 使用 CIFAR-10 进行训练&#xff0c; CIFAR-10 中图片尺寸为 32 * 32。卷积层通过卷积核移动进行计…

告别微信封号!学会这5招,让你的账号坚不可摧

在这个信息爆炸的时代&#xff0c;无论是工作沟通、社交互动还是获取信息&#xff0c;微信都扮演着极其重要的角色。但是&#xff0c;随着微信平台规则的日益严格&#xff0c;账号被封的风险也随之增加。今天&#xff0c;我们就来聊聊如何有效防止 微信被封&#xff0c;让你的账…

【RL Latest Tech】安全强化学习(Safe RL):理论、方法与应用

&#x1f4e2;本篇文章是博主强化学习&#xff08;RL&#xff09;领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对相关等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅…

Python | Leetcode Python题解之第486题预测赢家

题目&#xff1a; 题解&#xff1a; class Solution:def PredictTheWinner(self, nums: List[int]) -> bool:length len(nums)dp [0] * lengthfor i, num in enumerate(nums):dp[i] numfor i in range(length - 2, -1, -1):for j in range(i 1, length):dp[j] max(num…

uniapp结合uview-ui创建项目

准备工作&#xff1a; 下载HBuilderX;官网地址:HBuilderX-高效极客技巧 安装node.js;官网地址&#xff1a;Node.js — 在任何地方运行 JavaScript,下载所需版本&#xff0c;安装后配置好环境变量即可 方式一&#xff08;NPM安装方式&#xff09;&#xff1a; 1、打开开发者…

代码随想录-哈希表-两个数组的交集

题目与思路 这个题目可以用大小为1000的数组&#xff0c;因为限制了变量大小。我用的是set&#xff0c;感觉这个才是本意。 下面代码是用set实现的hash结构。先用set1存储nums1中的去重元素&#xff0c;然后用set2存储结果集 最后将set转为array用了两种方式&#xff0c;一是…

LINUX设备OTA时无法从HTTP服务器(TOMCAT)下载文件

疑难问题排查记录 问题 linux设备作为http客户端&#xff0c;执行OTA前先从HTTP服务器下载bin固件&#xff0c;测试nginx没有问题&#xff0c;nodejs编写的HTTP服务器也没有问题&#xff0c;而软件同事使用的Tomcat则无法成功下载。 排查经过 首先利用chrome浏览器测试下载…

WebGl 实现图片平移、缩放和旋转

1.图片平移 在WebGL中实现图片平移&#xff0c;可以通过修改顶点着色器中的顶点位置来实现。平移的基本思想是将每个顶点的位置向量沿着指定的方向&#xff08;通常是x轴和y轴&#xff09;进行平移。在顶点着色器中&#xff0c;可以通过添加或减去一个统一的偏移量&#xff08…

「AIGC」n8n AI Agent开源的工作流自动化工具

n8n AI Agent 是一个利用大型语言模型(LLMs)来设计和构建智能体(agents)的工具,这些智能体能够执行一系列复杂的任务,如理解指令、模仿类人推理,以及从用户命令中理解隐含意图。n8n AI Agent 的核心在于构建一系列提示(prompts),使 LLM 能够模拟自主行为。 传送门→ …

C++:stack 和 queue 的使用和模拟实现

使用 要注意&#xff0c;stack 和 queue 没有迭代器。 stack void teststack() {stack<int> st;st.push(1);st.push(2);st.push(3);st.push(4);st.push(5);cout << st.size() << endl;while (!st.empty()){cout << st.top() << " ";…

电机编码器

旋转式编码器 链接: 野火编码器 单圈&#xff0c;多圈绝对式编码器 在单圈绝对值编码器中&#xff0c;单圈并不表示编码器机械转动的圈数&#xff0c;而是指断电记忆的范围。实际上&#xff0c;机械转动是可以无限制地进行圈数的&#xff0c;但是断电记忆仅限于一圈的范围内…

构建后端为etcd的CoreDNS的容器集群(二)、下载最新的etcd容器镜像

在尝试获取etcd的容器的最新版本镜像时&#xff0c;使用latest作为tag取到的并非最新版本&#xff0c;本文尝试用实际最新版本的版本号进行pull&#xff0c;从而取到想的最新版etcd容器镜像。 一、用latest作为tag尝试下载最新etcd的镜像 1、下载镜像 [rootlocalhost opt]# …

bash之基本运算符

一.算术运算符 vim test.sh #!/bin/basha10 b20valexpr $a $b echo "a b : $val"valexpr $a - $b echo "a - b : $val"valexpr $a \* $b echo "a * b : $val"valexpr $b / $a echo "b / a : $val"valexpr $b % $a echo "b % a …