当前位置:   article > 正文

Python 差分进化算法(DE)_python de算法

python de算法

目录

简介:

1 算法原理:

2 具体流程:

2.1 具体问题

2.2 种群的初始化

2.3 变异

2.4 交叉

2.5 选择

3 总结

4 Pyhton具体代码(DE)


简介:

      差分进化算法(Differential Evolution Algorithm,DE)是一种高效的全局优化算法,由Storn和Price于1995年提出。该算法基于群体智能,通过不断改进目标函数来优化群体中的个体。在差分进化算法中,每个个体代表一个解向量,整个群体则构成了解空间的一个子集。

1 算法原理

       差分进化算法的基本流程包括初始化、变异、交叉和选择操作。首先,算法会随机生成足够多的初始个体,构成初始群体。然后,对于每个个体,根据固定的变异策略生成一个变异个体。接着,将原个体和变异个体进行交叉,得到一个新的个体。最后,将新个体与原个体进行比较,选择适应度更好的个体进入下一代。这个过程不断迭代,直到满足终止条件为止。具体流程如下。

fec4c33a78d94324a28dbc18bd339d04.png

2 具体流程

2.1 具体问题

      目标函数:

 eq?min%5C%2C%20%5C%2C%20%5C%2C%20%5C%2C%20%5C%2C%20%5C%2C%20%5C%2C%20y%3Dcos%28X_%7B_1%7D%29+sin%28X_%7B2%7D%29+%7BX_%7B1%7D%7D%5E%7B2%7D

      约束条件:

eq?%7BX_%7Bj%7D%5E%7BL%7D%7D%3C%7BX_%7Bj%7D%7D%3C%7BX_%7Bj%7D%5E%7BU%7D%7D%2C%20j%3D1%2C2

      eq?%5E%7B_%7B_%7B%7D%5E%7B%7D%7D%5E%7B%7D%7Deq?X_%7Bj%7D%5E%7BL%7D%2CX_%7Bj%7D%5E%7BU%7D分别为第eq?j个基因的上下限。

2.2 种群的初始化

eq?%7BX_%7Bij%7D%7D%3Drandom.uniform%28X_%7Bj%7D%5E%7BL%7D%2C%7BX_%7Bj%7D%5E%7BU%7D%7D%29

      eq?X_%7Bij%7D是种群中第eq?i个个体的第eq?j个基因值,eq?random.uniform%28X_%7Bj%7D%5E%7BL%7D%2C%7BX_%7Bj%7D%5E%7BU%7D%7D%29是在上下限中随机生成一个值。

2.3 变异

      差分进化算法与遗传算法对的最显著区别在于DE的个体变异是通过差分策略实现的如下式所示:

eq?V_%7Bi%7D%28g+1%29%3DX_%7Ba%7D%28g%29+F%5Ccdot%20%28X_%7Bb%7D%28g%29-X_%7Ba%7D%28g%29%29

      其中eq?V_%7Bi%7D%28g+1%29是第eq?g+1次迭代时第eq?i个变异后的个体,eq?X_%7Ba%7D%28g%29%2CX_%7Bb%7D%28g%29%2CX_%7Bc%7D%28g%29是第eq?g次迭代所产生的第eq?a%2Cb%2Cc个个体,eq?F是缩放因子。

2.4 交叉

     让第eq?g次迭代产生的第eq?i个个体eq?X_%7Bi%7D%28g%29,和第eq?g+1次迭代变异产生的第eq?i个个体eq?V_%7Bi%7D%28g+1%29进行交叉操作.

eq?if%20%5C%3B%20%5C%2C%20%5C%2C%20rand%280%2C1%29%3CCR:

eq?U_%7Bij%7D%28g+1%29%3DV_%7Bij%7D%28g+1%29

eq?else:

eq?U_%7Bij%7D%28g+1%29%3DX_%7Bij%7D%28g%29

      eq?CR为交叉概率,eq?U_%7Bij%7D%28g+1%29为第eq?g+1次迭代时交叉所产生的第eq?i个个体的第eq?j个基因。

2.5 选择

      用贪婪算法来选择下一代的种群>

eq?if%5C%2C%20%5C%3A%20%5C%2C%20f%28U_%7Bi%7D%28g+1%29%29%3Cf%28X_%7Bi%7D%28g+1%29%29:

eq?X_%7Bi%7D%28g+1%29%3DU_%7Bi%7D%28g+1%29

eq?else:

eq?X_%7Bi%7D%28g+1%29%3DX_%7Bi%7D%28g%29

3 总结

       差分进化算法以其强大的全局搜索能力、简单易实现的特性、快速的收敛速度以及高鲁棒性在优化问题中表现出色。该算法通过变异、交叉和选择操作在整个搜索空间中寻找最优解,仅需设置少量参数如种群大小、交叉概率和变异因子,便于实际应用中的调整和优化。同时,差分进化算法能够充分利用种群信息,快速收敛至最优解,处理复杂问题时效率较高。此外,该算法对初始种群和参数设置不敏感,性能稳定,且具备较好的抗噪声能力,适用于各种优化场景。

4 Pyhton具体代码(DE)

  1. import math
  2. import random
  3. import numpy as np
  4. import matplotlib.pyplot as plt
  5. class De:
  6. def __init__(self,F,CR):
  7. self.F=F
  8. self.CR=CR
  9. def fitness(self,X):
  10. if self.pdhs(X)>=2:
  11. y = math.cos(X[:, 1]) + math.sin(X[:, 0]) + X[:, 1] ** 2
  12. else:
  13. y=math.cos(X[1]) + math.sin(X[0]) + X[1] ** 2
  14. return y
  15. def mutate(self,X):
  16. P=[]
  17. n,m=np.shape(X)
  18. X=np.array(X)
  19. a,b,c = random.sample(range(0, n), 3)
  20. #随机选择三个种群进行变异操作
  21. for i in range(n):
  22. t=X[a,:]+self.F*(X[b,:]-X[c,:])
  23. P.append(t)
  24. P=np.array(P)
  25. # print(P)
  26. return P
  27. def cross(self,X,P):
  28. NewP=[]
  29. n, m = np.shape(X)
  30. for i in range(n):
  31. temp = []
  32. for j in range(m):
  33. # 随机生成一个0-1之间的小数
  34. c = random.uniform(0, 1)
  35. # 如果c<=cr,则选择H中个体染色体
  36. if (c <= self.CR):
  37. temp.append(X[i,j])
  38. else:
  39. temp.append(P[i,j])
  40. # 将新产生的个个体加入新种群
  41. NewP.append(temp)
  42. return NewP
  43. def selection(self,X,NewP):
  44. Newpopulation = []
  45. NewP=np.array(NewP)
  46. n, m = np.shape(X)
  47. for i in range (n):
  48. if self.fitness(X[i,:])>self.fitness(NewP[i,:]):
  49. t=NewP[i,:].copy()
  50. else:
  51. t=X[i,:].copy()
  52. # print(t)
  53. Newpopulation.append(t)
  54. Newpopulation=np.array(Newpopulation)
  55. return Newpopulation
  56. def bestp(self,Newpopulation):
  57. n, m = np.shape(Newpopulation)
  58. bestpopulation=[]
  59. bestfitness=10000
  60. for i in range(n):
  61. if self.fitness(Newpopulation[i, :]) < bestfitness:
  62. bestpopulation=Newpopulation[i,:].copy()
  63. return bestpopulation,self.fitness(bestpopulation)
  64. def pdhs(self, X):
  65. m = np.shape(X)
  66. # 数组维度至少为2D时返回行数,否则返回错误信息
  67. if X.ndim >= 2:
  68. return m[0]
  69. else:
  70. return 1 # "输入不是二维数组,没有行的概念。"
  71. #种群数量
  72. N=1000
  73. #特征数
  74. M=2
  75. De=De(F=0.8,CR=0.4)
  76. #种群的生成
  77. population = []
  78. for i in range(N):
  79. chromosome = [] # 每个个体的染色体
  80. for j in range(M):
  81. chromosome.append(random.uniform(-2, 2)) # 自变量的范围是[-4,4]
  82. population.append(chromosome)
  83. #迭代次数
  84. population=np.array(population)
  85. iters=100
  86. #记录每次迭代的最优种群
  87. besthistory=[]
  88. iterss=[]
  89. #种群更新全过程
  90. for i in range(iters):
  91. #变异
  92. P=De.mutate(population)
  93. #交叉
  94. NewP=De.cross(population,P)
  95. #选择产生的下一代种群
  96. population=De.selection(population,NewP)
  97. bestpopulation,bestfitness=De.bestp(population)
  98. besthistory.append(bestfitness)
  99. iterss.append(i)
  100. print("第{}次迭代,最优种群为:{},最优适应度:{}".format(i+1,bestpopulation,bestfitness))
  101. #迭代图像绘制
  102. plt.rcParams["font.sans-serif"] = "SimHei"#汉字乱码的解决方法
  103. plt.plot(iterss,besthistory,color='g')
  104. #坐标题目绘制
  105. plt.xlabel("迭代次数")
  106. plt.ylabel("每次迭代的最优适应度")
  107. plt.show()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/630191
推荐阅读
相关标签
  

闽ICP备14008679号