二叉树遗传规划
Binary Tree Genetic Programming
我刚刚开始使用 遗传编程,我在初始化种群时遇到问题。
我需要一棵树来表示每个候选解决方案 - 问题是,我不熟悉树。
我需要两种初始化方式,即Grow(可变大小的树)和Full(平衡的相同形状和大小树)。
FULL GROW
(*) (*)
(+) (-) (5) (-)
(1)(2) (3)(4) (6) (7)
我已经初始化了我的树 class,但是,我不知道如何从这里开始填充树(Full 或 Grow)。
public class Tree{
Object value;
Tree left, right;
public Tree(Object value)
{
this.value=value;
}
public Tree (Object value, Tree left, Tree right)
{
this.value = value;
this.left = left;
this.right = right;
}
// Getter & setter for the value.
public Object getValue(){
return value;}
public void setValue(Object 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;}
}
任何人都可以告诉我如何做到这一点,或者只是朝着正确的方向轻推一下。
我正在尝试随机填充树直到预定义的深度。
- 运算符(+ - / *)被插入除了叶子节点之外的任何地方。
- 操作数 (1-100) 仅插入到叶节点上
谢谢。
您需要创建两个向树中添加元素的函数。对于 GROW 函数,您可以执行如下操作...
基本上,您必须根据您决定的标准开始设置叶节点。这不是一个完美的例子,但可以帮助您朝着正确的方向前进。
我没有运行这个,但这应该演示如何种树。您可能需要添加功能以使其按您想要的方式工作。
Tree head = new Tree(new Value("*"));
for ( int x = 0; x < 5; x++){
head.grow(new Tree(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;
}
}
值:
public class 值{
字符串操作;
整数值
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;
}
}
不是很清楚你想要什么。你是问你给出的例子如何表示,或者如何实现根据两种策略之一生成随机树的方法?
您的示例可以用您的树 class 以这种方式表示:
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:
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 http://cswww.essex.ac.uk/staff/rpoli/TinyGP/ 的实现(由 Ricardo Poli 完成)。但是,该实现需要深入了解 C 编程语言。
或者,您可以使用具有染色体线性表示的 GP 变体(例如线性 GP、笛卡尔 GP、基因表达式编程、多表达式编程等)。那些有一个更简单和更容易理解的实现。例如,查看多表达式编程的源代码:http://www.mepx.org/source_code.html
我刚刚开始使用 遗传编程,我在初始化种群时遇到问题。
我需要一棵树来表示每个候选解决方案 - 问题是,我不熟悉树。
我需要两种初始化方式,即Grow(可变大小的树)和Full(平衡的相同形状和大小树)。
FULL GROW
(*) (*)
(+) (-) (5) (-)
(1)(2) (3)(4) (6) (7)
我已经初始化了我的树 class,但是,我不知道如何从这里开始填充树(Full 或 Grow)。
public class Tree{
Object value;
Tree left, right;
public Tree(Object value)
{
this.value=value;
}
public Tree (Object value, Tree left, Tree right)
{
this.value = value;
this.left = left;
this.right = right;
}
// Getter & setter for the value.
public Object getValue(){
return value;}
public void setValue(Object 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;}
}
任何人都可以告诉我如何做到这一点,或者只是朝着正确的方向轻推一下。
我正在尝试随机填充树直到预定义的深度。
- 运算符(+ - / *)被插入除了叶子节点之外的任何地方。
- 操作数 (1-100) 仅插入到叶节点上
谢谢。
您需要创建两个向树中添加元素的函数。对于 GROW 函数,您可以执行如下操作...
基本上,您必须根据您决定的标准开始设置叶节点。这不是一个完美的例子,但可以帮助您朝着正确的方向前进。
我没有运行这个,但这应该演示如何种树。您可能需要添加功能以使其按您想要的方式工作。
Tree head = new Tree(new Value("*"));
for ( int x = 0; x < 5; x++){
head.grow(new Tree(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;
}
}
值:
public class 值{ 字符串操作; 整数值
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;
}
}
不是很清楚你想要什么。你是问你给出的例子如何表示,或者如何实现根据两种策略之一生成随机树的方法?
您的示例可以用您的树 class 以这种方式表示:
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:
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 http://cswww.essex.ac.uk/staff/rpoli/TinyGP/ 的实现(由 Ricardo Poli 完成)。但是,该实现需要深入了解 C 编程语言。
或者,您可以使用具有染色体线性表示的 GP 变体(例如线性 GP、笛卡尔 GP、基因表达式编程、多表达式编程等)。那些有一个更简单和更容易理解的实现。例如,查看多表达式编程的源代码:http://www.mepx.org/source_code.html