基于免疫优化算法的TSP算法

article/2025/9/24 12:36:23

文章目录

  • 一、理论基础
  • 二、案例背景
    • 1、问题描述
    • 2、解决思路及步骤
      • (1). 算法流程
      • (2). 算法实现过程
  • 三、MATLAB程序实现
    • 1、程序源码
    • 2、结果分析
  • 四、参考文献

一、理论基础

TSP(traveling salesman problem,旅行商问题)是典型的NP完全问题,即其最坏情况下的时间复杂度随着问题规模的增大按指数方式增长,到目前为止还未找到一个多项式时间的有效算法。
TSP问题可描述为:已知 n n n个城市相互之间的距离,某一旅行商从某个城市出发访问每个城市有且仅有一次,最后回到出发城市,如何安排才使其所走路线距离最短。简言之,就是寻找一条最短的遍历 n n n个城市的路径,或者说搜索自然子集 X = { 1 , 2 , ⋯ , n } X=\{1,2,\dotsm,n\} X={1,2,,n}( X X X的元素表示对 n n n个城市的编号)的一个排列 π ( X ) = { V 1 , V 2 , ⋯ , V n } π(X)=\{V_1,V_2,\dotsm,V_n\} π(X)={V1,V2,,Vn},使得 T d = ∑ i = 1 n + 1 d ( V i , V i + 1 ) + d ( V n , V 1 ) T_d=\sum_{i=1}^{n+1} {d(V_i,V_{i+1})}+d(V_n,V_1) Td=i=1n+1d(Vi,Vi+1)+d(Vn,V1)取得最小值,其中 d ( V i , V i + 1 ) d(V_i,V_{i+1}) d(Vi,Vi+1)表示城市 V i V_i Vi到城市 V i + 1 V_{i+1} Vi+1的距离。

二、案例背景

1、问题描述

假设有一个旅行商人要拜访某些城市,他需要选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择要求是:所选路径的路程为所有路径之中的最小值。
具体城市个数及位置可参考:
链接:https://pan.baidu.com/s/1eJZXhoM8hjvp-3UGhzYZQw
提取码:wxyz
其中一个城市位置分布图如图1所示。
在这里插入图片描述

图1 城市分布图

2、解决思路及步骤

(1). 算法流程

免疫优化算法求解TSP问题的流程如图2所示。
在这里插入图片描述

图2 算法流程图

(2). 算法实现过程

(1)初始化免疫个体维数为城市个数 N N N,免疫种群个体数为 N P = 200 NP=200 NP=200,最大免疫代数为 G = 1000 G=1000 G=1000,克隆个数为 N c l = 10 Ncl=10 Ncl=10,计算任意两个城市间的距离矩阵 D D D
(2)随机产生初始种群,计算个体亲和度(即路径距离),并按亲和度升序排列。
(3)在取亲和度前对 N P / 2 NP/2 NP/2个个体进行克隆操作,并对每个源个体产生的克隆个体进行任意交换两个城市的变异操作;然后计算其亲和度,进行克隆抑制操作,只保留亲和度最高的个体,从而产生新的免疫种群。
(4)随机生成 N P / 2 NP/2 NP/2个个体的新种群,并计算个体亲和度;免疫种群和随机种群合并,按亲和度排序,进行免疫迭代。
(5)判断是否满足终止条件:若满足,则结束搜索过程,输出优化值;若不满足,则继续进行迭代优化。

三、MATLAB程序实现

1、程序源码

  • 计算路径长度函数
function len = PathLength(D, Chrom)
%% 计算各个体的路径长度
% 输入:
% D     两两城市之间的距离
% Chrom 个体的轨迹
[row, col] = size(D);
NIND = size(Chrom,1);
len = zeros(NIND,1);
for i = 1:NINDp = [Chrom(i,:) Chrom(i,1)];i1 = p(1:end-1);i2 = p(2:end);len(i, 1) = sum(D((i1-1)*col+i2));
end
  • 输出路径信息的函数
function p = OutputPath(R)
%% 输出路径函数
%输入:R 路径
R = [R, R(1)];
N = length(R);
p = num2str(R(1));
for i = 2:Np = [p,'—>',num2str(R(i))];
end
disp(p)
  • 画出路线轨迹图的函数
function DrawPath(Chrom,X)
%% 画路径函数
% 输入
% Chrom      待画路径
% X          各城市坐标位置
R = Chrom(1, :);       % 一个随机解(个体)
n = size(X, 1);
figure;
plot([X(R(1), 1), X(R(n), 1)], [X(R(1), 2) ,...X(R(n), 2)], 'ms-', 'LineWidth', 2, 'MarkerEdgeColor', 'k', 'MarkerFaceColor', 'g')
hold on
for i = 2:nplot([X(R(i-1), 1),X(R(i), 1)], [X(R(i-1), 2),...X(R(i), 2)], 'ms-', 'LineWidth', 2, 'MarkerEdgeColor', 'k', 'MarkerFaceColor', 'g')hold on
end
plot(X(R(1), 1), X(R(1), 2), 'bv', 'MarkerSize', 20)
plot(X(R(end), 1), X(R(end), 2), 'bs', 'MarkerSize', 20)
text(X(R(1),1)+0.03, X(R(1),2)+0.03, [' 起点' num2str(R(1))], 'color', [1,0,0]);
text(X(R(end),1)+0.03, X(R(end),2)+0.03, [' 终点' num2str(R(end))], 'color', [1,0,0]);
for i = 1:size(X,1)if R(1) ~= i && R(end) ~= itext(X(i,1)+0.03, X(i,2)+0.03, num2str(i), 'color', [0,0,0]);end
end
grid on
xlabel('横坐标')
ylabel('纵坐标')
title('轨迹图')
  • 主函数
clear;
clc;
%% 加载数据,画出城市位置
load CityPosition3.mat
figure;
plot(X(:, 1), X(:, 2), 'ms', 'LineWidth', 2, 'MarkerEdgeColor', 'k', 'MarkerFaceColor', 'g')
for i = 1:size(X, 1)text(X(i, 1)+0.03, X(i, 2)+0.03, num2str(i));
end
legend('城市位置')
title('城市分布图', 'fontsize', 12)
xlabel('km', 'fontsize', 12)
ylabel('km', 'fontsize', 12)
grid on;
%% 初始化参数
N = size(X, 1);        % 城市数量
D = zeros(N);          % 距离矩阵
% 求任意两个城市距离间隔矩阵
for i = 1:Nfor j = i+1:ND(i, j) = sqrt(sum((X(i, :)-X(j, :)).^2));D(j, i) = D(i, j);    % 利用D是对称矩阵的性质end
end
NP = 200;                           % 免疫个体数目
G = 1000;                           % 最大免疫代数
Chrom = zeros(NP, N);       % 种群
% 初始化种群
for i = 1:NPChrom(i, :) = randperm(N);           % 随机生成初始种群
end
len = PathLength(D, Chrom);            % 各个体路径长度
[Sortlen, Index] = sort(len);
SortChrom = Chrom(Index, :);     % 种群个体排序
gen = 1;                                % 免疫代数初值
Ncl = 10;                               % 克隆个数
%% 画出随机解的路线图
DrawPath(Chrom(1, :), X); 
%% 输出随机解的路线和总距离
disp('初始种群中的一个随机值:')
OutputPath(Chrom(1,:));
Rlength = PathLength(D,Chrom(1,:));
disp(['总距离:', num2str(Rlength)]);
disp('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
%% 免疫算法迭代优化
while gen<Gfor i = 1:NP/2%% 选亲和度前NP/2个个体进行免疫操作c = SortChrom(i, :);chrom = repmat(c, Ncl, 1);for j = 1:Nclwhile 1p1 = floor(1+N*rand());p2 = floor(1+N*rand());if p1 ~= p2break;endendtemp = chrom(j, p1);chrom(j, p1) = chrom(j, p2);chrom(j, p2) = temp;endchrom(1, :) = SortChrom(i, :);   % 保留克隆源个体           %% 克隆抑制,保留亲和度最高的个体chromLen = PathLength(D, chrom);[SortChromLen, index] = sort(chromLen);Sortchrom = chrom(index, :);ch(i, :) = Sortchrom(1, :);chLen(i) = SortChromLen(1);end%% 种群更新for i = 1:NP/2rc(i, :) = randperm(N);         % 随机生成种群end  rcLen = PathLength(D, rc); % 计算路径长度%% 免疫种群与新种群合并Chrom = [ch; rc];len = [chLen'; rcLen];[Sortlen, index] = sort(len);SortChrom = Chrom(index, :);% 迭代次数加1,记录最优值trace(gen) = Sortlen(1);gen = gen+1;
end
%% 画出最优解的路线图
ShortestPath = SortChrom(1, :);         % 最优路径
ShortestLength = trace(end);            % 最短距离
DrawPath(ShortestPath, X)
figure;
plot(trace, 'r', 'LineWidth', 2);
xlabel '迭代次数'; ylabel '路径距离';
title '亲和度进化曲线';
%% 输出最优解的路线和总距离
disp('最优路线:')
p = OutputPath(ShortestPath);
disp(['最短距离:', num2str(ShortestLength)]);
disp('-------------------------------------------------------------')

2、结果分析

优化前的一个随机路线轨迹图如图3所示。

图3 随机路线图

在这里插入图片描述

初始种群中的一个随机值:
20>31>18>25>8>9>7>19>27>10>2>26>16>1>6>15>28>13>14>22>17>3>21>23>12>4>29>11>30>24>5>20
总距离:42.7564
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

优化后的路线轨迹如图4所示。
在这里插入图片描述

图4 优化后的路线轨迹图
亲和度进化曲线如图5所示。

在这里插入图片描述

图5 亲和度进化曲线
最优路线:
14>12>13>7>5>2>10>9>8>4>16>6>11>23>20>21>22>18>3>17>19>24>25>26>28>27>30>31>29>1>15>14
最短距离:15.9262
-------------------------------------------------------------

由优化图可以看出,优化前后路径长度得到很大改进,接近300代后路径长度已经保持不变了,可以认为是最优解了,总距离由优化前的42.7564减少到优化后的15.9262,减为原来的37.2%。

四、参考文献

[1] 凯旋16668. 【啃书】《智能优化算法及其MATLAB实例》例4.3免疫算法求解TSP问题. CSDN博客.
[2] 曲怪曲怪. 智能算法之免疫算法求解TSP问题. CSDN博客.
[3] 杨震, 陈立万, 刘莎, 等. 基于免疫克隆多目标优化的WSN覆盖控制研究[J]. 电脑知识与技术, 2018, 14(28): 172-175+181.


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

相关文章

2018-4-8免疫算法(Immune IA)

学习资料来源&#xff1a; 【图文】免疫算法_百度文库 https://wenku.baidu.com/view/39eb47ec551810a6f52486ee.html?sxts1523143415445 《智能优化算法以及matlab实现》包子阳&#xff0c;余继周 编著 自己觉的好资源&#xff0c;但是看不懂 三种人工免疫算法综述_图文…

免疫算法(二进制)算例(源码实现)

之前我们讲解了免疫算法以及离散的免疫算法。见链接&#xff1a; 万字长文了解免疫算法原理 及求解复杂约束问题&#xff08;源码实现&#xff09; 离散免疫算法求解旅行商问题(源码实现) 今天讲下二进制的免疫算法。 我爱学习&#xff0c;爱玉酱。 算例 假设一个数PD210&#…

免疫算法(Immune Algorithm)

概念 人工免疫算法(Immune Algorithm)是一种具有生成检测 (generate and test)的迭代过程的群智能搜索算法。从理论上分析&#xff0c;迭代过程中&#xff0c;在保留上一代最佳个体的前提下&#xff0c;遗传算法是全局收敛的。 对于遗传算法&#xff1a;在对算法的实施过程中…

人工免疫算法概述

一、免疫系统 什么是病毒&#xff1f; 病毒是一种简单的生活形式&#xff1a;包裹在保护壳中的一些基因。这些基因是制造新病毒的指令。 在细胞外&#xff0c;病毒无法繁殖。但是一旦病毒入侵了活细胞&#xff0c;它就会将该细胞变成病毒工厂。随着时间的流逝&#xff0c;成…

人工智能-免疫算法

这是一类智能的算法&#xff0c;没有什么固定的模式&#xff0c;就是一个算法思想&#xff0c;可以给我们一些有价值的指导&#xff0c;当我们想要做一些相关工作的时候&#xff0c;可以扩宽我们的视野&#xff0c;打开我们的脑洞&#xff0c;借鉴其中的原理。我不想多说里面的…

免疫算法Python实现

1.流程 免疫算法与遗传算法其实非常相似&#xff0c;但其独特的地方在于&#xff0c;免疫算法用激励度而非亲和度来衡量结果的好坏&#xff0c;而激励度又与抗体密度有关&#xff0c;这就使得密度大的抗体激励度反而小&#xff0c;让免疫算法有全局搜索的能力&#xff0c;不容易…

免疫算法详解

基本思想是将想要求解的各类优化问题的目标函数&#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&…