自组织神经网络求解TSP问题.docx
- 文档编号:7597602
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:11
- 大小:29.58KB
自组织神经网络求解TSP问题.docx
《自组织神经网络求解TSP问题.docx》由会员分享,可在线阅读,更多相关《自组织神经网络求解TSP问题.docx(11页珍藏版)》请在冰豆网上搜索。
自组织神经网络求解TSP问题
自组织特征映射网络(SOFM)求解TSP问题
组长:
袁滨
组员:
杨涛,徐丽丽,张冰,殳晶莹,许才华,郑彩萍
一、旅行商问题
旅行商问题(TravelingSalesmanProblem,简称TSP).商品的推销员打算从驻地出发遍访他要去的每个城市,并且每个城市只能访问一次,最后必须返回出发城市。
问如何安排他对这些城市的访问次序,可使其旅行路线的总长度最短?
旅行商问题TSP是一个典型的组合优化问题,并且是一个NP完全问题,其可能Hamilton圈的数目是顶点的数目n的指数函数,所以一般很难精确地求出其最优解。
所谓组合优化问题,是指在离散的,有限的数学结构上,寻找一个满足给定条件,并使其目标函数值达到最小或最大的解。
一般来说,组合优化问题通常带有大量的局部极值点,通常是非线性的NP完全问题。
其最先起源于一个旅行商要访问他所有的客户,要发现一条最短的路线。
用用图论的术语来说,旅行商问题就是在赋权完全图上找一个权最小的Hamilton圈。
但是,首先从应用上来说,很多实际应用问题,如印制电路板的、连锁店的货物配送路线等,经简化的处理后,均可转化为旅行商问题TSP。
由于旅行商问题的重要应用价值,因而对旅行商问题的算法研究自然是一个无法回避的问题;其次,从理论上来说,它的计算复杂性研究在形成NP完全理论中起到奠基作用。
今天,由于电子计算机科学技术的进展,这个古老问题的算法研究又重新注入了新的活力,旅行商问题研究的新思路、新方法、新成果必将丰富NP完全理论的内涵,促进NP完全理论的发展。
二、神经网络算法与优化计算
神经网络的应用已经渗透到多个领域,如智能控制、模式识别、信号处理、计算机视觉、优化计算、知识处理、生物医学工程等。
利用神经网络进行优化计算,采用的模型一般包括Hopfield神经网络、混沌神经网络和波尔兹曼机(类似模拟退火)等。
TSP是典型的NP-难解问题,它对应的判定问题属于NPC类。
由于这个问题具有许多实际应用背景,所以寻求解决它的高效近似算法就成为学术界的研究热点。
可以利用自组织特征映射网络(SOFM)解决TSP问题。
八十年代中后期,美国、日本等国家出现了一股神经网络热潮,许多从事脑、科学、心理学、计算机科学以及电子学等方面的专家都在积极合作,开展这一领域的研究。
Hopfield于1984年又提出一种连续时间神经网络(HNN)模型,并由容易实现的电子线路所构成。
对于HNN,给出适当的初始条件,在状态空间里反复使其更新状态,网络的能量随时间推移单调地减小,状态向着平衡状态的方向更新。
最后,网络的能量减至全局最小或局部最小,其状态稳定在某个平衡状态。
利用HNN模型在状态空间里的这种能量最小(极小)化特性,可将它应用于TSP问题的求解。
该方法的基本思想是通过对神经网络引入适当的能量函数,使之与TSP的目标函数相一致来确定神经元之间的联结权,随着网络状态的变化,其能量不断减少,最后达到平衡时,即收敛到一个局部最优解。
要解n城市的TSP问题,要把问题映射到一个神经网络上。
可以使用n*n神经元矩阵。
矩阵中的每个元的状态只能为0或1,神经元的状态用Vsi表示,Vsi=l表示城市X在路径中第i个位置出现。
一次有效路径使每行每列有且仅有一个元素为1,其余为0。
为了最终解决TSP问题,必须构成这样的神经网络:
在网络运行时,计算能量降低,网络稳定后其输出状态表示城市被访问的次序。
网络能量的极小点,对应于最佳(或较佳)路径的形成。
其解决问题最关键的一步,是构造能量函数。
三、自组织特征映射网络(SOFM)
自组织特征映射(SOFM)是由芬兰学者T.Kohonen提出的。
它属于竞争神经网络,本质上是一种无监督的学习机,可以根据输入空间中样本的分布情况,把样本输入空间变换到输出空间。
这个输出空间一般比原来的输入空间来的简单(例如前者是离散的而后者是连续的;或者前者的维数比后者低),但是通过将输入样本以自组织的方式映射到输出空间上,输入样本所包含的重要统计信息得以保留,从而达到特征提取、特征选择以及样本聚类等多种目的。
在SOFM中,输出层的神经元分布在一维或二维的网格上(更高维数的网格也是可能的,但比较少见)。
与其他类型的神经网络很不相同的是,神经元分布中的相互位置和近邻关系对于整个网络而言非常重要,这是因为特征映射的过程,就是把在输入空间中样本之间的拓扑关系,尽量完整地反映到输出空间中由神经元组成的网格中,即在网格中的邻近的神经元对应类似的输入样本。
这种充分利用神经元位置关系的神经网络,更接近于生物神经系统的特性,具有很好的自组织学习能力。
SOFM的学习过程:
(1)初始化网络的权值,确定学习步长α以及邻域宽度参数σ
(2)随机选取一个输入样本x,根据最小欧氏距离确定获胜神经元,设其标号为i(x),i(x)=argminj|x(n)–wj|
然后更改网络的权值:
wj(n+1)=wj(n)+α(n)*hi(x),j(n)*(x–wj(n))
其中,邻域函数
n=0,1,2,3…
(3)按如下公式减小学习步长α以及宽度参数σ:
,
α0=0.1,τ2=1000τ1=1000/logσ0
(4)重复第
(2)步直至网络权值不再发生变化。
四、利用SOFM解决TSP的基本思路
根据SOFM在自组织映射过程中保持输入样本的拓扑关系这一特点,如果我们把所有城市的二维坐标作为输入样本,把它们映射到一维的环形输出空间上,就得到了一个环游所有城市的回路。
由于邻近的城市映射到相邻的神经元上,根据这个回路进行环游,从直观上看,其路径总长度应该是最短的。
这就是利用SOFM解决TSP的基本想法。
网络的结构是输入神经元,每个神经元对应二维城市坐标的一个维度;n个输出神经元(n为城市数目);2n个连接权。
这n个神经元排列成环状结构(保证最后得到一个合法环游),在这个环状神经元结构中,两个神经元i,j之间的距离di,j可以定义为:
di,j=在环路中从i到j需要经过的最少神经元数目(顺时针和逆时针)利用所有城市的坐标作为输入样本进行训练,直到网络权值不再发生变化。
这时,理想的情况应该是神经元的位置与城市位置一一重合(重合的次序决定环游路径)。
但是,由于网络初始权值的影响,这样理想的结果一般不容易达到。
解决这个问题的办法是,将所有城市的坐标逐一输入,找出具有与每个城市的坐标的欧氏距离最近的权值的神经元,该神经元的编号就是这个城市在环游路径中的位置。
五.实验结果
城市数目:
30
神经元数目:
90
学习步长参数:
1
邻域宽度参数:
10
实验结果:
旅行路径:
10,5,9,14,15,8,11,13,3,22,19,28,23,25,30,27,29,20,24,26,21,18,16,17,12,1,2,4,6,7,
distance=18783.000000
附:
MATLAB程序
functionvarargout=tsp(varargin)
%TSPM-filefortsp.fig
%Begininitializationcode
gui_Singleton=1;
gui_State=struct('gui_Name',mfilename,...
'gui_Singleton',gui_Singleton,...
'gui_OpeningFcn',@tsp_OpeningFcn,...
'gui_OutputFcn',@tsp_OutputFcn,...
'gui_LayoutFcn',[],...
'gui_Callback',[]);
ifnargin&isstr(varargin{1})
gui_State.gui_Callback=str2func(varargin{1});
end
ifnargout
[varargout{1:
nargout}]=gui_mainfcn(gui_State,varargin{:
});
else
gui_mainfcn(gui_State,varargin{:
});
end
%Endinitializationcode
%---Executesjustbeforetspismadevisible.
functiontsp_OpeningFcn(hObject,eventdata,handles,varargin)
%Thisfunctionhasnooutputargs,seeOutputFcn.
%hObjecthandletofigure
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
%varargincommandlineargumentstotsp(seeVARARGIN)
%Choosedefaultcommandlineoutputfortsp
handles.output=hObject;
%Updatehandlesstructure
guidata(hObject,handles);
%UIWAITmakestspwaitforuserresponse(seeUIRESUME)
%uiwait(handles.figure1);
%---Outputsfromthisfunctionarereturnedtothecommandline.
functionvarargout=tsp_OutputFcn(hObject,eventdata,handles)
%varargoutcellarrayforreturningoutputargs(seeVARARGOUT);
%hObjecthandletofigure
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
%Getdefaultcommandlineoutputfromhandlesstructure
varargout{1}=handles.output;
%---Executesonbuttonpressinpushbutton1.
functionpushbutton1_Callback(hObject,eventdata,handles)
%hObjecthandletopushbutton1(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
file1=uigetfile('*.txt');
if~isequal(file1,0)
read1(file1);
end
%---Executesonbuttonpressinpushbutton2.
functionpushbutton2_Callback(hObject,eventdata,handles)
%参数同上
file2=uigetfile('*.txt');
if~isequal(file2,0)
read2(file2);
end
%---Executesonbuttonpressinpushbutton3.
functionpushbutton3_Callback(hObject,eventdata,handles)
%参数同上
TSPsom;
%---Executesonbuttonpressinpushbutton4.
functionpushbutton4_Callback(hObject,eventdata,handles)
%参数同上
open('result.txt');
%---Executesonbuttonpressinpushbutton4.
functionpushbutton5_Callback(hObject,eventdata,handles)
%参数同上
cla;
functionpushbutton6_Callback(hObject,eventdata,handles)
%参数同上
close(gcbf);
%--------------------------------------------------------------------------
functionread1(file)
fidin=fopen(file);%打开.txt文件
fidout=fopen('coordinates.txt','w');%创建coordinates.txt文件
while~feof(fidin)%判断是否为文件末尾
tline=fgetl(fidin);%从文件读行
ifdouble(tline
(1))>=48&&double(tline
(1))<=57%判断首字符是否是数值
fprintf(fidout,'%s\n\n',tline);%如果是数字行,把此行数据写入文件coordinates.txt
continue%如果是非数字继续下一次循环
end
end
fclose(fidout);
%--------------------------------------------------------------------------
functionread2(file)
fidin=fopen(file);%打开.txt文件
fidout=fopen('distance.txt','w');%创建distance.txt文件
while~feof(fidin)%判断是否为文件末尾
tline=fgetl(fidin);%从文件读行
ifdouble(tline
(1))>=48&&double(tline
(1))<=57%判断首字符是否是数值
fprintf(fidout,'%s\n\n',tline);%如果是数字行,把此行数据写入文件distance.txt
continue%如果是非数字继续下一次循环
end
end
fclose(fidout);
%--------------------------------------------------------------------------
functionTSPsom()
%TSP问题,使用自组织特征映射神经网络SOFM解决
%把经纬度转换成了直角坐标后进行计算
clearall;
city_name=str2mat('哈尔滨','长春','乌鲁木齐','沈阳','呼和浩特','北京','天津','银川','太原','济南','西宁','青岛','兰州','郑州','西安','南京','合肥','上海','成都','武汉','杭州','拉萨','重庆','长沙','贵阳','福州','桂林','昆明','广州','南宁');
distanc=importdata('distance.txt');%将生成的distance.txt文件导入工作空间,变量名为distanc,实际上它不显示出来
org1=importdata('coordinates.txt');%将生成的coordinates.txt文件导入工作空间,变量为org1,实际上它不显示出来
[m,n]=size(distanc);
city_num=m;%设置城市数目
neuron_num=city_num*3;%设置神经元数目,这里神经元为城市数目的3倍,经验公式为1.5~2.5倍
neurons=rand(neuron_num,2)*1000;%随机产生一组神经元,为了和城市分布一致,将产生的0~1范围的数都乘以100
cities=org1(:
2:
3);%获取城市坐标(org1矩阵的2~3列)
%下面是参数:
t1=1000;
t2=1000;
delta=10;
alpha=0.9;
times=1000;%迭代次数,经验为城市数目的20~50倍,这里取的更多一些,使得网络更加收敛
n=-1;
h=waitbar(0,'正在计算,请稍候……');%创建一个计算进度条
while(n waitbar(n/times,h)%显示进度条 n=n+1; fori=1: city_num%计算获胜神经元———————————————— dist=100000; ix=0; forj=1: city_num tmp=(cities(i,: )-neurons(j,: ))*(cities(i,: )-neurons(j,: ))';%计算城市和每个神经元的距离,找到最小的 if(tmp dist=tmp; ix=j; end end %调整神经元的权值 rate=alpha*exp(-n/t2);%alpha(n) width=delta*exp(-n/(t1/log(10)));%theta(n) forj=1: city_num d=min(abs(ix-j),city_num-abs(j-ix));%d(j,i) %d=distance(ix,j); neurons(j,: )=neurons(j,: )+rate*exp(-d*d/(2*width*width))*(cities(i,: )-neurons(j,: )); end end%———————————— end%while close(h)%关闭进度条 fori=1: neuron_num%将神经元矩阵加上序号,放在第一列,坐标放在第2和第3列———————————— tmp=0; tmp=neurons(i,1); neurons(i,3)=neurons(i,2); neurons(i,2)=tmp; neurons(i,1)=i; end%———————————— fori=1: city_num%城市矩阵加上序号,放在第一列,坐标放在第2和第3列———————————— tmp=cities(i,1); cities(i,3)=cities(i,2); cities(i,2)=tmp; cities(i,1)=i; end fori=1: city_num%按城市寻找离该城市最近的神经元,把结果放到result矩阵中,result矩阵第1列为城市序号,第2,3列为城市坐标,第4列为找到的神经元编号,第5列为距离 dist=100000; ix=0; forj=1: city_num tmp=(cities(i,2: 3)-neurons(j,2: 3))*(cities(i,2: 3)-neurons(j,2: 3))'; if(tmp dist=tmp; ix=j; end end result(i,1)=cities(i,1); result(i,2)=cities(i,2); result(i,3)=cities(i,3); result(i,4)=ix; result(i,5)=dist; end%———————————— result2=sortrows(result,4);%按result矩阵的第4列升序排列,结果放到result2矩阵中 %这么做是由于神经元序列可以连成一条环路,现在要找离神经元最近的城市,把城市连起来 p=1: city_num; p=[p1];%P为一个从1,2,……,城市数目,1的向量 gridon; plot(neurons(p,2),neurons(p,3),'ro','MarkerSize',5);%在图中画出最终的神经元,用红色圆圈表示,只画出和城市数目相等的神经元,否则……太乱 holdon; %plot(neurons(p,1),neurons(p,2));%画出最终的城市编号 plot(result2(p,2),result2(p,3));%画出最终的城市路径 %holdon; plot(cities(p,2),cities(p,3),'go','Markersize',10);%画出城市点,用绿色圆圈表示 %plot(result(p,1),result(p,2)); fori=1: city_num text(result2(i,2)-0.1,result2(i,3)-0.9,city_name(result2(i,1),: ))%标出城市的名称 end dist=0;%计算得到的城市路径的总长度———————————— fori=1: city_num-1 dist=dist+distanc(result2(i,1),result2(i+1,1)); end dist=dist+distanc(result2(city_num,1),result2(1,1)); %—————————————— dist str=strcat('城市数目: ',int2str(city_num)); str=strcat(str,'神经元数目: '); str=strcat(str,int2str(neuron_num)); str=strcat(str,'迭代次数: '); str=strcat(str,int2str(times)); str=strcat(str,'学习步长参数α: '); str=strcat(str,int2str(alpha)); str=strcat(str,'宽度参数σ: '); str=strcat(str,int2str(delta)); title(str); xlabel(strcat('路径长度: ',int2str(dist))); %完成输出文件 %file3=uigetfile('*.txt'); %if~isequal(file3,0) %fidin1=fopen(file3); fid1=fopen('result.txt','w'); %fori=1: 4 %tline1=fgetl(fidin1); %fprin
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 组织 神经网络 求解 TSP 问题