6

受講しているソフトウェアエンジニアリングクラスのプロジェクトに取り組んでいます。目標は、遺伝的プログラミングを使用して、提供されたトレーニングデータに適合する数式を生成するプログラムを設計することです。

私はプロジェクトに取り組み始めたばかりで、ユーザー定義のツリーの高さを可能にし、各ノードを分離してクロスオーバーとミューテーションを簡単にするバイナリツリーを作成する方法に頭を悩ませようとしています。それらのプロセスを実装します。

これまでに作成したノードクラスは次のとおりです。私の明らかな経験不足であると私が確信していることをご容赦ください。

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

これにより、ノード自体から必要なすべてが達成されますが、これらをより大きなツリーに変換する方法を理解しようとすると問題が発生します。ある種のコレクションタイプを使用する必要があることはわかっていますが、ライブラリで、自分がやろうとしていることに適していると思われるコレクションタイプを見つけることができないようです。

正しい方向への微調整でさえ大いにありがたいです。

4

2 に答える 2

2

多分これを見ることはあなたを助けるでしょう。

于 2012-02-25T18:02:53.503 に答える
2

OperatorNodeでは、s、OperandNodes 、sのランダムなツリーを構築したいXNodeですか?そして、あなたは木の深さをユーザー定義にしたいと言いましたか?

buildRandomTreeと呼ばれる再帰関数または類似のものを定義します。intツリーの深さには単一のパラメーターを使用する必要があります。深さパラメーターが1の場合、ランダムなリーフノード(OperandNodeまたはXNode)を返します。深さパラメーターが1より大きい場合は、ランダムなOperatorNodeを生成し、再帰呼び出しを行って、左右のサブツリーを生成します(深さ1は現在のレベルよりも小さくなります)。

ノードで何をしたいかに応じて、他の再帰関数を定義する必要があります。たとえば、式ツリーのテキスト表現を生成したい場合があります。toString()そのために、各ノードクラスで定義できます。(左右のサブツリーOperatorNode.toString()を呼び出す必要があります。)toString()

(変数に指定された値を使用して)式ツリーも評価することをお勧めします。そのために、おそらくと呼ばれる別の再帰関数を定義できますevaluate()Map式を評価する変数値(または「バインディング」)を提供する1つのパラメーター(おそらく、 )を取得する必要があります。(現在、式ツリーには単一の変数 "x"しか含めることができませんが、さらに追加することをお勧めします。単一の変数のみを使用することが確実な場合はevaluate、の値に対して単一の数値引数を取ることができます。 "バツ"。)

3つのノードクラスの実装evaluateはすべて非常に簡単です。OperandNode値をVariableNode直接返します。左右のサブツリーOperatorNodeを呼び出し、適切な操作を使用して値を結合し、結果を返す必要があります。evaluate

于 2012-02-25T19:20:00.957 に答える