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基础教程之实现石头剪刀布游戏示例
Feb 11 Python
Python入门篇之编程习惯与特点
Oct 17 Python
python获取本地计算机名字的方法
Apr 29 Python
Python实现基本线性数据结构
Aug 22 Python
详解Python多线程Selenium跨浏览器测试
Apr 01 Python
python实现推箱子游戏
Mar 25 Python
python实现QQ邮箱/163邮箱的邮件发送
Jan 22 Python
Python实现查找数组中任意第k大的数字算法示例
Jan 23 Python
python Qt5实现窗体跟踪鼠标移动
Dec 13 Python
Python %r和%s区别代码实例解析
Apr 03 Python
python suds访问webservice服务实现
Jun 26 Python
15个Pythonic的代码示例(值得收藏)
Oct 29 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
《Re:从零开始的异世界生活》剧情体验,手游新作定名
2020/04/09 日漫
最新用php获取谷歌PR值算法,附上php查询PR值代码示例
2011/12/25 PHP
PHP中$_SERVER的详细参数与说明介绍
2013/10/26 PHP
php自定义错误处理用法实例
2015/03/20 PHP
PHP中使用array函数新建一个数组
2015/11/19 PHP
javascript入门·动态的时钟,显示完整的一些方法,新年倒计时
2007/10/01 Javascript
jquery1.9 下检测浏览器类型和版本的方法
2013/12/26 Javascript
jQuery实现的Div窗口震动特效
2014/06/09 Javascript
jQuery对val和atrr(&quot;value&quot;)赋值的区别介绍
2014/09/26 Javascript
ECMAScript 5中的属性描述符详解
2015/03/02 Javascript
JavaScript Function函数类型介绍
2015/04/08 Javascript
AngularJS实践之使用NgModelController进行数据绑定
2016/10/08 Javascript
JS表单数据验证的正则表达式(常用)
2017/02/18 Javascript
BootStrap Table实现server分页序号连续显示功能(当前页从上一页的结束序号开始)
2017/09/12 Javascript
对VUE中的对象添加属性
2018/09/18 Javascript
puppeteer库入门初探
2019/01/09 Javascript
vue组件开发props验证的实现
2019/02/12 Javascript
移动端 Vue+Vant 的Uploader 实现上传、压缩、旋转图片功能
2019/06/10 Javascript
python使用内存zipfile对象在内存中打包文件示例
2014/04/30 Python
Python和C/C++交互的几种方法总结
2017/05/11 Python
Django中ORM表的创建和增删改查方法示例
2017/11/15 Python
解决Python安装后pip不能用的问题
2018/06/12 Python
Python设计模式之备忘录模式原理与用法详解
2019/01/15 Python
在python中利用dict转json按输入顺序输出内容方式
2020/02/27 Python
python和node.js生成当前时间戳的示例
2020/09/29 Python
python关于倒排列的知识点总结
2020/10/13 Python
AmazeUi Tree(树形结构) 应用小结
2020/08/17 HTML / CSS
Qoo10台湾站:亚洲领先的在线市场
2018/05/15 全球购物
技术总监管理岗位职责
2014/03/09 职场文书
基本公共卫生服务健康教育工作方案
2014/05/22 职场文书
工商管理专业毕业生求职信
2014/05/26 职场文书
旅游与环境专业求职信
2014/06/05 职场文书
分公司总经理岗位职责
2014/07/30 职场文书
老兵退伍标语
2014/10/07 职场文书
2014年办公室人员工作总结
2014/12/09 职场文书
2016机关干部作风建设心得体会
2016/01/21 职场文书