記事"遺伝的アルゴリズム - とても簡単です!"についてのディスカッション - ページ 5

 
shurick:

重複の削除に関する質問は、私の満足のいく形で完全に答えられました。元の関数と最適化された関数を示すスクリプトコードを添付します。現在のコメントでは、関数のバグを指摘しているのではなく、その最適化を提案しているのです。私の主な目的は重複除去の原理を知ることであり、それに対して包括的な回答をいただきました。もう一度言いますが、ライブラリーと関数を明確にしていただき、本当にありがとうございました。

20本の染色体に対して110本と160本は多すぎますね...。カウンターの位置を間違えています。

これが正しい場所です:

//ペアの2つ目を選択する。
      for (Ch2=Ch+1;Ch2<PopulChromosCount;Ch2++)
      {
        //count_cicles++; // DEBUG サイクルChとCh2を渡す回数を数える
        if (Ch!=Ch2 && chromosomeUnique[Ch2]!=0)
        {
          count_cicles++; // DEBUGは染色体の比較回数をカウントする。
          //同一遺伝子の数をリセットしよう
          cnt=0;
          //遺伝子が同じであれば、遺伝子をチェックする。
          for (Ge=1;Ge<=GeneCount;Ge++)
          {
            if (Population[Ge][Ch]!=Population[Ge][Ch2])
              break;
            else
              cnt++;
          }
          //同一遺伝子の数が遺伝子の総数と同じ場合
          //染色体は複製として認識される。
          if (cnt==GeneCount)
            chromosomeUnique[Ch2]=0;
        }

OK。では、同じ集団で、同じ染色体で、この順序で試してみてください:

int m_init[20] = {7,7,7,3,9,2,4,5,3,3,5,6,2,4,3,5,10,6,2};

どうでしょう?

 

をシュリックに送る

確かに。すべての異なる染色体を使った一意性チェックの回数は、次の式で計算できます。

(PopulChromosCount^2-PopulChromosCount)/2。

20本の染色体がある例では(すべての染色体が異なると仮定)、チェックの回数は次のようになります:

(20*20-20)/2=190

となる:

int  m_init[20]  = {1,2,3,4,5,6,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}

重複が見つかれば、チェックはさらに少なくなります。

プロジェクトへの 積極的なご参加ありがとうございました!

ライブラリには適切な変更が加えられます。この変更はアルゴリズムの検索機能には影響しませんが、その作業をより合理的にします。

 
joo:

我々は何を見ているのか?

結果

今回の変更は、アルゴリズムの検索機能には何ら影響を与えないだろうが......。

全くその通りです。アルゴリズムの質は変わりません。当初は疑っていましたが、今はあなたがそれを証明してくれました。しかし、これらの疑念の上に最適化の方法が見つかりました :)

 
UGAライブラリとサンプルを記事に更新。現在のフリー作者バージョン1.2.1。
ファイル:
 
この記事のライブラリーUGAとサンプルを更新。現在の無料オーサリングバージョン1.2.1。
ファイル:
 

私はこの論文を研究し、コードの中でこのような矛盾を見つけました。範囲値を得るための2つの関数で、同じ式が使われているのです

//レプリケーション
void Replication
...
    //新しい遺伝子を作るための境界線を設定しよう
    Minimum = C1-((C2-C1)*ReplicationOffset);
    Maximum = C2+((C2-C1)*ReplicationOffset);
...

/////////////////////////////////////////////

// 人工突然変異。
void ArtificialMutation
...
    //新しい遺伝子を作るための境界線を設定しよう
    Minimum=C1-((C2-C1)*ReplicationOffset);
    Maximum=C2+((C2-C1)*ReplicationOffset);
...

すなわち、2つの遺伝子の値から外れたデータが得られてしまうのです。これはバグなのでしょうか、それとも別の説明があるのでしょうか?

複製法では符号を変える必要があるようです:

最小値 = C1+((C2-C1)*ReplicationOffset);

最大値 = C2-((C2-C1)*ReplicationOffset);


 
Batohov:

この記事を読んで、コードにこのような矛盾があることを発見しました。2つの関数が同じ数式を使って範囲の値を取得しているのです

つまり、2つの遺伝子の値から外れたデータが得られてしまうのです。これはバグなのでしょうか、それとも別の説明があるのでしょうか?

複製法では符号を変える必要があるようです:

最小値 = C1+((C2-C1)*ReplicationOffset);

最大値 = C2-((C2-C1)*ReplicationOffset);

エラーや矛盾はない。複製でも人為的突然変異でも、新しい遺伝子が出現する可能性のある境界(あなたが引用したコード部分)は同じように定義さ れます。

しかし、複製の場合、確率の高い領域はこの境界線内にあり、人工突然変異の場合は、この境界線を超えて いる。

複製は両親の遺伝子に特徴的な形質を(境界の範囲内で)伝達する役割を果たす。

人工突然変異は、両親の遺伝子とは異なる新しい遺伝子を生み出す(境界線の外側)。

 
joo:

誤りや矛盾はない。複製でも人工突然変異でも、新しい遺伝子が出現する可能性のある境界(あなたが引用したコード部分)は同じように定義される

しかし、複製の場合、確率の高い領域はこの境界の中にあり、人工突然変異の場合は、この境界を超えたところに ある。

複製は両親の遺伝子に特徴的な形質を(境界の範囲内で)伝達する役割を果たす。

人工突然変異は、両親の遺伝子とは異なる新しい遺伝子を生み出す(境界線の外側)。

早速のご回答、ありがとうございます。
 
joo:

ところで、ZZにまつわる最も有名なトレーダー神話の一つ(記事中の2つ目の課題)の破壊者になれてとてもうれしい。 :)

どうやら、私は課題の文言を理解していなかったようだ。私の発言

最小取引がN ピップスという条件で最大利益を得るためのエントリーポイントは、最小ニーN+スプレッドピップスという 条件でジグザグの頂点に位置しています。

 
joo:

MQL4フォーラムのスレッド"Test Multivariable Multiextremal Function " に興味深いテスト関数をいくつか投稿しました。

もしお望みであれば、GA以外の他の最適化アルゴリズムを使って提案した関数の極値を見つけてみて、その結果をここに投稿してください。大歓迎である。それは誰にとっても興味深いことだし、そもそも私にとっても興味深いことだ。

フィットの妥当性を評価することが非常に重要であることは理解しています。その方法のひとつが、元のデータにノイズを加えることです。

代替最適化手法のソースコードは、ここ(http://alglib.sources.ru/optimization/)とここ(http://ool.sourceforge.net/)にあります。

明らかに、それぞれの最適化アルゴリズムは、それぞれのクラスのターゲット関数でより良い性能を発揮します。

あなたは実際にどのターゲット関数を使いますか?