遗传算法及其应用实现
使用遗传算法求解函数具有最大值的点X
"""
Visualize Genetic Algorithm to find a maximum point in a function.
"""
import numpy as np
import matplotlib.pyplot as pltDNA_SIZE = 10 # DNA length
POP_SIZE = 100 # population size
CROSS_RATE = 0.8 # mating probability (DNA crossover)
MUTATION_RATE = 0.003 # mutation probability
N_GENERATIONS = 200 # stop evolution rule
X_BOUND = [0, 5] # x upper and lower bounds# to find the maximum of this function
def F(x):return np.sin(10 * x) * x + np.cos(2 * x) * x# 适应性函数(一个值域非负、与F有相同极值点的函数)
def get_fitness(pred):return pred + 1e-3 - np.min(pred)# 选择算子(适者生存,不适者遭淘汰)
def select(pop, fitness):idx = np.random.choice(np.arange(POP_SIZE), size=POP_SIZE, replace=True, p=fitness / fitness.sum()) # 比例选择规则(另外可用“模拟退火算子”)return pop[idx]# 杂交算子(促进进化的主要手段)
def crossover(parent, pop):if np.random.rand() < CROSS_RATE: # 多点杂交(另外还有“单点杂交”、“两点杂交”、“均匀杂交”)i_ = np.random.randint(0, POP_SIZE, size=1) # select another individual from popcross_points = np.random.randint(0, 2, size=DNA_SIZE).astype(np.bool) # choose crossover pointsparent[cross_points] = pop[i_, cross_points] # mating and produce one childreturn parent# 变异算子(使算法达到局部极值时有逃离局部极值“陷阱”的可能性)
def mutate(child):for point in range(DNA_SIZE):if np.random.rand() < MUTATION_RATE:child[point] = 1 if child[point] == 0 else 0return child# 将二进制的DNA转换为实数并且标准化到[0, 5]
def translateDNA(pop):return pop.dot(2 ** np.arange(DNA_SIZE)[::-1]) / float(2 ** DNA_SIZE - 1) * X_BOUND[1]
# np.arange(5)[::-1] 逆序:[4 3 2 1 0]
# 2 ** np.arange(5)[::-1] 幂次:[16 8 4 2 1]
# pop.dot(2 ** np.arange(5)[::-1]) 进制转换:二进制DNA转换为十进制数
# float(2 ** DNA_SIZE - 1) 最大十进制数:31=[16+8+4+2+1]
# pop.dot(2 ** np.arange(DNA_SIZE)[::-1]) / float(2 ** DNA_SIZE - 1) * X_BOUND[1] 将X范围缩放到:[0, 5]pop = np.random.randint(2, size=(POP_SIZE, DNA_SIZE)) # 初始化DNA
# [[1 0 1 1 0 0]
# [0 1 1 1 0 0]
# [1 0 0 1 1 1]]
plt.ion() # something about plotting
x = np.linspace(*X_BOUND, 200)
plt.plot(x, F(x))for _ in range(N_GENERATIONS):F_values = F(translateDNA(pop)) # compute function value by extracting DNA# something about plottingif 'sca' in globals(): sca.remove()sca = plt.scatter(translateDNA(pop), F_values, s=200, lw=0, c='red', alpha=0.5);plt.pause(0.05)# GA part (evolution)fitness = get_fitness(F_values)print("Most fitted DNA: ", pop[np.argmax(fitness), :])pop = select(pop, fitness)pop_copy = pop.copy()for parent in pop:child = crossover(parent, pop_copy)child = mutate(child)parent[:] = child # 自然选择(另外还有“父子混合选择”策略)print("the X: ", translateDNA(pop[np.argmax(fitness), :])) # 具有最高点的X值plt.ioff();
plt.show()
遗传算法及其应用实现相关推荐
- 遗传算法的简单介绍以及模式定理的简单证明
遗传算法 遗传算法(Genetic Algorithm,GA),最早是由美国的John holland在20世纪70年代提出.算法通过模拟达尔文生物进化论的自然选择以及遗传学机理的生物进化过程来搜 ...
- C语言局部搜索算法(爬山法,模拟退火法,遗传算法)求解八皇后问题
C语言局部算法求解八皇后问题 写在前面 八皇后问题及局部搜索算法 爬山法(hill-climbing searching) 算法介绍 代码实现 退火法(simulated annealing) 算法介 ...
- 遗传算法与C++实现
https://blog.csdn.net/b2b160/article/details/4680853/ https://blog.csdn.net/ljp1919/article/details/ ...
- 在遗传算法中出现等式约束_排序算法中的稳定性-等式的处理
在遗传算法中出现等式约束 by Onel Harrison 通过Onel Harrison 排序算法中的稳定性-等式的处理 (Stability in Sorting Algorithms - A T ...
- 2018-4-8使用兔子的例子对比说明遗传算法,局部搜索,禁忌搜索,模拟退火方法
文章的来源: [图文]智能优化算法_数学建模_王成章_模拟退火法_2011_百度文库 https://wenku.baidu.com/view/335c56e94afe04a1b071de13.htm ...
- 2018-4-7 进化类算法------1、遗传算法(GA)
学习资料<智能优化算法及其Matlab实例> 包子阳 余继周 编著 第二章遗传算法: 1.遗传算法:就是借鉴达尔文以及孟德尔的进化理论,而创造的一种模拟自然生物进化的算法.它的本 ...
- 2018-3-27 遗传算法中的轮盘赌
原出处:http://my.oschina.net/u/1412321/blog/192454 一.遗传算法的应用 函数优化(遗传算法的经典应用领域): 组合优化(实践证明,遗传算法对于组合优化中的N ...
- 2018-3-14(论文-优化问题的智能算法及其哲学内涵)笔记二(智能算法与人类智能以及遗传算法与生物进化对比)
随机优化技术: 20世纪60年代人们开始尝试在计算机上模仿生物进进化过程而发展处随机优化技术,解决传统的优化算法难以解决的复杂问题.我们将学习自然界各类生物进化的特点,创造和构建的求解优化问题的方法称 ...
- 基于Matlab的神经网络结合遗传算法在非线性函数极值寻优中的应用
本微信图文利用神经网络进行非线性函数数据的拟合并通过遗传算法对训练后的神经网络进行非线性函数极值寻优.
- 基于Matlab的遗传算法优化BP神经网络在非线性函数拟合中的应用
本微信图文详细介绍了遗传算法优化BP神经网络初始权值阈值的过程,并通过实例说明该优化能够提升BP神经网络的预测精确程度.
最新文章
- AWS — Nitro System
- C#枚举类型和结构体
- 利用ASP.NET2.0向导控件一步步建立与用户的交互--------提高和自定义用户体验
- linux自动锁屏命令_如何冻结和锁定你的Linux系统?
- unity editor下选中GameObject粘贴复制pos信息
- # 睡眠3秒_【for fun】睡眠排序算法
- 中科大开源镜像使用帮助列表
- 域名解析服务之DNS查询类型
- 配送A/B评估体系建设实践
- MooseFS学习-概述
- 单片机modbus rtu通讯_Modbus-RTU通讯
- JAVA:二进制和十进制互转
- 博弈论 从懵逼到入门 详解
- 重磅!2021年国内Java培训机构排名前十最新出炉啦
- 关于:Table '项目名称..hibernate_sequence' doesn't exist的解决方法
- 33种名车的标志及名称来历
- 【产品】 产品设计:工业设计之外观设计详解(形态设计和CMF设计)
- 创业公司该如何设计激励员工的期权池
- 数据治理:数据质量管理策略!
- rsync大批量删除文件