Pregunta

Estoy trabajando en un proyecto de ingeniería de software de la clase que estoy tomando.El objetivo es el diseño de un programa que va a utilizar la programación genética para generar una expresión matemática que se ajuste proporcionado datos de entrenamiento.

Acabo de empezar a trabajar en el proyecto, y estoy tratando de envolver mi cabeza alrededor de cómo crear un árbol binario que permitirá a los definidos por el usuario la altura de los árboles y mantener cada nodo por separado para hacer de cruce y de mutación más sencillo cuando llego a la implementación de los procesos.

Aquí están las nodo clases que he creado hasta ahora.Pido perdón por lo que estoy seguro es de mi evidente falta de experiencia.

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

De esta forma se logran todo lo que necesitan de los propios nodos, pero estoy ejecutando en problemas tratando de averiguar cómo convertirlas en un árbol grande.Me doy cuenta de que tengo que usar un tipo de colección de algún tipo, pero parece que no puede encontrar uno en la Biblioteca que parece adecuado para lo que yo estoy tratando de hacer.

Incluso un empujón en la dirección correcta sería muy apreciada.

¿Fue útil?

Solución

Así que usted quiere construir un árbol de azar OperatorNodes, OperandNodes, y XNodes?Y usted dijo que usted desea hacer el árbol de profundidad definida por el usuario?

Definir una función recursiva llamado buildRandomTree o algo similar.Se debe de tomar una sola int parámetro para el árbol de profundidad.Si la profundidad parámetro es 1, el retorno al azar nodo hoja (OperandNode o XNode).Si el parámetro profundidad es de más de 1, generar un azar OperatorNode, y hacer llamadas recursivas para generar la izquierda y la derecha subárboles (con profundidad de 1 a menos que el nivel actual).

Dependiendo de lo que desea hacer con los nodos, se ha de definir otras funciones recursivas.Por ejemplo, es probable que desee para generar representaciones textuales de sus árboles de expresión.Por eso, se puede definir toString() en cada uno de los nodos de las clases.(OperatorNode.toString() tendrá que llamar a toString() a la izquierda y a la derecha subárboles.)

Usted probablemente también desee evaluar la expresión de los árboles (con valores dados de las variables).Por eso, puede definir otra función recursiva, tal vez llamado evaluate().Tendrá que tomar un parámetro, probablemente, a un Map, que dará a los valores de la variable (o "enlaces") que se desea evaluar la expresión.(Ahora tu árboles de expresión sólo puede contener una variable "x", pero me imagino que usted lo desea, puede añadir más.Si estás seguro de que sólo se utilice una sola variable, a continuación, evaluate puede tomar un solo argumento numérico para el valor de "x".)

La aplicación de evaluate para su 3 nodo de clases puede ser muy simple. OperandNode y VariableNode se acaba de devolver un valor directamente; OperatorNode tendrá que llamar a evaluate a la izquierda y a la derecha subárboles, combinar los valores utilizando la operación apropiada, a continuación, devolver el resultado.

Otros consejos

Tal vez mirando a Este te ayudará.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top