我想用遗传算法求解包含n个变量的n个线性方程组。
我很难定义交叉操作,因为解决方案可能包含浮点值。我该怎么办?这似乎是可能的,但这是我第一次遇到遗传算法。
假设我们必须解决
x + 2y = 1
2x + 8y = 3
答案是x = 1/2和y = 1/4。
我们如何对问题进行建模?
更新:看看您是否可以从论文http://www.masaumnet.com/archives/mjbas/volume1/issue2/mjbas010205.pdf中解读任何内容。
答案 0 :(得分:6)
您的染色体可能是n个浮点数(双精度数),或者您可以使用联合将它们重新解释为位串:
const int n = 100;
union Chromosome {
double val[n];
unsigned char bits[n * sizeof(double)];
};
...然后你可以使用双值来解释解/适应值,以及用于繁殖/交叉/变异的位。
祝你好运!答案 1 :(得分:5)
你根本就没有。您可以应用许多不同的方法来解决线性系统。但是“遗传算法”并不是我想到的。您将使用遗传算法来解决组合问题(从有限集中挑选一个元素)。
您通常使用分解(QR,LU)或迭代算法(Gauß-Seidel,CG,...)来解决线性系统
答案 2 :(得分:1)
一种方法是选择您自己的浮点表示,这可以让您根据需要自由地使用值。当然,这使您负责实现算术运算。也许你可以找到一个你可以改变的bignum库。
您还可以使用以下方法分解平台本机浮点数。在交叉步骤中frexp
,然后在剔除过程中重新组合。
答案 3 :(得分:1)
您需要考虑使用真实的编码遗传算法,而不是您所提到的论文中建议的二进制编码遗传算法。事实上,如果你使用二进制编码遗传算法,那么如果'x','y'可以取负值,你将无法找到方程的解。
因此,您需要使用真实的编码遗传算法。您可以自己编写整个遗传算法,也可以使用现有的RGA代码来解决问题。您只需根据需要自定义健身功能。在这里,您可以使用本文中建议的那个。这很简单!
您可以考虑使用http://www.iitk.ac.in/kangal/codes.shtml中的RGA实现。