如何处理遗传算法中交叉变异导致的优化不可行?

人工智能 遗传算法 交叉运营商 变异算子 约束优化
2021-10-19 12:42:01

我有具有浮点表示的染色体,其值介于01. 例如

p1=[0.1,0.2,0.3]p2=[0.5,0.6,0.7]成为两个父母。两者都符合约束集。就我而言,主要的限制是

p1[1]p1[2]kp1[0]0
对于任何染色体p1. 对于上面的例子,我们可以采取k=0.3, 呈现c2不可行。

然而,通过 1 点交叉产生的孩子,我们得到c1=[0.1,0.6,0.7]c2=[0.5,0.2,0.3]其中 1 个或两者可能不符合给定的约束。

由于突变策略,值的小扰动也可能发生类似的情况。如果我错误地认为无论交叉和突变采用何种策略都可能出现这种情况,请纠正我。

处理此类案件有哪些选择?

1个回答

您有两大类选择,预防和修复。

预防意味着定义一个交叉和变异算子,试图在尊重约束方面更加智能。假设您有一个编码,其中每个人都是整数列表,并且约束是不能重复。您可以定义一个交叉运算符来执行以下操作。对于后代中的每个位置,从一个父母中随机选择,这样,如果可能,您选择一个尚未出现在后代中的值。如果父母双方在该位置都有已在后代中使用的值,则选择一个随机值。

该操作员将首先避免违反约束,同时尽可能多地尝试让后代从父母那里继承信息。

另一种选择是让操作员违反约束,然后再处理后果。您不会详细说明您的约束实际上是什么,只是c1=[0.1, 0.6, 0.7]违反了它们。假设约束条件是第三个位置不应比第一个位置大 4 倍。好的,那么让我们拿这个后代来调整第一项或第三项。也许我们把新的个体变成c1=[0.2, 0.6, 0.7].

通常,您希望在任一选项中具有一些随机性元素,这样您就不会强烈地偏向新搜索点的产生。在我的示例中,不要总是使第一个元素变大。有时,使第三个元素更小或产生两者的随机组合来修复约束违规。

最后,这两种选择通常都极大地受益于领域知识。设计一个能够理解您的问题并尝试智能解决问题的操作员。