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求二元函数最大值(来自知乎)相关推荐

  1. python函数求导_python构建计算图1——简单实现自动求导

    机器学习和深度学习中比较重要的内容便是计算图,主流的框架如tensorflow,pytorch都是以计算图为主要框架.而计算图的核心便是自动求导. 所谓自动求导,就是在表达式或者网络结构确定之时,其( ...

  2. 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 ...

  3. 矩阵求导(一)-- 求导的定义和布局约定

    本系列主要参考张贤达的<矩阵分析与应用>第三章 矩阵微分和下面的博客内容进行学习,并整理成学习笔记.学习路线参考SinclairWang的文章--矩阵求导入门学习路线,按下面推荐顺序学习, ...

  4. 对抽象函数求导_抽象函数的求导方法怎么?

    2005-10-31 什么是洛必达法则,用它求极限就是求导吗? 我们知道,在求极限时,常会遇到两个无穷小之比的极限或两个无穷大之比的极限.这些极限有的存在,有的不存在.通常称这类极限为"未定 ...

  5. 高等数学期末总复习 DAY 3.利用导数定义求极限 判断连续与可导的关系 关于导数定义的证明题 基本求导 基本高阶求导 抽象函数求导

    DAY 3. 一路陪我走过来的从来都不是什么善良正直正能量,而是虚荣嫉妒不甘心 文章目录 DAY 3. 1. 利用导数定义求极限 2.判断连续与可导的关系 3.关于导数定义的证明题 4.基本复合函数求 ...

  6. 机器学习中的矩阵向量求导(四) 矩阵向量求导链式法则

    在机器学习中的矩阵向量求导(三) 矩阵向量求导之微分法中,我们讨论了使用微分法来求解矩阵向量求导的方法.但是很多时候,求导的自变量和因变量直接有复杂的多层链式求导的关系,此时微分法使用起来也有些麻烦. ...

  7. 机器学习中的矩阵向量求导(三) 矩阵向量求导之微分法

    在机器学习中的矩阵向量求导(二) 矩阵向量求导之定义法中,我们讨论了定义法求解矩阵向量求导的方法,但是这个方法对于比较复杂的求导式子,中间运算会很复杂,同时排列求导出的结果也很麻烦.因此我们需要其他的 ...

  8. 机器学习中的矩阵向量求导(二) 矩阵向量求导之定义法

    在机器学习中的矩阵向量求导(一) 求导定义与求导布局中,我们讨论了向量矩阵求导的9种定义与求导布局的概念.今天我们就讨论下其中的标量对向量求导,标量对矩阵求导, 以及向量对向量求导这三种场景的基本求解 ...

  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 ...

最新文章

  1. centos 6 添加svn 的1.7版本yum源
  2. 090621 NTFS删除的恢复
  3. 查找_排序_思维导图
  4. HDU 1003——Max Sum(动态规划)
  5. Spring boot 项目目录结构详解
  6. 为什么 0.1 + 0.2 = 0.300000004
  7. 基于设备树的TQ2440的中断(2)
  8. asp.net zero
  9. jenkins java jar_Jenkins 安装和配置、启动jar包
  10. python装饰器与闭包_Python:函数装饰器和闭包
  11. vue.js 事件的案例以及 v-model 的学习
  12. data layui table 排序_具有排序、筛选、分组、虚拟化、编辑功能的React表格组件...
  13. 计算机专业实习日记,计算机专业实习日记精选
  14. 输入阻抗和输出阻抗概念
  15. ubuntu 的挂起与休眠
  16. findfont: Font family [‘sans-serif‘] not found解决方法
  17. rabbitmq的web管理界面无法使用guest用户登录
  18. 未来教育计算机二级2020年9月有几套题,未来教育】2021年9月全国计算机二级office题库国二计算机等级考试上机考试真题计算机二级msoffice2021年考试备考三月教材九2016...
  19. 2017283421俞烨炜
  20. 使用自定义注解实现接口参数校验

热门文章

  1. [BZOJ1430] 小猴打架
  2. 使用SWIG,在java编程中调用动态库
  3. 4月1日起,惠州3个高铁站可直达香港。最详细攻略来了。
  4. 01改变世界:现代计算机真正的鼻祖——超越时代的伟大思想
  5. harmonyos2.0能在电脑安装么,华为鸿蒙系统2.0怎么安装 HarmonyOS2.0安装攻略
  6. Java IO流经典练习题详解
  7. 证明:连续型随机变量的分布函数一定是连续的
  8. Nosql与Redis期末考核项目回顾
  9. 人生思维与职业的转变
  10. Python执行selenium报错This version of ChromeDriver only supports Chrome version并配置环境变量