【发布时间】:2015-08-14 20:16:32
【问题描述】:
我在尝试将遗传算子应用于二叉树时遇到问题。
首先,我有一些方法可以为初始种群生成两种类型的树,即 Grow(可变大小的树)和 Full(平衡相同形状和大小的树) .
FULL GROW
(*) (*)
(+) (-) (5) (-)
(1)(2) (3)(4) (6) (7)
每棵树的类如下所示:
public class Tree<E>{
E element;
Tree<E> left, right;
double rawFit;
int hitRat;
public Tree(E element)
{
this.element=element;
}
public Tree (E element, Tree left, Tree right)
{
this.element = element;
this.left = left;
this.right = right;
}
//MORE
//CODE
}
现在我在理解如何实现遗传算子时遇到困难,即 Mutation 和 Crossover
从我的初始种群中随机选择一棵树,我该如何应用这些遗传算子? 对于变异:
- 我需要在父树中随机选择一个点。
- 删除该选定点下方的整个子树。
- 生成与已移除子树深度相似的新子树。
- 将其替换回原始父树和选定点上。
这是现在的后代。
图形描述:
PARENT
(*)
randomly chosen point --> (+) (-)
(1)(2) (3)(4)
OFFSPRING RANDOM SUBTREE
(*)
(NULL) (-) + (*)
(3) (4) (5) (6)
NEW OFFSPRING
(*)
(*) (-)
(5)(6) (3) (4)
我也需要为 Crossover 做类似的事情。
理论上这似乎很容易,但我不知道如何编码(Java)。任何帮助将不胜感激。
编辑:我用来生成完整树的方法如下所示:
private static final String[] OPERATORS = {"+", "-", "/", "*"};
private static final int MAX_OPERAND = 100;
public static Tree full(int depth) {
if (depth > 1) {
String operator = OPERATORS[random.nextInt(OPERATORS.length)];
return new Tree(operator, full(depth - 1), full(depth - 1));
} else {
return new Tree(random.nextInt(MAX_OPERAND) + 1);
}
}
【问题讨论】:
-
到目前为止你做了什么?还有你想如何生成“生成与删除的子树深度相似的新子树”。 ?
-
@StefanSpreger 我编辑了我的问题以展示我是如何创建一棵树的。可以使用相同的方法生成子树。
标签: java tree binary-tree genetic-algorithm mutation