深 圳 大 学 实 验 报 告
实验课程名称: 人工神经网络
实验项目名称: SOM网络模型应用
学院: 计算机与软件学院 专业: 软件工程
报告人: 文 成 学号: **********
同组人: 无
指导教师: ***
实验时间: 2016年5月31日
实验报告提交时间: 2016年6月01日
教务处制
实验名称,实验人姓名,页码
一、 实验目的
理解并熟悉掌握SOM算法。
二、 实验内容
1)假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求所经过的路径路程最短。
2)设计一个SOM神经网络,解决TSP旅行销售员问题。
3)试分析如何将网络设计扩展到解决多个旅行销售员的MTSP问题。
三、 实验步骤
1. 网络设计,包括输入层、输出层节点个数的设计,为什么如此设计;
SOM网络的目标是:通过输入数据训练网络,使得当输入数据接近时,输出结果也接近。叫做特征映射 (feature map)。
如何达到目标:通过引入竞争学习机制,调节神经网络结点的权值,使得具有类似输入特征的输出结点尽可能相互靠近。
输入层节点个数为2个,即为每个城市的横坐标和纵坐标。输出层节点个数为城市的个数29(y1-y29)。
实验名称,实验人姓名,页码
2. 算法步骤;
仿真实验的过程如上图所示
1. 首先初始化神经网络的权值 2. 将坐标输入到神经网络中去 3. 竞争出来一个优胜点
4. 计算出离这个点最近的邻居 5. 修改优胜点和它邻居的权值,如果权值改变了,那么返回第2步。
6. 结束
实验名称,实验人姓名,页码
3. 运行程序,结果图示。
例如29个城市的图
运行前要先load数据,然后执行main.m data=load('bayg29.tsp.txt')
bestpath=load('bayg29.tour.txt') Main(data,bestpath)
3.1对101个城市进行处理的结果截图,分别运行3次,结果图是否一样?为什么?
结果不一样。仔细看可以发现有细微差别。
如下三个图所示。
实验名称,实验人姓名,页码
原因是初始状态的选取是随机的,不一定那个点就是优胜点,而且结果也是最优路径的近似值,并不是完全的最优路径,所以结果也是不尽相同的。但是,每次结果的误差都很小,所以这种算法还是可行的。
3.2对29个城市进行处理的结果截图,分别运行3次,结果图是否一样?为什么?
结果的图一样,因为点的数量太少,在误差一定的情况下,运行结果是一样的。
实验名称,实验人姓名,页码
3.3分析学习率alpha的取值范围[0.001,0.1]对结果的影响;
Alpha=0.001时:
Alpha=0.01时:
Alpha=0.1时: time= 8.741680s
实验名称,实验人姓名,页码
所以当alpha=0.01这个量级的时候结果是最准确的
3.4分析学习率beta的取值范围[0.001,0.5]对结果的影响; 当beta=0.001时
当beta=0.01时
实验名称,实验人姓名,页码
当bata=0.1时
beta的值如果太小,不可行。 随着beta的增大,运行时间缩短。
在beta接近0.1的时候,结果最准确而且速度相对快
四、总结分析
程序运行结果的列表,包括7组不同数据、3次不同的运行次数、不同的参数选择的情况下的路径长度、运行时间、以及最短路径的长度。
由实验得出,当alpha=0.03,beta=0.1,percent=0.2的时候,运行效果最佳,运行时间较短而且准确性较高。 alpha=0.03,beta=0.1,percent=0.2
图21
实验名称,实验人姓名,页码
图22
运行时间:time= 7.798191s
五、附录源程序
注:代码主要来源于老师上课时给的代码,而且参考了网上!
Main
function [] =Main(data,bestpath) tic%计时
%data :训练集,有三列,第一列是行标,第二、三列是坐标;route; 得到的有序的路径;bestpath:为最优路径,每行只有一列,表示城市标号 %参数配置
bug=0;%调试模式1,运行模式0
norm=0;%是否对数据归一化,1:归一化;0:不归一化 alpha=0.03;
beta=0.1;%学习率 beta1=beta;%学习率 percent=0.2;
citynum=length(data);%城市数目
neutralNum=citynum*2;%输出神经元数目 r=10;%初始半径
iterNum=1000;%定义迭代数 data2=data;%备份 if norm==1 %归一化
max1=max(data(:,2));
实验名称,实验人姓名,页码
max2=max(data(:,3)); min1=min(data(:,2)); min2=min(data(:,3)); for i=1:1:length(data)
data(i,2)=(data(i,2)-min1)/(max1-min1);
data(i,3)=(data(i,3)-min2)/(max2-min2);%0到1 end end
%初始化权重值,W
for i=1:1:neutralNum for j=1:1:2
W(i,j)=rand;%0到1 end end %训练
for iter=1:1:iterNum error=0;%记录精度 for count=1:1:citynum
i=floor(rand*citynum)+1;%现随机取数据 coord=data(i,2:3);%城市的坐标
[winnerIndex,distValSet] =findWinner(coord,W);%winnerIndex :找到的优胜者下标;distValSet;输入向量与所有的神经元的距离值得集合; %更新优胜者和邻居的权值 for j=1:1:neutralNum
dist1=dist(winnerIndex,j,neutralNum);%dist(i,j,M) 计算s神经元i与优胜神经元j之间的距离,其中M为总的神经元 adjacentFuncVal =adjacentFunction(dist1, r);%findWinner(A,W) 求近邻函数的结果值;dist; 神经距离优胜神经元的距离; r;本次迭代的近邻半径 %更新权值
W(j,1)=W(j,1)+beta* adjacentFuncVal*(coord(1)-W(j,1)); W(j,2)=W(j,2)+beta* adjacentFuncVal*(coord(2)-W(j,2)); end
error=error+distValSet(winnerIndex); end
%检查精度,精度满足则退出 if error r= round((r-1)*(1-iter/(iterNum)))+1; %更新半径 beta=beta-beta1/(iterNum); %更新学习率 实验名称,实验人姓名,页码 %调试工具 if bug==1 if iter>1 cla end %画图 plot(data(:,2),data(:,3),'ro'); % axis([0,1,0,1]); hold on; [path1,path2] =getPath(data, W);%获取路径 drawPath(path1);%绘制路径 pause(1);%休眠 %统计结果 [distantOfBestPath,distantOfRusultPath,errorRate,] =compareToBestPath(path2,bestpath,data2);%与最优路径对比,path2:路径,格式为路径按照行数排序,第二列是城市编号;bestpath:最优路径;data2:城市坐标数据 str=sprintf('%s%d%s%d%s%d%s%d','最优路径长度=',distantOfBestPath,' ;结果路径长度=',distantOfRusultPath,' ;误差率=',errorRate,' ;迭代次数=',iter); title(str); end end cla %画图 plot(data(:,2),data(:,3),'ro'); % axis([-0.2,1.2,-0.2,1.2]); hold on; [path1,path2] =getPath(data, W)%获取路径 drawPath(path1);%绘制路径 pause(1);%休眠 %统计结果 [distantOfBestPath,distantOfRusultPath,errorRate,data3] =compareToBestPath(path2,bestpath,data2);%与最优路径对比,path2:路径,格式为路径按照行数排序,第二列是城市编号;bestpath:最优路径;data2:城市坐标数据 str=sprintf('%s%d%s%d%s%d','最优路径长度=',distantOfBestPath,' ;结果路径长度=',distantOfRusultPath,' ;误差率=',errorRate); title(str); %画最优路径 figure; 实验名称,实验人姓名,页码 plot(data3(:,1),data3(:,2),'ro-'); title('最优路径'); iter toc%完毕 findWinner: function [winnerIndex,distValSet] =findWinner(A,W) %winnerIndex :找到的优胜者下标;distValSet;输入向量与所有的神经元的距离值得集合;A:输入的向量 W:所有神经元的权重值的集合 iputDim=length(A);%iputDim:输入向量的维度值 neuNum=length(W);%输出神经元数目 winnerIndex=1; %计算输入的向量 W:所有神经元的权重之间的距离 for i=1:1:neuNum distant=0; for j=1:1:iputDim distant=distant+(A(j)-W(i,j))^2; end distValSet(i)= sqrt(distant); if i>2 if distValSet(winnerIndex)>distValSet(i) winnerIndex=i; end end end compareToBestPath: function [distantOfBestPath,distantOfRusultPath,errorRate,data2] =compareToBestPath(path2,bestpath,data) %与最优路径对比,path2:路径,格式为路径按照行数排序,第二列是城市编号;bestpath:最优路径;data:城市坐标数据;data2:最优路径 %的坐标数据 dist1=0; dist2=0; data2(1,:)=data(bestpath(1,1),2:3); for i=1:1:(length(bestpath)-1) cityNum1=bestpath(i,1); cityNum2=bestpath(i+1,1); 实验名称,实验人姓名,页码 cityPos1=data(cityNum1,2:3); cityPos2=data(cityNum2,2:3); data2(i+1,:)=data(cityNum2,2:3); d=(cityPos1(1)-cityPos2(1))^2+(cityPos1(2)-cityPos2(2))^2; d=sqrt(d); dist1=dist1+d; end cityNum1=bestpath(1,1); cityNum2=bestpath(length(bestpath),1); cityPos1=data(cityNum1,2:3); cityPos2=data(cityNum2,2:3); d=(cityPos1(1)-cityPos2(1))^2+(cityPos1(2)-cityPos2(2))^2; d=sqrt(d); dist1=dist1+d; distantOfBestPath=dist1;%最优路径长度 for i=1:1:(length(path2)-1) cityNum1=path2(i,2); cityNum2=path2(i+1,2); cityPos1=data(cityNum1,2:3); cityPos2=data(cityNum2,2:3); d=(cityPos1(1)-cityPos2(1))^2+(cityPos1(2)-cityPos2(2))^2; d=sqrt(d); dist2=dist2+d; end cityNum1=path2(1,2); cityNum2=path2(length(path2),2); cityPos1=data(cityNum1,2:3); cityPos2=data(cityNum2,2:3); d=(cityPos1(1)-cityPos2(1))^2+(cityPos1(2)-cityPos2(2))^2; d=sqrt(d); dist2=dist2+d; distantOfRusultPath=dist2;%结果路径长度 errorRate=(distantOfRusultPath-distantOfBestPath)/distantOfBestPath;%误差率 实验名称,实验人姓名,页码 指导教师批阅意见:√ 实验报告内容的确完整性 (20分) 完整 20 较完整 15 不够完整 10 实验步骤的清晰程度 (20分) 清晰 20 较清晰 15 不够清晰 10 实验数据的准确性 (20分) 准确 20 较准确 15 不够准确 10 实验结果和分析的正确性 (20分) 正确 20 较正确 15 不够正确 10 实验态度(实验表现、格式排版、独立完成、按时提交)(20分) 规范 20 较规范 15 不够规范 10 说明: 说明: 说明: 说明: 说明: 成绩评定: 指导教师签字:朱安民 2016 年 6 月 16 日 备注: 注:1、报告内的项目或内容设置,可根据实际情况加以调整和补充。 2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。 因篇幅问题不能全部显示,请点此查看更多更全内容