Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.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_Genetic Algorithm - Fatal编程技术网

C 遗传算法使用哪种编码?

C 遗传算法使用哪种编码?,c,genetic-algorithm,C,Genetic Algorithm,我想用C编写一个遗传算法,用于优化10个变量(x1到x10)的函数。但是,我无法确定应该使用哪种编码。我在示例中主要看到使用二进制编码,但我的示例中的变量可以取实际值。另外,对于这些类型的问题,值编码是一个很好的选择吗 当两个非常接近最优的答案组合起来会使其他答案非常接近最优时,最好使用遗传算法。纯二进制编码的问题在于,如果不检查交叉,最终会得到两个答案,而这两个答案可能与原始答案没有多大关系 也就是说,只有当变量的数量非常少,并且变量中的数据量很大时,这才是真正的问题。至于选择一种编码,与其说

我想用C编写一个遗传算法,用于优化10个变量(x1到x10)的函数。但是,我无法确定应该使用哪种编码。我在示例中主要看到使用二进制编码,但我的示例中的变量可以取实际值。另外,对于这些类型的问题,值编码是一个很好的选择吗

当两个非常接近最优的答案组合起来会使其他答案非常接近最优时,最好使用遗传算法。纯二进制编码的问题在于,如果不检查交叉,最终会得到两个答案,而这两个答案可能与原始答案没有多大关系

也就是说,只有当变量的数量非常少,并且变量中的数据量很大时,这才是真正的问题。至于选择一种编码,与其说是一门科学,不如说是一门艺术,这取决于你的问题。我建议使用适合您所需精度的编码。有了10个变量,无论您如何编码,都不会错得太多,8位ASCII编码器可能可以正常工作


希望有帮助。

对于实值问题,我建议尝试CMA-ES或其他ES变体。CMA-ES无疑是实值问题的最新技术。它的目的是在多维问题中快速找到好的解决方案。上有可用的实现。在这项工作中,还有一个C#实现。进化策略是专为实值优化问题设计的算法。它们与遗传算法非常相似(两者都是在同一时间发明的,但在不同的地方)。主要区别在于,对于ES而言,主要驱动因素是突变,并且它具有对突变强度的巧妙适应。没有这种自适应,就无法及时定位(局部)最优。CMA-ES易于配置,它只需要初始标准偏差和可选的总体规模(否则,有一个公式可以在给定问题规模的情况下对此进行估计)

当然,遗传算法也可以应用,但你必须使用一些特定的算子,这些算子只能以很小的程度变异变量。例如,穆伦宾的育种家遗传算法。但一般来说,遗传算法更适合于需要正确组合的问题。例如,背包问题中应包含哪些项目,或将哪些函数和终端组合到公式中(遗传编程)。如果你需要为某件事找到合适的价值,那么问题就少了。当然,虽然有遗传算法的变体可以解决这些问题,但请寻找实数编码遗传算法(RCGA或RGA)

另一种适用于实值问题的算法是粒子群优化算法,但在我看来它更难配置。我从2011年的标准PSO开始


如果您的问题包含整数变量,那么选择将变得更加困难。当变量是离散变量时,进化策略的性能并不好,因为整数变量的适应方案是不同的。遗传算法再次成为一种有趣的首选算法。

感谢您提供的详细答案!!