我想用C编写遗传算法来优化10个变量(x1到x10)的函数。但是我无法确定应该使用哪种编码。我主要看到在示例中使用了二进制编码,但在我的情况下,变量可以采用实际值。此外,值编码是否适合这些类型的问题?
答案 0 :(得分:4)
对于真正有价值的问题,我建议尝试使用CMA-ES或其他ES版本。 CMA-ES当然是现实价值问题的最新技术。它旨在快速找到多维问题的良好解决方案。 Hansen's page上有可用的实现。 HeuristicLab的工作中还有一个C#实现。进化策略是专为实值优化问题设计的算法。它们与遗传算法非常相似(两者都是在同一时间发明的,但在不同的地方发明)。主要区别在于,对于ES,主要驱动因素是突变,它具有突变强度的巧妙适应性。没有这种适应性,(局部)最佳值不能及时定位。 CMA-ES易于配置,它所需要的只是初始标准偏差和可选的种群大小(否则有一个公式可以根据问题大小估计这个)。
当然也可以应用遗传算法,但是你必须使用一些特定的运算符,这些运算符只能在非常小的程度上改变变量。例如,有来自Mühlenbein的种鸡遗传算法。一般而言,遗传算法更适合需要正确组合的问题。例如。哪些项目包含在背包问题中,或哪些功能和终端与公式(遗传编程)相结合。少了问题,你需要为某些东西找到合适的价值。虽然当然有遗传算法的变种来解决这些问题,但是寻找实数编码遗传算法(RCGA或RGA)。
另一种适用于实值问题的算法是粒子群优化,但在我看来,配置起来比较困难。我将从SPSO-2011 2011标准PSO开始。
如果您的问题包含整数变量,则选择变得更加困难。当变量是离散的时,进化策略不能很好地执行,因为整数变量的自适应方案是不同的。遗传算法再次成为一种有趣的首选算法。
答案 1 :(得分:3)
最好使用遗传算法,当两个非常接近最优的答案在合并时会使其他东西非常接近最优。纯二进制编码的问题在于,如果你不检查你的交叉,你最终会得到两个答案,这些答案可能与原始答案没有多大关系。
也就是说,如果您的变量数量非常少且变量中的数据量很大,那么这只是一个问题。就选择编码而言,它更像是一门艺术,而不是一门科学,它取决于你的问题。我建议使用符合您想要的精度的编码。有了10个变量你就不会有那么大的错误但是你编码它,一个8位的ASCII编码器可能会正常工作。
希望有所帮助。