人工神经网络的路径优化.docx

上传人:b****7 文档编号:10381600 上传时间:2023-02-10 格式:DOCX 页数:18 大小:166.08KB
下载 相关 举报
人工神经网络的路径优化.docx_第1页
第1页 / 共18页
人工神经网络的路径优化.docx_第2页
第2页 / 共18页
人工神经网络的路径优化.docx_第3页
第3页 / 共18页
人工神经网络的路径优化.docx_第4页
第4页 / 共18页
人工神经网络的路径优化.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

人工神经网络的路径优化.docx

《人工神经网络的路径优化.docx》由会员分享,可在线阅读,更多相关《人工神经网络的路径优化.docx(18页珍藏版)》请在冰豆网上搜索。

人工神经网络的路径优化.docx

人工神经网络的路径优化

基于Hopfield人工神经网络的路径优化

绪论

本文研究了移动机器人在含障区域内完成全覆盖行走路径的优化。

将子区域内行走路线、区域分割和子区域衔接顺序三方面结合,进行总体优化的考虑。

提出用“双线扫法”完成区域的分割,选择“向内螺旋式”行进作为子区域内部行进路径,构造整个待覆盖区域全连通图模型。

由于基于全连通图模型的行走路径与TSP问题极其相似,所以我采用了Hopfield人工神经网络求解TSP问题的方法优化全连通图,对移动机器人在各个子区域的行走顺序进行寻优。

最后给出了仿真试验,试验表明利用Hopfield人工神经网络,移动机器人在含有障碍物的环境中能够找到全覆盖的最优路径或者次优的路径。

1环境建模

所谓全覆盖寻优路径规划,是指机器人合理而高效地走遍一个区域内除障碍物以外的全部地方。

和点到点寻优算法一样全覆盖算法的应用范围很广,比如清扫(灰尘树叶积雪等)、收割(谷物草等)、耕犁、播撒(农药种子刷塗)、探矿、搜救、水下测绘、排雷等等。

1.1子区域内的行走方式

子区域内部行进方式采用“螺旋收缩式”。

虽然“螺旋收缩式”和“往复前进式”本身各有优缺点,但在多子区域覆盖问题上,“螺旋收缩式”的优点显而易见。

这些优点包括:

“螺旋收缩式”行进方式可避免“往复前进式”的边缘效应;“螺旋收缩式”不会留下或只在中间留下很少的未覆盖面积,而这位于中间的小的未覆盖部分,对机器人来说是很容易解决的;从理论上讲,机器人完成子区域内部覆盖后的终点位于最开阔的子区域重心(见图1),从而有利于区域分割任务完成后的机器人子区域衔接行为。

图1螺旋收缩式行进方式

1.2区域分割

子区域分割采用“双线扫法”。

所谓“双线扫法”,即用直立和水平各一根想象中的长线段分两次“扫”过整个待覆盖区域,第一次用直立线段从最左端“扫”至最右端,每当这根线与某个障碍物的某条直立边重合时,该线就从待覆盖区域划出一个高度等于待覆盖区域高度的子块。

第二次用水平线段从最上端至“扫”最下端,每当这根线与某个障碍物的某条水平边重合时,该线就将某个前次被直立线段划出的子块进一步分割成独立的子区域。

就是说,“双线扫法”分两次把整个待覆盖区域的子区域分割任务完成。

“双线扫法”比较适用于平行四边形障碍物且其边多数平行于区域边缘的情况。

“双线扫法”将整个待覆盖区域自然形成的小区域分割开来,不刻意追求所分成的子区域本身覆盖的高效率,主观上避免过小区域的出现,造成行走困难。

子区域面积越大,则一般说来由直线行进加以覆盖的部分就越多,余下由转弯动作完成覆盖的部分自然就越少了,耗费在转弯上的定位导航的时间变短、消耗的能量减少,提高了效率。

图2,采用“双线扫法”的对环境进行分割后的坐标式环境地图。

图2“双线扫法”的坐标式环境地图

用坐标法表示环境地图,经过分割后有两个障碍物的平面图被分割为七个子区域,每个子区域的坐标表示如下:

第一个子区域

第二个子区域

第三个子区域

第四个子区域

第五个子区域

第六个子区域

第七个子区域

分割的七个子区域如图3:

图3分割的七个子区域

1.3区域全连通图

在分割后的子区域基础上,构造整个待覆盖区域的全连通图模型。

为利用神经网络方法求子区域衔接顺序做准备。

把各个子区域的重心,作为该子区域对应节点的位置。

把子区域重心间的距离,作为对应节点间连线的长度。

由于真实情况是只有部分子区域相邻,所以最初的连通图只有部分节点之间直接连通。

为了进一步构造任意两个节点间都直接连通的全连通图,需要根据具体情况,在一些节点之间添加必要的连线,确实不能连接的节点之间用长度足够大的连线相连。

前面环境模型的连通图表示为图4:

图4区域全连通图

1.4优化机器人行走路线

本文要做的工作就是利用Hopfield网络解决TSP旅行商问题的办法,优化全连通图,找出一条优化行走路线。

使得机器人找出一条最短的路线,走遍连通图中的所有节点并最终回到起点。

下图是基于前面环境模型经过仿真的道的一条优化路径。

如图5:

图5优化的路径

2Hopfield人工神经网络算法概述

Hopfield网络分为两类;离散型Hopfield网络(DiscreteHopfieldNeuralNetwork)和连续型Hopfield网络(ContinuousHopfieldNeuralNetwork)。

两者具有相同的拓扑结构(如图6),主要区别在于其中每个神经元的取值是离散的还是连续的。

这种拓扑结构在很大程度上反映了生物神经系统中广泛存在的神经回路现象。

本文涉及的是连续型Hopfield网络(CHNN)在CHNN中各个神经元的状态取值是连续的,它根据式(2.1)所规定的符合生物神经活动的规律变化。

图6连续型Hopfield网络

式(2.1)

其中,Xi第i个神经元输入;Vj:

第j个神经元输出;Ii第i个神经元外部输入;r:

时间常数;Wij;反馈网络联结权——第j个神经元输出反馈到第i个神经元输入的系数;输出Vj=f(Xj),函数f(.)为S型函数(见式2.2)和图7。

S型函数符合真实神经细胞中信息传递的单调上升关系。

式(2.2)

图7神经元输入和输出的关系

从上面可以知道,连续Hopfield网络是一个单层反馈网络,它的每个神经元的输入与输出关系为连续可微的单调上升函数,每个神经元的输入与来自网络外部的输入信号和网络内部其它神经元的输出信号有直接关系,这种关系由它们之间的连接权定量确定。

由于每个神经元的输入是一个随时间变化的状态变量,于是整个系统成为一个随时间变化的动态系统。

关于CHNN的稳定性问题,Hopfield提出了一个有确定物理意义的广义李雅普诺夫函数,称为能量函数,能判别一个单层反馈动态神经网络的稳定性。

CHNN的能量函数定义为

式2.3

如果能量函数E随时间单调下降,就总可以达到能量的极小点,也就是系统的稳定点。

稳定条件是:

若Wij=Wji且输入输出关系是单调上升函数(dVi/dXi>0),则网络最终到达稳定点。

顺便指出,Hopfield选择的能量函数,只是保证系统稳定和渐近稳定的充分条件,而不是必要条件,也就是说能量函数不是唯一的。

能量函数第三项是仿照人工神经网络电路实现而人为增加的,它是一个正值函数,表现为Vi值越小,能量值也越小。

如果人为地设计连续Hopfield神经网络的联接权矩阵W和输入I,把传统优化问题中的目标函数、约束条件这两个东西与Hopfield能量函数联系起来,那么能量函数的极小点也是优化问题中满足约束条件的目标函数的极小点。

这就是应用CHNN求解优化问题。

2.1TSP问题描述

TSP问题描述如下:

假定有N个城市的集合(C1,C2,...,Cn),它们之间的距离dxy已知。

要求找出一条经过每个城市仅一次的最短路径,并且从起始点回到出发点。

例如行走路线为C3C1C5C2C4C3则行走的距离为:

d=d31+d15+d52+d24+d43

可以用关联矩阵表示为:

图8TSP中的关联矩阵

(1)TSP问题的目标函数h(V)

把关联矩阵的每个元素用符号VxiVyj来表示,下标x,y表示城市,下标i,j表示顺序,则目标函数为

式2.4

其中,Vxi取0表示不经过城市x,取1表示经过城市x,dxy表示两不同城市之间距离

(2)约束条件g(V)

约束条件是要保证关联矩阵每一行和每一列只有一个元素为1,其余均为0,为1的总数为N。

约束条件如下式2.5

第一项表示一次只能到一个城市,满足约束时该项为零,第二项表示每个城市只能去一次,第三项表示Vxi为1的次数最多为N,若满足约束这些项为0。

(3)Hopfield能量函数

式2.6

系数ABCD和距离dxy都是大于0的因而E>0然后根据能量函数E

式2.7

求得神经元的状态方程

式2.8

根据上面的状态方程,再加下面的输出方程,就可以通过计算机数值迭代求得旅行商的周游顺序。

式2.9

值得提及的是,CHNN本身是非线性的,随着城市数目N的增加,其局部极小点的数目也随之增加,使优化的结果不容易达到全局最优,而往往得到的是较优解,甚至有时还会得到不很优化的解。

即使得到的解不很优化,但只要按照该解能够走遍所有城市且能每个城市只到一次,该解习惯被称为合理解。

3仿真试验设计

3.1移动机器人环境地图

图9移动机器人环境地图

3.2环境地图的全连通图

根据机器人实际的环境,求得环境的全连通图。

3.3Hopfield人工神经网络算法模块

以下是迭代算法共分5步

第一步取初值

第二步在初始时刻t=t0令Xxi(t0)=Xinit+

其中

为随机噪声

第三步由

求Xxi(t0)

第四步将Vxi(t0)代入下式

第五步按

求下一时刻的Xxi(t+t)然后转第三步或者进入下一步

第六步当每个Vxi变化量小于规定值或迭代次数超过规定值时结束迭代。

本迭代算法运行所得结果为关联矩阵,其中行表示子区域,列表示移动机器人到达某子区域的先后顺序。

CHNN算法的稳定性先天不足,这一点无法回避,表现为收敛速度不够快,或者系统初始位置不确定导致收敛到一些不是最小值点的极小值点,甚至还有可能发散。

原因主要有初值的影响系,数的影响,子区域分布的影响,神经元本身输入输出关系的非线性,等等。

Hopfield网络的成功与否,取决于能不能合适地选择四个独立的系数ABC和D。

在A—B—C—D空间中的一个很小的低维区域中,这种方法才能给出满足约束的合理解,大多数选择的系数值都不能得出令人满意的结果。

同时注意到了两个隐含的约束:

第一个是每个子区域只在旅行路线中出现一次;第二个是旅行路线上的每个站都只能是在一个子区域,所以引入了两个约束J,K。

3.4程序中的参数

关联矩阵元素的初值X0=0.02

约束条件三个系数A=3.3B=3.3C=1.5

增加的约束条件二个系数J=30.0K=30.0

目标函数的系数D=1.8

时间步长t=0.005

结束迭代的关联矩阵元素值增量dv=0.001

结束迭代的迭代次数上限n=5000

实验所采用的一个具有真实距离数值的距离阵如下:

其中无法直接相连的用足够大的距离值代替。

1

2

3

4

5

6

7

1

0.00

1.30

1.25

14.0

14.0

14.0

14.0

2

1.30

0.00

14.0

1.35

1.95

2.345

14.0

3

1.25

14.0

0.00

1.30

2.725

1.95

14.0

4

14.0

1.35

1.30

0.00

1.425

1.325

14.0

5

14.0

1.95

2.725

1.425

0.00

14.0

1.45

6

14.0

2.345

1.95

1.325

14.0

0.00

1.375

7

14.0

14.0

14.0

14.0

1.45

1.375

0.00

距离阵中距离值的实际单位是米。

3.5仿真结果

CHNN算法代码运行30次,结果为23次收敛到合理解,7次发散。

下图是仿真的结果,以及给出的收敛路径,由于时间的仓促没有对仿真结果加以很细的分析。

下面只是列出了两种仿真结果。

第一种仿真结果:

4-5-7-6-2-1-3

对应于上面仿真结果的全域连通

 

第二种仿真结果:

3-6-7-5-4-2-1

对应于上面仿真结果的全域连通图。

仿真结果表明基于Hopfield人工神经网络算法的有效性,使得移动机器人在含有障碍物的环境种能够找到一条优化的全域覆盖路径。

4小结

本文提出用连续Hopfield人工神经网络模型求解旅行商问题的算法来寻找具有一定优化的移动机器人全覆盖路径。

虽然利用Hopfield模型求解优化问题,不一定每次都能得到最优解,但它确有能快速得到满意解。

其次本文给出了在简单环境下的仿真,实验表明了算法的有效性,但是在复杂环境中,由于CHNN算法本身的缺陷,可能会不收敛,在复杂环境的最优路径的选择还有待进一步研究。

附录:

算法

下面是用VC++编写的仿真程序。

#include

#include

#include

#include

#defineN7/*numberofcities*/

seven()

{

floatu0,t,tao;

floatv0,v1,v2,v3,v4,v5,v6,dv,delta,s,dist;

floatu[8][8],vb[9][9],v[9][9],du[8][8];

floatA,B,C,D,J,K;

intx,i,y,j,e;

intn,column[9];/*cyclingtimes*/

floatd[8][8]={0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,/*distance*/

0.0,0.0,1.3,1.25,14.0,14.0,14.0,14.0,/*between*/

0.0,1.3,0.0,14.0,1.35,1.95,2.345,14.0,/*7cities*/

0.0,1.25,14.0,0.0,1.3,2.725,1.95,14.0,

0.0,14.0,1.35,1.3,0.0,1.425,1.325,14.0,

0.0,14.0,1.95,2.725,1.425,0.0,14.0,1.45,

0.0,14.0,2.345,1.95,1.325,14.0,0.0,1.375,

0.0,14.0,14.0,14.0,14.0,1.45,1.375,0.0};

u0=0.02;/*step1:

initialization*/

A=3.3,B=3.3,C=1.5,D=1.8;/*step1:

*/

J=30.0,K=30.0;/*step1:

*/

t=0.005;

tao=100.0;

u[0][0]=0.5*u0*log(N-1);/*step1:

*/

n=1;/*step1:

*/

printf("u[0][0]=%8.6f\n",u[0][0]);/**/

srand(time(NULL));/*secondasseed*/

for(x=1;x<8;x++)/*initialinput*/

{

for(i=1;i<8;i++)/*values*/

{/*of49cells*/

delta=(rand()%2000)/1000.0-1.0;

u[x][i]=u[0][0]+delta;

printf("u[%d][%d]=%6.4f",x,i,u[x][i]);

}

printf("\n");

}

for(x=0;x<8;x++)/*step02:

outputvalues*/

for(i=0;i<8;i++)/*step02:

ofcell[x][i]*/

vb[x][i]=0.0;/*step02:

attimet0*/

do

{

e=0;

for(x=1;x<8;x++)/*step2:

*/

for(i=1;i<8;i++)/*step2:

*/

{

v[x][i]=0.5*(1.0+tanh(u[x][i]/u0));/*step2:

newoutputvalue*/

dv=v[x][i]-vb[x][i];/*step2:

variatedvalue*/

vb[x][i]=v[x][i];

if(fabs(dv)>0.001)/*step3:

oneofcriteria*/

e=1;/*step3:

forend*/

}

for(x=1;x<8;x++)

{

v[x][0]=v[x][7];

v[x][8]=v[x][1];

}

if(e==0)/*ifalldv<0.001*/

break;/*stop*/

else/*ifanydv>0.001*/

n+=1;/*continue*/

for(x=1;x<8;x++)/*step3:

*/

for(i=1;i<8;i++)/**/

{

v1=0.0;/*startpoint*/

v2=0.0;

v3=0.0;

v4=0.0;

v5=0.0;

v6=0.0;

v0=-u[x][i]/tao;/*step3:

----term0*/

for(j=1;j<8;j++)/*step3:

totalvaluesof*/

if(j!

=i)/*step3:

cellsinlinex*/

v1=v1+v[x][j];

v1=-A*v1;/*step3:

----term1*/

for(y=1;y<8;y++)/*step3:

totalvaluesof*/

if(y!

=x)/*step3:

cellsincolumni*/

v2=v2+v[y][i];/**/

v2=-B*v2;/*step3:

----term2*/

for(y=1;y<8;y++)/*step3:

totalvalues*/

for(j=1;j<8;j++)/*step3:

ofallcells*/

v3=v3+v[y][j];/**/

v3=-C*(v3-N);/*step3:

----term3*/

for(j=1;j<8;j++)/*step3:

possibledistance*/

v4=v4+d[x][j]*(v[j][i+1]+v[j][i-1]);/*step3:

betweenany2*/

v4=-D*v4;/*step3:

----term4*/

for(j=1;j<8;j++)/*twomorerestriction*/

v5=v5+v[x][j];/*conditions:

v5andv6*/

v5=-J*(v5-1.0);

for(y=1;y<8;y++)

v6=v6+v[y][i];

v6=-K*(v6-1.0);

du[x][i]=v0+v1+v2+v3+v4+v5+v6;/*step3:

valueofdu/dt*/

u[x][i]=u[x][i]+du[x][i]*t;/*step4:

newinput*/

}

printf("\n");

}while(n<5000);/*theothercriteria*/

for(i=1;i<8;i++)

{

for(j=1;j<8;j++)

printf("u%d,%d=%7.5f",i,j,u[i][j]);/*result:

inputvalues*/

printf("\n");

}

printf("\n");

printf("times=%d\n",n);/*result:

times*/

for(x=1;x<8;x++)/*displaythevmatrix*/

{/*infloatnumber*/

for(y=1;y<8;y++)

printf("%7.4f",v[x][y]);

printf("\n");

}

for(x=1;x<8;x++)/*dispalythevmatrix*/

{/*inintegernumber*/

for(y=1;y<8;y++)

{

v[x][y]=floor(v[x][y]+0.38);

printf("%.0f",v[x][y]);

}

printf("\n");

}

getch();

}

main()

{

seven();

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1