知能アルゴリズムシリーズの遺伝的アルゴリズム

ここに画像の説明を挿入

  このブログの表紙はChatGPT + Midjourney共著です。

序文

  この記事は、インテリジェント アルゴリズム (Python 再帰)コラムの最初の記事であり、主に遺伝的アルゴリズムの関連するアプリケーション シナリオの(Genetic Algorithm, GA)アイデア、python実装、シミュレーションを紹介します。

  自然界の生物の生存と繁殖は世代を超えて入れ替わりを繰り返しており、新旧の種の消滅や進化は自然界の生物の適応能力を示しています。これに触発された遺伝的アルゴリズムは、生物学的な継承と進化のプロセスをシミュレートし、極値問題を解決するための一種の自己組織化適応型人工知能テクノロジーになります。その理論的根拠には、ラマルク進化論 ( Lamarckism)、ダーウィン進化論、メンデル遺伝学 ( Mendelian inheritance) が含まれ、主な生物学的基礎は生物の遺伝、変異、進化です。

1. アルゴリズムの考え方

  遺伝的アルゴリズムは(Evolutionary Algorithms, EA)、ダーウィンの進化論をコンピューターに導入する進化的アルゴリズムの一分野です。具体的には、まず、あるメカニズムに従って初期集団を作成し、その初期集団の適応度を評価し、(fitness)初期集団における最適な適応度解を現在の最適解として保存する、と表現できます。次に、集団内の個体を選択(select)、交叉(crossover)、突然変異させて(mutation)新しい集団を取得します。新しい集団の最適解が親世代の最適解よりも優れている場合は、その集団が置き換えられます。アルゴリズムの終了条件が満たされるまで、上記の操作を繰り返します。

  集団内の各個人が問題の解決策を表します。

ここに画像の説明を挿入

  遺伝的アルゴリズムのフローチャートに従って、遺伝的アルゴリズムの構成要素5に対応して問題を整理できます。つまり、問題の解決策をどのように符号化するか、つまり符号化するかです。人口を初期化するにはどうすればよいですか? ハイパーパラメータはどのように選択すればよいでしょうか? フィットネス機能をどのように設計するか? コードを選択、交差、および変更するにはどうすればよいですか? 終了条件は何ですか?5
  (1)DNA
  (2)
  (3)
  (4)DNA
  (5)

2. 詳細を整理する

2.1 DANコード

  解の遺伝的表現は遺伝的コーディングと呼ばれます。遺伝的アルゴリズムは問題空間の決定変数を直接扱うことができず、特定の構造に従って遺伝子で構成される染色体に変換する必要があるため、コーディング操作が必要です。それ以外の場合は、コーディング空間から問題空間へのマッピングがデコーディングのために呼び出されます。
  符号化にはさまざまな方式があり、使用する記号により二値符号化、実数符号化、整数符号化などに分けられ、符号化の構造により一次元符号化と多次元符号化に分けられます。次元エンコード、固定長エンコードと可変長エンコード。さまざまな最適化問題に対して、適切なコーディング方法を選択する必要がありますが、次の制約に従う必要があります:
  (1)非冗長性: コーディングからデコーディングへのマッピングが1正しい1;
  (2)合法性: コーディングの任意の順列が解に対応する;
  (2)完全性: あらゆる解が対応するコードに。

2.2 母集団の初期化とスーパーパラメータの選択

  通常、初期母集団を生成するには 2 つの方法があります: 1 つは完全にランダムな方法で生成され、問題の解決策について事前知識がない状況に適しています。もう 1 つは、特定の事前知識に基づいており、次の条件を満たす必要があります。一連の要件を指定し、これらの要件を満たすソリューションからサンプルをランダムに選択します。現在の作業で使用されている状況に関する限り、それらはすべてランダムな初期母集団です。
  パラメーター サイズの選択は、遺伝的アルゴリズムの実行結果に大きな影響を及ぼします。パラメーターを適切に設定すると、アルゴリズムが全体的な最適解に収束する (収束) ことが促進されます。一般に、設定する必要があるパラメータは次のとおりです。
  (1)母集団のサイズは、Nアルゴリズムの検索能力と動作効率に影響し、通常は に設定されます20~100N設定が大きいと、一度にカバーできるパターンの数が多くなり、母集団の多様性とアルゴリズムの検索能力が高まりますが、計算量が増加してアルゴリズムの効率が低下します。設定が小さいと (集団内の個体の多様性が減少するN)、局所的な収束が起こりやすく、
  (2) DNA長さはLアルゴリズムの計算量や交配突然変異操作の効果に影響を与える。Lの設定は一般に、問題によって定義される解の形式と選択されたエンコード方法によって決まります。
  (3)交叉 (交配) の確率は、Pc進化の過程で集団内で交配に参加する染色体の平均数を決定し、その値は0.4~0.99実行プロセス中に交配確率を調整するアルゴリズムでは、適応方法も使用できます。
  (4)突然変異確率はPm、進化プロセスにおけるすべての突然変異遺伝子の平均数を決定し、その値は一般にです0.001~0.1突然変異操作は集団進化の多様性を高めますが、Pm値が大きすぎてはなりません。大きすぎると、見つかった最適解に一定の破壊的な影響を及ぼし、探索状態が元の劣悪な状況に戻ってしまいます。
  (5)終了条件には、最大発展代数と収束誤差値を設定する必要がある。最大進化代数は一般的に設定できます100~1000が、実際の問題に応じて設定する必要があります。合理的な進化代数では、非収束によりアルゴリズムが継続的に実行されるのを防ぐことができます。

2.3 フィットネス機能

  適応度関数は(fitness function)評価関数とも呼ばれます。名前が示すように、個人の適応度値を評価するために使用され、適応度値が大きい個人は、解のアルゴリズムの要件とより一致しているため、評価関数は非常に重要であり、方向性を導きますソリューションの進化。同時に、適応度関数の選択は、遺伝的アルゴリズムの収束速度と、全体的な最適解を見つけられるかどうかに直接影響します。

2.4 選択、交叉(交配)および突然変異

  選択操作の原理は基本的にダーウィンの自然選択理論に基づいており、その役割は遺伝子検索を検索空間内の有望な領域に導くことです。一般的に使用される選択方法は、ルーレット選択(roulette wheel selection)、トーナメント選択(tournament selection)、ランダム(stochastic sampling)選択、決定論的選択(deterministic sampling)、および混合選択です(mixed sampling)
  いわゆる交叉とは、2つの親個体の構造の一部を置き換えて新しい個体を生成する操作を指し、探索力を向上させることができます。交叉操作の前に、母集団内の個体をペアにする必要があります。現在一般的に使用されているマッチング戦略はランダム マッチングです。つまり、グループ内の個体がランダムな方法でペアになり、ペアになった個体間で交叉操作が実行されます。
  突然変異とは、染色体コード列内の一部の遺伝子が他の遺伝子に置き換えられることです。これは遺伝的アルゴリズムの不可欠な部分であり、その目的は、遺伝的アルゴリズムの局所検索能力を向上させ、集団の多様性を維持し、早期現象を防ぐことです。突然変異オペレーターを設計するには、突然変異点の位置と遺伝子値の置換を決定する必要があります。最も一般的に使用されるのは、コード文字列内の個々のビットの遺伝子値のみを変更する基本的なビット突然変異です。確率的に見ると、突然変異が起こる確率は小さく、その効果は比較的遅く、効果は明ら​​かではありません。
  

2.5 終了条件

  通常、遺伝的アルゴリズムの終了条件は 2 つあり、1 つは反復回数を設定し、アルゴリズムの反復回数が設定値に達するとアルゴリズムが停止すること、もう 1 つは解の変化が 1 秒未満である場合です。値が小さい場合、結果は収束していると見なされ、アルゴリズムが停止します。いずれか 1 つだけを使用することも、両方を同時に使用することもできます。

3. アルゴリズムの実装

3.1 問題のシナリオ

  最も価値のある問題、f ( x ) = xsin ( 5 x ) − xcos ( 2 x ) f(x) = xsin(5x) - xcos(2x) を解きます。f ( x )=x s in ( 5 x )ドメイン上のx cos ( 2 x )[0, 5]の最大値。手動で計算してみましょう:

f ′ ( x ) = 2 xsin ( 2 x ) + sin ( 5 x ) − cos ( 2 x ) + 5 xcos ( 5 x ) f^\prime (x) = 2 x sin(2 x) + sin(5 x) - cos(2 x) + 5 x cos(5 x)f( × )_=2 xインチ( 2 x ) _+s in ( 5 x )cos ( 2 x )+5 x cos ( 5 x )  令f ' ( x ) = 0 f^\prime (x) = 0f( × )_=0以降のよどみ点は理論的には求めることができますが、計算するのは簡単ではありません。

3.2 遺伝的アルゴリズムの観点からの解析

x上式から、問題の解、つまり最大値に対応する変数は浮動小数点数であることが  わかり、ここ
  ではバイナリエンコード方式が使用されています。定義域が1.5、遺伝子コードの長さが の場合10、変換は中間値(四捨五入)となり307、さらにバイナリに変換し0100110011、同様にバイナリを実解に変換することも可能です、1011111011それを中間値 に変換し763、さらに として浮動小数点数(解)に変換します3.7292277614858262遺伝暗号と解の関係は次のとおりです: x ∗ = int ( dna , 2 ) 2 len ( dna ) − 1 × xrangex^* = \frac {int(dna, 2)} {2^{len(dna) }-1 } \times x_{range}バツ=2レンディオン_ _ _1in t ( d na 2 )×バツ範囲_ _ _
  最大値問題を解くためなので、関数f ( x ) f(x) は直接次のようになります。f ( x )は、適応度関数として直接使用されます。つまり、関数値が適応度値を表します。関数値が大きいほど、集団の環境への適応力が強く、その集団が最適 (解決策)DNA
  自然選択、適者生存。selectもちろん、この操作は適応度の高い個体を選択するためのものであり、この記事のcrossover操作とmutation

3.3 Pythonの実装

 -*- coding:utf-8 -*-
# Author:   xiayouran
# Email:    [email protected]
# Datetime: 2023/3/10 16:55
# Filename: ga.py
import numpy as np
import matplotlib.pyplot as plt

dna_size = 10           # DNA length
population_size = 100   # population size
crossover_rate = 0.7    # mating probability(DNA crossover)
mutation_rate = 0.003   # mutation probability
max_generations = 1000   # maximum iterations
x_range = [0, 5]        # x upper and lower bounds

seed = 10086
np.random.seed(seed)

def F(x):
    return x*np.sin(5*x) - x*np.cos(2*x)     # to find the maximum of this function

# find non-zero fitness for selection
def get_fitness(pred):
    return pred + 1e-3 - np.min(pred)

# convert binary DNA to decimal and normalize it to a range(0, 5)
def translateDNA(population):
    # 二进制转10进制, 然后归一化, 再乘以x坐标轴
    return population.dot(2 ** np.arange(dna_size)[::-1]) / float(2**dna_size-1) * x_range[1]

def selection(population, fitness):
    # p: 一维数组, 决定了数组中每个元素采样的概率, 默认为None, 即每个元素被采样的概率相同
    # replace=True, 允许元素重复
    idx = np.random.choice(np.arange(population_size), size=population_size, replace=True,
                           p=fitness/fitness.sum())
    return population[idx]

def crossover(parent, population):
    if np.random.rand() < crossover_rate:   # random crossover
        i_ = np.random.randint(0, population_size, size=1)  # select another individual from population
        cross_points = np.random.randint(0, 2, size=dna_size).astype(np.bool)   # choose crossover points
        parent[cross_points] = population[i_, cross_points]     # mating and produce one child
    return parent

def mutation(child):
    for point in range(dna_size):
        if np.random.rand() < mutation_rate:    # random mutate
            child[point] = 1 if child[point] == 0 else 0
    return child

if __name__ == '__main__':
    # Step1: initialize the population DNA
    population = np.random.randint(2, size=(population_size, dna_size))

    fig = plt.figure()
    plt.ion()   # 交互模式
    x = np.linspace(*x_range, 200)
    plt.plot(x, F(x))

    for _ in range(max_generations):
        F_values = F(translateDNA(population))

        # something about plotting
        if 'sca' in globals():
            sca.remove()
        sca = plt.scatter(translateDNA(population), F_values, s=100, lw=0, c='red', alpha=0.5)
        plt.pause(0.01)

        # Step2: compute fitness value
        fitness = get_fitness(F_values)
        best_id = np.argmax(fitness)
        print("Most fitted DNA: {}, x: {}, max_value: {}".format(population[best_id],
                                                                 translateDNA(population[best_id]),
                                                                 F(translateDNA(population[best_id]))))
        # Step3: selection
        population = selection(population, fitness)
        population_copy = population.copy()
        for parent in population:
            # Step4: crossover
            child = crossover(parent, population_copy)
            # Step5: mutation
            child = mutation(child)
            parent[:] = child   # parent is replaced by its child

    plt.ioff()
    plt.show()

  得られた最適解は次のとおりです。

Most fitted DNA: [1 1 0 1 0 1 0 1 0 1], x: 4.16911045943304, max_value: 5.738744982619388

  シミュレーションのプロセスは次のとおりです。

ここに画像の説明を挿入

コードリポジトリ:IALib[GitHub]

  この記事のコードは、Python[スマート アルゴリズム (反復)] 列の専用ウェアハウスに同期されています: IALib
  ランタイムライブラリIALibGAアルゴリズム:

git clone [email protected]:xiayouran/IALib.git
cd examples
python main.py -algo ga

おすすめ

転載: blog.csdn.net/qq_42730750/article/details/129444149
おすすめ