python二元函数求导_python实现GA求二元函数最大值(来自知乎)
importmath, randomclassPopulation:#种群的设计
def __init__(self, size, chrom_size, cp, mp, gen_max):#种群信息合
self.individuals = [] #个体集合
self.fitness = [] #个体适应度集
self.selector_probability = [] #个体选择概率集合
self.new_individuals = [] #新一代个体集合
self.elitist= {'chromosome':[0, 0], 'fitness':0, 'age':0} #最佳个体的信息
self.size= size #种群所包含的个体数
self.chromosome_size = chrom_size #个体的染色体长度
self.crossover_probability = cp #个体之间的交叉概率
self.mutation_probability = mp #个体之间的变异概率
self.generation_max= gen_max #种群进化的最大世代数
self.age = 0 #种群当前所处世代
#随机产生初始个体集,并将新一代个体、适应度、选择概率等集合以 0 值进行初始化
v = 2 ** self.chromosome_size - 1
for i inrange(self.size):
self.individuals.append([random.randint(0, v), random.randint(0, v)])
self.new_individuals.append([0, 0])
self.fitness.append(0)
self.selector_probability.append(0)#基于轮盘赌博机的选择
defdecode(self, interval, chromosome):'''将一个染色体 chromosome 映射为区间 interval 之内的数值'''d= interval[1] -interval[0]
n= float (2 ** self.chromosome_size -1)return (interval[0] + chromosome * d /n)deffitness_func(self, chrom1, chrom2):'''适应度函数,可以根据个体的两个染色体计算出该个体的适应度'''interval= [-10.0, 10.0]
(x, y)=(self.decode(interval, chrom1),
self.decode(interval, chrom2))
n= lambda x, y: math.sin(math.sqrt(x*x + y*y)) ** 2 - 0.5d= lambda x, y: (1 + 0.001 * (x*x + y*y)) ** 2func= lambda x, y: 0.5 - n(x, y)/d(x, y)returnfunc(x, y)defevaluate(self):'''用于评估种群中的个体集合 self.individuals 中各个个体的适应度'''sp=self.selector_probabilityfor i inrange (self.size):
self.fitness[i]= self.fitness_func (self.individuals[i][0], #将计算结果保存在 self.fitness 列表中
self.individuals[i][1])
ft_sum=sum (self.fitness)for i inrange (self.size):
sp[i]= self.fitness[i] / float (ft_sum) #得到各个个体的生存概率
for i in range (1, self.size):
sp[i]= sp[i] + sp[i-1] #需要将个体的生存概率进行叠加,从而计算出各个个体的选择概率
#轮盘赌博机(选择)
defselect(self):
(t, i)=(random.random(), 0)for p inself.selector_probability:if p >t:breaki= i + 1
returni#交叉
defcross(self, chrom1, chrom2):
p= random.random() #随机概率
n = 2 ** self.chromosome_size -1
if chrom1 != chrom2 and p
t= random.randint(1, self.chromosome_size - 1) #随机选择一点(单点交叉)
mask = n << t #<< 左移运算符
(r1, r2) = (chrom1 & mask, chrom2 & mask) #& 按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0
mask = n >> (self.chromosome_size -t)
(l1, l2)= (chrom1 & mask, chrom2 &mask)
(chrom1, chrom2)= (r1 + l2, r2 +l1)return(chrom1, chrom2)#变异
defmutate(self, chrom):
p=random.random ()if p
t= random.randint (1, self.chromosome_size)
mask1= 1 << (t - 1)
mask2= chrom &mask1if mask2 >0:
chrom= chrom & (~mask2) #~ 按位取反运算符:对数据的每个二进制位取反,即把1变为0,把0变为1
else:
chrom= chrom ^ mask1 #^ 按位异或运算符:当两对应的二进位相异时,结果为1
returnchrom#保留最佳个体
defreproduct_elitist (self):#与当前种群进行适应度比较,更新最佳个体
j = -1
for i inrange (self.size):if self.elitist['fitness']
j=i
self.elitist['fitness'] =self.fitness[i]if (j >=0):
self.elitist['chromosome'][0] =self.individuals[j][0]
self.elitist['chromosome'][1] = self.individuals[j][1]
self.elitist['age'] =self.age#进化过程
defevolve(self):
indvs=self.individuals
new_indvs=self.new_individuals#计算适应度及选择概率
self.evaluate()#进化操作
i =0whileTrue:#选择两个个体,进行交叉与变异,产生新的种群
idv1 =self.select()
idv2=self.select()#交叉
(idv1_x, idv1_y) = (indvs[idv1][0], indvs[idv1][1])
(idv2_x, idv2_y)= (indvs[idv2][0], indvs[idv2][1])
(idv1_x, idv2_x)=self.cross(idv1_x, idv2_x)
(idv1_y, idv2_y)=self.cross(idv1_y, idv2_y)#变异
(idv1_x, idv1_y) =(self.mutate(idv1_x), self.mutate(idv1_y))
(idv2_x, idv2_y)=(self.mutate(idv2_x), self.mutate(idv2_y))
(new_indvs[i][0], new_indvs[i][1]) = (idv1_x, idv1_y) #将计算结果保存于新的个体集合self.new_individuals中
(new_indvs[i+1][0], new_indvs[i+1][1]) =(idv2_x, idv2_y)#判断进化过程是否结束
i = i + 2 #循环self.size/2次,每次从self.individuals 中选出2个
if i >=self.size:break
#最佳个体保留
#如果在选择之前保留当前最佳个体,最终能收敛到全局最优解。
self.reproduct_elitist()#更新换代:用种群进化生成的新个体集合 self.new_individuals 替换当前个体集合
for i inrange (self.size):
self.individuals[i][0]=self.new_individuals[i][0]
self.individuals[i][1] = self.new_individuals[i][1]defrun(self):'''根据种群最大进化世代数设定了一个循环。
在循环过程中,调用 evolve 函数进行种群进化计算,并输出种群的每一代的个体适应度最大值、平均值和最小值。'''
for i inrange (self.generation_max):
self.evolve ()print (i, max (self.fitness), sum (self.fitness)/self.size, min (self.fitness))if __name__ == '__main__':#种群的个体数量为 50,染色体长度为 25,交叉概率为 0.8,变异概率为 0.1,进化最大世代数为 150
pop = Population (50, 24, 0.8, 0.1, 150)
pop.run()
python二元函数求导_python实现GA求二元函数最大值(来自知乎)相关推荐
- python函数求导_python构建计算图1——简单实现自动求导
机器学习和深度学习中比较重要的内容便是计算图,主流的框架如tensorflow,pytorch都是以计算图为主要框架.而计算图的核心便是自动求导. 所谓自动求导,就是在表达式或者网络结构确定之时,其( ...
- matlab对多项式求导,matlab中多项式求导
1 0.5 0 -0.5 -1 -1.5 -2 -2 -1.5 -1 -0.5 0 0.5 1 1.5 2 4.对比用多项式函数的 polyder 函数及符号函数中的 diff 函数,求导 x2+2x ...
- 矩阵求导(一)-- 求导的定义和布局约定
本系列主要参考张贤达的<矩阵分析与应用>第三章 矩阵微分和下面的博客内容进行学习,并整理成学习笔记.学习路线参考SinclairWang的文章--矩阵求导入门学习路线,按下面推荐顺序学习, ...
- 对抽象函数求导_抽象函数的求导方法怎么?
2005-10-31 什么是洛必达法则,用它求极限就是求导吗? 我们知道,在求极限时,常会遇到两个无穷小之比的极限或两个无穷大之比的极限.这些极限有的存在,有的不存在.通常称这类极限为"未定 ...
- 高等数学期末总复习 DAY 3.利用导数定义求极限 判断连续与可导的关系 关于导数定义的证明题 基本求导 基本高阶求导 抽象函数求导
DAY 3. 一路陪我走过来的从来都不是什么善良正直正能量,而是虚荣嫉妒不甘心 文章目录 DAY 3. 1. 利用导数定义求极限 2.判断连续与可导的关系 3.关于导数定义的证明题 4.基本复合函数求 ...
- 机器学习中的矩阵向量求导(四) 矩阵向量求导链式法则
在机器学习中的矩阵向量求导(三) 矩阵向量求导之微分法中,我们讨论了使用微分法来求解矩阵向量求导的方法.但是很多时候,求导的自变量和因变量直接有复杂的多层链式求导的关系,此时微分法使用起来也有些麻烦. ...
- 机器学习中的矩阵向量求导(三) 矩阵向量求导之微分法
在机器学习中的矩阵向量求导(二) 矩阵向量求导之定义法中,我们讨论了定义法求解矩阵向量求导的方法,但是这个方法对于比较复杂的求导式子,中间运算会很复杂,同时排列求导出的结果也很麻烦.因此我们需要其他的 ...
- 机器学习中的矩阵向量求导(二) 矩阵向量求导之定义法
在机器学习中的矩阵向量求导(一) 求导定义与求导布局中,我们讨论了向量矩阵求导的9种定义与求导布局的概念.今天我们就讨论下其中的标量对向量求导,标量对矩阵求导, 以及向量对向量求导这三种场景的基本求解 ...
- MIT 18.01 Single Variable Calculus(单变量微积分)课堂笔记【3】——求导四则运算和三角函数求导
求导四则运算和三角函数求导 本节重点讲解了两个三角函数求导公式的证明: f′(sin(x))=cos(x)f'(\sin(x)) = \cos(x) f′(sin(x))=cos(x) f′(co ...
最新文章
- centos 6 添加svn 的1.7版本yum源
- 090621 NTFS删除的恢复
- 查找_排序_思维导图
- HDU 1003——Max Sum(动态规划)
- Spring boot 项目目录结构详解
- 为什么 0.1 + 0.2 = 0.300000004
- 基于设备树的TQ2440的中断(2)
- asp.net zero
- jenkins java jar_Jenkins 安装和配置、启动jar包
- python装饰器与闭包_Python:函数装饰器和闭包
- vue.js 事件的案例以及 v-model 的学习
- data layui table 排序_具有排序、筛选、分组、虚拟化、编辑功能的React表格组件...
- 计算机专业实习日记,计算机专业实习日记精选
- 输入阻抗和输出阻抗概念
- ubuntu 的挂起与休眠
- findfont: Font family [‘sans-serif‘] not found解决方法
- rabbitmq的web管理界面无法使用guest用户登录
- 未来教育计算机二级2020年9月有几套题,未来教育】2021年9月全国计算机二级office题库国二计算机等级考试上机考试真题计算机二级msoffice2021年考试备考三月教材九2016...
- 2017283421俞烨炜
- 使用自定义注解实现接口参数校验
热门文章
- [BZOJ1430] 小猴打架
- 使用SWIG,在java编程中调用动态库
- 4月1日起,惠州3个高铁站可直达香港。最详细攻略来了。
- 01改变世界:现代计算机真正的鼻祖——超越时代的伟大思想
- harmonyos2.0能在电脑安装么,华为鸿蒙系统2.0怎么安装 HarmonyOS2.0安装攻略
- Java IO流经典练习题详解
- 证明:连续型随机变量的分布函数一定是连续的
- Nosql与Redis期末考核项目回顾
- 人生思维与职业的转变
- Python执行selenium报错This version of ChromeDriver only supports Chrome version并配置环境变量