Java 二叉树遗传规划
我刚刚开始遗传编程,我在初始化我的群体时遇到了一些问题 我需要一棵树来表示每个候选解决方案-问题是,我不熟悉树 我需要两种初始化方法,即成长(可变大小的树)和完整(平衡相同形状和大小的树) 我已经初始化了我的树类,但是,我不知道如何从这里开始填充树(完整或增长) 有谁能告诉我怎么做,或者仅仅是朝着正确的方向轻推一下 我正在尝试随机填充树,直到达到预定义的深度。Java 二叉树遗传规划,java,tree,binary-tree,genetic-algorithm,genetic-programming,Java,Tree,Binary Tree,Genetic Algorithm,Genetic Programming,我刚刚开始遗传编程,我在初始化我的群体时遇到了一些问题 我需要一棵树来表示每个候选解决方案-问题是,我不熟悉树 我需要两种初始化方法,即成长(可变大小的树)和完整(平衡相同形状和大小的树) 我已经初始化了我的树类,但是,我不知道如何从这里开始填充树(完整或增长) 有谁能告诉我怎么做,或者仅仅是朝着正确的方向轻推一下 我正在尝试随机填充树,直到达到预定义的深度。 操作符(+-/*)插入到除叶节点之外的任何位置 仅在叶节点上插入操作数(1-100) 谢谢。您需要创建两个向树中添加元素的函数。对于
- 操作符(+-/*)插入到除叶节点之外的任何位置
- 仅在叶节点上插入操作数(1-100)
谢谢。您需要创建两个向树中添加元素的函数。对于GROW函数,您可以执行如下操作 基本上,您必须根据您决定的标准开始设置叶节点。这不是一个完美的例子,但可能会帮助你朝着正确的方向前进 我还没有运行这个,但它应该演示如何生长一棵树。您可能需要添加函数以使其按您所希望的方式工作
Tree head = new Tree(new Value("*"));
for ( int x = 0; x < 5; x++){
head.grow(new Tree(x));
}
树头=新树(新值(“*”);
对于(int x=0;x<5;x++){
头长(新树(x));
}
树:
public class Tree{
Value value;
Tree left, right;
public Tree(Value value)
{
this.value=value;
}
public Tree (Value value, Tree left, Tree right)
{
this.value = value;
this.left = left;
this.right = right;
}
// Getter & setter for the value.
public Value getValue(){
return value;}
public void setValue(Value value){
this.value = value;}
// Getters & setters for left & right nodes.
public Tree getLeft(){
return left;}
public Tree getRight(){
return right;}
public void setLeft(Tree ln){
left = ln;}
public void setRight(Tree rn){
right = rn;}
public void grow(Tree t){
if(value.compareTo(t) < 0){
if(right == null){
setRight(t);
} else{
getRight().grow(t);
}
else{
if(left == null){
setLeft(t);
} else{
getLeft().grow(t);
}
}
public toString(){
if(left == null && right == null)
return value.oper;
else{
return value.val;
}
}
公共类树{
价值观;
树左,右;
公共树(值)
{
这个。值=值;
}
公共树(值、左树、右树)
{
这个值=值;
this.left=左;
这个。右=右;
}
//值的Getter和setter。
公共值getValue(){
返回值;}
公共无效设置值(值){
this.value=value;}
//左、右节点的getter和setter。
公共树getLeft(){
向左返回;}
公共树getRight(){
返回权;}
公共void setLeft(树项次){
左=ln;}
公共无效设置权(树rn){
右=rn;}
公共空间生长(树t){
如果(值比较到(t)<0){
if(right==null){
设置权限(t);
}否则{
getRight().grow(t);
}
否则{
if(left==null){
左(t);
}否则{
getLeft().grow(t);
}
}
公共toString(){
if(left==null&&right==null)
返回值.oper;
否则{
返回值.val;
}
}
值:
public class Tree{
Value value;
Tree left, right;
public Tree(Value value)
{
this.value=value;
}
public Tree (Value value, Tree left, Tree right)
{
this.value = value;
this.left = left;
this.right = right;
}
// Getter & setter for the value.
public Value getValue(){
return value;}
public void setValue(Value value){
this.value = value;}
// Getters & setters for left & right nodes.
public Tree getLeft(){
return left;}
public Tree getRight(){
return right;}
public void setLeft(Tree ln){
left = ln;}
public void setRight(Tree rn){
right = rn;}
public void grow(Tree t){
if(value.compareTo(t) < 0){
if(right == null){
setRight(t);
} else{
getRight().grow(t);
}
else{
if(left == null){
setLeft(t);
} else{
getLeft().grow(t);
}
}
public toString(){
if(left == null && right == null)
return value.oper;
else{
return value.val;
}
}
公共阶级价值{
字符串运算符;
整数val
public value(String str){
oper = str;
val = Integer.MIN_VALUE;
}
public value(Integer x){
oper = "non";
val = x;
}
public int compareTo(Value o){
if(o.val < val) return -1;
if(o.val > val) return 1;
return 0;
}
}
公共值(字符串str){
oper=str;
val=整数的最小值;
}
公共值(整数x){
oper=“非”;
val=x;
}
公共整数比较(值o){
如果(o.valval)返回1;
返回0;
}
}
您想要什么还不是很清楚。您是在问如何表示您给出的示例,还是如何实现根据两种策略之一生成随机树的方法
您的示例可以通过以下方式用树类表示:
Tree full = new Tree("*",
new Tree("+", new Tree(1), new Tree(2)),
new Tree("-", new Tree(3), new Tree(4)));
Tree grow = new Tree("*",
new Tree(5),
new Tree("-", new Tree(6), new Tree(7)));
[编辑] 可以使用以下类中的方法随机生成树:
class TreeGenerator {
private static final String[] OPERATORS = {"+", "-", "/", "*"};
private static final int MAX_OPERAND = 100;
private static Random random = new Random();
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);
}
}
public static Tree grow(int depth) {
if (depth > 1 && random.nextBoolean()) {
String operator = OPERATORS[random.nextInt(OPERATORS.length)];
return new Tree(operator, grow(depth - 1), grow(depth - 1));
} else {
return new Tree(random.nextInt(MAX_OPERAND) + 1);
}
}
}
然后,您可以执行以下操作:
Tree full3 = TreeGenerator.full(3);
Tree grow4 = TreeGenerator.grow(4);
您可以看看Tiny GP的实现(由Ricardo Poli完成)。然而,该实现需要对C编程语言有深入的了解
或者,您可以使用染色体线性表示的GP变体(如线性GP、笛卡尔GP、基因表达式编程、多表达式编程等)。它们有一个更简单、更容易理解的实现。例如,看看多表达式编程的源代码:嗨,对不起,我已经清楚地编辑了我的原始帖子。我正在尝试随机生成一个具有预定义深度的带有运算符和操作数的树。谢谢!这正是我要找的!我使用了对象值,因为我的树由运算符(char)和操作数(int)组成。我不知道是否有更好的方法可以这样做。@Leo您可能应该创建自己的自定义类,该类同时包含运算符或基元。然后您可以重写compareTo并使用Object.equals(t)。上面的代码仍然表明,您需要一个函数来附加leave节点。然后,您将创建一个for循环,每次迭代都在树的头部添加一个新节点。非常感谢您的解释。我一定会尝试一下。
Tree full3 = TreeGenerator.full(3);
Tree grow4 = TreeGenerator.grow(4);