我在理解遗传算法的过程时遇到了问题。我找到了在一个区间内最大化函数的例子,我想我理解它们,但是如何使用遗传算法来解决,例如,二次方程?
假设我们想要找到最多4位数的解,那么对数字进行编码的正确表示是什么?什么可以用作评估每个数字的适应度函数?
感谢任何帮助
答案 0 :(得分:1)
如果你想解决二次方程
a * x^2 + b * x + c = 0
那么你只需要一个变量x
作为表示。你可以使用
f(x) = abs(a * x^2 + b * x + c)
作为适应度函数,与精度相同,因此需要最小化。
但是只有一个变量很难做到交叉,你可以使用每个人10个数字,然后取平均值得到x,或者只做两个数字的平均值来做交叉。同样,对于突变而不是完全覆盖x,您可以将其乘以0.5到2之间的随机数。
答案 1 :(得分:1)
第一步是选择解决方案的表示。最广泛使用的是二进制编码。例如,您的x可能看起来:
1 0 0 1 1 1 1 0 | 0 0 0 0 0 0 0 0 0 0 1 1 1
前8位编码数字的整数部分,残余13位编码后的数字部分。在此示例中,二进制字符串编码为158.0007。
Crrossover可能看起来
1 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 - 158.0007
1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 - 225.0008
最简单的交叉算子是一个分界点。您生成一个从1到字符串长度的数字 - 1.此时,您从一个字符串中获取一个位,从该点获取第二个字符串。在这个例子中,我们选择了分界点4的位置。后代看起来像:
1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 - 145.0008
突变随选择的概率改变一些比特。
适应度函数可以是二次方程的函数值(如果你试图找到一个最大值)在x中,x是作为位串的解码获得的。
最后有些理论。你有两套。一组是搜索空间(具有二进制字符串的空间),第二组是具有解决方案的空间。来自搜索空间的个体被解码为解空间中的解(在我们的例子中,由二进制串编码的x的值)。搜索空间代表基因型,解码的解决方案是表型。遗传算子使用单独的搜索空间(在这种情况下为二进制字符串)和使用解码解决方案的适应度函数。