首页

文章

python有没有简单的遗传算法库

发布网友 发布时间:2022-04-20 04:18

我来回答

3个回答

懂视网 时间:2022-04-18 19:39

本篇文章主要介绍了Python 遗传算法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

写在前面

之前的文章中已经讲过了遗传算法的基本流程,并且用MATLAB实现过一遍了。这一篇文章主要面对的人群是看过了我之前的文章,因此我就不再赘述遗传算法是什么以及基本的内容了,假设大家已经知道我是怎么写遗传算法的了。

Python的遗传算法主函数

我的思想是,创建一个染色体的类,其中包括了两个变量:染色体chrom与适应度fitness。因此我们就可以通过直接建立对象来作为种群中的个体。


#染色体的类
class Chrom:
 chrom = []
 fitness = 0
 def showChrom(self):
 print(self.chrom)
 def showFitness(self):
 print(self.fitness)

所以我们开始设置基础参数。其中种群的表达方式我用的是字典,也就是用一个字典来保存种群内的所有个体,这个也是我想出来的创建多个对象的方法。

将字典的索引为个体的标号,如:chrom1, chrom2等。字典索引的值就是一个对象。这个对象拥有两个属性,就是染色体与适应度。

其实在这一方便来说,我觉得在思路上是优于利用MATLAB的矩阵式编程的。因为这样可以很直观的将个体与个体的属性这一种思想给表达出来,相比一堆矩阵来说,在逻辑上比较容易接受。


#基础参数
N = 200 #种群内个体数目
mut = 0.2 #突变概率
acr = 0.2 #交叉概率

pop = {} #存储染色体的字典
for i in range(N):
 pop['chrom'+str(i)] = Chrom()
chromNodes = 2 #染色体节点数(变量个数)
iterNum = 10000 #迭代次数
chromRange = [[0, 10], [0, 10]] #染色体范围
aveFitnessList = [] #平均适应度
bestFitnessList = [] #最优适应度

之后就是初始染色体了,其中就牵扯到了各种用来初始化种群、计算适应度、找最优等函数,我在这里分出了两个文件,分别为Genetic.py与Fitness.py。

Genetic.py里面有八个函数,主要包含了作用于种群或者染色体操作的函数,分别为:

  1. findBest函数,用于寻找种群中的最优染色体;

  2. findworse函数,用于寻找种群中的最劣染色体;

  3. initialize函数,用于初始化种群;

  4. calAveFitness函数,用于计算种群的平均适应度;

  5. mutChrom函数,用于对染色体进行变异;

  6. inRange函数,用于判断染色体节点值是否越界;

  7. acrChrom函数,用于对染色体进行交叉;

  8. compareChrom函数,用于比较两个染色体孰优孰劣。

Fitness.py里面有两个函数,主要包含了对适应度操作的函数,分别为:

  1. calFitness函数,用来迭代每一个个体,并计算适应度(利用funcFitness函数计算);

  2. funcFitness函数,计算单个个体的适应度。

因此可以列出初始化代码为


#初始染色体
pop = Genetic.initialize(pop, chromNodes, chromRange)
pop = Fitness.calFitness(pop) #计算适应度
bestChrom = Genetic.findBest(pop) #寻找最优染色体
bestFitnessList.append(bestChrom[1]) #将当前最优适应度压入列表中
aveFitnessList.append(Genetic.calAveFitness(pop, N)) #计算并存储平均适应度

迭代过程的思路和逻辑与MATLAB无异


#开始迭代
for t in range(iterNum):
 #染色体突变
 pop = Genetic.mutChrom(pop, mut, chromNodes, bestChrom, chromRange)
 #染色体交换
 pop = Genetic.acrChrom(pop, acr, chromNodes)
 #寻找最优
 nowBestChrom = Genetic.findBest(pop)
 #比较前一个时间的最优和现在的最优
 bestChrom = Genetic.compareChrom(nowBestChrom, bestChrom)
 #寻找与替换最劣
 worseChrom = Genetic.findWorse(pop)
 pop[worseChrom[0]].chrom = pop[bestChrom[0]].chrom.copy()
 pop[worseChrom[0]].fitness = pop[bestChrom[0]].fitness
 #存储最优与平均
 bestFitnessList.append(bestChrom[1])
 aveFitnessList.append(Genetic.calAveFitness(pop, N))

最后再做一下迭代的的图像


plt.figure(1)
plt.plot(x, aveFitnessList)
plt.plot(x, bestFitnessList)
plt.show()

最后再在最前面加上各种库和文件就可以运行了。


import Genetic
import Fitness
import matplotlib.pyplot as plt
import numpy as np

感悟

可以说最主要的感悟就是染色体这一个类。其实那个Genetic.py与Fitness.py这两个文件也可以直接包装成类,但是这样一来我就嫌主文件太臃肿,在其他里面再包装成类又多此一举,毕竟这只是一个小程序,所以我就这样写了。

深刻感悟到了面向对象编程的优点,在编程逻辑的处理上真是一种享受,只需要思考对象的属性即可,省去了许多复杂的思考。

另一个感悟就是创建多个对象时,利用字典的方法来创建对象。当初我也是困惑怎么建立一个类似于C++中的对象数组,上网查找了各种方法,结果都避而不谈(当然,也可能是我搜索能力太差没找到),所以经过尝试中遇到到了这种方法。

等有空我再详细说一下这个方法吧,这一次就先到这里。

剩余的函数补充

首先是Genetic.py里面的八个函数


import random

#寻找最优染色体
def findBest(pop):
 best = ['1', 0.0000001]
 for i in pop:
 if best[1] < pop[i].fitness:
 best = [i, pop[i].fitness]
 return best

#寻找最劣染色体
def findWorse(pop):
 worse = ['1', 999999]
 for i in pop:
 if worse[1] > pop[i].fitness:
 worse = [i, pop[i].fitness]
 return worse

#赋初始值
def initialize(pop, chromNodes, chromRange):
 for i in pop:
 chromList = []
 for j in range(chromNodes):
 chromList.append(random.uniform(chromRange[j][0], chromRange[j][1]+1))
 pop[i].chrom = chromList.copy()
 return pop

#计算平均适应度
def calAveFitness(pop, N):
 sumFitness = 0
 for i in pop:
 sumFitness = sumFitness + pop[i].fitness
 aveFitness = sumFitness / N
 return aveFitness

#进行突变
def mutChrom(pop, mut, chromNodes, bestChrom, chromRange):
 for i in pop:
 #如果随机数小于变异概率(即可以变异)
 if mut > random.random():
 mutNode = random.randrange(0,chromNodes)
 mutRange = random.random() * (1-pop[i].fitness/bestChrom[1])**2
 pop[i].chrom[mutNode] = pop[i].chrom[mutNode] * (1+mutRange)
 #判断变异后的范围是否在要求范围内
 pop[i].chrom[mutNode] = inRange(pop[i].chrom[mutNode], chromRange[mutNode])
 return pop

#检验便宜范围是否在要求范围内
def inRange(mutNode, chromRange):
 if chromRange[0] < mutNode < chromRange[1]:
 return mutNode
 elif mutNode-chromRange[0] > mutNode-chromRange[1]:
 return chromRange[1]
 else:
 return chromRange[0]

#进行交叉
def acrChrom(pop, acr, chromNodes):
 for i in pop:
 for j in pop:
 if acr > random.random():
 acrNode = random.randrange(0, chromNodes)
 #两个染色体节点进行交换
 pop[i].chrom[acrNode], pop[j].chrom[acrNode] = pop[j].chrom[acrNode], pop[i].chrom[acrNode]
 return pop

#进行比较
def compareChrom(nowbestChrom, bestChrom):
 if bestChrom[1] > nowbestChrom[1]:
 return bestChrom
 else:
 return nowbestChrom

然后是Fitness.py的两个函数


import math

def calFitness(pop):
 
 for i in pop:
 #计算每个染色体的适应度
 pop[i].fitness = funcFitness(pop[i].chrom)

 return pop

def funcFitness(chrom):
 #适应度函数
 fitness = math.sin(chrom[0])+math.cos(chrom[1])+0.1*(chrom[0]+chrom[1])

热心网友 时间:2022-04-18 16:47

首先遗传算法是一种优化算法,通过模拟基因的优胜劣汰,进行计算(具体的算法思路什么的就不赘述了)。大致过程分为初始化编码、个体评价、选择,交叉,变异。

以目标式子 y = 10 * sin(5x) + 7 * cos(4x)为例,计算其最大值

首先是初始化,包括具体要计算的式子、种群数量、染色体长度、交配概率、变异概率等。并且要对基因序列进行初始化

[python] view plain copy

热心网友 时间:2022-04-18 18:05

建议使用Python高性能遗传算法库:Geatpy。提供框架方法,几行代码就可以解决复杂的进化优化问题。代码风格与Matlab的类似,容易上手。
https://blog.csdn.net/qq_33353186/article/details/82014986
八月中国最凉快的地方 八月份哪里最凉快,去哪旅游好?美丽的地方 乱字同韵字是什么意思 华硕笔记本电脑触摸板怎么开笔记本电脑触摸板怎么开启和关闭_百度知 ... 陕西职务侵占案立案准则 结婚后我的恋情维系了十年,怎么做到的? 玉米仁子饭产自哪里 中国期货交易所的交易品种有哪些? 历史要怎么读,有啥诀窍 高中历史诀窍 年终会活动策划方案 深度解析:第一财经回放,探索财经新风向 逆水寒手游庄园怎么邀请好友同住 逆水寒手游 逆水寒不同区可以一起组队吗? 逆水寒手游 逆水寒怎么进入好友世界? 逆水寒手游 逆水寒怎么去别人的庄园? 使用puppeteer实现将htmll转成pdf 内卷时代下的前端技术-使用JavaScript在浏览器中生成PDF文档 【译】将HTML转为PDF的几种实现方案 变形金刚08动画怎么样 变形金刚08动画的问题 变形金刚08动画日语版剧情介绍 高分!换显卡nvidia控制面板被我卸了,重新安装显卡驱动后没了nvidia控... 我的nvidia控制面板被卸载了 怎么找回啊 卸载后 这个画面看着很奇怪_百 ... 李卓彬工作简历 林少明工作简历 广东工业职业技术学院怎么样 郑德涛任职简历 唐新桂个人简历 土地入股的定义 ups快递客服电话24小时 贷款记录在征信保留几年? 安徽徽商城有限公司公司简介 安徽省徽商集团新能源股份有限公司基本情况 安徽省徽商集团有限公司经营理念 2019哈尔滨煤气费怎么有税? 快手删除的作品如何恢复 体育理念体育理念 有关体育的格言和理念 什么是体育理念 万里挑一算彩礼还是见面礼 绿萝扦插多少天后发芽 绿萝扦插多久发芽 扦插绿萝多久发芽 炖牛排骨的做法和配料 网络诈骗定罪标准揭秘 “流水不争先”是什么意思? mc中钻石装备怎么做 为什么我的MC里的钻石块是这样的?我想要那种。是不是版本的问题?如果是... 带“偷儿”的诗句 如何在阿里云服务器上搭建wordpress博客 Wordpress建博客需要买服务器吗 html中get和post的区别和使用 hexo博客相对于wordpress,如果托管到coding是不是... 求一个博客系统源码,UTF-8编码的,网站源码 php中防止SQL注入,该如何解决? 请教C/C++/VC中字符编码转换问题,还有不同进制之... 怎么利用python爬取csdn博客访问量例子 如何从零搭建hexo个人博客网站 怎么在一个apk内打开另一个apk hexo搭建个人博客如何设置自定义的页面为主页 如何把coding上托管的静态博客搬运到服务器上 如何将Hexo Blog同时发布到GitHub跟Coding上 移动哪里可以领免费的流量 移动怎么领取免费流量 移动怎样能领免费的流量 如何领取移动的免费流量 新手求推荐显示器 HDR是什么意思 档案管理有哪些流程? 质量管理体系文件资料管理员的具体工作有哪些? 如何用python制作个人简历 博客和个人网站有什么区别么? 托管在coding上的域名怎么进行ICP备案 工程师Coding的时候听什么音乐? 有没有人能说下,多数据源数据同步哪里行啊? gtx1080ti性能最好的是哪款 2021年显卡排名? 性能最强的GTX1080Ti显卡是哪个 ? 求nvidia显卡性能排名,有哪些比较推荐? 求笔记本显卡排名,有哪些比较推荐? 1080ti显卡 哪个牌子好一点 GTX1080TI显卡什么牌子的好? 求非公版GTX1080ti性能跑分排名 一般吧GTX1080Ti显卡哪个牌子好,比价选购 1080ti哪款显卡好,性价比高 1080ti显卡哪个牌子好 显卡1080ti最顶级了吗 GTX1080Ti和GTX1660Ti选哪个好? GTX1080Ti 显卡的性能和gtx970比,性能高出多少?... gtx1080ti对比rtx20系列哪个显卡?
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com