algorithm - 使用遗传算法选择稀疏参数

标签 algorithm genetic-algorithm data-mining

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

问题在于,在这些稀疏条件下,GA 很难改善种群。平均适应度成本和“最差”个体的适应度都不会随着时间的推移而提高。我所看到的只是最佳个人得分的轻微(甚至很小)提高,我想这是随机抽样的结果。

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

你会建议什么问题表示?

P.S 如果这很重要,我使用 PyEvolve .

最佳答案

我对 PyEvolve 不熟悉,但根据我对遗传算法的内存,你关心的是 4 个步骤,

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

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

我需要更多地了解您的问题,但这是我的建议。由于您有可变数量的参数,因此您需要为染色体中的参数数量提出某种概率分布。我在这里假设 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*。

现在,有很多方法可以解决这个问题,所以选择对您的问题最有意义的方法。

关于algorithm - 使用遗传算法选择稀疏参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/906777/

相关文章:

algorithm - 你在生产中有遗传算法吗?

python - 我的遗传算法有什么问题

database - 检索人口密度数据

linux - 为什么 svmlight 中的训练和测试文件相同

algorithm - 嵌套模式算法/减少浪费问题

python - 解决排列和约束问题

c++ - 使用递归计算一个函数的高度和大小?

r - GA算法并行计算时返回 "non-numeric argument to binary operator"

machine-learning - Weka 中的分类器选项呈灰色

algorithm - 面试中的LCA问题