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)

import math
import random
import numpy as np
import matplotlib.pyplot as plt
class De:
    def __init__(self,F,CR):
        self.F=F
        self.CR=CR


    def fitness(self,X):
        if self.pdhs(X)>=2:
            y = math.cos(X[:, 1]) + math.sin(X[:, 0]) + X[:, 1] ** 2
        else:
            y=math.cos(X[1]) + math.sin(X[0]) + X[1] ** 2
        return y
    def mutate(self,X):
        P=[]
        n,m=np.shape(X)
        X=np.array(X)
        a,b,c = random.sample(range(0, n), 3)
        #随机选择三个种群进行变异操作
        for i in range(n):
            t=X[a,:]+self.F*(X[b,:]-X[c,:])
            P.append(t)
        P=np.array(P)
        # print(P)
        return P
    def cross(self,X,P):
        NewP=[]
        n, m = np.shape(X)
        for i in range(n):
            temp = []
            for j in range(m):
                # 随机生成一个0-1之间的小数
                c = random.uniform(0, 1)
                # 如果c<=cr,则选择H中个体染色体
                if (c <= self.CR):
                    temp.append(X[i,j])
                else:
                    temp.append(P[i,j])
            # 将新产生的个个体加入新种群
            NewP.append(temp)
        return NewP

    def selection(self,X,NewP):
        Newpopulation = []
        NewP=np.array(NewP)
        n, m = np.shape(X)
        for i in range (n):
            if self.fitness(X[i,:])>self.fitness(NewP[i,:]):
                t=NewP[i,:].copy()
            else:
                t=X[i,:].copy()
            # print(t)
            Newpopulation.append(t)
        Newpopulation=np.array(Newpopulation)
        return Newpopulation
    def bestp(self,Newpopulation):
        n, m = np.shape(Newpopulation)
        bestpopulation=[]
        bestfitness=10000
        for i in range(n):
            if self.fitness(Newpopulation[i, :]) < bestfitness:
                bestpopulation=Newpopulation[i,:].copy()
        return bestpopulation,self.fitness(bestpopulation)

    def pdhs(self, X):
        m = np.shape(X)
        # 数组维度至少为2D时返回行数,否则返回错误信息
        if X.ndim >= 2:
            return m[0]
        else:
            return 1  # "输入不是二维数组,没有行的概念。"


#种群数量
N=1000
#特征数
M=2
De=De(F=0.8,CR=0.4)
#种群的生成
population = []
for i in range(N):
    chromosome = []  # 每个个体的染色体
    for j in range(M):
        chromosome.append(random.uniform(-2, 2))  # 自变量的范围是[-4,4]
    population.append(chromosome)
#迭代次数
population=np.array(population)
iters=100
#记录每次迭代的最优种群
besthistory=[]
iterss=[]
#种群更新全过程
for i in range(iters):
    #变异
    P=De.mutate(population)
    #交叉
    NewP=De.cross(population,P)
    #选择产生的下一代种群
    population=De.selection(population,NewP)
    bestpopulation,bestfitness=De.bestp(population)
    besthistory.append(bestfitness)
    iterss.append(i)
    print("第{}次迭代,最优种群为:{},最优适应度:{}".format(i+1,bestpopulation,bestfitness))
#迭代图像绘制
plt.rcParams["font.sans-serif"] = "SimHei"#汉字乱码的解决方法
plt.plot(iterss,besthistory,color='g')
#坐标题目绘制
plt.xlabel("迭代次数")
plt.ylabel("每次迭代的最优适应度")
plt.show()


  • 12
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
差分进化算法(Differential Evolution,DE)是一种常用的全局优化算法,用于解决连续优化问题。它基于群体智能的思想,通过模拟生物进化的过程来逐步改进搜索解空间中的解。下面是一个简单的 Python 代码示例,演示如何使用差分进化算法进行优化: ```python import numpy as np # 目标函数(待优化的函数) def target_func(x): return x[0]**2 + x[1]**2 # 差分进化算法 def differential_evolution(func, bounds, pop_size=50, max_iter=100, F=0.8, CR=0.7): # 初始化种群 dim = len(bounds) pop = np.random.rand(pop_size, dim) # 随机生成初始种群 pop = bounds[:, 0] + pop * (bounds[:, 1] - bounds[:, 0]) # 将种群映射到指定范围内 # 迭代优化 for i in range(max_iter): for j in range(pop_size): # 随机选择三个个体 idxs = [idx for idx in range(pop_size) if idx != j] a, b, c = np.random.choice(idxs, 3, replace=False) # 变异操作 mutant = pop[a] + F * (pop[b] - pop[c]) # 交叉操作 cross_points = np.random.rand(dim) < CR trial = np.where(cross_points, mutant, pop[j]) # 选择操作 if func(trial) < func(pop[j]): pop[j] = trial # 返回最优解 best_idx = np.argmin([func(x) for x in pop]) best_solution = pop[best_idx] best_fitness = func(best_solution) return best_solution, best_fitness # 示例:优化目标函数 target_func(x) = x^2 + y^2,其中 -5 <= x <= 5,-5 <= y <= 5 bounds = np.array([[-5, 5], [-5, 5]]) best_solution, best_fitness = differential_evolution(target_func, bounds) print("最优解:", best_solution) print("最优适应度:", best_fitness) ``` 在上述代码中,`target_func` 为待优化的目标函数,`bounds` 定义了优化变量的取值范围。`differential_evolution` 函数是差分进化算法的实现,其中 `pop_size` 是种群大小,`max_iter` 是最大迭代次数,`F` 是变异率(通常取值为0.5~1),`CR` 是交叉率(通常取值为0~1)。最后通过调用 `differential_evolution` 函数进行优化,并打印输出最优解和最优适应度。 希望对你有所帮助!如有任何问题,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值