1.代入例子,目标函数求最优解迭代过程:
蜻蜓算法流程:
蜻蜓算法(Dragonfly Algorithm)是一种基于种群的优化算法,灵感来自于蜻蜓的群集行为。该算法通过模拟蜻蜓之间的吸引力和斥力,以及蜻蜓的移动,来搜索问题的最优解。
下面是蜻蜓算法的流程:
初始化种群:生成一组随机的蜻蜓位置和速度,并初始化蜻蜓最佳位置、蜻蜓最佳适应度值、种群最佳位置和种群最佳适应度值。
迭代优化:对于每个迭代,执行以下步骤:
a. 计算蜻蜓间距:计算每对蜻蜓之间的欧几里德距离。
b. 计算蜻蜓吸引力:对于每个蜻蜓,计算其吸引力,即吸引其它蜻蜓向其移动
c. 计算蜻蜓斥力:对于每个蜻蜓,计算其斥力,即排斥其它蜻蜓的移动。斥力的计算公式为:
如果某个蜻蜓的最佳适应度值优于其它蜻蜓,那么它的斥力将比其它蜻蜓更大。
d. 更新速度和位置:根据蜻蜓吸引力和斥力的作用,更新蜻蜓的速度和位置。速度和位置的更新公式分别为
e. 更新最佳位置和适应度值:对于每个蜻蜓,如果它的新位置的适应度值优于原来的最佳适应度值,那么更新它的最佳位置和最佳适应度值。如果它的最佳
3.代码:
# -*- coding: utf-8 -*-
"""
Created on Sat Mar 18 12:51:47 2023
@author: pony
"""
import numpy as np
import matplotlib.pyplot as plt
# 设置目标函数
def obj_func(x):
return (x**2).sum()
# 定义蜻蜓优化算法
def dragonfly_opt(func, dim, num, max_iter, lb, ub):
# 初始化蜻蜓位置
x = np.random.uniform(lb, ub, (num, dim))
# 初始化蜻蜓速度
v = np.zeros((num, dim))
# 初始化蜻蜓最佳位置
pbest = x.copy()
# 初始化蜻蜓最佳适应度值
fbest = np.zeros(num)
for i in range(num):
fbest[i] = func(pbest[i])
# 初始化种群最佳位置
gbest = pbest[fbest.argmin()].copy()
# 初始化种群最佳适应度值
fgbest = fbest.min()
# 迭代优化
for t in range(max_iter):
# 计算蜻蜓间距
dist = np.sqrt(((x[:, np.newaxis, :] - x)**2).sum(axis=2))
# 计算蜻蜓吸引力
attract = np.zeros((num, dim))
for i in range(num):
for j in range(num):
if i != j:
attract[i] += (x[j] - x[i]) / ((dist[i, j] + 1e-10)**2)
# 计算蜻蜓斥力
repel = np.zeros((num, dim))
for i in range(num):
for j in range(num):
if i != j:
if fbest[i] < fbest[j]:
repel[i] += (x[i] - x[j]) / ((dist[i, j] + 1e-10)**2)
# 更新速度和位置
v = v + attract + repel
x = x + v
x = np.clip(x, lb, ub)
# 更新最佳位置和适应度值
for i in range(num):
fnew = func(x[i])
if fnew < fbest[i]:
pbest[i] = x[i].copy()
fbest[i] = fnew
if fnew < fgbest:
gbest = x[i].copy()
fgbest = fnew
# 打印当前迭代结果
print("Iteration {}: Best Fitness Value = {}".format(t+1, fgbest))
# 返回最佳位置和适应度值
return gbest, fgbest
# 设置目标函数的维度和范围
dim = 2
lb = np.array([-10, -10])
ub = np.array([10, 10])
# 调用蜻蜓优化算法求解目标函数
best_pos, best_val = dragonfly_opt(obj_func, dim, num=20, max_iter=100, lb=lb, ub=ub)