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下10个简单实例代码
Nov 15 Python
python将每个单词按空格分开并保存到文件中
Mar 19 Python
python模拟表单提交登录图书馆
Apr 27 Python
深入分析python中整型不会溢出问题
Jun 18 Python
Python3实现转换Image图片格式
Jun 21 Python
Python 从列表中取值和取索引的方法
Dec 25 Python
Python玩转PDF的各种骚操作
May 06 Python
pycharm重命名文件的方法步骤
Jul 29 Python
python使用正则表达式(Regular Expression)方法超详细
Dec 30 Python
解决Python图形界面中设置尺寸的问题
Mar 05 Python
Pycharm 跳转回之前所在页面的操作
Feb 05 Python
python模块与C和C++动态库相互调用实现过程示例
Nov 02 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学习笔记之三 数据库基本操作
2011/01/17 PHP
PHP将进程作为守护进程的方法
2015/03/19 PHP
Laravel获取当前请求的控制器和方法以及中间件的例子
2019/10/11 PHP
PHP获取真实IP及IP模拟方法解析
2020/11/24 PHP
基于jquery+thickbox仿校内登录注册框
2010/06/07 Javascript
从零开始学习jQuery (二) 万能的选择器
2010/10/01 Javascript
javascript实现日历控件(年月日关闭按钮)
2012/12/12 Javascript
javascript 兼容各个浏览器的事件
2015/02/04 Javascript
使用JavaScript开发IE浏览器本地插件实例
2015/02/18 Javascript
javascript实现淡蓝色的鼠标拖动选择框实例
2015/05/09 Javascript
IE9+已经不对document.createElement向下兼容的解决方法
2015/09/14 Javascript
提升jQuery的性能需要做好七件事
2016/01/11 Javascript
javascript轻量级库createjs使用Easel实现拖拽效果
2016/02/19 Javascript
JS中正则表达式只有3种匹配模式(没有单行模式)详解
2016/07/28 Javascript
Angular工具方法学习
2016/12/26 Javascript
D3.js中强制异步文件读取同步的几种方法
2017/02/06 Javascript
Javascript中字符串相关常用的使用方法总结
2017/03/13 Javascript
Vue2.X 通过AJAX动态更新数据
2018/07/17 Javascript
jQuery实现每日秒杀商品倒计时功能
2019/09/06 jQuery
el-form 多层级表单的实现示例
2020/09/10 Javascript
两个命令把 Vim 打造成 Python IDE的方法
2016/03/20 Python
python3第三方爬虫库BeautifulSoup4安装教程
2018/06/19 Python
Python如何发送与接收大型数组
2020/08/07 Python
Ubuntu20下的Django安装的方法步骤
2021/01/24 Python
python opencv实现图像配准与比较
2021/02/09 Python
PHP面试题集
2016/12/18 面试题
门卫人员岗位职责
2013/12/24 职场文书
硕士生工作推荐信
2014/03/07 职场文书
小学家长评语大全
2014/04/16 职场文书
公司口号大全
2014/06/11 职场文书
少先大队干部竞选稿
2015/11/20 职场文书
个人的事迹材料怎么写
2019/04/24 职场文书
2019学校请假条格式及范文
2019/06/25 职场文书
MATLAB 全景图切割及盒图显示的实现步骤
2021/05/14 Python
《极主夫道》真人电影正式预告 定档6月3日上映
2022/04/05 日漫
Java死锁的排查
2022/05/11 Java/Android