- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
神经网络入门六
神经网络入门连载之六
4.10??功能的两个改进 (A Couple of Improvements) 尽管扫雷机学习寻找地雷的本领十分不错,这里我仍有两件事情要告诉你,它们能进一步改进扫雷机的性能。
4.10.1 改进一(Improvement Number One) 首先,单点crossover算子留下了许多可改进的余地。按照它的规定,算子是沿着基因组长度任意地方切开的,这样常有可能使个别神经细胞的基因组在权重的中间被一刀两段地分开。
为清楚起见,我们来考察图16的权重。这是我们以前在说明基因组如何编码时看过的一个简单网络。 在这里,杂交算子可以沿向量长度的任意一处切开,这样,就会有极大几率在某个神经细胞(如第二个)的权重中间断开,也就是说,在权重0.6和-0.1之间某处切开。这可能不会是我们想要的,因为,如果我们把神经细胞作为一个完整的单元来看待,则它在此以前所获得的任何改良就要被骚扰了。事实上,这样的杂交操作有可能非常非常象断裂性突变(disruptive mutation)操作所起的作用。
图16 简单的网络
与此针锋相对,我已创建了另一种类型的杂交运算,它只在神经细胞的边界上进行切开。在图16的例子中,就是在第3、4或第6、7的两个基因之间切开,如小箭头所示。 为了实现这一算法,我已在CNeuralNet类中补充了另一个切割方法: CalculateSplitPoints。这一方法创建了一个用于保存所有网络权重边界的矢量,它的代码如下:vectorint CNeuralNet::CalculateSplitPoints() const{? ?vectorint SplitPoints;??? ?int WeightCounter = 0;??? ?// 对每一层? ?for (int i=O; im_NumHiddenLayers + 1; ++i)? ? {? ???// 对每一个神经细胞? ???for (int j=O; jm_vecLayers.m_NumNeurons; ++j) {? ?? ? // 对每一个权重? ?? ? for (int k=O; km_vecLayers.m_vecNeurons[j].m_NumInputs; ++k)? ?? ??? { ? ?? ?? ??? ++WeightCounter;? ?? ??? }? ?? ???SplitPoints.push_back(WeightCounter - 1);? ?? ?}? ?}? ?return SplitPoints;} 这一方法是CController类构造函数在创建扫雷机并把断裂点向量传递给遗传算法类时调用的。它们被存储在一个名叫m_vecSplitPoints的std::vector向量中。然后遗传算法就利用这些断裂点来实现两点杂交操作,其代码如下:void CGenAlg::CrossoverAtSplits(const vectordouble??mum,? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???const vectordouble??dad,? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???vectordouble? ?? ?? ?babyl,? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???vectordouble? ?? ?? ?baby2){? ?// 如果超过了杂交率,就不再进行杂交,把2个上代作为2个子代输出? ?// 如果2个上辈相同,也把它们作为2个下辈输出? ?if ( (RandFloat() m_dCrossoverRate) || (mum == dad))? ???{? ?? ?baby1 = mum; ? ?? ?baby2 = dad;? ?? ?return;? ???}? ?// 确定杂交的2个断裂点? ?int index1 = RandInt(0, m_vecSplitPoints.size()-2);? ?int index2 = RandInt(Index1, m_vecSplitPoints.size()-1);? ?int cp1 = m_vecSplitPoints[Index1];? ?int cp2 = m_vecSplitPoints[Index2];? ?// 创建子代for (int i=0; imum.size(); ++i)? ?{ ? ???if ( (icp1) || (i=cp2) )? ?? ? {? ?? ?? ???
文档评论(0)