5

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

数学上讲: 对于一些函数f:[-1,1]^10 - >ř 分钟F(X) S.T. | {var in X with var!= 0} | < = 4

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

我迄今为止尝试:

只是一个基本的遗传算法是基因组[-1,1]^10 1点交叉和对变量的一些高斯变异。我试图通过仅使用前4个非零(在附近为0,)值来使用适应度函数对子集条件进行编码。这种方法并不能很好地工作,并且该算法卡在4个第一变量中,并且从不使用超出该值的值。我看到了一种适用于01背包问题的遗传算法,这种方法运行良好,但显然这只适用于二元变量。

你会推荐我下次尝试什么?

+0

我不知道遗传算法的想法,但你可以尝试不同的编码问题:选择范围0-9 4个实际值和4个不同的整数。 – Patrick

+0

解决方案总数少于10^4,为什么不使用枚举?这是功课吗? – willem

回答

3

您可以尝试一种“数据透视”式步骤:选择一个现有的非零值变为零,并将其中一个现有零值设置为非零来代替它。 (我的“枢轴”术语来自线性规划,其中枢轴是单纯形法中的基本步骤)。

最简单的情况是在选择每个值时都是随机的;您可以为新的非零变量选择一个随机值或多个值。更局部的步骤是仅对现有的非零变量使用高斯步长,但是如果其中一个变量过零,则产生的变异会旋转到其中一个零值。 (请注意,这些不是相互排斥的,因为您可以轻松添加两种步骤)。

如果您有任何有关健身分数的本地行为的信息,您可以尝试使用它来指导您的选择。只是因为实际进化不看健身功能,并不意味着你不能...

+0

这听起来很有趣,我想我可以将它编码为(*位置列表*,*值列表*)并使用上面@Nate建议的交叉方法。 – dassmann

5

如果你的健身功能是快速和肮脏的评估,那么它是便宜的,以增加你的总人口规模。

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

我看到两种方法来做到这一点。

  1. 您创建了210个不同的“物种”。每种物种都由允许使用的10种基因组中的4种定义。然后,您可以对每个物种分别运行遗传算法(串行或群集内并行)。

  2. 每个生物只有4个基因组值(当创建随机后代随机选择哪些基因组)。当两个有机体交配在一起时,你只能与相匹配的基因组交叉。如果你的一对有机体含有3种常见的基因组,那么你可以随机选择你喜欢的第4种基因组。作为一种启发式方法,您也可以避免交配生物体的基因差异过大(即,共享两个或更少基因组的对可能会造成不良后代)。

我希望能给你一些建议,

0

您的GA在没有子集约束的情况下是否能很好地解决问题?如果不是,你可能首先要解决这个问题。其次,你可以让你的约束柔和而不难:惩罚一个解决方案对每个零值变量的适应度,超过4.(你可以从更进一步放松约束开始,允许9个0值变量,然后8等,并确保GA能够处理这些问题变体之前使问题变得更加困难)。

第三,也许尝试2点或多点交叉而不是1点。

希望有所帮助。

-Ted