Python粒子群优化算法实现(PSO)

89 篇文章 27 订阅
78 篇文章 11 订阅

PSO(PSO——Particle Swarm Optimization)(基于种群的随机优化技术算法)
粒子群算法模仿昆虫、兽群、鸟群和鱼群等的群集行为,这些群体按照一种合作的方式寻找食物,群体中的每个成员通过学习它自身的经验和其他成员的经验来不断改变其搜索模式。
这里写图片描述

概述请见:

http://www.omegaxyz.com/2017/05/04/introductionofpso/

Python3代码:

# coding: utf-8
import numpy as np
import random
import matplotlib.pyplot as plt


# ----------------------PSO参数设置---------------------------------
class PSO():
    def __init__(self, pN, dim, max_iter):
        self.w = 0.8
        self.c1 = 2
        self.c2 = 2
        self.r1 = 0.6
        self.r2 = 0.3
        self.pN = pN  # 粒子数量
        self.dim = dim  # 搜索维度
        self.max_iter = max_iter  # 迭代次数
        self.X = np.zeros((self.pN, self.dim))  # 所有粒子的位置和速度
        self.V = np.zeros((self.pN, self.dim))
        self.pbest = np.zeros((self.pN, self.dim))  # 个体经历的最佳位置和全局最佳位置
        self.gbest = np.zeros((1, self.dim))
        self.p_fit = np.zeros(self.pN)  # 每个个体的历史最佳适应值
        self.fit = 1e10  # 全局最佳适应值

    # ---------------------目标函数-----------------------------
    def function(self, X):
        return X**2-4*X+3

    # ---------------------初始化种群----------------------------------
    def init_Population(self):
        for i in range(self.pN):
            for j in range(self.dim):
                self.X[i][j] = random.uniform(0, 1)
                self.V[i][j] = random.uniform(0, 1)
            self.pbest[i] = self.X[i]
            tmp = self.function(self.X[i])
            self.p_fit[i] = tmp
            if tmp < self.fit:
                self.fit = tmp
                self.gbest = self.X[i]

                # ----------------------更新粒子位置----------------------------------

    def iterator(self):
        fitness = []
        for t in range(self.max_iter):
            for i in range(self.pN):  # 更新gbest\pbest
                temp = self.function(self.X[i])
                if temp < self.p_fit[i]:  # 更新个体最优
                    self.p_fit[i] = temp
                    self.pbest[i] = self.X[i]
                    if self.p_fit[i] < self.fit:  # 更新全局最优
                        self.gbest = self.X[i]
                        self.fit = self.p_fit[i]
            for i in range(self.pN):
                self.V[i] = self.w * self.V[i] + self.c1 * self.r1 * (self.pbest[i] - self.X[i]) + \
                            self.c2 * self.r2 * (self.gbest - self.X[i])
                self.X[i] = self.X[i] + self.V[i]
            fitness.append(self.fit)
            print(self.X[0], end=" ")
            print(self.fit)  # 输出最优值
        return fitness

        # ----------------------程序执行-----------------------


my_pso = PSO(pN=30, dim=1, max_iter=100)
my_pso.init_Population()
fitness = my_pso.iterator()
# -------------------画图--------------------
plt.figure(1)
plt.title("Figure1")
plt.xlabel("iterators", size=14)
plt.ylabel("fitness", size=14)
t = np.array([t for t in range(0, 100)])
fitness = np.array(fitness)
plt.plot(t, fitness, color='b', linewidth=3)
plt.show()

注意pN是指初始种群,一般来说初始种群越大效果越好

dim是优化的函数维度,常见的初等函数和初等复合函数都是1维

max_iter是迭代次数

本文的优化函数是x^2-4x+3,显然这个函数在x=2时取最小值-1

验证:

迭代图像:
这里写图片描述

  • 41
    点赞
  • 316
    收藏
    觉得还不错? 一键收藏
  • 23
    评论
粒子群优化算法(Particle Swarm Optimization, PSO)是一种基于群体智能的优化算法,模拟了鸟群觅食行为中的信息共享和合作。该算法通过不断更新粒子的位置和速度来搜索最优解。 以下是使用Python实现粒子群优化算法解决TSP问题的代码示例: ```python import numpy as np # 定义TSP问题的目标函数 def tsp_objective_function(route, distance_matrix): total_distance = 0 for i in range(len(route) - 1): total_distance += distance_matrix[route[i]][route[i+1]] return total_distance # 粒子群优化算法 def pso_tsp(distance_matrix, num_particles, num_iterations): num_cities = len(distance_matrix) # 初始化粒子的位置和速度 particles = np.zeros((num_particles, num_cities), dtype=int) velocities = np.zeros((num_particles, num_cities), dtype=int) global_best_route = np.zeros(num_cities, dtype=int) global_best_fitness = float('inf') # 随机初始化粒子的位置 for i in range(num_particles): particles[i] = np.random.permutation(num_cities) # 迭代更新粒子的位置和速度 for iteration in range(num_iterations): for i in range(num_particles): # 计算粒子的适应度值 fitness = tsp_objective_function(particles[i], distance_matrix) # 更新全局最优解 if fitness < global_best_fitness: global_best_route = particles[i].copy() global_best_fitness = fitness # 更新粒子的速度和位置 velocities[i] = velocities[i] + np.random.rand() * (global_best_route - particles[i]) + np.random.rand() * (particles[i] - particles[i]) particles[i] = np.roll(particles[i] + velocities[i], -1) return global_best_route, global_best_fitness # 示例使用 distance_matrix = [[0, 10, 15, 20], [10, 0, 35, 25], [15, 35, 0, 30], [20, 25, 30, 0]] num_particles = 50 num_iterations = 100 best_route, best_fitness = pso_tsp(distance_matrix, num_particles, num_iterations) print("Best route:", best_route) print("Best fitness:", best_fitness) ``` 这段代码实现粒子群优化算法来解决TSP问题。其中,`distance_matrix`是城市之间的距离矩阵,`num_particles`是粒子数量,`num_iterations`是迭代次数。最后输出的结果是找到的最优路径和对应的适应度值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值