1

我面临一个参数选择问题,我想使用遗传算法 (GA) 来解决这个问题。我应该从 3000 个可能的参数中选择不超过 4 个参数。使用二进制染色体表示似乎是一种自然的选择。评估函数惩罚过多的“选择”属性,如果属性的数量可以接受,则评估选择。

问题是在这些稀疏的条件下,遗传算法几乎无法改善人口。平均适应度成本和“最差”个体的适应度都不会在几代人中得到改善。我所看到的只是最好个人的分数略有(甚至很小)的提高,我想这是随机抽样的结果。

使用参数索引对问题进行编码也不起作用。这很可能是因为染色体是有方向的,而选择问题不是(即染色体 [1, 2, 3, 4]; [4, 3, 2, 1]; [3, 2, 4, 1] 等相同)

你会建议什么问题表示?

PS 如果这很重要,我使用PyEvolve

4

2 回答 2

2

我对 PyEvolve 不熟悉,但从我对遗传算法的记忆中,你关心 4 个步骤,

  1. 染色体评估(你可能已经知道了)
  2. 染色体初始化
  3. 染色体交叉
  4. 染色体突变

我认为你可以用列表来做到这一点。您需要重载一些运算符,但看起来 PyEvolve可以让您这样做 一个简单的事情是保留列表表示,只需在返回染色体之前对它们进行数字排序。

我需要更多地了解您的问题,但这是我的建议。由于您有可变数量的参数,因此您需要为染色体中的参数数量提出某种概率分布。我会在这里假设 1,2,3,4 是一个统一的随机数,但如果你更喜欢它,你可以尝试其他的东西。我将把这个分布称为 P_n。

  1. 初始化。用(至少)3000 条染色体播种你的种群。调用这些 c_1,...,c_3000。从 P_n 画出 n_j。将 j 放入 c_j。从其余参数中选择具有均匀随机分布的剩余 n_j - 1 个参数。
  2. 交叉。假设我们有两条染色体。C_1 和 C_2。我们将创建(并返回)染色体 C_3。从 {n_1, n_2} 中选择 n_3,每个概率为 1/2。现在将 C_1 和 C_2 的参数放在一个列表中(并且它们是唯一的,因此如果C_1 和 C_2包含参数 1,则它只在列表中一次)。从联合列表中抽取n_3个参数,放入染色体C_3。
  3. 突变。给定染色体 C_1,从 P_n 中画出 n_1*。如果 n_1* < n_1,则从 C_1 中随机删除元素,直到有 n_1* 个元素。如果 n_1* = n_1 从 C_1 中随机选择 1 个元素,并将其替换为从不在 C_1 中的参数中随机选择的参数。如果 n_1* > n_1 随机添加元素到 C_1 直到它的大小为 n_1*。

现在,有很多方法可以解决这个问题,所以做对你的问题最有意义的事情。

于 2009-05-26T04:17:47.217 回答
0

由于参数数量的限制,我认为奇异值分解(http://en.wikipedia.org/wiki/Singular_value_decomposition)在这里可能更合适。

于 2009-05-26T04:22:50.650 回答