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读写Excel文件的实例
Nov 01 Python
Python简单进程锁代码实例
Apr 27 Python
Python实现遍历数据库并获取key的值
May 17 Python
Python中几种导入模块的方式总结
Apr 27 Python
python获取多线程及子线程的返回值
Nov 15 Python
python matplotlib坐标轴设置的方法
Dec 05 Python
python的pytest框架之命令行参数详解(下)
Jun 27 Python
Python编程快速上手——强口令检测算法案例分析
Feb 29 Python
python中的yield from语法快速学习
Nov 06 Python
Pytorch中TensorBoard及torchsummary的使用详解
May 12 Python
浅谈pytorch中的dropout的概率p
May 27 Python
python垃圾回收机制原理分析
Apr 13 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
php通过数组实现多条件查询实现方法(字符串分割)
2014/05/06 PHP
PHP数组遍历知识汇总(包含遍历方法、数组指针操作函数、数组遍历测速)
2014/07/05 PHP
如何使用Gitblog和Markdown建自己的博客
2015/07/31 PHP
ThinkPHP中数据操作案例分析
2015/09/27 PHP
PHP如何将XML转成数组
2016/04/04 PHP
PHP PDO和消息队列的个人理解与应用实例分析
2019/11/25 PHP
javascript四舍五入函数代码分享(保留后几位)
2013/12/10 Javascript
jQuery过滤特殊字符及JS字符串转为数字
2016/05/26 Javascript
jQuery Mobile 触摸事件实例
2016/06/04 Javascript
实例讲解JavaScript中的this指向错误解决方法
2016/06/13 Javascript
全面了解JavaScript的数据类型转换
2016/07/01 Javascript
js继承实现方法详解
2016/12/16 Javascript
深入理解Webpack 中路径的配置
2017/06/17 Javascript
使用JavaScript实现一个小程序之99乘法表
2017/09/21 Javascript
Angular移动端页面input无法输入的解决方法
2017/11/14 Javascript
angularJS开发注意事项
2018/05/26 Javascript
浅谈vue项目打包优化策略
2018/09/29 Javascript
详释JavaScript执行环境与执行栈
2019/04/02 Javascript
vuex 中插件的编写案例解析
2019/06/10 Javascript
Python读取ini文件、操作mysql、发送邮件实例
2015/01/01 Python
仅利用30行Python代码来展示X算法
2015/04/01 Python
python操作字典类型的常用方法(推荐)
2016/05/16 Python
python实现树形打印目录结构
2018/03/29 Python
python实现对输入的密文加密
2019/03/20 Python
Django 批量插入数据的实现方法
2020/01/12 Python
python上下文管理器异常问题解决方法
2021/02/07 Python
在线课程:Skillshare
2019/04/02 全球购物
心理学专业毕业生推荐信范文
2013/11/21 职场文书
应届毕业生个人求职自荐信
2014/01/06 职场文书
联欢晚会主持词
2014/03/25 职场文书
2014离婚协议书范文(3篇)
2014/11/29 职场文书
2014年仓库保管员工作总结
2014/12/03 职场文书
JavaScript使用canvas绘制坐标和线
2021/04/28 Javascript
vscode中使用npm安装babel的方法
2021/08/02 Javascript
Mysql排序的特性详情
2021/11/01 MySQL
索尼ICF-36收音机评测
2022/04/30 无线电