【问题标题】:Creating a binary tree in Java for Genetic Programming Purposes为遗传编程目的在 Java 中创建二叉树
【发布时间】:2012-11-17 05:13:17
【问题描述】:

我正在为我正在学习的软件工程课程做一个项目。目标是设计一个程序,该程序将使用遗传编程来生成适合提供的训练数据的数学表达式。

我刚刚开始着手这个项目,我正试图围绕如何创建一个允许用户定义树高度并保持每个节点分开以使交叉和突变更简单的二叉树我开始实施这些流程。

这是迄今为止我创建的节点类。请原谅我确信我显然缺乏经验。

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;
    }
}

这可以从节点本身完成我需要的一切,但是我在试图弄清楚如何将它们变成更大的树时遇到了问题。我意识到我需要使用某种集合类型,但似乎无法在库中找到适合我正在尝试做的事情。

即使是朝着正确的方向轻推也将不胜感激。

【问题讨论】:

  • 不是你的问题的真正答案,但你看过 jgap 吗? jgap.sourceforge.net
  • 我会遇到它,但我们因从头开始构建它而获得了额外的功劳,真的,这是我想了解的,为了我个人的利益。

标签: java binary-tree genetic-programming


【解决方案1】:

所以你想构建OperatorNodes、OperandNodes 和XNodes 的随机树?你说你想让用户定义树的深度?

定义一个名为buildRandomTree 或类似名称的递归函数。它应该采用单个 int 参数来表示树的深度。如果深度参数为 1,则返回一个随机叶节点(OperandNode 或 XNode)。如果depth参数大于1,随机生成OperatorNode,递归调用生成左右子树(深度小于当前层级1)。

根据您要对节点执行的操作,您必须定义其他递归函数。例如,您可能希望生成表达式树的文本表示。为此,您可以在每个节点类上定义 toString()。 (OperatorNode.toString() 必须在左右子树上调用 toString()。)

您可能还需要评估表达式树(使用给定的变量值)。为此,您可以定义另一个递归函数,可能称为evaluate()。它必须采用一个参数,可能是Map,它将给出您想要评估表达式的变量值(或“绑定”)。 (现在你的表达式树只能包含一个变量“x”,但我想你可能想要添加更多。如果你确定你只会使用一个变量,那么evaluate 可以接受一个数字参数“x”的值。)

为您的 3 个节点类实现evaluate 都将非常简单。 OperandNodeVariableNode 将直接返回一个值; OperatorNode 必须在左右子树上调用 evaluate,使用适当的操作组合值,然后返回结果。

【讨论】:

  • 这基本上是我前进的方向,但让我困惑的是如何在创建节点值后检索它们。如果没有集合或唯一标识符,我不只是在创建无法检索的无实体 Node 对象吗?
【解决方案2】:

也许看看this 会对你有所帮助。

【讨论】:

  • 浏览它并试图将我的头包裹在它周围。感谢您的链接。
猜你喜欢
  • 2015-10-24
  • 1970-01-01
  • 1970-01-01
  • 2017-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多