2

ターミナル変数に(整数だけでなく)実数値の指数が必要です。たとえば、関数 y = x^3.5 + x^2.2 + 6 を進化させたいとします。どのように進めればよいでしょうか? これを実行できる GP 実装は見たことがありません。累乗関数を使用してみましたが、初期解の指数が多すぎて、評価値が「二重」境界を超える場合があります。任意の提案をいただければ幸いです。前もって感謝します。

4

4 に答える 4

1

DEAP (Python) が実装しています。実際、そのがあります。Python の math.pow をプリミティブ セットに追加することで、必要なものを実現できます。

pset.addPrimitive(math.pow, 2)

しかし、 pow 演算子を使用すると、おそらく望ましくない x^(x^(x^(x))) のような結果になる危険があります。ツリーのどこに pow が許可されているか (葉の直前など) に制限を追加する必要があります (よくわかりませんが)。

OpenBeagle (C++) でも可能ですが、 pow from を使用して独自のプリミティブを開発する必要があります<math.h>。例として Sin または Cos プリミティブを使用できます。

于 2012-04-19T15:26:17.463 に答える
1

初期集団の一部だけがオーバーフローの問題に苦しんでいる場合は、それらに低いフィットネス スコアでペナルティを課すだけで、おそらく数世代以内に集団から削除されます。

しかし、事実上すべての人がこの問題に苦しんでいるという問題がある場合は、いくつかの制約を追加する必要があります. 最も簡単な方法は、累乗関数の指数の子を実数リテラルに制限することです。つまり、累乗を入れ子にすることはできません。ただし、これがニーズに十分かどうかによって異なります。このような制約 (またはより複雑な制約) を追加する方法はいくつかあります。Constrained Syntactic Structures と文法ガイド付き GP を調べてみてください。

他のいくつかの簡単な考え: より広い範囲のデータ型を使用できますか? また、ネストされた指数の余地が少なくなるように、最大​​深度パラメーターを減らすこともできます。もちろん、それはある程度しか可能ではなく、関数の複雑さに依存します。

于 2012-04-17T21:48:25.413 に答える
0

整数は実数とは異なるバイナリ表現を持つため、わずかに異なるビット文字列表現と再結合/突然変異演算子を使用する必要があります。

優れたデモについては、www.cs.vu.nl/~gusz/ecbook/slides/Genetic_Algorithms.ppt のスライド 24 を参照するか、Eiben/Smith の書籍「Introduction to Evolutionary Computing Genetic Algorithms」を参照してください。これは、ビット文字列を実数にマッピングする方法を説明しています。次に、x が区間 [y,z] 内にのみある表現を作成できます。この場合、使用しているデータ型の容量よりも小さい大きさになるように y と z を選択して (たとえば、double の場合は 10^308)、説明したオーバーフローの問題に遭遇しないようにします。

于 2012-04-17T00:25:01.927 に答える
0

You have to consider that with real-valued exponents and a negative base you will not obtain a real, but a complex number. For example, the Math.Pow implementation in .NET says that you get NaN if you attempt to calculate the power of a negative base to a non-integer exponent. You have to make sure all your x values are positive. I think that's the problem that you're seeing when you "exceed double bounds".

Btw, you can try the HeuristicLab GP implementation. It is very flexible with a configurable grammar.

于 2012-04-17T21:42:11.423 に答える