遺伝的アルゴリズムを簡単に使用する方法

前提

GAに基づく-共通コードウェアハウスアドレス

アーキテクチャパターン

ここに画像の説明を挿入

デザインモデル(プロバージョン)

ここに画像の説明を挿入

基本的な知識の補足

遺伝的アルゴリズムとは

まず、遺伝的アルゴリズムは、生物集団の進化を模倣する最適化アルゴリズムであり、一定の反復によって複雑なモデルの最適化手法を実現し、組み合わせ最適化の問題を解決するために使用できます。

遺伝的アルゴリズムのいくつかの基本的な概念

  • 人口(グループのコレクション)
  • 個人
  • 表現型
  • 遺伝子型

遺伝的アルゴリズムの最適化プロセスの概要

不满足条件
满足条件
开始优化
生成种群
种群内部交叉
种群内个体变异
在种群内选择适应环境的个体
优化结束

チップ:

  • 一般に、最大反復回数または終了するためのある程度の適合性に達することを含む2つの条件があります。
  • クロスオーバーと突然変異のプロセスは、一般的にクロスオーバー率と突然変異率によって決定されます

解決できる問題

  • パラメータ最適化問題
  • 組み合わせ最適化問題

コーディングの説明

環境財団

今回はPythonをベースにした遺伝的アルゴリズムウェアハウスを使用しGA-Commonます。

環境の説明を使用する

python3.6+

インストールに関する注意事項

pip install GA-Common

使用例

例1:単純なアプリケーション

遺伝的アルゴリズムを使用して、特定の最高値を概算します

import math

from ga import GA, Individual, IndividualMeta, Selector
from ga_codec import CodecPlugin
from ga_cm import CmPlugin
from ga_iter import StopIterPlugin
from ga_generate import GeneratePlugin
from ga_selector import Selector


def get_fitness(individual: Individual):
    val = individual.phenotype.phenotype
    return -math.log(abs(val[0] - 19.1564))  # 逼近19.1564


def run_simple_ga():
    individual_meta = IndividualMeta()
    individual_meta.range_list = [(19, 30)] # 指定参数A的取值范围
    individual_meta.bit_count = [50]  # 指定二进制编码长度

    codec_plugin = CodecPlugin()
    cm_plugin = CmPlugin(0.05, 0.01)  # 指定交叉率和变异率
    stop_iter_plugin = StopIterPlugin(100)  # 指定最大迭代次数
    generate_plugin = GeneratePlugin(50, individual_meta)  # 指定最大种群数量

    selector = Selector(get_fitness)  # 初始化环境选择器

    ga = GA(
        codec_plugin,
        cm_plugin,
        stop_iter_plugin,
        "",
        generate_plugin
    )
    ga.setup_population()  # 初始化种群
    ga.use_selector(selector)  # 适配环境选择器

    vals = []
    for idx, _ in enumerate(ga):
        individuals = ga.population.individuals
        nums = [i.phenotype.phenotype[0] for i in individuals]
        vals.append((idx, sum(nums) / 100))
    

if __name__ == "__main__":
    run_simple_ga()

この状態では、100回の反復内で、パラメーターは最適値に収束します。
ここに画像の説明を挿入

例2:二次関数パラメーターの最適化

import numpy as np
from ga import GA, IndividualMeta, Individual
from ga_codec import CodecPlugin
from ga_cm import CmPlugin
from ga_generate import GeneratePlugin
from ga_selector import Selector
from ga_iter import StopIterPlugin


x = np.linspace(0, 1, 100)


def get_fitness(individual: Individual):
    phenotypes = individual.phenotype.phenotype

    a, b = phenotypes

    y = a * x ** 2 + b
    mae = np.mean(np.abs(y - x ** 3))

    return 1 / mae


def run_quad():
    individual_meta = IndividualMeta()
    individual_meta.range_list = [(0, 10), (0, 20)]
    individual_meta.bit_count = [100, 100]

    codec_plugin = CodecPlugin()
    cm_plugin = CmPlugin(0.1, 0.1)
    iter_plugin = StopIterPlugin(50)
    generate_plugin = GeneratePlugin(50, individual_meta)

    ga = GA(
        codec_plugin,
        cm_plugin,
        iter_plugin,
        "",
        generate_plugin
    )

    selector = Selector(get_fitness)
    ga.setup_population()
    ga.use_selector(selector)

    best = []
    wrost = []
    fitness = []
    for _ in ga:
        individuals = ga.population.individuals
        individual_pair = [(get_fitness(i), i.phenotype.phenotype) for i in individuals]

        best_a, best_b = max(individual_pair)[1]
        wrost_a, wrost_b = min(individual_pair)[1]

        best.append([best_a, best_b])
        wrost.append([wrost_a, wrost_b])
        fitness.append(sum([i[0] for i in individual_pair]) / len(individuals))


if __name__ == "__main__":
    run_quad()

0から1の範囲で、2次関数のパラメーターを最適化し、0から1の範囲で3次関数の形式に近づけます。

ここに画像の説明を挿入

基本的には地上で約10ラウンドであり、前の値は約0.1に低下しており、最適化効果は明ら​​かです。

例3:SVMモデルパラメーターの最適化

例4:ナビゲーションパスの計画

(つづく...)

おすすめ

転載: blog.csdn.net/m0_37964621/article/details/110945074