В статье автор расскажет об эволюционных вычислениях с использованием генетического алгоритма собственной реализации. Будет показано на примерах функционирование алгоритма, даны практические рекомендации по его использованию.
class COptimizatedParam: public CObject
{
public:
string name; //имя оптимизируемого параметра, требуется для выполнения ФФ(в моем случае у меня модель полностью так и работает как работала, только с виртуальным аккаунтом)
string type; //тип оптимизируемого параметра, требуется для см. выше
string on; //с какого значения начать выполнение -минимум
string step; //шаг
string end; //максимум
stringvalue; //в моем случае инициализация модели происходит по тому же CList, который передан функции оптимизации и value -текущее значение оптимизируемого параметра
論文のフリーライブラリーで、遺伝子型を扱う。表現型をFFで処理する(例2のように)。
上記は、表現型をFFで処理した場合、ライブラリは同じように効率的に動作するが、反復回数(FFの実行回数)は、GAが表現型を直接処理した場合よりもかなり多くなることを意味する(探索空間の詳細度が増すため)。限界では、探索(表現型の精密化なし)は連続的な探索空間になる傾向がある。
こんばんは。
素晴らしい記事をありがとう。
最初は少し複雑でしたが、なんとなく理解できました。
このフォーラムのスレッドに何か書く前に、私があなたの記事とUGAアルゴリズムのコースを正しく理解しているかどうか、自分自身で明らかにしたいと思います:
1)特定のタスクに対するUGAの入力パラメータの設定。
---UGA
2)遺伝子をランダムに組み合わせて親の初期コロニーを作る。
2.2)各コロニーについてFFの結果を計算する。
2.3)クローンの除去
3)そのコロニー内の全個体から最良のFF結果を決定する
4)最初のコロニーから子孫のコロニーを作るサイクルを開始する。子孫はツールを使って作られる:クロスオーバー、人工突然変異、自然突然変異、遺伝子複製、遺伝子借用。
クロスオーバー - 親の染色体の一部を交換すること、
人工突然変異-範囲外の遺伝子の選択(親1の遺伝子、親2の遺伝子)。
エスト。突然変異-範囲内の遺伝子の選択(遺伝子範囲の最小値、遺伝子範囲の最大値)。
複製 - 親遺伝子の値に近い範囲の遺伝子を選択するが、一定のオフセットがある。
遺伝子の借用 - 遺伝子の数と同じ数の親から「組み立てられた個体」を作る。
クローンの削除
6)それぞれのコロニーについてFFの結果を計算する。
7)子孫個体の結果を基準結果と比較し、入れ替えの可能性を検討する。入れ替えの場合、カウンタ「基準値の変化のない期間」はリセットされる。
8)全個体を良いものから悪いものへとソートする。
9) -->項目 4
10)Yに変化のないエポックが発生した場合、終了し、見つかった基準値を出力する。
これはチュートリアルというよりディスカッションのスレッドかもしれませんが、他にアドバイスを求めるところがないので、先に謝っておきます。実はGAとは貴殿の記事で初めて出会いました(貴殿の記事を読む前は、ターミナルテスターの「Fast(genetic algorithm)」という言葉の意味すら理解していませんでした)ので、私の知識と経験(MQL5でプログラミングを始めたのは2ヶ月ほど前です)は少し限られています。
もし私があなたのGAアルゴリズムを理解したら、それをOOPに移植しようと思います。実際、何のために勉強し始めたのか。私はすでに、直接探索で自己最適化する取引モデルを実装していますが、GAではまだ実装していません( https://www.mql5.com/ru/articles/217 の記事で説明されている原理のモデル)。
よろしくお願いします。
mi__x__an:
...私は、あなたの記事とUGAアルゴリズムの経過を正しく理解しているかどうか、自分自身で明らかにしたいと思います。
。
早速のお返事ありがとうございます。
いくつか質問があります。
ここでいうクロモソーム配列とは何でしょうか? 最適化されるパラメータの可能な値?
例えば 、「最小 ロットサイズ」を0.1~1の範囲で最適化するとします(最小ロットステップは0.1)、
とすると、配列は次のようになります:{0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0}, 1番染色体の遺伝子数, 最小0.1 最大1.0, ステップ0.1 ?そうなのでしょうか?
また、関連する質問ですが、このような配列に、例えば、最適化されたストップロス[10...500]、テイクプロフィット[10...500]、最小ロットサイズ[0.1...1.0]、トレイリングフラグ(トレイリングを使用するかどうか)[0...1]を入力するにはどうすればよいでしょうか?
一般的に、異なるタイプ、最小値、最大値を持つパラメータを最適化する場合、入力データはどのようになるべきでしょうか?
ご回答をよろしくお願いします。
ここでいうクロモソーム配列とは、最適化されたパラメータの取り得る値のことですか?
例えば 、「最小 ロットサイズ」を0.1から1の範囲で最適化するとします(最小ロットステップは0.1)、
とすると、配列は次のようになります:{0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0}, 第1染色体の遺伝子数, 最小0.1 最大1.0, ステップ0.1 ?そうなのでしょうか?
また、関連する質問ですが、このような配列に、例えば、最適化されたストップロス[10...500]、テイクプロフィット[10...500]、最小ロットサイズ[0.1...1.0]、トレイリングフラグ(トレイリングを使用するかどうか)[0...1]を入力するにはどうすればよいでしょうか?
一般的に、異なるタイプ、最小値、最大値を持つパラメータを最適化する場合、入力データはどのようになるべきでしょうか?
回答よろしくお願いします。
いいえ、
Chromosome[]はコメントにある通りです。
最初のインデックス[0]は個体のフィットネス値です。その他は与えられた範囲内で最適化されたパラメータです。これが遺伝子型です。
FFで表現型(ストップロス、テイクプロフィット、ボリューム、インジケータなど)を扱う(染色体の遺伝子の範囲内で最適化されたパラメータのスケーリング):
例えば、遺伝子が[-1;1]の範囲に設定されているとします。
Index 0: FF value <---------------------------------------------------------[8;8]//pivot to Pi/2 eights.
第1指標:ストップロス[10..500]<------------------------------------------------- [-1;1]
第2指標:利食い [10..500] <--------------------------------------------- [-1;1]
第3指標:最小ロット [0.1...1.0] <--------------------------------------- [-1;1]
4番目のインデックス: トレーリング・フラグ(トレーリングを使うかどうか)[0..1] <------ [-1;1]
さらに、Chromosome[]配列には5つのセルがあります。例えば、染色体は次のようになる{0.2, 0.3, -0.8, 0.1, 0.9;}。
しかしこの場合、実数でない遺伝子の値の正しさの処理はFFで行う必要がある。つまり、long型、double型、bool型を 最適化した場合、UGAはそれらすべてに対して実数値を生成します。bool型も含め、RangeMinimumから RangeMaximumの 範囲には多くの遺伝子のバリエーションがあり、実際に使用可能な値は1と0の2つだけです。また、正しい値の選択はすでにFFで行われるのですか?
この欠点を解消するには、個人的には、染色体の遺伝子値をFFで使用可能な値に修正するサービス機能を導入するのがベストだと思う。
-->子孫の生成⇒遺伝子値を実際に使える値に修正⇒クローンの削除⇒FFの呼び出し。
この方針で、UGAのパフォーマンスに大きな影響があると思いますか?考え方としては、一方のパラメーターを最適化するステップが他方より大きければ、FFの実行回数は減るはずです。
もしこれが適切でないなら、(テスターに実装されているような)バイナリ遺伝的アルゴリズムを使うべきです。第4フォーラムにそれに関する記事があります。
いいえ、ポイントは違います。このアルゴリズムはそのような場合にも完璧に使えます。
mi__x__an:
mi__x__an: しかし、この場合、実際の遺伝子ではなく、値の正しさの処理をFFで行う必要があります。つまり、long型、double型、bool型を 最適化した場合、UGAはそれらすべてに対して実際の値を生成することになります。 また、正しい値の選択はすでにFFで行われるのですか?
表現型を使った操作はすべてFFで行う必要があります。遺伝子型から表現型へのデコードの問題です。
最適化されたパラメータがbool型で、trueとfalseの2種類しかないと仮定しましょう。そうすると、デコーディングは次のようになる:
ここで、geneは染色体の特定の遺伝子である。
この遺伝子(遺伝子型)にはさまざまな変異型があり、2つの表現型しか得られないことがわかる。これは自然界でも同じである。
つまり、問題を解くのに必要な回数よりも多くの染色体の変異体が生成される(したがって、FFの計算回数も増える)。つまり、最適化には時間がかかる。このことはすでに述べた。染色体をバイナリ符号化する場合も同じです。それでもタスク固有の表現型にデコードする必要があります。
しかし。バイナリコーディングの場合も、実数で遺伝子を表現する場合も、各オプティミズム・パラメーターにSEARCH STEPSとSTEPを設定することで、不必要なFF計算を避ける(可能な染色体バリアントの数を減らす)ことは非常に簡単です。つまり、不要な染色体バリアントを事前にカットするのです (これはバイナリコーディングの標準的なオプティマイザではすでに行われています)。これは記事のGAでも可能で、適切な機能を追加すればよいのです。各遺伝子の境界とステップを設定する機能、つまりGAが表現型を直接操作 できるようにします。
しかし、ライブラリ内の各遺伝子の境界とステップを指定する必要があるため、柔軟性が低下する。
私がトレーディング・モデルのオプティマイザーで使った方法は、おそらくベストでもワーストでもないだろう:
1 - 最適化パラメータのクラス - CObjectの継承者。
2 - 主要な一般モデルの仮想関数:
virtual CList *OptimizatedParams()これは、各モデルが最適化されたパラメーターの独自のリストを作成することを可能にする。
3. 最適化関数 - 必要なすべての値を再帰的に列挙します。
列挙された型はすべて、最適化関数で扱うことができる。
ここで質問:最適化パラメータに関する情報がこの最適化パラメータのクラスを通して渡されるCListを入力データとし、UGAライブラリ自身が各遺伝子に対して必要な数の境界とステップを作成することは合理的であろう。そうすれば、より柔軟性が増し、遺伝的クローンではなく表現型クローンを作成するための不必要なFFの実行回数を減らすことができる。