类背包优化问题的遗传算法



我有一个优化问题,我试图解决使用遗传算法。基本上,有一个包含10个有界实值变量的列表(-1 <= x <= 1),我需要最大化该列表中的某个函数。问题是列表中最多只能有4个变量为!= 0(子集条件)。

数学上来说:对于某函数f: [- 1,1]^10 -> R最小f (X)酸处理|{var in X with var != 0}| <= 4

关于f的一些背景:该函数不类似于任何类型的背包目标函数,如Sum x*weight或类似的东西。

我已经试过了:

只是基因组[- 1,1]^10的基本遗传算法,具有1点交叉和变量上的一些高斯突变。我试图通过仅使用前4个非零(中的零足够接近0)值来编码适应度函数中的子集条件。这种方法不能很好地工作,算法被困在4个第一个变量,从来没有使用超出这个值。对于01- backpack问题,我看到了某种遗传算法,这种方法很有效,但显然它只适用于二进制变量。

接下来你推荐我吃什么?

如果你的适应度函数是快速和肮脏的评估,那么它是便宜的增加总人口规模。

你遇到的问题是,你试图同时选择两个完全不同的东西。你要选择你关心的4个基因组,然后选择最优值。

我认为有两种方法可以做到这一点。

  1. 你创造了210个不同的"物种"。每个物种的定义是它们可以使用10个基因组中的4个。然后你可以在每个物种上分别运行一个遗传算法(可以是串行的,也可以是集群内并行的)。

  2. 每个生物体只有4个基因组值(当产生随机后代时随机选择哪些基因组)。当两个生物体交配时,你只会用匹配的基因组进行杂交。如果你的一对生物体包含三个共同的基因组,那么你可以随机选择你喜欢的第四个基因组。作为一种启发式方法,你也可以避免与基因差异太大的生物交配(即一对共享两个或更少基因组的生物可能会产生不好的后代)。

您可以尝试"枢轴"式的步骤:选择一个现有的非零值为零,然后通过设置一个现有的零值为非零来替换它。(我的"枢轴"一词来自线性规划,其中枢轴是单纯形法的基本步骤)。

最简单的情况是这些值的选择完全随机;您可以为新的非零变量选择一个随机值或多个值。一种更局部的步骤是只对现有的非零变量使用高斯步骤,但如果其中一个变量越过零,就会产生指向其中一个零值的变量。(请注意,这两种步骤不是互斥的,因为您可以轻松地添加这两种步骤)。

如果你有任何关于你的健身分数的本地行为的信息,你可以尝试用它来指导你的选择。仅仅因为实际的进化不考虑适应度函数,并不意味着你不能。

你的遗传算法在没有子集约束的情况下能很好地解决问题吗?如果没有,你可能需要先解决这个问题。

其次,你可以让你的约束变软而不是变硬:惩罚一个解决方案对于它所拥有的每个零值变量的适应度,超过4。(您可以从进一步放宽约束开始,允许9个0值变量,然后8个,等等,并确保GA能够在使问题变得更困难之前处理这些问题变量。)

第三,也许可以尝试两点或多点交叉,而不是一点。

希望对你有帮助。

- t

最新更新