一、免疫算法结合蚁群算法求解旅行商问题简介

1 引言
旅行商问题(Traveling Salesman Problem,TSP)是具有重要意义的组合优化难题,已被证明属于NPC问题。它可简述为:给定一个边赋权图G=(V,E),寻找G的Hamilton圈C,使得C的总权ω(C)最小。TSP问题描述简单却难以求解,因而一直作为衡量各种优化算法性能的标准。近年来,人们从仿生学的机理中受到启发,提出了许多用于求解TSP问题的新方法,如:禁忌搜索算法、遗传算法、摸拟退火算法、人工免疫算法和蚁群算法等。然而,面对TSP问题的复杂性,每种算法都表现出各自的优势和缺陷。

人工免疫算法(Artificial Immune Algorithm,AIA)是近几年才提出的一种随机优化方法,它模拟生物免疫系统,用亲和力来描述抗体与抗原之间的匹配程度,用排斥力来描述两个抗体之间的相似程度,依据抗体与抗原之间的亲和力以及抗体与抗体之间的排斥力来选择抗体。在用AIA求解优化问题时,一个抗体用一个字符串表示,满足约束条件的最优解即是抗原,候选解即是抗体。抗体与抗原之间的亲和力反映了候选解与最优解的接近程度,也即反映候选解对目标函数和约束条件的满足程度;抗体与抗体之间的排斥力反映了不同候选解之间的异同,也即反映了抗体的多样性。保持抗体的多样性可以防止算法陷入局部最优解。AIA具有快速随机的全局搜索能力,但对于系统中的反馈信息利用不足,当求解到一定范围时往往做大量无为的冗余迭代,求解效率低。

蚁群算法(Ant Colony Algorithm,ACA)是由意大利学者M.Dorigo,A.Colorni,V.Manizzo等在90年代初提出来的一类新的模拟进化算法,它通过信息素的积累和更新来寻求最优解。它的特点是模拟自然界中蚂蚁的群体行为。科学家们发现,蚂蚁有能力在没有任何提示下找到从巢穴到食物源的最短路径,并且能随环境的变化而变化,适应性地搜索新的路径,产生新的选择。经研究发现,其根本原因是蚂蚁在寻找食物源时,在其走过的路上释放一种特殊的分泌物–信息素,后来的蚂蚁选择该路径的概率与当时这条路径上该物质的强度成正比。当一定路径上通过的蚂蚁越来越多时,其留下的信息素轨迹也越来越多,后来的蚂蚁选择该路径的概率也越高,从而更增加了该路径的信息素强度。而强度大的信息素会吸引更多的蚂蚁,从而形成一种正反馈机制。通过这种正反馈机制,蚂蚁最终可以发现最短路径。特别是,当蚂蚁巢穴与食物源之间出现障碍物时,蚂蚁不仅可以绕过障碍物,而且通过蚁群信息素轨迹在不同路径上的变化,经过一定时间的正反馈,最终收敛到最短路径。ACA具有分布式并行全局搜索能力,但由于初期信息素匮乏,致使求解速度缓慢。

2 基于人工免疫算法和蚁群算法的混合算法
2.1 算法的设计思想

基于人工免疫算法和蚁群算法的混合算法,其基本思想是算法前过程采用AIA,充分利用AIA的快速性、随机性、全局收敛性,寻找较优的可行解,算法后过程采用ACA,利用前过程中AIA获得的较优可行解,产生初始信息素分布,然后充分利用ACA的并行性、正反馈性,提高求解效率。

2.2 算法中人工免疫算子的构造
人工免疫算子有字符换位算子、字符串移位算子、字符串逆转算子和优质字符串的保留等几种。对于TSP问题,AIA的人工免疫算子的构造如下:

2.2.1 字符换位算子,可分为单对字符换位算子和多对字符换位算子
单对字符换位操作是随机取两个正整数i,j(1<i,j≤n,i≠j),以一定的概率pc交换抗体A=(c1,c2,…,cn)中的一对字符ci,cj的位置;多对字符换位操作是预先确定一个正整数uc,在抗体A=(c1,c2,…,cn)中随机取r(1<r燮uc)对字符作字符串换位操作。

2.2.2 字符串移位算子,可分为单个字符串移位算子和多个字符串移位算子
单个字符串移位操作是随机取两个正整数i,j(1<i,j≤n,i≠j),在抗体A=(c1,c2,…,cn)中取一个字符子串A1=(ci,ci+1,…,cj-1,cj),以一定的概率ps依次往右移动A1中的各个字符,最右边的一个字符则移动到最左边的位置;多个字符串移位操作是预先确定一个正整数us,在抗体A=(c1,c2,…,cn)中随机取r(1<r燮us)个字符子串作字符串移位操作。

2.2.3 字符串逆转算子,可分为单个字符串逆转算子和多个字符串逆转算子
单个字符串逆转操作是随机取两个正整数i,j(1<i,j≤n,i≠j),在抗体A=(c1,c2,…,cn)中取一个字符子串A1=(ci,ci+1,…,cj-1,cj),以一定的概率pi使A1中的各个字符首尾倒置;多个字符串逆转操作是预先确定一个正整数ui,在抗体A=(c1,c2,…,cn)中随机取r(1<r燮ui)个字符子串作字符串逆转操作。

2.2.4 优质字符串的保留
如果若干个抗体与抗原之间的亲和力都很大,且这些抗体中包含了一个相同的字符子串,则称这个字符子串为优质字符串。如果抗体中存在优质字符串,则在抗体产生过程中以概率po使该优质字符串不受破坏,即把该优质字符串当成一个字符看待,称为优质字符串的保留。

2.3 算法基本步骤
根据该文算法的设计思想,其基本步骤可描述如下:

步骤1输入问题和确定抗体的编码表示。

输入问题的目标函数和约束条件,作为AIA的抗原。AIA的抗体采用自然数编码方式,一个字符串代表一个候选解。对于n个城市的TSP问题,设其城市编码分别为1,2,…,n,并且把商人出发城市编为第1号,其它城市可随意编号。把这n个城市的编号任意排列成一个长度为n的字符串都可以形成一个抗体,因此抗体空间包含n!个抗体。为了缩小抗体空间,提高搜索效率,将每个人工抗体(字符串)的第一个字符固定为出发城市的编号1。这样,每个抗体只有(n-1)个字符可任意排列,抗体空间就只包含(n-1)!个抗体。

步骤2产生初始抗体并进行预处理。

在一般情况下,可按上述抗体编码方式,在解空间中随机产生N个抗体作为初始抗体,构成初始抗体群,其中N为抗体群中抗体的数目。考虑到TSP问题的任何一条路径都是闭合路径,从任一城市出发,要到达的下一个城市选择为未到过的城市中距该城市最近的一个。为了提高搜索效率,先对每一个初始抗体进行预处理,然后才开始算法的迭代计算。设初始抗体A=(c1,c2,…,cn),其中c1=1(即c1代表商人出发城市的编号),对A进行预处理的步骤是:

(1)随机取正整数r(1燮r燮n)。若r=c1=1,则令A′=(c′1,c′2,…,c′n)=A,转(3);若r=ck≠1(1<k燮n),则转(2)。

(2)对初始抗体A中的各个字符依次循环左移位(k-1)次,每次移位时,使ci+1移到ci(i=1,2,…,i-1)的位置,且使ck移到c1的位置。设移位以后初始抗体A变为A′,则A′=(ck,ck+1,…,cn,c1,c2,…,ck-1)。令A′=(c′1,c′2,…,c′n),其中c′1=ck,余类推。

(3)随机取c′m=c′1,令C=邀c′2,c′3,…,c′n妖,若对C中任一个元素c′k,都有d(c′m,c′l)燮d(c′m,c′k),c′l∈C,则把c′l置于A′中c′m+1的位置,此时A′变为A″,令A″=(c″1,c″2,…,c″n)。然后从C中删除元素c′l,再取c″m=c″1,重复上述步骤,直到C中的元素全部被删除为止。设这一步完成以后初始抗体A变为B。

(4)对初始抗体B中的各个字符依次循环右移位若干次,直到抗体中第一个字符为1为止,移位方法与(2)中的类似,但方向相反。

步骤3计算亲和力和排斥力。

对于TSP问题,可定义抗体B与抗原G之间的亲和力App(B)=1/(TB-TG)。其中TB,TG分别为抗体B与抗原G对应的旅行路线的总长度,TG也是所求的最短路线的总长度。因在计算结束之前并不知道TG的大小,可用一适当大的正数T(T<TG)代替TG。又因计算App(B)需作除法运算,可定义App(B)=TM-TB。其中TM为较大的正数,且要求TM大于任意抗体对应的旅行路线的总长度,则可避免在计算App(B)时作除法运算。因此,构造抗体B与抗原G之间的亲和力App(B)=TM-TB并计算App(B)。抗体与抗原之间的亲和力反映抗体与抗原之间的匹配程度,App(B)越大,说明抗体B与抗原G之间的匹配越好。

对于TSP问题,可定义抗体B1与抗体B2之间的排斥力Re p(B1,B2)=|TB1-TB2|并计算Re p(B1,B2)。其中TB1,TB2分别为抗体B1与抗体B2对应的旅行路线的总长度。抗体与抗体之间的排斥力反映抗体与抗体之间的差距,Re p(B1,B2)越大,说明抗体B1与抗体B2之间的差距越大。计算抗体群中所有抗体与当前最佳抗体之间的排斥力。

步骤4产生新抗体并计算其亲和力和排斥力。

构造适当的人工免疫算子,通过人工免疫算子的作用概率pc,ps,pi,po和预先确定的正整数uc,us,ui产生新抗体;同时,计算各个新抗体的亲和力App(B)和新抗体间的排斥力Re p(B1,B2)。若新抗体中有与抗原相匹配的抗体,或已满足预定的停机条件则停机,从而获得较优的可行解。否则转步骤5。

步骤5抗体选择。

按照“优胜劣汰”的自然选择机制,在新产生的若干个抗体中,选择出N个与抗原匹配得较好的抗体构成新的抗体群,转步骤4。

步骤6初始化参数τC、τG、m、ρ、α、β、Q,根据步骤4获得的较优可行解,生成信息素初始分布,将m只蚂蚁置于n个结点。

这里,τC是一个根据具体求解规模给定的信息素常数,τG是AIA求解结果转换的信息素值,m是蚁群中蚂蚁的数量,ρ(0≤ρ<1)为信息素轨迹的残留系数,α(α叟0)为边(i,j)信息素轨迹强度τij的相对重要性,β(β叟0)为边(i,j)能见度ηij的相对重要性,ηij为边(i,j)长度dij的倒数,Q为蚂蚁循环一周所释放的总信息量。在初始时刻,根据下式设置信息素的初值:

步骤7计算每只蚂蚁的选择概率,根据选择概率移动每只蚂蚁到下一结点。

设蚂蚁k在t时刻的转移概率为pkij(t),可行顶点集为U,则按下式的概率转移规则决定t时刻蚂蚁k由位置i转移到位置j:

步骤8经过n个时刻,m只蚂蚁遍历个结点,完成一次循环。

设Δτkij为蚂蚁k在本次循环中在边(i,j)上留下的单位长度轨迹信息量,Zk为蚂蚁k在本次循环中所走路径的长度。此时,根据下式对各个路径信息素更新:

步骤9进行递归循环,直到满足算法的停止条件为止。

蚂蚁完成一个搜索周期,进入下一个循环。反复进行递归循环,直到周游计数器(总循环次数)NC达到预设值或所有蚂蚁都走同一周游路径便停止计算,输出近似最优解。

二、部分源代码

function varargout = ACO(varargin)
% ACO M-file for ACO.fig
%      ACO, by itself, creates a new ACO or raises the existing
%      singleton*.
%
%      H = ACO returns the handle to a new ACO or the handle to
%      the existing singleton*.
%
%      ACO('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in ACO.M with the given input arguments.
%
%      ACO('Property','Value',...) creates a new ACO or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before ACO_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to ACO_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES% Edit the above text to modify the response to help ACO% Last Modified by GUIDE v2.5 17-Apr-2022 16:39:44% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...'gui_Singleton',  gui_Singleton, ...'gui_OpeningFcn', @ACO_OpeningFcn, ...'gui_OutputFcn',  @ACO_OutputFcn, ...'gui_LayoutFcn',  [] , ...'gui_Callback',   []);
if nargin && ischar(varargin{1})gui_State.gui_Callback = str2func(varargin{1});
endif nargout[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
elsegui_mainfcn(gui_State, varargin{:});
end
function ACO_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to ACO (see VARARGIN)% Choose default command line output for ACO
handles.output = hObject;% Update handles structure
guidata(hObject, handles);
% --- Outputs from this function are returned to the command line.
function varargout = ACO_OutputFcn(hObject, eventdata, handles)
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)% Get default command line output from handles structure
varargout{1} = handles.output;%各TEXT和EDIT TEXT对象的回调函数,函数为空
function out_current_num_Callback(hObject, eventdata, handles)
% hObject    handle to out_current_num (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of out_current_num as text
%        str2double(get(hObject,'String')) returns contents of
%        out_current_num as a double
function out_current_num_CreateFcn(hObject, eventdata, handles)
% hObject    handle to out_current_num (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');
end
function out_glob_num_Callback(hObject, eventdata, handles)
% hObject    handle to out_glob_num (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of out_glob_num as text
%        str2double(get(hObject,'String')) returns contents of out_glob_num
%        as a double
function out_glob_num_CreateFcn(hObject, eventdata, handles)
% hObject    handle to out_glob_num (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');
end
function in_ant_num_Callback(hObject, eventdata, handles)
% hObject    handle to in_ant_num (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of in_ant_num as text
%        str2double(get(hObject,'String')) returns contents of in_ant_num as a double
function in_ant_num_CreateFcn(hObject, eventdata, handles)
% hObject    handle to in_ant_num (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');
end

三、运行结果

四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016.
[2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017.
[3]胡纯德,祝延军,高随祥.基于人工免疫算法和蚁群算法求解旅行商问题[J].计算机工程与应用. 2004,(34)

3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除

【TSP】基于matlab GUI免疫算法结合蚁群算法求解旅行商问题【含Matlab源码 1910期】相关推荐

  1. c语言编译免疫算法亲和力,蚁群算法模拟系统设计及实现.doc

    J I A N G S U U N I V E R S I T Y 本 科 毕 业 论 文 蚁群算法模拟系统的设计与实现 Ant Colony Simulation System Design and ...

  2. 【图像去噪】基于matlab GUI butterworth+中值+维纳+小波图像去噪【含Matlab源码 520期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[图像去噪]基于matlab GUI butterworth+中值+维纳+小波图像去噪[含Matlab源码 520期] 获取代码方式2: ...

  3. 【物理应用】基于matlab GUI气象参数计算综合指标和IAQI【含Matlab源码 2116期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[物理应用]基于matlab GUI气象参数计算综合指标和IAQI[含Matlab源码 2116期] 点击上面蓝色字体,直接付费下载,即可 ...

  4. 最短移臂调度算法_MATLAB优化算法实例——蚁群算法

    ❝ 欢迎关注「工科男的Maltab学习日志」,采用Mardown文本编辑器编写文章,全新排版升级,内容.代码更简洁,同时开通了视频号,「工科男的日常」欢迎大家关注. --工科男 ❞ 1 蚁群算法基本理 ...

  5. 【智能优化算法】蚁群算法ACO

    文章目录 [智能优化算法] 蚁群算法 1. 简介 1.1 简介 1.2 蚁群流程图 1.3 分类(可以不看) 2. 算法 2.1 参数讲解 2.2 计算公式 1) 转移概率公式 2) 启发式因子计算公 ...

  6. 智能优化算法之蚁群算法(1)

    蚁群算法(ant colony algorithm) : 一种模拟进化算法 蚂蚁在觅食过程中能够在其经过的路径留下一种称为信息素的物质,并在觅食的过程中能感知这种物质的强度,并指导自己的行动方向,他们 ...

  7. 智能优化算法之蚁群算法(ACO)

    蚁群算法优缺点 优点 蚁群算法是一种本质上的并行算法.每只蚂蚁搜索的过程彼此独立,仅通过信息激素进行通信.不仅增加了算法的可靠性,也使得算法具有较强的全局搜索能力. 蚁群算法是一种自组织的算法. 蚁群 ...

  8. 群体智能算法之蚁群算法初探(一)

    一.背景 20世纪90年代,意大利学者M.Dorigo,V.Maniezzo,A.Colorni等从生物进化的机制中受到启发,通过穆尼自然界蚂蚁搜索路径的行为,提出来一种新型的模拟进化算法--蚁群算法 ...

  9. 路径算法:蚁群算法(ant colony optimization, ACO)

    一, 蚁群算法概述 自然界中有一个神奇的现象,即蚂蚁在没有提示的情况下总是能够找到从巢穴到食物的最短路径,这是为什么呢?原因就是蚂蚁在寻找食物时,能在其走过的路径上释放一种特殊的分泌物--信息素,随着 ...

  10. 关键路径-stl版_A*算法与蚁群算法相结合的无人艇巡逻路径规划

    作者:张丹红,陈文文,张华军,苏义鑫 摘要:针对无人艇海上巡逻路径规划问题,提出了一种A*算法与蚁群算法相结合进行最短巡逻路径优化的方法.在传统A*算法的八角度搜索基础上,设计了一种多角度A*算法以获 ...

最新文章

  1. win 7 系统激活工具
  2. java 文件读写--转载
  3. 全生命周期管理,是趋势更是未来
  4. 3D人脸识别预处理,3D face recognition preprocess
  5. mysql安装忘了root_MySQL - 安装:MySQL忘记root密码的解决办法
  6. 收藏 | 机器学习、深度学习调参手册
  7. 1.2 边缘检测示例
  8. FFmpeg查看支持的封装、编解码器、滤镜(四)
  9. C++内存日志系统(一)
  10. paip.编程语言方法重载实现的原理及python,php,js中实现方法重载
  11. PID算法理解和代码以及PID调参
  12. 面试官让我说一下Mybatis一级缓存、二级缓存的区别,史诗级回答让他刮目相看
  13. 共码未来 | 2022 Google 谷歌开发者大会参会现场记
  14. 计算机屏幕自己动,ipad屏幕失灵自己乱跳怎么办【图文】
  15. nodejs获取本地IP地址
  16. js对象的getter和setter
  17. 分享50个ASP交友会员源码,总有一款适合您
  18. mac编码查看及修改
  19. 比较笨的ass双语特效ass字幕做法,留档
  20. 冰炭不投day博客导航

热门文章

  1. Cobalt Strike神器使用教程
  2. Microsoft Visio2003 简体中文版 下载
  3. Microsoft Office 2016 简体中文Vl批量官方授权版镜像下载
  4. 编写函数计算正方体体积
  5. 07版qq默认经典表情下载
  6. 原版windows下载地址
  7. php doss_ddos PHP版
  8. 危害极大的计算机病毒cih发作的日期是,计算机病毒防治(答案)
  9. 前端必会的Vue项目请求方法模块化的高度封装操作案例说明——getData()方法封装实例,告别多次重复调用,解决页面代码冗余
  10. 官网下载JDK1.7的方法和步骤