我有一个优化问题,我试图用遗传算法解决。基本上,存在10个绑定实值变量的列表(-1 <= x <= 1),并且我需要最大化该列表的一些功能。问题是列表中最多只有4个变量!= 0(子集条件)。
数学上说: 对于某些函数f:[ - 1,1] ^ 10 - &gt; [R min f(X) S.T. | {var in X with var!= 0} | &lt; = 4
关于f的一些背景:该函数与任何类型的背包物镜函数(如Sum x * weight或类似的东西)都不相似。
到目前为止我尝试过:
只是基因组上的基本遗传算法[-1,1] ^ 10,在变量上有1点交叉和一些高斯变异。我尝试通过仅使用前4个非零(零<,如足够接近0 )值来对适应度函数中的子集条件进行编码。这种方法不能很好地工作,并且算法停留在4个第一个变量上,并且从不使用超出该值的值。我看到了01-knapsack问题的某种GA,这种方法效果很好,但显然这只适用于二进制变量。
你建议我接下来尝试什么?
答案 0 :(得分:5)
如果您的健身功能快速而且肮脏,那么增加您的总人口规模便宜。
您遇到的问题是您试图同时选择两个完全不同的东西。您想要选择您关心的4个基因组,然后选择最佳值。
我认为有两种方法可以做到这一点。
你创造了210种不同的“物种”。每个物种的定义是它们被允许使用的10个基因组中的哪4个。然后,您可以分别在每个物种上运行遗传算法(在群集中串行或并行)。
每个生物只有4个基因组值(当创建随机后代时,随机选择哪个基因组)。当两个生物交配时,你只会与匹配的基因组交叉。如果您的生物体包含3个常见的基因组,那么您可以随机选择您可能更喜欢的基因组中的第4个。作为一种启发式方法,您还可以避免看似过于遗传的交配生物(即,一对共享两个或更少基因组的生物可能会造成一个坏的后代)。
我希望能为您提供一些可以解决的想法。
答案 1 :(得分:3)
您可以尝试“pivot”式步骤:选择一个现有非零值变为零,并通过将其中一个现有零值设置为非零来替换它。 (我的“枢轴”术语来自线性编程,其中枢轴是单纯形法中的基本步骤。)
在选择每个值时,最简单的情况是随机随机;您可以为新的非零变量选择随机值或多个值。更局部的步骤是仅对现有的非零变量使用高斯步骤,但如果其中一个变量过零,则生成转向其中一个零值的变量。 (请注意,这些不是互斥的,因为您可以轻松添加两种步骤)。
如果您有关于健身评分的当地行为的任何信息,您可以尝试使用它来指导您的选择。仅仅因为实际的进化没有看健身功能,并不意味着你不能......
答案 2 :(得分:0)
如果没有子集约束,您的GA是否能很好地解决问题?如果没有,你可能想先解决这个问题。
其次,你可以使你的约束软而不是硬:惩罚一个解决方案对它所具有的每个零值变量的适应性,超过4.(你可以开始进一步放宽约束,允许9个0值变量,然后8等,并确保GA能够在使问题更加困难之前处理这些问题变体。)
第三,也许尝试2点或多点交叉而不是1点。
希望有所帮助。
-Ted