我正在为我正在参加的软件工程类(class)做一个项目。目标是设计一个程序,该程序将使用遗传编程生成适合提供的训练数据的数学表达式。
我刚刚开始这个项目,我正在努力思考如何创建一个二叉树,它允许用户定义树的高度,并保持每个节点分开,以便在以下情况下使交叉和变异更简单我开始实现这些流程。
这是我到目前为止创建的节点类。请原谅我显然缺乏经验。
public class Node
{
Node parent;
Node leftchild;
Node rightchild;
public void setParent(Node p)
{
parent = p;
}
public void setLeftChild(Node lc)
{
lc.setParent(this);
leftchild = lc;
}
public void setRightChild(Node rc)
{
rc.setParent(this);
rightchild = rc;
}
}
public class OperatorNode extends Node
{
char operator;
public OperatorNode()
{
double probability = Math.random();
if (probability <= .25)
{
operator = '+';
}
else if (probability > .25 && probability <= .50)
{
operator = '-';
}
else if (probability > .50 && probability <= .75)
{
operator = '*';
}
else
{
operator = '/';
}
}
public void setOperator(char op)
{
if (op == '+' || op == '-' || op == '*' || op == '/')
{
operator = op;
}
}
/**
* Node that holds x variables.
*/
public class XNode extends Node
{
char x;
public XNode()
{
x = 'x';
}
}
import java.util.Random;
public class OperandNode extends Node
{
int operand;
/**
* Initializes random number generator, sets the value of the node from zero to 9.
*/
public OperandNode()
{
Random rand = new Random();
operand = rand.nextInt(10);
}
/**
* Manually changes operand.
*/
public void setOperand(int o)
{
operand = o;
}
}
这完成了节点本身所需的一切,但我在试图弄清楚如何将它们变成更大的树时遇到了问题。我意识到我需要使用某种集合类型,但似乎无法在库中找到适合我正在尝试做的事情的集合类型。
即使是朝着正确方向的插入,我们也将不胜感激。
最佳答案
所以你想构建一棵随机的 OperatorNode
、OperandNode
和 XNode
树?你说你想让树的深度由用户定义?
定义一个名为 buildRandomTree
或类似名称的递归函数。它应该采用单个 int
参数来表示树的深度。如果深度参数为 1,则返回一个随机的叶节点(OperandNode 或 XNode)。如果深度参数大于1,则随机生成一个OperatorNode,递归调用生成左右子树(深度小于当前层级1)。
根据您要对节点执行的操作,您将必须定义其他递归函数。例如,您可能想要生成表达式树的文本表示。为此,您可以在每个节点类上定义 toString()
。 (OperatorNode.toString()
必须在左右子树上调用 toString()
。)
您可能还想评估表达式树(使用给定的变量值)。为此,您可以定义另一个递归函数,可能称为 evaluate()
。它必须采用一个参数,可能是一个 Map
,它将给出您要用来评估表达式的变量值(或“绑定(bind)”)。 (现在你的表达式树只能包含一个变量“x”,但我想你可能想添加更多。如果你确定你只会使用一个变量,那么 evaluate
可以采取“x”的值的单个数字参数。)
evaluate
的 3 个节点类的实现都将非常简单。 OperandNode
和VariableNode
只会直接返回一个值; OperatorNode
必须在左右子树上调用 evaluate
,使用适当的操作组合值,然后返回结果。
关于java - 在 Java 中为遗传编程目的创建二叉树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9446520/