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