2012-02-25 15 views
6

私は、取り組んでいるソフトウェアエンジニアリングクラスのプロジェクトに取り組んでいます。目標は、提供されたトレーニングデータに適合する数学的表現を生成するために遺伝的プログラミングを使用するプログラムを設計することです。遺伝的プログラミングの目的でJavaでバイナリツリーを作成する

私はちょうどプロジェクトに取り掛かり始めました。ユーザー定義のツリーの高さを許し、クロスオーバーと突然変異を簡単にするために各ノードを分離したままにするバイナリツリーを作成する方法について私の頭の中に入れようとしています。私はこれらのプロセスを実装することになります。

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

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

は、これは私が自分自身のノードのうち、必要なものすべてを達成したが、私は大きな木にこれらを有効にする方法を把握しようとしている問題に実行していますよ。私は何らかのコレクション型を使う必要があることを理解していますが、私がしようとしているものに適しているライブラリをライブラリ内に見つけることができないようです。

正しい方向へのナッジでさえ、非常に高く評価されます。

+0

本当にあなたの質問への回答はありませんが、あなたはjgapを見ましたか? http://jgap.sourceforge.net/ –

+0

私はそれを渡って走っていましたが、私たちは一からそれを構築するために余分な功績を得ました。そして本当に、これは私が個人的な利益のために理解したいことです。 – sitrick2

答えて

2

したがって、OperatorNode秒、OperandNode秒、XNode秒のランダムなツリーを作成しますか?そして、あなたは、ツリーの深さをユーザ定義したいと思っていますか?

buildRandomTreeなどと呼ばれる再帰関数を定義します。ツリー深度には1つのintパラメータが必要です。 depthパラメータが1の場合は、ランダムなリーフノード(OperandNodeまたはXNode)を返します。 depthパラメータが1より大きい場合は、ランダムなOperatorNodeを生成し、左および右のサブツリー(現在のレベルよりも深い1)を生成するために再帰呼び出しを行います。

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

おそらく、変数に指定された値を使って式ツリーを評価することもできます。そのために、おそらくevaluate()と呼ばれる別の再帰関数を定義することができます。 1つのパラメータ(おそらくMap)を取る必要があります。これは、式を評価する変数値(または「バインディング」)を与えます。 (今では、式ツリーには1つの変数 "x"しか含めることができませんが、さらに追加したいと思うと思います。evaluateは1つの変数を使用することが確実であれば、

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

+0

これは基本的には私が先に進めていた方向ですが、混乱させるのはNode値を作成した後にNode値を取得する方法です。コレクションや一意の識別子がなければ、私は取り出せないNodeオブジェクトを作成していませんか? – sitrick2

+0

私の編集した答えを見てください。 –

2

おそらくthisを見てみるとお手伝いをします。

+0

それを通って、私の頭を包み込みます。リンクありがとう。 – sitrick2

関連する問題