Python打卡训练营学习记录Day12

 

遗传算法

就像在一个大“家族”里,每个成员都有自己独特的“本领”(解决问题的方案)。一开始,大家的“本领”有好有坏。然后,我们挑出那些“本领”比较强的成员,让他们“生孩子”(产生新的方案)。在这个过程中,孩子会继承父母的一些“本领”,但也可能会有一些新的“变化”(变异)。经过很多代后,家族成员的“本领”就会越来越厉害,我们就能找到最厉害的“本领”来解决问题啦。

粒子群算法

想象有一群小虫子在一个大房间里找一颗糖。每只小虫子都知道自己离糖最近的一次位置,也知道所有小虫子里离糖最近的那个位置。然后,小虫子们就根据这两个信息来决定自己下一步往哪里走,走多快。它们不断地调整自己的方向和速度,最后就能找到糖在哪里啦,这个糖的位置就是问题的最优解。

模拟退火算法

把解决问题当成是让一块烧热的铁慢慢变冷。刚开始的时候,铁很烫,它的分子可以到处乱动,就像在尝试各种不同的解决问题的方法。随着温度慢慢降低,分子的活动就越来越小,最后铁冷却下来,达到一个最稳定的状态,这个状态就是我们要找的最好的解决问题的方法。在冷却过程中,即使有时候铁会先进入一个不太好的状态(比如有点歪歪扭扭),但因为温度的变化,它还是有机会调整,最终变成一个最好的形状(最优解)。

下面详细说明粒子群算法:

粒子群算法概述

粒子群算法(Particle Swarm Optimization, PSO)是一种基于群体智能的优化算法,由 Kennedy 和 Eberhart 在 1995 年提出。该算法的灵感来源于鸟群或鱼群的群体行为,通过模拟粒子在搜索空间中的飞行来寻找最优解。

基本原理

在粒子群算法中,每个粒子代表一个潜在的解,粒子在搜索空间中移动,其移动的方向和速度由自身的经验和群体的经验决定。每个粒子有两个重要的属性:位置和速度。

  • 位置:表示粒子在搜索空间中的坐标,对应着一个可能的解。
  • 速度:决定了粒子在搜索空间中的移动方向和距离。

每个粒子会记住自己曾经到达过的最优位置(个体最优位置,pbest),同时整个群体也会记住所有粒子中曾经到达过的最优位置(全局最优位置,gbest)。在每一次迭代中,粒子会根据自身的pbest和群体的gbest来调整自己的速度和位置。

算法步骤

  1. 初始化:随机初始化一群粒子的位置和速度。
  2. 计算适应度值:根据目标函数计算每个粒子的适应度值。
  3. 更新个体最优位置和全局最优位置:对于每个粒子,如果其当前位置的适应度值优于其个体最优位置的适应度值,则更新个体最优位置;如果某个粒子的当前位置的适应度值优于全局最优位置的适应度值,则更新全局最优位置。
  4. 更新粒子的速度和位置:根据以下公式更新粒子的速度和位置:
    • 速度更新公式: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] 之间的随机数。
  5. 终止条件判断:如果满足终止条件(如达到最大迭代次数或适应度值达到阈值),则停止迭代,输出全局最优位置;否则,返回步骤 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}")    

 

代码解释

  1. 目标函数objective_function 定义了要优化的目标函数,这里是 \(f(x)=x^{2}\)。
  2. 粒子群算法pso 函数实现了粒子群算法的核心逻辑,包括初始化粒子的位置和速度、更新个体最优位置和全局最优位置、更新粒子的速度和位置等步骤。
  3. 运行算法:调用 pso 函数并输出最优位置和最优适应度值。@浙大疏锦行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值