前提
基于GA-Common 代码仓库地址
架构模式
设计模型(Pro版)
基础知识补充
什么是遗传算法
首先,遗传算法属于一种模仿生物种群演进规律的优化算法,通过不停的迭代来达到对于复杂模型的优化方式,可以用于解决组合优化问题等。
遗传算法中的一些基础概念
- 种群(群体的集合)
- 个体
- 表现型
- 基因型
遗传算法的优化过程概览
Tips:
- 条件一般由两种,包含了最大迭代次数或者达到了某种适应度可以结束
- 交叉和变异过程,一般都会由交叉率和变异率来决定
可以解决的问题
- 参数优化问题
- 组合优化问题
编码说明
环境基础
本次采用的基于Python构建的基础的遗传算法仓库GA-Common
。
使用环境说明
python3.6+
安装说明
pip install GA-Common
使用示例
示例一: 简单应用
使用遗传算法,逼近某个置顶的数值
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次以内的迭代,参数就会收敛到最优值。
示例二: 二次函数参数优化
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范围内,优化二次函数的参数,并且使其在0~1范围内接近三次函数的形式。
基本可以确定大概在地10轮左右,mae的数值已经下降到了0.1左右,优化效果明显。
示例三: SVM 模型参数优化
示例四: 导航路径规划
(未完待续…)