遺伝的プログラミング目的でJavaでバイナリツリーを作成する
-
12-11-2019 - |
質問
私は私が撮っているソフトウェア工学クラスのプロジェクトに取り組んでいます。目標は、Genetic Programmingを使用してトレーニングデータを提供する数学的表現を生成するプログラムを設計することです。
プロジェクトに取り組んできました。これらのプロセスを実装するようになります。
これまでに作成したノードクラスです。私の明白な経験がないことを確信していることを赦してください。
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
s、OperandNode
s、およびXNode
sのランダムツリーを構築しますか?そして、あなたは木の深さのユーザーを定義したいと言った?
buildRandomTree
または類似のものと呼ばれる再帰関数を定義します。木の深さには単一のint
パラメータを取得する必要があります。 DEPTHパラメータが1の場合は、ランダムリーフノード(operandnodeまたはxノード)を返します。 DEPTHパラメータが1を超える場合は、ランダムなオペレータノードを生成し、左右のサブツリーを生成するための再帰呼び出しを行います(深さ1は現在のレベルより小さい)。
ノードと一緒にやりたいものに応じて、他の再帰関数を定義する必要があります。たとえば、あなたの表現ツリーのテキスト表現を生成したいでしょう。そのためには、各ノードクラスにtoString()
を定義できます。 (OperatorNode.toString()
は、左右のサブツリーにtoString()
を呼び出す必要があります。)
あなたはおそらく表現ツリーを評価したいでしょう(変数のために与えられた値を持つ)。そのためには、おそらくevaluate()
という別の再帰関数を定義できます。それはおそらく1つのパラメータ、おそらくMap
を取る必要があります。これにより、式を評価したい変数値(または「バインディング」)が表示されます。 (今すぐあなたの表現ツリーには単一の変数 "x"を含めることができますが、もっと追加したいと思うかもしれません。 "x")
3ノードクラスのevaluate
の実装はすべて非常に単純です。 evaluate
とOperandNode
は、値を直接返すだけです。 VariableNode
は左右のサブツリーでOperatorNode
を呼び出して、適切な操作を使用して値を組み合わせて結果を返します。
他のヒント
このはあなたを助けるでしょう。