写一个差分进化算法的python代码
时间: 2024-03-02 17:22:08 浏览: 87
差分进化算法(Differential Evolution,DE)是一种优化算法,常用于解决连续优化问题。下面是一个简单的Python实现:
```python
import numpy as np
# 定义目标函数
def func(x):
return np.sum(x**2)
# 差分进化算法主函数
def differential_evolution(func, bounds, popsize=20, maxiter=1000, F=0.5, CR=0.5):
'''
func: 目标函数
bounds: 参数范围,形如[(min1, max1), (min2, max2), ...]
popsize: 种群大小
maxiter: 最大迭代次数
F: 缩放因子
CR: 交叉概率
'''
# 初始化种群
dim = len(bounds)
pop = np.random.rand(popsize, dim)
for i in range(dim):
pop[:, i] = pop[:, i] * (bounds[i][1] - bounds[i][0]) + bounds[i][0]
# 迭代
for i in range(maxiter):
for j in range(popsize):
# 随机选择三个个体
idxs = np.random.choice(popsize, 3, replace=False)
x1, x2, x3 = pop[idxs]
# 变异
mutant = x1 + F * (x2 - x3)
# 交叉
cross_points = np.random.rand(dim) < CR
if not np.any(cross_points):
cross_points[np.random.randint(0, dim)] = True
trial = np.where(cross_points, mutant, pop[j])
# 选择
if func(trial) < func(pop[j]):
pop[j] = trial
# 返回最优解和最优值
best_idx = np.argmin([func(ind) for ind in pop])
best = pop[best_idx]
return best, func(best)
# 测试
bounds = [(-5, 5)] * 10
best, score = differential_evolution(func, bounds)
print("Best solution:", best)
print("Best score:", score)
```
在这个实现中,我们定义了一个目标函数`func`,并将其作为差分进化算法的输入。`bounds`是参数的范围,popsize是种群大小,maxiter是最大迭代次数,F是缩放因子,CR是交叉概率。在主函数`differential_evolution`中,我们首先初始化种群,然后进行迭代。在每一次迭代中,我们随机选择三个个体,并使用差分和交叉操作生成一个新的个体。如果它的适应度比原先的个体好,就替换原先的个体。最后,我们返回最优解和最优值。在测试时,我们使用了一个简单的目标函数$f(x)=\sum_{i=1}^{10}x_i^2$,并将它传递给差分进化算法。我们将参数的范围设置为$[-5,5]$,并运行算法,输出最优解和最优值。
阅读全文