写在前面

之前的文章中已经讲过了遗传算法的基本流程,并且用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里面有八个函数,主要包含了作用于种群或者染色体操作的函数,分别为:

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

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

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

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

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

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

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

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

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

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

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])

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

遗传算法python与matlab_遗传算法之Python实现代码相关推荐

  1. 遗传算法求最短路径(旅行商问题)python实现

    问题描述 一个商品推销员要去若干个城市推销商品,该推销员从一个城市出发,需要经过所有城市后,回到出发地.应如何选择行进路线,以使总的行程最短. 对于n个城市的TSP,本文利用python分别实现遗传算 ...

  2. 遗传算法之扇贝的进化(python代码实现)

    遗传算法之扇贝的进化 目录 背景故事 进化论 遗传算法 遗传算法过程 代码实现 完整代码 1. 背景故事 ​扇贝的进化讲述了一个有趣的故事: ​从前在海岸边有一群扇贝在生活繁衍.它们自然是衣食不愁,连 ...

  3. python遗传算法_带有Python的AI –遗传算法

    python遗传算法 带有Python的AI –遗传算法 (AI with Python – Genetic Algorithms) This chapter discusses Genetic Al ...

  4. 基于Python实现的遗传算法求最值问题

    遗传算法求最值问题 目录 人工智能第三次实验报告 1 遗传算法求最值问题 1 一 .遗传算法 1 1.1 遗传算法简介 1 1.2 遗传算法基本要素 2 4. 设定遗传操作: 2 1.3 遗传算法一般 ...

  5. python 对比matlab_全面对比 MATLAB、Julia、Python,谁在科学计算中更胜一筹?

    原标题:全面对比 MATLAB.Julia.Python,谁在科学计算中更胜一筹? 数百种编程语言,各有优劣,各自也都有自己最为适用的场景.那么就科学计算领域而言,主流的 MATLAB.Julia.P ...

  6. python实训项目-实验楼Python项目

    整理几个实验楼小项目,有免费的也有会员的,会员的可以参考他们的实验报告. 直接去实验楼这个网站,粘贴上就能搜到. 免费专区: Kmeans聚类算法评估足球比赛 Python实现3D建模工具 K-近邻算 ...

  7. python 个人项目_80个Python练手项目列表,学完立马成大神 牛逼了

    Python 新手入门课 Python3 简明教程 Python版设计模式实践 Python Flask Web框架 Python3 基于 Flask 框架搭建个人博客 Flask 实现简单聊天室 D ...

  8. 用python实行财务报告分析,用python做财务数据分析

    Python是否有用于财务报表分析的库 谷歌人工智能写作项目:小发猫 python如何做数据分析 用Python做数据分析,大致流程如下:1.数据获取可以通过SQL查询语句来获取数据库中想要数据typ ...

  9. python ai教程_带有Python的AI教程

    python ai教程 带有Python的AI教程 (AI with Python Tutorial) PDF Version Quick Guide Resources Job Search Dis ...

  10. python创建类的实例方法-Python中动态创建类实例的方法

    简介 在Java中我们可以通过反射来根据类名创建类实例,那么在Python我们怎么实现类似功能呢? 其实在Python有一个builtin函数import,我们可以使用这个函数来在运行时动态加载一些模 ...

最新文章

  1. 【javascript】深入理解对象
  2. 通过WiFi对STC单片机程序下载和调试
  3. 从Java到Go面向对象--类的定义和实例化对象
  4. 小程序、vue 新闻上下轮播
  5. ora-07445 oracle 9,Oracle ORA-07445 : 出现异常错误: 核心转储(一)
  6. Verilog实现2分频实例
  7. css修改layui的下拉框样式 js_layui,经典模块化前端UI框架,前端菜鸟带你初识栅格。...
  8. python怎么打开excel文件并处理_Python利用openpyxl处理Excel文件(Excel文件基本操作)...
  9. Linux 任务计划、周期性任务计划
  10. 程序员实用算法 源码_程序员必须知道的十大基础实用算法综述
  11. [zz]muduo源码阅读之Thread和ThreadPool
  12. 如何写一份成功的商业计划书
  13. python参数类型为uint8_Python 改变数组类型为uint8的实现
  14. 破圈、增长、被加码,集合店能创造美妆行业新风口?
  15. 树型结构的四种建模方法
  16. UniswapV2Library.sol
  17. TensorFlow在win10上安装--精简教程
  18. C#之Base64编码解码
  19. tomcat8.5服务开启zabbix远程监控配置修改
  20. ubuntu下播放wav视频和mp3音频文件

热门文章

  1. 最新联发科Helio X30(mt6799)芯片处理器详细资料(datasheet)
  2. 补点C#基础_022_json校验和json在线编辑器-bejson
  3. Unity发布windows程序,Fullscreen Mode设置为Windowed,可运行总是全屏
  4. 工作学习中word及电脑常备小知识(C盘清理、电脑上微信记录清理)
  5. NLP是什么,百度的NLP技术有有哪些?
  6. centos7 | All matches were filtered out by modular filtering for argument: mysql-community-server
  7. CSU 2166: 卖萌表情(2018湖南省赛)
  8. 【win10】安装wsl,报错WslRegisterDistribution failed with error: 0x8007019e
  9. 广度优先搜索生成树怎么画_无向图的深度优先生成树和广度优先生成树
  10. 宜宾学院谢江宜计算机基础题,宜宾学院2011-2012学年度下期期末公共课考试安排表.xls...