5

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

从数学上讲:对于某些函数 f: [-1, 1]^10 -> R min f(X) st |{var in X with var != 0}| <= 4

f 的一些背景知识:该函数与任何类型的背包目标函数(如 Sum x*weight 或类似的函数)都不相似。

到目前为止我已经尝试过:

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

你会推荐我接下来尝试什么?

4

3 回答 3

5

如果你的适应度函数评估起来又快又脏,那么增加你的总人口规模是很便宜的。

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

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

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

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

我希望这能给你一些可以借鉴的想法。

于 2011-11-08T23:49:41.013 回答
3

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

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

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

于 2011-11-08T23:44:36.133 回答
0

在没有子集约束的情况下,您的 GA 能否很好地解决问题?如果没有,你可能想先解决这个问题。

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

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

希望有帮助。

-泰德

于 2011-11-28T04:33:29.690 回答