python实现简单遗传算法


Posted in Python onSeptember 18, 2020

ObjFunction.py

import math


def GrieFunc(vardim, x, bound):
 """
 Griewangk function
 """
 s1 = 0.
 s2 = 1.
 for i in range(1, vardim + 1):
  s1 = s1 + x[i - 1] ** 2
  s2 = s2 * math.cos(x[i - 1] / math.sqrt(i))
 y = (1. / 4000.) * s1 - s2 + 1
 y = 1. / (1. + y)
 return y


def RastFunc(vardim, x, bound):
 """
 Rastrigin function
 """
 s = 10 * 25
 for i in range(1, vardim + 1):
  s = s + x[i - 1] ** 2 - 10 * math.cos(2 * math.pi * x[i - 1])
 return s

GAIndividual.py

import numpy as np
import ObjFunction


class GAIndividual:

 '''
 individual of genetic algorithm
 '''

 def __init__(self, vardim, bound):
  '''
  vardim: dimension of variables
  bound: boundaries of variables
  '''
  self.vardim = vardim
  self.bound = bound
  self.fitness = 0.

 def generate(self):
  '''
  generate a random chromsome for genetic algorithm
  '''
  len = self.vardim
  rnd = np.random.random(size=len)
  self.chrom = np.zeros(len)
  for i in xrange(0, len):
   self.chrom[i] = self.bound[0, i] + \
    (self.bound[1, i] - self.bound[0, i]) * rnd[i]

 def calculateFitness(self):
  '''
  calculate the fitness of the chromsome
  '''
  self.fitness = ObjFunction.GrieFunc(
   self.vardim, self.chrom, self.bound)

GeneticAlgorithm.py

import numpy as np
from GAIndividual import GAIndividual
import random
import copy
import matplotlib.pyplot as plt


class GeneticAlgorithm:

 '''
 The class for genetic algorithm
 '''

 def __init__(self, sizepop, vardim, bound, MAXGEN, params):
  '''
  sizepop: population sizepop
  vardim: dimension of variables
  bound: boundaries of variables
  MAXGEN: termination condition
  param: algorithm required parameters, it is a list which is consisting of crossover rate, mutation rate, alpha
  '''
  self.sizepop = sizepop
  self.MAXGEN = MAXGEN
  self.vardim = vardim
  self.bound = bound
  self.population = []
  self.fitness = np.zeros((self.sizepop, 1))
  self.trace = np.zeros((self.MAXGEN, 2))
  self.params = params

 def initialize(self):
  '''
  initialize the population
  '''
  for i in xrange(0, self.sizepop):
   ind = GAIndividual(self.vardim, self.bound)
   ind.generate()
   self.population.append(ind)

 def evaluate(self):
  '''
  evaluation of the population fitnesses
  '''
  for i in xrange(0, self.sizepop):
   self.population[i].calculateFitness()
   self.fitness[i] = self.population[i].fitness

 def solve(self):
  '''
  evolution process of genetic algorithm
  '''
  self.t = 0
  self.initialize()
  self.evaluate()
  best = np.max(self.fitness)
  bestIndex = np.argmax(self.fitness)
  self.best = copy.deepcopy(self.population[bestIndex])
  self.avefitness = np.mean(self.fitness)
  self.trace[self.t, 0] = (1 - self.best.fitness) / self.best.fitness
  self.trace[self.t, 1] = (1 - self.avefitness) / self.avefitness
  print("Generation %d: optimal function value is: %f; average function value is %f" % (
   self.t, self.trace[self.t, 0], self.trace[self.t, 1]))
  while (self.t < self.MAXGEN - 1):
   self.t += 1
   self.selectionOperation()
   self.crossoverOperation()
   self.mutationOperation()
   self.evaluate()
   best = np.max(self.fitness)
   bestIndex = np.argmax(self.fitness)
   if best > self.best.fitness:
    self.best = copy.deepcopy(self.population[bestIndex])
   self.avefitness = np.mean(self.fitness)
   self.trace[self.t, 0] = (1 - self.best.fitness) / self.best.fitness
   self.trace[self.t, 1] = (1 - self.avefitness) / self.avefitness
   print("Generation %d: optimal function value is: %f; average function value is %f" % (
    self.t, self.trace[self.t, 0], self.trace[self.t, 1]))

  print("Optimal function value is: %f; " %
    self.trace[self.t, 0])
  print "Optimal solution is:"
  print self.best.chrom
  self.printResult()

 def selectionOperation(self):
  '''
  selection operation for Genetic Algorithm
  '''
  newpop = []
  totalFitness = np.sum(self.fitness)
  accuFitness = np.zeros((self.sizepop, 1))

  sum1 = 0.
  for i in xrange(0, self.sizepop):
   accuFitness[i] = sum1 + self.fitness[i] / totalFitness
   sum1 = accuFitness[i]

  for i in xrange(0, self.sizepop):
   r = random.random()
   idx = 0
   for j in xrange(0, self.sizepop - 1):
    if j == 0 and r < accuFitness[j]:
     idx = 0
     break
    elif r >= accuFitness[j] and r < accuFitness[j + 1]:
     idx = j + 1
     break
   newpop.append(self.population[idx])
  self.population = newpop

 def crossoverOperation(self):
  '''
  crossover operation for genetic algorithm
  '''
  newpop = []
  for i in xrange(0, self.sizepop, 2):
   idx1 = random.randint(0, self.sizepop - 1)
   idx2 = random.randint(0, self.sizepop - 1)
   while idx2 == idx1:
    idx2 = random.randint(0, self.sizepop - 1)
   newpop.append(copy.deepcopy(self.population[idx1]))
   newpop.append(copy.deepcopy(self.population[idx2]))
   r = random.random()
   if r < self.params[0]:
    crossPos = random.randint(1, self.vardim - 1)
    for j in xrange(crossPos, self.vardim):
     newpop[i].chrom[j] = newpop[i].chrom[
      j] * self.params[2] + (1 - self.params[2]) * newpop[i + 1].chrom[j]
     newpop[i + 1].chrom[j] = newpop[i + 1].chrom[j] * self.params[2] + \
      (1 - self.params[2]) * newpop[i].chrom[j]
  self.population = newpop

 def mutationOperation(self):
  '''
  mutation operation for genetic algorithm
  '''
  newpop = []
  for i in xrange(0, self.sizepop):
   newpop.append(copy.deepcopy(self.population[i]))
   r = random.random()
   if r < self.params[1]:
    mutatePos = random.randint(0, self.vardim - 1)
    theta = random.random()
    if theta > 0.5:
     newpop[i].chrom[mutatePos] = newpop[i].chrom[
      mutatePos] - (newpop[i].chrom[mutatePos] - self.bound[0, mutatePos]) * (1 - random.random() ** (1 - self.t / self.MAXGEN))
    else:
     newpop[i].chrom[mutatePos] = newpop[i].chrom[
      mutatePos] + (self.bound[1, mutatePos] - newpop[i].chrom[mutatePos]) * (1 - random.random() ** (1 - self.t / self.MAXGEN))
  self.population = newpop

 def printResult(self):
  '''
  plot the result of the genetic algorithm
  '''
  x = np.arange(0, self.MAXGEN)
  y1 = self.trace[:, 0]
  y2 = self.trace[:, 1]
  plt.plot(x, y1, 'r', label='optimal value')
  plt.plot(x, y2, 'g', label='average value')
  plt.xlabel("Iteration")
  plt.ylabel("function value")
  plt.title("Genetic algorithm for function optimization")
  plt.legend()
  plt.show()

运行程序:

if __name__ == "__main__":
 
  bound = np.tile([[-600], [600]], 25)
  ga = GA(60, 25, bound, 1000, [0.9, 0.1, 0.5])
  ga.solve()

作者:Alex Yu
出处:http://www.cnblogs.com/biaoyu/

以上就是python实现简单遗传算法的详细内容,更多关于python 遗传算法的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
利用Python的Django框架生成PDF文件的教程
Jul 22 Python
Python 使用os.remove删除文件夹时报错的解决方法
Jan 13 Python
python处理xml文件的方法小结
May 02 Python
Apache如何部署django项目
May 21 Python
python 简单备份文件脚本v1.0的实例
Nov 06 Python
Python实现识别手写数字大纲
Jan 29 Python
python2.7+selenium2实现淘宝滑块自动认证功能
Feb 24 Python
python使用插值法画出平滑曲线
Dec 15 Python
Python利用字典破解WIFI密码的方法
Feb 27 Python
Python的垃圾回收机制详解
Aug 28 Python
Python list与NumPy array 区分详解
Nov 06 Python
重构Python代码的六个实例
Nov 25 Python
详解python 支持向量机(SVM)算法
Sep 18 #Python
python利用线程实现多任务
Sep 18 #Python
Pycharm的Available Packages为空的解决方法
Sep 18 #Python
Pycharm Available Package无法显示/安装包的问题Error Loading Package List解决
Sep 18 #Python
pycharm 代码自动补全的实现方法(图文)
Sep 18 #Python
PyCharm上安装Package的实现(以pandas为例)
Sep 18 #Python
Pycharm自带Git实现版本管理的方法步骤
Sep 18 #Python
You might like
人尽可用的Windows技巧小贴士之下篇
2007/03/22 PHP
Ajax+Jpgraph实现的动态折线图功能示例
2019/02/11 PHP
javascript实现的像java、c#之类的sleep暂停的函数代码
2010/03/04 Javascript
jQuery 创建Dom元素
2010/05/07 Javascript
JavaScript在XHTML中的用法详解
2013/04/11 Javascript
同时使用n个window onload加载实例介绍
2013/04/25 Javascript
iframe子页面获取父页面元素的方法
2013/11/05 Javascript
详解JavaScript ES6中的Generator
2015/07/28 Javascript
javascript实现tab切换的四种方法
2015/11/05 Javascript
详解Document.Cookie
2015/12/25 Javascript
理解javascript中Map代替循环
2016/02/26 Javascript
Ext JS框架中日期函数的用法及日期选择控件的实现
2016/05/21 Javascript
Node.js的环境安装配置(使用nvm方式)
2016/10/11 Javascript
原生js实现查询天气小应用
2016/12/09 Javascript
Reactjs实现通用分页组件的实例代码
2017/01/19 Javascript
纯JS单页面赛车游戏制作代码分享
2017/03/03 Javascript
Vue实例中生命周期created和mounted的区别详解
2017/08/25 Javascript
vscode 开发Vue项目的方法步骤
2018/11/25 Javascript
微信小程序实现展示评分结果功能
2019/02/15 Javascript
vue treeselect获取当前选中项的label实例
2020/08/31 Javascript
Python BeautifulSoup中文乱码问题的2种解决方法
2014/04/22 Python
Python 中 Meta Classes详解
2016/02/13 Python
Python使用pylab库实现画线功能的方法详解
2017/06/08 Python
python 平衡二叉树实现代码示例
2018/07/07 Python
对python For 循环的三种遍历方式解析
2019/02/01 Python
Python实现银行账户资金交易管理系统
2020/01/03 Python
使用keras实现非线性回归(两种加激活函数的方式)
2020/07/05 Python
CSS3 animation实现逐帧动画效果
2016/06/02 HTML / CSS
html5的自定义data-*属性与jquery的data()方法的使用
2014/07/02 HTML / CSS
英国赛车、汽车改装和摩托车零件购物网站:Demon Tweeks
2018/10/29 全球购物
印刷工程专业应届生求职信
2013/09/29 职场文书
2014最新毕业证代领委托书
2014/09/26 职场文书
2014党员整改措施思想汇报
2014/10/07 职场文书
车间主任岗位职责
2015/02/03 职场文书
使用Selenium实现微博爬虫(预登录、展开全文、翻页)
2021/04/13 Python
SpringBoot整合MongoDB的实现步骤
2021/06/23 MongoDB