受自然启发的计算已经成为优化问题、机器学习、数据挖掘和计算智能的新范式,具有广泛的应用。自然启发计算的本质是自然启发算法,如遗传算法(GA)
、粒子群优化(PSO)
和萤火虫算法(FA)
。大多数受自然启发的算法都使用了群体智能的一些特征。在受自然启发的算法中,萤火虫算法(firefly algorithm, FA)是由XinShe Yang在2007年末和2008年初提出的,至今已有近10年的发展历程,在过去几年中取得了重大进展。
在热带和温带地区的夏季天空中,萤火虫的生物发光是一种令人惊叹的景象。据估计,世界上大约有2000种萤火虫,大多数种类的萤火虫都会发出短暂而有节奏的闪光。每个物种都有不同的闪光模式和节奏,这种闪光的主要功能之一是作为一种信号系统,与其他萤火虫进行交流。闪光的频率、强度和间隔时间构成了信号系统的一部分,雌性萤火虫对雄性萤火虫独特的闪光模式做出反应。一些热带萤火虫甚至可以同步闪光,导致自组织行为。随着与闪烁源距离的增加,夜空中的光强度也会降低,能见度通常可以达到几百米,具体取决于天气条件。萤火虫的吸引力通常与它闪光的亮度和其闪光模式的定时准确性有关。
基于以上特点,杨新社开发了萤火虫算法(FA)。在FA内部,萤火虫的吸引力是由它的亮度决定的。由于光吸收的指数衰减和光随距离变化的平方反比定律,采用高度非线性项来模拟光强或吸引力的变化。在FA中,位置(作为问题的解向量)的主要算法方程为:
其中, 是控制随机漫步步长的比例因子, 是控制萤火虫可见性(以及搜索模式)的比例相关参数。另外, 是两只萤火虫之间距离为零时的吸引力常数(即 )。在上式中,右手边的第二项是随距离变化的非线性吸引力,第三项是随机化项,其中 表示每次迭代都要从高斯分布中抽取的随机数向量。该系统是一个非线性系统,这可能导致算法行为方面的丰富特征。从广义上讲,萤火虫算法(FA)属于群体智能范畴。
基于群体智能(swarm intelligence,SI)的算法都利用了群体智能的某些方面。需要指出的是,萤火虫 和萤火虫 之间的距离 可以定义为它们之间的笛卡尔距离。然而对于一些其他的问题如互联网路由问题,这个“距离”可以定义为时间延迟。对于某些组合问题,它甚至可以定义为汉明距离(Hamming Distance)。汉明距离是两个等长字符串对应位置上不同字符的个数。它通常用于比较两个二进制位串或其他符号串,以确定它们之间的相似度或差异。此外,由于萤火虫的亮度与其位置作为指标相关联,其他萤火虫看到的吸引力取决于它们的相对位置和相对亮度。所以需要对所有萤火虫进行配对比较。FA的主要步骤可以概括为以下伪代码。
此外,是控制FA中随机或扰动强度的参数。逐步减少随机性,加快整体收敛速度。因此,我们可以使用
式中为初值,为化简因子。在大多数情况下,我们可以使用 = 0.9到0.99。
事实上,由于FA是一个非线性系统,它具有将整个群体自动细分为多个子群体的能力。这是因为近距离吸引比远距离吸引更强,而群体的划分与吸引力变化的平均范围有关。在分成多群后,每个子群都可能围绕一个局部模式群集。因此,萤火虫算法自然适用于多模态优化问题。所以根据“情人眼里出西施”的原则,通过比较相对亮度来选择最佳方案。
该算法和方程式取自《自然启发算法和应用优化》一书。
应用领域和场景
萤火虫算法在多个领域都有广泛应用,包括但不限于:
-
函数优化:解决非线性、多峰值等复杂函数的优化问题。
-
图像处理:用于图像分割、图像配准等任务。
-
无线传感器网络:用于节点部署和数据路由优化。
-
机器学习:优化模型参数,提高模型性能。
-
特征选择和故障处理:用于选择重要特征,提升模型准确性,并在故障诊断中识别问题源头。
-
天线设计:优化天线阵列的布局,提高信号覆盖和接收效果。
-
结构设计:在土木工程和机械工程中优化结构设计,提高稳定性和性能。
-
调度:在生产和制造过程中优化任务调度,提高效率,减少等待时间。
-
化学相平衡:用于化学反应中求解相平衡问题,确定不同组分的最优配比。
-
动态问题:解决随时间变化的问题,如动态路径规划、动态资源分配等,提高系统响应速度和效率。
https://transpireonline.blog/2019/07/23/firefly-algorithm-fa-a-novel-method-motivated-from-the-behavior-of-fireflies-for-optimal-solution/
使用FA算法实现图像分割
以下代码实现了利用萤火虫算法(Firefly Algorithm, FA)进行图像分割的过程。图像分割
是一种图像处理技术,其作用是将图像划分为多个有意义的区域,以便进一步分析和处理。分割后的区域通常包含类似的属性,如颜色、亮度或纹理。此代码首先加载并预处理图像,将其转换为灰度图像,然后使用萤火虫算法对图像进行聚类分割。在算法运行过程中,代码保存并显示每隔几次迭代后的分割结果,并最终展示包含原始图像及其分割效果图的组合图。同时,代码还绘制了随着迭代次数增加的最佳成本值曲线,以显示算法的收敛情况。
import numpy as np
import matplotlib.pyplot as plt
from skimage import io, color, exposure, img_as_float
from scipy.spatial.distance import cdist
from matplotlib.colors import to_rgb
# 自定义用于分割的颜色
custom_colors = [
'#0511F2', # 蓝色
'#0583F2', # 浅蓝色
'#82F27E', # 浅绿色
'#F2E205', # 黄色
'#F20505', # 红色
'#00CCFF', # 青色
'#01FFFF', # 浅青色
'#FFAA01' # 橙色
]
# 将聚类标签转换为使用自定义颜色的RGB图像的函数
def label2rgb_custom(label_image, colors):
# 创建一个与标签图像大小相同的空白RGB图像
rgb_image = np.zeros((label_image.shape[0], label_image.shape[1], 3), dtype=np.float32)
# 遍历每个颜色,将对应标签的像素设置为该颜色
for i, color in enumerate(colors):
rgb_image[label_image == i] = to_rgb(color)
return rgb_image
# 加载图像
original_img_path = r"D:\系统默认\桌面\协作文件夹\python100 笔记\42.2.jpg"
original_img = io.imread(original_img_path) # 读取图像
img = img_as_float(original_img) # 将图像转换为浮点数格式
gray = color.rgb2gray(img) # 转换为灰度图像
gray = exposure.equalize_adapthist(gray) # 进行自适应直方图均衡化
# 将图像重塑为向量
X = gray.flatten()
# 聚类的成本函数
def ClusterCost(m, X):
# 计算距离矩阵
d = cdist(X[:, np.newaxis], m[:, np.newaxis])
# 分配聚类并找到最近的距离
dmin = np.min(d, axis=1)
ind = np.argmin(d, axis=1)
# 聚类内距离的总和
WCD = np.sum(dmin)
z = WCD
out = {
'd': d,
'dmin': dmin,
'ind': ind,
'WCD': WCD
}
return z, out
# 萤火虫算法参数
k = 8 # 聚类数
MaxIt = 50 # 最大迭代次数
nPop = 10 # 萤火虫数量(种群规模)
gamma = 1 # 光吸收系数
beta0 = 2 # 吸引系数基值
alpha = 0.2 # 变异系数
alpha_damp = 0.98 # 变异系数衰减比率
delta = 0.05 * (np.max(X) - np.min(X)) # 均匀变异范围
m = 2
dmax = (np.max(X) - np.min(X)) * np.sqrt(len(X))
# 初始化萤火虫
fireflies = np.random.uniform(np.min(X), np.max(X), (nPop, k))
costs = np.zeros(nPop)
best_sol = {'cost': np.inf, 'position': None, 'out': None}
# 评估初始种群
for i in range(nPop):
costs[i], cluster_indices = ClusterCost(fireflies[i], X)
if costs[i] < best_sol['cost']:
best_sol['cost'] = costs[i]
best_sol['position'] = fireflies[i]
best_sol['out'] = cluster_indices
# 保存最佳成本值的数组
best_cost = np.zeros(MaxIt)
# 准备保存绘图的图像
images = []
# 萤火虫算法主循环
for it in range(MaxIt):
new_fireflies = np.copy(fireflies)
for i in range(nPop):
for j in range(nPop):
if costs[j] < costs[i]:
rij = np.linalg.norm(fireflies[i] - fireflies[j]) / dmax
beta = beta0 * np.exp(-gamma * rij**m)
e = delta * np.random.uniform(-1, 1, k)
new_sol = fireflies[i] + beta * np.random.rand(k) * (fireflies[j] - fireflies[i]) + alpha * e
new_sol = np.clip(new_sol, np.min(X), np.max(X))
new_cost, new_cluster_indices = ClusterCost(new_sol, X)
if new_cost < costs[i]:
new_fireflies[i] = new_sol
costs[i] = new_cost
if new_cost < best_sol['cost']:
best_sol['cost'] = new_cost
best_sol['position'] = new_sol
best_sol['out'] = new_cluster_indices
fireflies = new_fireflies
best_cost[it] = best_sol['cost']
print(f"Iteration {it+1}: Best Cost = {best_cost[it]}")
alpha *= alpha_damp
# 每3次迭代保存一次分割结果
if (it + 1) % 3 == 0 and len(images) < 8:
gray2 = np.reshape(best_sol['out']['ind'], gray.shape)
segmented = label2rgb_custom(gray2, custom_colors)
images.append((segmented, it + 1))
# 确保我们有8张分割图像
if len(images) < 8:
gray2 = np.reshape(best_sol['out']['ind'], gray.shape)
segmented = label2rgb_custom(gray2, custom_colors)
images.append((segmented, MaxIt))
# 绘制包括原始图像的所有图像
plt.figure(figsize=(15, 15))
plt.subplot(3, 3, 1)
plt.imshow(original_img)
plt.title('Original')
for idx, (segmented, iteration) in enumerate(images):
plt.subplot(3, 3, idx + 2)
plt.imshow(segmented)
plt.title(f'Segmented at Iter {iteration}')
plt.tight_layout()
plt.show()
# 绘制FA训练曲线
plt.figure()
plt.plot(best_cost, '--k', linewidth=1)
plt.title('FA Train')
plt.xlabel('FA Iteration Number')
plt.ylabel('FA Best Cost Value')
plt.show()
# 重新加载原始图像以确保一致性
original_img = io.imread(original_img_path)
# 将聚类中心及其索引转换为图像
gray2 = np.reshape(best_sol['out']['ind'], gray.shape)
segmented = label2rgb_custom(gray2, custom_colors)
# 绘制最终结果
plt.figure()
plt.subplot(1, 2, 1)
plt.imshow(original_img)
plt.title('Original')
plt.subplot(1, 2, 2)
plt.imshow(segmented)
plt.title('Final Segmented Image')
plt.show()
Xin-She Yang (2024). Firefly Algorithm (https://www.mathworks.com/matlabcentral/fileexchange/29693-firefly-algorithm)
https://www.mathworks.com/matlabcentral/fileexchange/114330-firefly-algorithm-image-segmentation
原始图像:
FA训练曲线:
不同迭代次数下的图像分割结果:
通过以上内容,相信大家对萤火虫优化算法有了更加深入的理解。以上内容总结自网络,如有帮助欢迎关注与转发,我们下次再见!