Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 遗传算法在神经网络中的应用_C++_Clr_Neural Network_Genetic Algorithm - Fatal编程技术网

C++ 遗传算法在神经网络中的应用

C++ 遗传算法在神经网络中的应用,c++,clr,neural-network,genetic-algorithm,C++,Clr,Neural Network,Genetic Algorithm,目前,我正在从事一个利用遗传算法优化神经网络的项目。我确实意识到这可能不是优化它们的最佳方法,但我对这两种方法都不熟悉,所以我只想尝试使用它们 我的计划如下(可能会有很多变化)。我的输入神经元使用的数据集几乎可以是任何正数(包括最多两位的小数,所以它们实际上是浮点数),但最有可能在0到20000之间。因为重要的是数字在值上的相互比较,而不是它们的大小,所以它们将首先被输入的所有值中的最大值除以。在进入隐藏层之前,它们将乘以权重(任何正或负浮动)。隐藏层中的每个神经元将对其所有输入求和,直到计算完

目前,我正在从事一个利用遗传算法优化神经网络的项目。我确实意识到这可能不是优化它们的最佳方法,但我对这两种方法都不熟悉,所以我只想尝试使用它们

我的计划如下(可能会有很多变化)。我的输入神经元使用的数据集几乎可以是任何正数(包括最多两位的小数,所以它们实际上是浮点数),但最有可能在0到20000之间。因为重要的是数字在值上的相互比较,而不是它们的大小,所以它们将首先被输入的所有值中的最大值除以。在进入隐藏层之前,它们将乘以权重(任何正或负浮动)。隐藏层中的每个神经元将对其所有输入求和,直到计算完成。然后,它们将通过物流功能运行并输出

<>我的环境是VisualStudioC++ 2010 Express,我使用CLR。< /P> 我的问题在于遗传算法及其工作原理。这将是调整重量。我的问题是,当它随机改变一个权重(突变率)时,它可能会使权重异常高或低,在与输入相乘并与其他权重相加时,会导致溢出或其他错误。我也不知道如何组织我的染色体。那么,通过选择权重来执行随机化会更好吗,而不是随机地将它们更改为定义范围内的随机数?基本上,我在寻找关于如何在不造成错误的情况下进行组织的建议,在保持性能的同时,使值最终变得太大或太小

谢谢,(如果这是理论计算机科学的话,我很抱歉,但我认为它不适合那里)

(人工)神经网络(ANN)是出了名的难以优化,而遗传算法(GAs)是一种相当好的方法(主要是因为它的工作效率往往非常有限)。当然,也有一些替代方案工作得很好,但它们更复杂,更微妙,无法正确编程和调整(模拟退火和学习动量的反向传播)。我知道你们做这个项目主要是为了玩这些东西

你可能想看看进化神经控制器(ENC),这是一个利用遗传(或进化)算法训练人工神经网络以完成复杂导航任务的领域(例如,行星间空间任务是我个人研究的应用之一)

对于人工神经网络,我建议你不要局限于后勤功能(我知道乙状结肠的灵感来自生物神经元,但这并不意味着它们一直都是最好的)。还有许多其他功能,之所以使用后勤功能,部分原因是它们使反向传播更快、更简单。但是,径向基函数也发挥了神奇的作用(依我所见,ANN最成功的应用是使用径向基函数,即RBF-NN)。通常,人们使用高斯函数、超球面函数和三角函数(称为模糊网络,另一大类ANN)

至于GAs,我不推荐你描述的突变类型(即翻转位),因为你提到的原因。人们在处理真正有价值的基因时不会使用这种突变。一种非常简单的突变方法就是决定(以一定的概率)对个体进行突变,然后选择其基因中的一个元素进行突变,然后简单地生成一个新的基因元素,用随机数生成器(rand())替换它。通过这种方式,您可以限制生成的基因元素的规模,以避免使您的个体退化的问题(即,一个完全错误的基因元素可以使整个个体无用)。基因是什么?对于ANN,通常是一个包含网络中所有神经元的所有权重的大向量。你可以猜测,如果神经元数量太多,人们很少使用气体。我还建议您使用锦标赛选择来选择要繁殖的个体。至于交叉(即,将两个父母混合成一个孩子),只需保持权重的顺序,并为孩子的每个元素随机选择一个来自父母中任意一方的权重,概率相等

我个人已经完成了上面所述的工作,并且对于某些问题(尺寸减小、复杂度高,即没有明显的最佳解决方案)效果很好


最后,不要期望它能那么容易地工作。通常,它需要的种群规模和世代数要远远高于你的预期(毕竟,进化是一个非常缓慢的过程!)。所以,不要尝试一个10人的群体,跑50代,然后悲伤地说“哦,我想它不起作用……”。当然,根据您所应用的问题的规模,按人口中数千人和几千到十万代的顺序尝试更多

你的问题在于染色体的表达。这就是众所周知的哈明悬崖问题。你可以用它来表示没有汉明悬崖问题的染色体

我不记得细节,但在这本书中:,作者做的和你描述的差不多,例如,使用基因突变的权重值来优化神经网络。您提出的解决方案与更传统的过程(甚至可能是非神经过程)之间的性能比较会很有趣。我很理解您所说的,感谢您提供了非常详细的答案,但我有一个问题。关于随机数生成,什么是最好的ra