用python实现一下自适应差分进化算法
时间: 2023-09-20 13:07:26 浏览: 98
以下是用 Python 实现自适应差分进化算法的示例代码:
```python
import numpy as np
class DE:
def __init__(self, func, dim, popsize=10, f=0.5, cr=0.7, maxiter=100):
self.func = func
self.dim = dim
self.popsize = popsize
self.f = f
self.cr = cr
self.maxiter = maxiter
def run(self):
pop = np.random.rand(self.popsize, self.dim)
fitness = np.zeros(self.popsize)
for i in range(self.popsize):
fitness[i] = self.func(pop[i])
best_idx = np.argmin(fitness)
best = pop[best_idx]
best_fitness = fitness[best_idx]
for it in range(self.maxiter):
for i in range(self.popsize):
r1, r2, r3 = np.random.choice(self.popsize, 3, replace=False)
while r1 == i or r2 == i or r3 == i:
r1, r2, r3 = np.random.choice(self.popsize, 3, replace=False)
xi = pop[i]
xr1, xr2, xr3 = pop[r1], pop[r2], pop[r3]
vi = xr1 + self.f * (xr2 - xr3)
mask = np.random.rand(self.dim) < self.cr
ui = np.where(mask, vi, xi)
fitness_ui = self.func(ui)
if fitness_ui < fitness[i]:
pop[i] = ui
fitness[i] = fitness_ui
if fitness_ui < best_fitness:
best = ui
best_fitness = fitness_ui
# 自适应调整 F 和 CR
mean_fitness = np.mean(fitness)
if mean_fitness != 0:
F = np.mean(np.abs(fitness - mean_fitness)) / mean_fitness
self.f = 0.5 + 0.2 * F
if best_fitness != 0:
CR = 1 - np.mean(np.abs(fitness - best_fitness)) / best_fitness
self.cr = 0.1 + 0.9 * CR
print("Iteration {}: Best Fitness = {}".format(it+1, best_fitness))
return best, best_fitness
```
其中,`func` 是需要优化的目标函数,`dim` 是变量维度,`popsize` 是种群大小,`f` 和 `cr` 分别是差分进化算法中的缩放因子和交叉概率,`maxiter` 是最大迭代次数。
在 `run` 方法中,首先随机生成初始种群 `pop`,计算每个个体的适应度 `fitness`,并记录最优个体和适应度。然后开始迭代,对于每个个体,随机选择三个不同的个体 `xr1`、`xr2` 和 `xr3`,然后根据公式计算新个体 `vi` 和 `ui`,并计算新个体的适应度 `fitness_ui`。如果新个体的适应度比原个体的适应度更好,则接受新个体。同时,记录最优个体和适应度。
在每次迭代后,根据当前种群的适应度情况自适应调整缩放因子 `f` 和交叉概率 `cr`。最后返回最优个体和适应度。
使用方法如下:
```python
import math
# 目标函数是 Rastrigin 函数
def rastrigin(x):
return 10 * len(x) + sum([xi**2 - 10 * math.cos(2*math.pi*xi) for xi in x])
de = DE(rastrigin, 10)
best, best_fitness = de.run()
print("Best Solution: {}, Best Fitness: {}".format(best, best_fitness))
```
这里优化的是 Rastrigin 函数,变量维度为 10。可以根据需要修改目标函数和变量维度。