Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.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
Java 遗传算法:基因值的总和应为1_Java_Genetic Algorithm_Evolutionary Algorithm_Watchmaker - Fatal编程技术网

Java 遗传算法:基因值的总和应为1

Java 遗传算法:基因值的总和应为1,java,genetic-algorithm,evolutionary-algorithm,watchmaker,Java,Genetic Algorithm,Evolutionary Algorithm,Watchmaker,我想实现一个遗传算法(我可能还不确定语言/框架)来优化某些流体的混合比 每个混合物由多达5种成分组成,我将其建模为具有变化值的基因。由于染色体代表混合比,因此(至少)还有两个附加条件: (1) a + b + c + d + e = 1 (2) a, b, c, d, e >= 0 我还在计划我的项目的阶段,因此我不能给出任何示例代码,但是我想知道这些条件是否以及如何在遗传算法框架中实现,比如Watchmaker [编辑] 由于这似乎不是直截了当的解释: 问题在于条件(1)-如果每

我想实现一个遗传算法(我可能还不确定语言/框架)来优化某些流体的混合比

每个混合物由多达5种成分组成,我将其建模为具有变化值的基因。由于染色体代表混合比,因此(至少)还有两个附加条件:

(1) a + b + c + d + e = 1
(2)    a, b, c, d, e >= 0
我还在计划我的项目的阶段,因此我不能给出任何示例代码,但是我想知道这些条件是否以及如何在遗传算法框架中实现,比如Watchmaker

[编辑]
由于这似乎不是直截了当的解释:

问题在于条件(1)-如果每个基因
a、b、c、d、e
是随机独立选择的,则发生这种情况的概率约为0。因此,我需要以一种方式实现变异,其中,
a,b,c,d,e
是根据彼此选择的(参见示例)

然而,我不知道这是否可能,也不知道这是否符合一般的进化算法。

第一个条件(
a+b+c+d+e=1
)可以通过拥有较短的染色体来满足,只需
a,b,c,d
e
值可以通过
e:=1-a-b-c-d
表示(在适应度函数中或以后使用)

编辑:
满足第一个条件的另一种方法是规范化值:

sum:= a+b+c+d+e
a:= a/sum;
b:= b/sum;
c:= c/sum;
d:= d/sum;
e:= e/sum;
新的总数将是1


对于第二个条件(
a、b、c、d、e>=0
),您可以在将新的后代染色体(通过突变和/或交叉产生)放入基因库(并允许其繁殖)之前,为其添加一个批准阶段,并拒绝那些不满足该条件的染色体。

您的目标函数是什么?你打算怎么做交叉和变异?@idfah我还没有确切的计划,不过我想我会在这里使用一些标准功能。目标函数可能是配方的味道。交叉和变异必须经过测试。我不认为你的约束在遗传算法的意义上有什么特殊性。看来你应该先研究实现这种算法的一般方法,例如,阅读框架文档,如果你有真正的问题就回来。@Holger你当然是对的,我需要更多地研究遗传算法。你能推荐一个我可以阅读到相互依赖的基因的来源吗(因为这是我在问题条件(1)中提到的问题)。首先,您可以强制执行变异部分中的约束,禁止产生冲突的变异。或者,您可以允许违反约束,并将检查集成到适应度函数中,指定结果适应度越高,越能满足约束。一旦你进入了进化的概念,这两个都不难。谢谢!但是在这个解决方案中,如何防止
a+b+c+d>1
?就像
a=0.7
b=0.4
。在这种情况下,e将变成阴性,因此违反第二个条件,导致该染色体被拒绝。好的,我明白了。。。然而,我怀疑e的概率分布是否与a-d相同。。。但我不确定,e实际上和a-d有不同的分布,但对于染色体来说,这并不重要,因为只有a-d是自由参数。如果你确实需要相同的分布,你可以自由地使用a-e,然后通过将每个参数除以所有参数的和来对它们进行规范化,得到一个正好为1的新和。在遗传算法中,分布并不重要,它只影响初始种群。我建议将染色体冗余设置为免费,在您的情况下,这意味着只有4个免费参数。当然,当在初始种群中随机选择a、b、c、d的值时(遗传为零),e往往较小,但随着解决方案的发展,这种影响将消失,所有参数都可能达到最佳值。