前提
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:ナビゲーションパスの計画
(つづく...)