请选择 进入手机版 | 继续访问电脑版

Hello Mat

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 468|回复: 0

GA遗传算法的函数寻优--Python

[复制链接]

735

主题

867

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
29731
发表于 2019-3-27 23:45:17 | 显示全部楼层 |阅读模式
GA遗传算法的函数寻优--Python:
  1. from PIL import Image
  2. from pylab import *
  3. import string
  4. import matplotlib.pyplot as plt
  5. import numpy as np
  6. from numpy import random
  7. import fun

  8. #print random.random()
  9. #
  10. popmax = np.array( [1,1] )
  11. popmin = np.array( [-1,-1] )
  12. pc = 0.75
  13. pm = 0.05
  14. nVar = 2
  15. maxg = 30
  16. sizepop = 30
  17. #Intial
  18. pop = [[0 for x in range(nVar)] for y in range(sizepop)]
  19. gbest = [[0 for x in range(nVar)] for y in range(sizepop)]
  20. fitness = [0 for x in range(sizepop)]
  21. fitnessgbest =[0 for x in range(sizepop)]
  22. zbest = [0 for x in range(nVar)]

  23. #init pop
  24. for i in range(sizepop):
  25.     pop[i] = fun.code(popmin,popmax);
  26.     fitness[i] =fun.funfitness(pop[i][0],pop[i][1]);
  27.     gbest[i][0] = pop[i][0]
  28.     gbest[i][1] = pop[i][1]
  29.     fitnessgbest[i] = fitness[i]
  30.     print(fitness[i])
  31. fitnesszbest =min(fitness)
  32. index = fun.minIndex(fitness,fitnesszbest)
  33. zbest[0] = pop[index][0]
  34. zbest[1] = pop[index][1]
  35. print (zbest)
  36. # plot (range(sizepop),fitness,'r*-')
  37. # plot(fitness,'r*-')
  38. # show

  39. fitness_iter = [0 for x in range(maxg)]
  40. # main loop
  41. for i in range(maxg):
  42.     # update position
  43.     pop = fun.select(sizepop,pop,fitness,popmin,popmax)
  44.    
  45.     pop = fun.cross(sizepop,pc,pop,popmin,popmax)

  46.     pop = fun.mut(sizepop,pm,pop,popmin,popmax)
  47.     for j in range(sizepop):
  48.         fitness[j] = fun.funfitness(pop[j][0],pop[j][1])
  49.         if (fitness[j] < fitnessgbest[j]):
  50.             fitnessgbest[j] = fitness[j]
  51.             gbest[j][0] = pop[j][0]
  52.             gbest[j][1] = pop[j][1]
  53.         if (fitness[j] < fitnesszbest):
  54.             fitnesszbest = fitness[j]
  55.             zbest[0] = pop[j][0];
  56.             zbest[1] = pop[j][1];
  57.     fitness_iter[i] = fitnesszbest

  58. print ("最优解:")
  59. print (zbest)
  60. plt.plot(fitness_iter,'ro-')
  61. plt.show()
复制代码

相应的fun.py函数如下:包含选择、交叉、变异:

  1. import numpy as np
  2. from numpy import random
  3. import math

  4. def funfitness(x1,x2):
  5.     y = (x1-0.5)**2+(x2-0.6)**2;
  6.     return y;

  7. def minIndex(fitness, fitnesszbest):
  8.     for i in range(len(fitness)):
  9.         if(fitness[i] == fitnesszbest):
  10.             break;
  11.     return i;

  12. def select(sizepop,pop,fitness,popmin,popmax):
  13.     #fitness_d =sorted(fitness,reverse=True);
  14.     fitness_Index = np.argsort( -np.array( fitness) )         
  15.     c = np.int32(sizepop/4);
  16.     for i in range(c):
  17.         pop[fitness_Index[i]][0] = popmin[0] + (popmax[0]-popmin[0])*random.random();
  18.         pop[fitness_Index[i]][1] = popmin[1] + (popmax[1]-popmin[1])*random.random();
  19.     return pop

  20. def mut(sizepop,pm,pop,popmin,popmax):
  21.     for i in range(sizepop*2):
  22.         if random.random() > pm:
  23.             a = 0;
  24.             while a == 0:
  25.                 a = np.int32( random.random()*sizepop );
  26.             b=[0,0]
  27.             b[0] = pop[a][0]
  28.             b[1] = pop[a][1]
  29.             if random.random() > 0.5:
  30.                 pop[a][0] = pop[a][0] + (popmax[0]-pop[a][0])*random.random();
  31.                 pop[a][1] = pop[a][1] + (popmax[1]-pop[a][1])*random.random();
  32.             else:
  33.                 pop[a][0] = pop[a][0] + (popmin[0]-pop[a][0])*random.random();
  34.                 pop[a][1] = pop[a][1] + (popmin[1]-pop[a][1])*random.random();

  35.             if pop[a][0] > popmax[0] or pop[a][0] < popmin[0]:
  36.                 pop[a][0] =  b[0];
  37.             if pop[a][1] > popmax[1] or pop[a][1] < popmin[1]:
  38.                 pop[a][1] =  b[1];
  39.     return pop

  40. def cross(sizepop,pc,pop,popmin,popmax):
  41.     for j in range(sizepop*2):
  42.         if random.random() > pc:
  43.             a = np.array( [0,0] );
  44.             while np.min(a.tolist()) == 0:
  45.                 a = np.int32( random.random([1,2])*sizepop );
  46.             pop1 = [0 for x in range(2)]
  47.             pop2 = [0 for x in range(2)]
  48.             pop1 = pop[a[0][0]]
  49.             pop2 = pop[a[0][1]]
  50.             k = random.random()
  51.             pop[a[0][0]] = (1-k) * np.array( pop1 ) + k * np.array( pop2 );
  52.             pop[a[0][1]] = (1-k)*  np.array( pop2 ) + k * np.array( pop1 );
  53.             if pop[a[0][0]][0] > popmax[0] or pop[a[0][0]][0] < popmin[0]:
  54.                 pop[a[0][0]] =  pop1;
  55.             if pop[a[0][1]][1] > popmax[1] or pop[a[0][1]][1] < popmin[1]:
  56.                 pop[a[0][1]] =  pop2;         
  57.     return pop

  58. def code(popmin,popmax):
  59.     flag = 1
  60.     pop = [0,0]
  61.     while flag ==1:
  62.         pop[0] = popmin[0] + (popmax[0]-popmin[0])*random.random();
  63.         pop[1] = popmin[1] + (popmax[1]-popmin[1])*random.random();
  64.         flag = test(pop,popmin,popmax)
  65.     return pop

  66. def test(pop,popmin,popmax):
  67.     if pop[0] < popmin[0] or pop[0] > popmax[0] or pop[1] < popmin[1] or pop[1] > popmax[1]:
  68.         flag = 1
  69.     else:
  70.         flag = 0
  71.     return flag
复制代码





算法QQ  3283892722
群智能算法链接http://halcom.cn/forum.php?mod=forumdisplay&fid=73
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Python|Opencv|MATLAB|Halcom.cn  

GMT+8, 2019-8-26 10:10 , Processed in 0.103582 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表