2

簡単に見えますが、実装が難しいことがわかりました。実装しようとしている単純な遺伝的プログラミングの問題には、それが必要です。関数は、ノードを指定すると、ノードを選択する確率がその深さに比例して正規分布するように、ノード自体またはその子のいずれかを返す必要があります (したがって、関数は主に中間ノードを返す必要がありますが、ルート自体または最下位のノードを返す場合もあります)。 1 つ-しかし、それが非常に複雑になる場合は、実際には必要ありません。すべてのノードが等しい確率で選択されている場合、それで十分です)。

ありがとう

4

1 に答える 1

4

均一なケースでは、各ノードの深さがわかっている場合、確率 size(left)/size(this) で左に移動し、確率 size(right)/size(this) で右に移動し、そうでない場合は現在のノードを選択します。各接合点に 1 つの乱数で十分です。

int r = rand() % size(this);
if (r < size(left)) { /* go left */ }
else if (r > size(left)) { /* go right */ }
else { /* pick this node */ }

実際、いくつかの調整を行うことで、すべてのノードで使用される 1 つの乱数を渡すことができます。少し考えた後、はい、できます。左に行く場合は、r変更されていないものを使用してください。右に行く場合は、(size(left) - 1)から引きrます。

正規分布の場合、深さの半分の平均を持つ正規分布の確率変数を使用して、事前に深さを選択してから、上記のアルゴリズムにフォールバックします。これは、均一ではなく、サブツリーの相対的なサイズに従って中間ノード間で分散されることに注意してください。

于 2010-04-04T10:45:07.460 に答える