遺伝的アルゴリズムのために、局所最適状態で動けなくなるのを防ぐ方法


7

文法の進化を利用して遺伝的アルゴリズムをプログラミングしています。私の問題は、局所的な最適値(早期収束)に到達し、それが発生したときに何をすべきかわからないことです。突然変異率を上げることを考えています(5%がデフォルト値です)が、いつ必要かを判断する方法がわかりません。

私がすべての世代で持っているデータは、最初の列がその適合性である二次元配列です

adn[i][0] ← fitness 
row → is the values of the Grammar
column ↓ Each indiviual result

説明が必要な場合は、お問い合わせください。変更させていただきます。これは私の母国語ではなく、間違いやご不便をおかけして申し訳ありません。

リクエストに答えると、私の操作は次のとおりであり、この順序で正確に:

  • ランダムな母集団(乱数を含む行列)を生成します
  • 希望する結果を含む行列を生成します。これを行うために、私はさらに+ -5%のバリエーションを持ついくつかの関数を実装しました。例:fun(x)=(2 * cos(x)+ sen(x)-2X)* (0,95+ (0と0,1の間で振動する数値)、xには0からN(Nは行のサイズ)までのすべてのf(x)が含まれ、yにはまったく同じ(より多くの結果)が含まれます
  • アルゴリズムを開始します(世代が変わり始めます

すべての世代を作るアクションは次のとおりです。

  • 突然変異:すべての染色体の乱数は任意の遺伝子で突然変異する可能性があります→adn [i] [ランダム] =乱数(これが発生する確率の5%)
  • クロスオーバー:私はすべてのadnを他のadnと交差させます(80%はすべてのペアの突然変異の可能性です)。ペアリングのために、乱数を選び、adn [i]とadn [(i + j)mod NumADNs]に直面します。
  • 翻訳。ワンステップの転写で作成したf(0からN)の値を含む行列を取得し、画像に文法を適用して翻訳します

    文法

-fitness:取得した値を期待値と比較し、適合度を更新します。

-エリート主義:その後、私は最高の4つのADNを選択し、それをトップにします、それらは選択されます

-選択:非エリート主義のadnは完全にランダムなadnに直面し、その適応度が低い(低いほうが良い)が優勢であり、悪い方が生き残る可能性があります


1
あなたのタイトルは、あなたが局所最適であるかどうかを知る方法について尋ねます-いくつかの反復の後、これ以上の変化はありませんが、本文は何をすべきか尋ねます-いくつかの大域最適テクニックを追加します。私は正しく理解しましたか?
邪悪な

@EvilJSはい、そうです。私のアルゴリズムは引き続き実行されますが、関連する変更はありません。
Kaostias 2016年

したがって、変更せずに反復回数を追跡し、これが所定のしきい値よりも大きい場合は、計算を停止します。停止する代わりに、突然変異率を上げて再試行できます。突然変異率を上げるためにソリューションのみを試す場合-いくつかの反復回数を与え、デフォルト値に設定します。
邪悪な

作業の順番を間違えているような印象です。
Auberon 2016年

すべてのバッチでランダムなゲノム
t123 '19

回答:


9

早すぎる収束に対処しているようです。

言い換えれば、母集団は次善の解を表す個人および/またはその解に(あまりに)近い個人で満たされます。

遺伝的アルゴリズムの基本的なフレームワークは次のとおりです。

P <- Population of size N with N random individuals.
evaluate fitness of all individuals in P
while (stopping criteria not met) {
    C <- empty Child set of size M
    while (size of C is not M) {
        parent1 <- select an individual from P
        parent2 <- select an individual from P

        child1, child2 <- combine parent1 and parent2 somehow.
        child1, child2 <- mutate children by chance
        evaluate fitness of child1, child2
        C <- C + child1 + child2
    }
    P <- combine P and C. (P remains size N)
}
return individual with best fitness

(例えば)人口/子供のサイズはそれ自体一定である必要はないことに注意してください。または、可変数の親を可変数の子に結合することもできます(たとえば、5つの親の間のクロスオーバーによって7つの子が生成される)。でも、最初はシンプルにしておこうと思います。

ご覧のとおり、遺伝的アルゴリズムの主な演算子は、

  • 選択:組み合わせる母集団から個人を選択します。例:トーナメントの選択プロポーショナルの選択トランケーションの選択、...
  • クロスオーバー:選択した個人(親)を新しい個人(子供)に結合します。例:1点交差n点交差均一交差カットアンドスプライス、...
  • 突然変異:偶然にも、個人をわずかに変更することで個人を突然変異させないでください。
  • 組み換え:どういうわけか、子を親のセットに挿入します。例:すべての子供を母集団に追加し、事柄を適合度で並べ替え、最悪の個人を削除して、母集団のサイズを再びNにします。人口を並べ替えて最悪のM人を落とし、すべての子供を追加します。多くの場合、選択フェーズで提示されるのと同じ手法が使用されます。

説明では、複数のステップを1つであるかのように混乱させています(たとえば、選択ステップをスキップしますが、クロスオーバーステップでそれを統合しません)。また、アルゴリズムのステップであるかのようにテクニックを記述します(たとえば、Elitismは、組み換えステップで少なくとも最高の個体が死亡しないようにするために使用されるテクニックです)。

時期尚早な収束が発生する可能性がある/発生する例は、親として最高の個体のみを選択し、最高の個体のみが(組換えステップで)生き残ることを許可する場合です。

これを解決するいくつかの可能な方法:

  • 突然変異率を上げる。ただし、突然変異は通常非常にランダムなプロセスです。次善の解決策を回避するには、「純粋な」運が必要です。
  • 遺伝子操作を再設計します。たとえば、不健康な個人/子孫が世代をより頻繁に生き残ることができるようにします。あなたが現在生き残るにはあまりにも多くの良い個人を選択しているかもしれません。ただし、悪質な個人が生き残ることができないようにしてください。
  • (...)

目標は、次の世代ごとに、集団の平均適合度が(できれば)十分に大きく、十分な適合度の変動を維持するように、遺伝子操作を週にすることです。これは簡単ではありません。

上記の方法で解決できない場合に、早期収束を回避する方法は他にもいくつかあります。ただし、これを行う前に、まず遺伝子操作の変更を試すことを強くお勧めします。検索語句:事前選択混雑フィットネス共有近親相姦防止、...


まあ、用語「局所最適が例えば、記事や書籍で使用された、ここで昔用語が過負荷に少しですが、それが使用され、そして有意義な。。
悪の

私はもう少し生き残っているダミーのソリューションを試してみるつもりです(ランダムトーナメントでより良いものに直面したとき、私はすぐにそれを破壊しました)どちらが悪いソリューションの良い合格率でしょうか?
Kaostias 2016年

@Kaostias回答を編集して、遺伝子操作について簡単に説明してください(選択、組換え、突然変異、置換など)?この方法では、早期収束の考えられる原因を検出できます。
Auberon 2016年

@Auberonが完了しました。悪い英語で申し訳ありませんが、類義語が大幅に不足しています。
Kaostias 2016年

@Kaostias私はあなたのために私が最も興味深いと思うものへの私の答えを変更しました。
Auberon 2016年

1

突然変異率を上げると、局所最適値から跳ね返ることができ、より多くの可能性を検索できますが、トレードオフがあります-突然変異率が高いと収束率が変化し、高すぎると収束が停止します。
結果がいくつかの反復で停止したとき-これは停止したときなので、新しい検索を開始する瞬間でもあります。グローバル最適を見つけるために、GAとSA
混合することを提案します。
実用的なハックソリューションは、ローカルの最適値を覚えて再起動(突然変異または再初期化)することですが、アトラクターを破棄した後は突然変異率を下げます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.