python实现了一个简单的粒子群优化算法(PSO)用于求解一元函数的最小值

文章介绍了一个用Python实现的粒子群优化算法(ParticleSwarmOptimization,PSO)用于寻找一元函数最小值。优化后的代码将原有两个类合并,并利用numpy进行向量运算,提高了效率和代码可读性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为实现了一个简单的粒子群优化算法(PSO)用于求解一元函数的最小值。

构思解释:

1. `Particle`类表示一个粒子,包含位置、速度、当前最优位置和最优适应度等属性。在初始化时,随机生成位置和速度。

2. `PSO`类表示一个粒子群,包含多个粒子。在初始化时,随机生成多个粒子。在优化时,不断更新每个粒子的位置和速度,直到满足停止条件。

3. `optimize`方法是优化函数,它不断更新每个粒子的位置和速度,并记录全局最优位置和适应度。

4. 在每个粒子更新时,首先计算当前粒子的适应度,然后更新该粒子的最优位置和全局最优位置。

5. `update_velocity`方法是更新速度的函数,根据当前粒子的历史最优位置和全局最优位置计算出两个分量,分别对应粒子的认知和社会行为,最终更新粒子的速度。

6. `update_position`方法是更新位置的函数,根据粒子的速度更新粒子的位置。
代码示例如下:

import random

class Particle:
    def __init__(self, dim):
        self.position = [random.uniform(-10, 10) for i in range(dim)]
        self.velocity = [random.uniform(-1, 1) for i in range(dim)]
        self.best_position = self.position[:]
        self.best_fitness = float('inf')
        self.fitness = None

    def update_position(self):
        self.position = [self.position[i] + self.velocity[i] for i in range(len(self.position))]

    def update_velocity(self, global_best_position, w, c1, c2):
        for i in range(len(self.velocity)):
            r1 = random.random()
            r2 = random.random()
            cognitive_component = c1 * r1 * (self.best_position[i] - self.position[i])
            social_component = c2 * r2 * (global_best_position[i] - self.position[i])
            self.velocity[i] = w * self.velocity[i] + cognitive_component + social_component

class PSO:
    def __init__(self, num_particles, dim, w, c1, c2, num_iterations):
        self.num_particles = num_particles
        self.dim = dim
        self.w = w
        self.c1 = c1
        self.c2 = c2
        self.num_iterations = num_iterations
        self.particles = [Particle(dim) for i in range(num_particles)]

    def optimize(self):
        global_best_position = None
        global_best_fitness = float('inf')
        for i in range(self.num_iterations):
            for particle in self.particles:
                fitness = particle.position[0] ** 2
                particle.fitness = fitness
                if fitness < particle.best_fitness:
                    particle.best_fitness = fitness
                    particle.best_position = particle.position[:]
                if fitness < global_best_fitness:
                    global_best_fitness = fitness
                    global_best_position = particle.position[:]
            for particle in self.particles:
                particle.update_velocity(global_best_position, self.w, self.c1, self.c2)
                particle.update_position()
        return global_best_position, global_best_fitness

if __name__ == '__main__':
    pso = PSO(num_particles=30, dim=1, w=0.8, c1=2, c2=2, num_iterations=1000)
    best_position, best_fitness = pso.optimize()
    print("Best position: ", best_position)
    print("Best fitness: ", best_fitness)

 实现代码后我发现还能继续优化代码,如下:

mport random
import numpy as np


class PSO:
    def __init__(self, num_particles, dim, w, c1, c2, num_iterations):
        self.num_particles = num_particles
        self.dim = dim
        self.w = w
        self.c1 = c1
        self.c2 = c2
        self.num_iterations = num_iterations
        self.positions = np.random.uniform(-10, 10, (num_particles, dim))
        self.velocities = np.random.uniform(-1, 1, (num_particles, dim))
        self.best_positions = self.positions.copy()
        self.best_fitness = np.inf
        self.fitness = None

    def optimize(self):
        for i in range(self.num_iterations):
            fitness = self.positions[:, 0] ** 2
            self.fitness = fitness
            mask = fitness < self.best_fitness
            self.best_positions[mask] = self.positions[mask]
            self.best_fitness = np.min(fitness)
            global_best_position = self.positions[np.argmin(fitness)]
            self.update_velocity(global_best_position)
            self.update_position()
        return global_best_position, self.best_fitness

    def update_velocity(self, global_best_position):
        r1 = np.random.uniform(0, 1, (self.num_particles, self.dim))
        r2 = np.random.uniform(0, 1, (self.num_particles, self.dim))
        cognitive_component = self.c1 * r1 * (self.best_positions - self.positions)
        social_component = self.c2 * r2 * (global_best_position - self.positions)
        self.velocities = self.w * self.velocities + cognitive_component + social_component

    def update_position(self):
        self.positions += self.velocities


if __name__ == '__main__':
    pso = PSO(num_particles=30, dim=1, w=0.8, c1=2, c2=2, num_iterations=1000)
    best_position, best_fitness = pso.optimize()
    print("Best position: ", best_position)
    print("Best fitness: ", best_fitness)

以上代码是优化后的代码,构思优化解释:

1. 可以将`Particle`和`PSO`两个类合并成一个类,这样可以避免一些重复代码,使代码更加简洁。

2. 可以使用numpy库来处理向量运算,这样可以提高代码的运行效率,同时也使代码更加简洁。

所以,优化后的代码更加简洁、高效,使用了numpy库来处理向量运算,使得代码更加易读、易维护。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SzetoZeZe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值