2024年4月17日发(作者:旷波)
龙源期刊网
遗传算法在智能机器人行为规划中的应用研
究
作者:叶本公,刘敬,陈曦
来源:《软件导刊》2013年第12期
摘要:遗传算法(GA)是一种基于进化论的仿生算法,非常适合于求解最优化问题,适
用于解决难度大或者计算代价大的问题。将遗传算法用于可移动智能体的研究,其重点是智能
机器人的行为规划,对此进行了论述。
关键词:遗传算法;智能机器人;行为规划
中图分类号:TP311.5文献标识码:A文章编号文章编号:1672-7800(2013)012-0064-03
作者简介:叶本公(1968-),男,江汉大学文理学院副教授,研究方向为人工智能;刘
敬(1958-),男,江汉大学文理学院副教授,研究方向为算法研究;陈曦(1979-),女,江
汉大学文理学院讲师,研究方向为软件工程。
0引言
智能机器人的行为规划和控制问题,是一个解决难度较大、不容易人工干预的复杂问题,
目前技术条件下解决办法一般是采用遗传算法,即把问题的参数用基因代表,把问题的解用染
色体代表(在计算机里用二进制码表示),从而得到一个由具有不同染色体的个体组成的群
体。这个群体在问题特定的环境里生存竞争,适者有最好的机会生存和产生后代。后代随机化
地继承了父代的最好特征,并在生存环境的控制支配下继续这一过程。群体的染色体将逐渐适
应环境,不断进化,最后收敛到一族最适应环境的类似个体,即得到问题的最优解。
本文将遗传算法用于智能机器人的行为规划,设计出算法的主要内容,并用C++完成其核
心代码。
1人工控制下智能机器人的行为表现
智能飞船的行为控制代码主要由两个重要的类CLander 和Ccontroller来完成。Ccontroller
类的核心代码如下:
class CController
{private:
CLander* m_pUserLander;
龙源期刊网
bool m_bSuccess;
vector m_vecStarVB;
vector m_vecPadVB;
SVector2D m_vPadPos;
int m_cxClient,
m_cyClient;
void WorldTransform(vector &pad);
void RenderLandingPad(HDC &surface);
public:
CController(int cxClient, int cyClient);
~CController();
bool Update(double TimeElapsed);
void NewRun();
void Render(HDC &surface);
};
如果智能飞船能成功登陆,则m_bSuccess的值为true;m_vecStarVB用于存放登陆点的顶
点缓冲区;m_vecPadVB存放登陆点的形状缓冲区;m_vPadPos为登陆点的位置;Update( )
更新智能飞船的位置;NewRun( )初始化新一轮的执行。
CLander类中保存着一个记录,其中包含了需要知道的有关智能飞船的所有信息,也包括
绘制智能飞船、从用户得到输入信息以及进行物理更新的各种方法。下面为CLander类的核心
代码:
class CLander
{ ……
龙源期刊网
public:
Clander{int cxClient,
int cyClient,
double rot,
SVector2D pos,
SVector2D pad);
void Render(HDC &surface);
void Reset(SVector2D &NewPadPos);
void UpdateShip(double TimeElapsed);
};
其中的UpdateShip( )函数是控制智能飞船的行为。如何从用户端接收输入,如何更新
登月船的位置和速度,都是在UpdateShip函数中完成的。update函数在每一个帧中功能包括:
检测用户是否按下了一个键,相应地更新智能飞船的速度、加速度和旋转角;更新智能飞船的
位置;变换智能飞船的顶点;检测智能飞船的顶点是否在地平面以下;如果智能飞船已到达地
平面,检测登陆是成功或者失败。
测试的结果是智能飞船在人工控制下的表现不尽如人意,具体表现是智能飞船成功登陆很
困难,分析其原因,是在人工控制下的情况下,智能飞船面对的复杂环境被简单化,不能满足
复杂的环境要求。为此,必须考虑智能飞船在复杂情况下的行为规划。
2遗传算法的引入
为了研究智能飞船在复杂情况下的行为规划,必须考虑在其行为控制中引入遗传算法。
遗传算法包括3个基本操作:选择、交叉(基因重组)、变异。遗传算法涉及六大要素:
参数编码、初始群体的设定、适应度函数的设计、遗传操作的设计、控制参数的设定、迭代终
止条件。
下面主要论述以下3个问题:基因编码、杂交和变异操作、适应度函数的设计。
3遗传算法控制的智能飞船
龙源期刊网
解决智能飞船控制问题的关键,在于正确定义下面3件事情:
①为可能出现的所有候选解进行编码;
②确定意义明确的变异和杂交操作;
③设计一个准确的适应性函数。
3.1基因组编码
候选解可以用二进制的位串进行编码,或者利用整数(数列)的一个置换(permutation)
来编码,也可用一系列实数来进行编码。但如果为非常复杂的候选解进行编码时,不论基因组
有多长,都应为它们指定变异和杂交操作,甚至有可能利用非常复杂的数据结构来作为基因,
但目前必须保证变异和杂交操作能以一种有意义的方式应用到问题中。一共有4种不同的方法
来控制登月飞船:可以使用一个向前推进的力、可以使用一个向左转动的力、可以使用一个向
右转动的力、不施加任何力,即让它进行漂移或滑翔。
这4种控制动作的每一种都在某个时间周期中应用,该时间周期用它更新每一帧所需的秒
数(分数值)来表示。因此,在每一个编码中必须同时表示出行动(action)和持续时间
(duration)两种数据。每个基因包含了一对数据。其中前半个基因代表飞船应该采取的行
动,后半个基因则表示该行动应该持续的时间长度。
每个基因的一次行动的最大持续时间由MAX ACTION DURATION定义为30个帧。 定义
基因组的代码如下:
struct SGenome
{ vector vecActions;
double dFitness;
SGenome():dFitness(0){}
SGenome(const int num_actions):dFitness(0)
{ for (int i=0; i
{ _back(SGene()); }
}
friend bool operator
龙源期刊网
{ return (ss < ss); }
};
假设遗传算法的初始群体是由一些随机的基因组即随机的行动和持续时间串组成的,如果
每个动作能依次应用于指定的时间周期中,由此就可以控制智能飞船了。
3.2杂交和变异操作
下面的程序将采用多点杂交,两个基因组的多点杂交,就是沿着基因组长度,随机地选取
一些点位,将对应基因进行互换,直到把整个基因组处理完毕。
变异算子则是沿基因组长度在某些点位上将基因的两个组成部分进行随机变化。首先按照
变异率,把其中的动作随机地改变成另外的动作(动作可能保持不变)。然后将动作的持续时
间改变为不超过MAX_MUTATION_DURATION的另一个持续时间。持续时间同时还要被限
制在零到MAX_ACTION_DURATIDN之间。
3.3适应性函数
适应性函数常常是遗传算法最难确定的一个部分,这是因为问题常常是多目标的。在本例
中智能飞船要成功着陆,在着陆之前必须同时满足几个目标,这就是:智能飞船与登陆地点中
心的距离必须在某个范围之内、智能飞船落到登陆点的速度必须在某个速度之下、智能飞船偏
离轴的转角必须在某个预定范围之内。
利用上述3个目标来编写适应性函数时,登陆动作显得过于简单。在游戏中,智能飞船从
天上笔直着陆,并采用相当精确的转动角度和推进力着陆。因此加入人工的干预操作,加入了
一个目标:智能飞船在空中停留的时间愈长,适应性分数也增加得比别人愈多,算法就变得比
较完善,智能飞船的行为变得比较真实。
下面为适应性函数的代码:
void CLander::CalculateFitness()
{ double DistFromPad = fabs(m_vPadPos.x - m_vPos.x);
double distFit = m_cxClient-DistFromPad;
double speed = sqrt((m_vVelocity.x*m_vVelocity.x) +
(m_vVelocity.y*m_vVelocity.y));
double rotFit = 1/(fabs(m_dRotation)+1);
龙源期刊网
double fitAirTime = (double)m_cTick/(speed+1);
m_dFitness = distFit + 400*rotFit + 4* fitAirTime;
if( (DistFromPad < DIST_TOLERANCE) &&
(speed < SPEED_TOLERANCE) &&
(fabs(m_dRotation) < ROTATION_TOLERANCE))
{ m_dFitness = BIG_NUMBER; }
}
适应性函数最后检查智能飞船是否已通过安全登陆所需要的全部要求,如果是,就把一个
很大的数赋给适应性分数,这样程序就知道已经得到一个解。
3.4更新函数
下面介绍引入遗传算法后智能飞船程序的update函数。当演化候选解时,应使计算机运行
得尽可能快,以便快速找到一个解。人工控制版的update函数在每一帧中都加入了最低延迟时
间,即使用每秒5 000帧的标准来运行它,智能飞船像是在作实时运动。
在update函数中使用这种方法还能够使更新函数变得更快,因为计算工作减少了。缺点
是,如果要在人工控制版中使用这种技术,而程序是在一台慢速的计算机上运行,则在不同出
帧率的计算机上将会感到有不同的实际情况。
下面是引入遗传算法后UpdateShip函数的部分代码:
bool CLander::UpdateShip()
{ if (m_bCheckedIfLanded)
{ return false; }
action_type action;
if (m_cTick >= m_())
{ action = non; }
else
龙源期刊网
{ action = m_vecActions[m_cTick++]; }
m_bJetOn = false;
switch (action)
{ case rotate_left:
m_dRotation -= ROTATION_PER_TICK;
if (m_dRotation < -PI)
{ m_dRotation += TWO_PI; }
break;
case rotate_right:
m_dRotation += ROTATION_PER_TICK;
if (m_dRotation > TWO_PI)
{ m_dRotation -= TWO_PI; }
break;
case thrust:
{ double ShipAcceleration = THRUST_PER_TICK/m_dMass;
m_vVelocity.x += ShipAcceleration * sin(m_dRotation);
m_vVelocity.y += ShipAcceleration * cos(m_dRotation);
m_bJetOn = true;
}
break;
case non:
龙源期刊网
break;
}
return true;
}
在每一个epoch之前,所有个体的基因组都用解码函数Decode转化为一个行动向量。利
用这种办法很容易将帧记数器用作动作数组的下标,以确定在每一帧中哪一个行动需要执行。
利用上述方法可以减少物理计算。程序最后用来做一些范围检查——检查智能飞船是否已
经在地面之下,并更新它的适应性分数。
4效果分析和改进建议
尽管遗传算法的进化复杂度很低,但可以看到,经过仅仅几十代的进化后智能体的躲避能
力得到了很大的提高。而经过上千代的进化,智能体的行为有点奇怪。分析其原因,本项目采
用的遗传算法设置采用轮盘赌选择法来选拔合适结果,没有使用适应性比例选择,因此可以对
许多参数进行改进试验,以提高它的性能。
以上所实现的算法存在一些可以改进的地方,主要有如下几个方面:
使用适应性比例选择,对许多参数进行改进试验。
在个体较少的情况下,算法的收敛速度太快。可以通过改变选择算法、增加个体数量和适
当减少精英策略来改进该缺点。
需要对包含如此大量规则的规则集进行优化。这意味着需要执行几十万轮次的进化,甚至
更多。我们可以采用实数来表示最优方向和推进力量的基因。
5结语
引入遗传算法后,智能飞船的行为显得更加富有“理性”和更加逼近真实的情境。由于能同
时观察到所有个体,从而能确切得到群体有怎样的差异,进而得知不同的选择方法、不同的变
异算子或不同的杂交算子对性能会有什么样的影响。
参考文献参考文献:
[1]王万森.人工智能原理及其应用[M].北京:电子工业出版社,2012.
龙源期刊网
[2][澳]MICHAEL NEGNEVITSKY.人工智能系统指南[M].陈薇,译.北京:机械工业出版
社,2012.
[3]RECHT.计算智能导论[M].第2版.谭营,译.北京:清华大学出版
社,2010.
[4]蔡自兴,徐光祐.人工智能及其应用[M].第4版.北京:清华大学出版社,2010.
[5]史忠植.高级人工智能[M].第3版.北京:科学出版社, 2011.
[6]危辉.人工智能形式概念系统[M].北京:科学出版社,2011.
[7]马锐.人工神经网络原理[M].北京:机械工业出版社,2010.
[8][加]海金.神经网络与机器学习[M].北京:机械工业出版社,2011.
[9][美]拉塞尔,诺维格.人工智能:一种现代的方法[M].北京:清华大学出版社,2011.
[10]孙晓燕, 巩敦卫, 徐瑞东.高级交互式遗传算法理论与应用[M].北京:科学出版社,
2011.
(责任编辑:杜能钢)
2024年4月17日发(作者:旷波)
龙源期刊网
遗传算法在智能机器人行为规划中的应用研
究
作者:叶本公,刘敬,陈曦
来源:《软件导刊》2013年第12期
摘要:遗传算法(GA)是一种基于进化论的仿生算法,非常适合于求解最优化问题,适
用于解决难度大或者计算代价大的问题。将遗传算法用于可移动智能体的研究,其重点是智能
机器人的行为规划,对此进行了论述。
关键词:遗传算法;智能机器人;行为规划
中图分类号:TP311.5文献标识码:A文章编号文章编号:1672-7800(2013)012-0064-03
作者简介:叶本公(1968-),男,江汉大学文理学院副教授,研究方向为人工智能;刘
敬(1958-),男,江汉大学文理学院副教授,研究方向为算法研究;陈曦(1979-),女,江
汉大学文理学院讲师,研究方向为软件工程。
0引言
智能机器人的行为规划和控制问题,是一个解决难度较大、不容易人工干预的复杂问题,
目前技术条件下解决办法一般是采用遗传算法,即把问题的参数用基因代表,把问题的解用染
色体代表(在计算机里用二进制码表示),从而得到一个由具有不同染色体的个体组成的群
体。这个群体在问题特定的环境里生存竞争,适者有最好的机会生存和产生后代。后代随机化
地继承了父代的最好特征,并在生存环境的控制支配下继续这一过程。群体的染色体将逐渐适
应环境,不断进化,最后收敛到一族最适应环境的类似个体,即得到问题的最优解。
本文将遗传算法用于智能机器人的行为规划,设计出算法的主要内容,并用C++完成其核
心代码。
1人工控制下智能机器人的行为表现
智能飞船的行为控制代码主要由两个重要的类CLander 和Ccontroller来完成。Ccontroller
类的核心代码如下:
class CController
{private:
CLander* m_pUserLander;
龙源期刊网
bool m_bSuccess;
vector m_vecStarVB;
vector m_vecPadVB;
SVector2D m_vPadPos;
int m_cxClient,
m_cyClient;
void WorldTransform(vector &pad);
void RenderLandingPad(HDC &surface);
public:
CController(int cxClient, int cyClient);
~CController();
bool Update(double TimeElapsed);
void NewRun();
void Render(HDC &surface);
};
如果智能飞船能成功登陆,则m_bSuccess的值为true;m_vecStarVB用于存放登陆点的顶
点缓冲区;m_vecPadVB存放登陆点的形状缓冲区;m_vPadPos为登陆点的位置;Update( )
更新智能飞船的位置;NewRun( )初始化新一轮的执行。
CLander类中保存着一个记录,其中包含了需要知道的有关智能飞船的所有信息,也包括
绘制智能飞船、从用户得到输入信息以及进行物理更新的各种方法。下面为CLander类的核心
代码:
class CLander
{ ……
龙源期刊网
public:
Clander{int cxClient,
int cyClient,
double rot,
SVector2D pos,
SVector2D pad);
void Render(HDC &surface);
void Reset(SVector2D &NewPadPos);
void UpdateShip(double TimeElapsed);
};
其中的UpdateShip( )函数是控制智能飞船的行为。如何从用户端接收输入,如何更新
登月船的位置和速度,都是在UpdateShip函数中完成的。update函数在每一个帧中功能包括:
检测用户是否按下了一个键,相应地更新智能飞船的速度、加速度和旋转角;更新智能飞船的
位置;变换智能飞船的顶点;检测智能飞船的顶点是否在地平面以下;如果智能飞船已到达地
平面,检测登陆是成功或者失败。
测试的结果是智能飞船在人工控制下的表现不尽如人意,具体表现是智能飞船成功登陆很
困难,分析其原因,是在人工控制下的情况下,智能飞船面对的复杂环境被简单化,不能满足
复杂的环境要求。为此,必须考虑智能飞船在复杂情况下的行为规划。
2遗传算法的引入
为了研究智能飞船在复杂情况下的行为规划,必须考虑在其行为控制中引入遗传算法。
遗传算法包括3个基本操作:选择、交叉(基因重组)、变异。遗传算法涉及六大要素:
参数编码、初始群体的设定、适应度函数的设计、遗传操作的设计、控制参数的设定、迭代终
止条件。
下面主要论述以下3个问题:基因编码、杂交和变异操作、适应度函数的设计。
3遗传算法控制的智能飞船
龙源期刊网
解决智能飞船控制问题的关键,在于正确定义下面3件事情:
①为可能出现的所有候选解进行编码;
②确定意义明确的变异和杂交操作;
③设计一个准确的适应性函数。
3.1基因组编码
候选解可以用二进制的位串进行编码,或者利用整数(数列)的一个置换(permutation)
来编码,也可用一系列实数来进行编码。但如果为非常复杂的候选解进行编码时,不论基因组
有多长,都应为它们指定变异和杂交操作,甚至有可能利用非常复杂的数据结构来作为基因,
但目前必须保证变异和杂交操作能以一种有意义的方式应用到问题中。一共有4种不同的方法
来控制登月飞船:可以使用一个向前推进的力、可以使用一个向左转动的力、可以使用一个向
右转动的力、不施加任何力,即让它进行漂移或滑翔。
这4种控制动作的每一种都在某个时间周期中应用,该时间周期用它更新每一帧所需的秒
数(分数值)来表示。因此,在每一个编码中必须同时表示出行动(action)和持续时间
(duration)两种数据。每个基因包含了一对数据。其中前半个基因代表飞船应该采取的行
动,后半个基因则表示该行动应该持续的时间长度。
每个基因的一次行动的最大持续时间由MAX ACTION DURATION定义为30个帧。 定义
基因组的代码如下:
struct SGenome
{ vector vecActions;
double dFitness;
SGenome():dFitness(0){}
SGenome(const int num_actions):dFitness(0)
{ for (int i=0; i
{ _back(SGene()); }
}
friend bool operator
龙源期刊网
{ return (ss < ss); }
};
假设遗传算法的初始群体是由一些随机的基因组即随机的行动和持续时间串组成的,如果
每个动作能依次应用于指定的时间周期中,由此就可以控制智能飞船了。
3.2杂交和变异操作
下面的程序将采用多点杂交,两个基因组的多点杂交,就是沿着基因组长度,随机地选取
一些点位,将对应基因进行互换,直到把整个基因组处理完毕。
变异算子则是沿基因组长度在某些点位上将基因的两个组成部分进行随机变化。首先按照
变异率,把其中的动作随机地改变成另外的动作(动作可能保持不变)。然后将动作的持续时
间改变为不超过MAX_MUTATION_DURATION的另一个持续时间。持续时间同时还要被限
制在零到MAX_ACTION_DURATIDN之间。
3.3适应性函数
适应性函数常常是遗传算法最难确定的一个部分,这是因为问题常常是多目标的。在本例
中智能飞船要成功着陆,在着陆之前必须同时满足几个目标,这就是:智能飞船与登陆地点中
心的距离必须在某个范围之内、智能飞船落到登陆点的速度必须在某个速度之下、智能飞船偏
离轴的转角必须在某个预定范围之内。
利用上述3个目标来编写适应性函数时,登陆动作显得过于简单。在游戏中,智能飞船从
天上笔直着陆,并采用相当精确的转动角度和推进力着陆。因此加入人工的干预操作,加入了
一个目标:智能飞船在空中停留的时间愈长,适应性分数也增加得比别人愈多,算法就变得比
较完善,智能飞船的行为变得比较真实。
下面为适应性函数的代码:
void CLander::CalculateFitness()
{ double DistFromPad = fabs(m_vPadPos.x - m_vPos.x);
double distFit = m_cxClient-DistFromPad;
double speed = sqrt((m_vVelocity.x*m_vVelocity.x) +
(m_vVelocity.y*m_vVelocity.y));
double rotFit = 1/(fabs(m_dRotation)+1);
龙源期刊网
double fitAirTime = (double)m_cTick/(speed+1);
m_dFitness = distFit + 400*rotFit + 4* fitAirTime;
if( (DistFromPad < DIST_TOLERANCE) &&
(speed < SPEED_TOLERANCE) &&
(fabs(m_dRotation) < ROTATION_TOLERANCE))
{ m_dFitness = BIG_NUMBER; }
}
适应性函数最后检查智能飞船是否已通过安全登陆所需要的全部要求,如果是,就把一个
很大的数赋给适应性分数,这样程序就知道已经得到一个解。
3.4更新函数
下面介绍引入遗传算法后智能飞船程序的update函数。当演化候选解时,应使计算机运行
得尽可能快,以便快速找到一个解。人工控制版的update函数在每一帧中都加入了最低延迟时
间,即使用每秒5 000帧的标准来运行它,智能飞船像是在作实时运动。
在update函数中使用这种方法还能够使更新函数变得更快,因为计算工作减少了。缺点
是,如果要在人工控制版中使用这种技术,而程序是在一台慢速的计算机上运行,则在不同出
帧率的计算机上将会感到有不同的实际情况。
下面是引入遗传算法后UpdateShip函数的部分代码:
bool CLander::UpdateShip()
{ if (m_bCheckedIfLanded)
{ return false; }
action_type action;
if (m_cTick >= m_())
{ action = non; }
else
龙源期刊网
{ action = m_vecActions[m_cTick++]; }
m_bJetOn = false;
switch (action)
{ case rotate_left:
m_dRotation -= ROTATION_PER_TICK;
if (m_dRotation < -PI)
{ m_dRotation += TWO_PI; }
break;
case rotate_right:
m_dRotation += ROTATION_PER_TICK;
if (m_dRotation > TWO_PI)
{ m_dRotation -= TWO_PI; }
break;
case thrust:
{ double ShipAcceleration = THRUST_PER_TICK/m_dMass;
m_vVelocity.x += ShipAcceleration * sin(m_dRotation);
m_vVelocity.y += ShipAcceleration * cos(m_dRotation);
m_bJetOn = true;
}
break;
case non:
龙源期刊网
break;
}
return true;
}
在每一个epoch之前,所有个体的基因组都用解码函数Decode转化为一个行动向量。利
用这种办法很容易将帧记数器用作动作数组的下标,以确定在每一帧中哪一个行动需要执行。
利用上述方法可以减少物理计算。程序最后用来做一些范围检查——检查智能飞船是否已
经在地面之下,并更新它的适应性分数。
4效果分析和改进建议
尽管遗传算法的进化复杂度很低,但可以看到,经过仅仅几十代的进化后智能体的躲避能
力得到了很大的提高。而经过上千代的进化,智能体的行为有点奇怪。分析其原因,本项目采
用的遗传算法设置采用轮盘赌选择法来选拔合适结果,没有使用适应性比例选择,因此可以对
许多参数进行改进试验,以提高它的性能。
以上所实现的算法存在一些可以改进的地方,主要有如下几个方面:
使用适应性比例选择,对许多参数进行改进试验。
在个体较少的情况下,算法的收敛速度太快。可以通过改变选择算法、增加个体数量和适
当减少精英策略来改进该缺点。
需要对包含如此大量规则的规则集进行优化。这意味着需要执行几十万轮次的进化,甚至
更多。我们可以采用实数来表示最优方向和推进力量的基因。
5结语
引入遗传算法后,智能飞船的行为显得更加富有“理性”和更加逼近真实的情境。由于能同
时观察到所有个体,从而能确切得到群体有怎样的差异,进而得知不同的选择方法、不同的变
异算子或不同的杂交算子对性能会有什么样的影响。
参考文献参考文献:
[1]王万森.人工智能原理及其应用[M].北京:电子工业出版社,2012.
龙源期刊网
[2][澳]MICHAEL NEGNEVITSKY.人工智能系统指南[M].陈薇,译.北京:机械工业出版
社,2012.
[3]RECHT.计算智能导论[M].第2版.谭营,译.北京:清华大学出版
社,2010.
[4]蔡自兴,徐光祐.人工智能及其应用[M].第4版.北京:清华大学出版社,2010.
[5]史忠植.高级人工智能[M].第3版.北京:科学出版社, 2011.
[6]危辉.人工智能形式概念系统[M].北京:科学出版社,2011.
[7]马锐.人工神经网络原理[M].北京:机械工业出版社,2010.
[8][加]海金.神经网络与机器学习[M].北京:机械工业出版社,2011.
[9][美]拉塞尔,诺维格.人工智能:一种现代的方法[M].北京:清华大学出版社,2011.
[10]孙晓燕, 巩敦卫, 徐瑞东.高级交互式遗传算法理论与应用[M].北京:科学出版社,
2011.
(责任编辑:杜能钢)