遗传算法
就像在一个大“家族”里,每个成员都有自己独特的“本领”(解决问题的方案)。一开始,大家的“本领”有好有坏。然后,我们挑出那些“本领”比较强的成员,让他们“生孩子”(产生新的方案)。在这个过程中,孩子会继承父母的一些“本领”,但也可能会有一些新的“变化”(变异)。经过很多代后,家族成员的“本领”就会越来越厉害,我们就能找到最厉害的“本领”来解决问题啦。
粒子群算法
想象有一群小虫子在一个大房间里找一颗糖。每只小虫子都知道自己离糖最近的一次位置,也知道所有小虫子里离糖最近的那个位置。然后,小虫子们就根据这两个信息来决定自己下一步往哪里走,走多快。它们不断地调整自己的方向和速度,最后就能找到糖在哪里啦,这个糖的位置就是问题的最优解。
模拟退火算法
把解决问题当成是让一块烧热的铁慢慢变冷。刚开始的时候,铁很烫,它的分子可以到处乱动,就像在尝试各种不同的解决问题的方法。随着温度慢慢降低,分子的活动就越来越小,最后铁冷却下来,达到一个最稳定的状态,这个状态就是我们要找的最好的解决问题的方法。在冷却过程中,即使有时候铁会先进入一个不太好的状态(比如有点歪歪扭扭),但因为温度的变化,它还是有机会调整,最终变成一个最好的形状(最优解)。
下面详细说明粒子群算法:
粒子群算法概述
粒子群算法(Particle Swarm Optimization, PSO)是一种基于群体智能的优化算法,由 Kennedy 和 Eberhart 在 1995 年提出。该算法的灵感来源于鸟群或鱼群的群体行为,通过模拟粒子在搜索空间中的飞行来寻找最优解。
基本原理
在粒子群算法中,每个粒子代表一个潜在的解,粒子在搜索空间中移动,其移动的方向和速度由自身的经验和群体的经验决定。每个粒子有两个重要的属性:位置和速度。
- 位置:表示粒子在搜索空间中的坐标,对应着一个可能的解。
- 速度:决定了粒子在搜索空间中的移动方向和距离。
每个粒子会记住自己曾经到达过的最优位置(个体最优位置,pbest),同时整个群体也会记住所有粒子中曾经到达过的最优位置(全局最优位置,gbest)。在每一次迭代中,粒子会根据自身的pbest和群体的gbest来调整自己的速度和位置。
算法步骤
- 初始化:随机初始化一群粒子的位置和速度。
- 计算适应度值:根据目标函数计算每个粒子的适应度值。
- 更新个体最优位置和全局最优位置:对于每个粒子,如果其当前位置的适应度值优于其个体最优位置的适应度值,则更新个体最优位置;如果某个粒子的当前位置的适应度值优于全局最优位置的适应度值,则更新全局最优位置。
- 更新粒子的速度和位置:根据以下公式更新粒子的速度和位置:
- 速度更新公式:vi(t+1)=w×vi(t)+c1×r1×(pbesti−xi(t))+c2×r2×(gbest−xi(t))
- 位置更新公式:xi(t+1)=xi(t)+vi(t+1)
其中,vi(t) 是粒子 i 在第 t 次迭代的速度,xi(t) 是粒子 i 在第 t 次迭代的位置,w 是惯性权重,c1 和 c2 是学习因子,r1 和 r2 是 [0,1] 之间的随机数。
- 终止条件判断:如果满足终止条件(如达到最大迭代次数或适应度值达到阈值),则停止迭代,输出全局最优位置;否则,返回步骤 2。
Python 代码实现
下面是一个使用 Python 实现粒子群算法的示例代码,用于求解函数 f(x)=x2 的最小值:
import numpy as np
# 目标函数
def objective_function(x):
return x ** 2
# 粒子群算法
def pso(objective_function, dim=1, num_particles=30, max_iter=100, w=0.5, c1=1.5, c2=1.5):
# 初始化粒子的位置和速度
particles_position = np.random.uniform(-10, 10, (num_particles, dim))
particles_velocity = np.random.uniform(-1, 1, (num_particles, dim))
# 初始化个体最优位置和全局最优位置
pbest_position = particles_position.copy()
pbest_fitness = np.array([objective_function(p) for p in particles_position])
gbest_index = np.argmin(pbest_fitness)
gbest_position = pbest_position[gbest_index]
gbest_fitness = pbest_fitness[gbest_index]
# 迭代更新
for _ in range(max_iter):
for i in range(num_particles):
# 更新速度
r1, r2 = np.random.rand(2)
particles_velocity[i] = (w * particles_velocity[i] +
c1 * r1 * (pbest_position[i] - particles_position[i]) +
c2 * r2 * (gbest_position - particles_position[i]))
# 更新位置
particles_position[i] += particles_velocity[i]
# 计算新的适应度值
fitness = objective_function(particles_position[i])
# 更新个体最优位置
if fitness < pbest_fitness[i]:
pbest_fitness[i] = fitness
pbest_position[i] = particles_position[i]
# 更新全局最优位置
if fitness < gbest_fitness:
gbest_fitness = fitness
gbest_position = particles_position[i]
return gbest_position, gbest_fitness
# 运行粒子群算法
best_position, best_fitness = pso(objective_function)
print(f"最优位置: {best_position}")
print(f"最优适应度值: {best_fitness}")
代码解释
- 目标函数:
objective_function
定义了要优化的目标函数,这里是 \(f(x)=x^{2}\)。 - 粒子群算法:
pso
函数实现了粒子群算法的核心逻辑,包括初始化粒子的位置和速度、更新个体最优位置和全局最优位置、更新粒子的速度和位置等步骤。 - 运行算法:调用
pso
函数并输出最优位置和最优适应度值。@浙大疏锦行