首页 > 编程语言 >PSO 算法的变体python实现

PSO 算法的变体python实现

时间:2022-11-25 22:44:14浏览次数:32  
标签:object PSO min python max self random range 变体

上演化计算课的时候老师让我们实现EOPSO算法(一种精英反向的粒子群优化算法),下面是他的算法步骤:

 

首先我们需要知道一些基础知识:

(1)基础PSO算法

 

(2)精英反向解

 

import numpy as np
import random
import math

class Population:
    def __init__(self,min_range_x,max_range_x,min_range_v,max_range_v,w,c1,c2,r1,r2,size,dim,rounds,f,CR,k,object_func):
        self.min_range_x = min_range_x
        self.max_range_x = max_range_x
        self.min_range_v = min_range_v
        self.max_range_v = max_range_v
        self.w = w
        self.c1 = c1
        self.c2 = c2
        self.r1 = r1
        self.r2 = r2
        self.size = size
        self.dimension = dim
        self.rounds = rounds
        self.f = f
        self.CR = CR
        self.k = k
        self.get_object_function_value = object_func
        self.cur_round = 0
        #初始化粒子位置和速度,gbest,pbest,精英反向解
        self.X = np.array([np.array([random.uniform(self.min_range_x, self.max_range_x) for s in range(self.dimension)])
                              for tmp in range(size)])
        self.V = np.array([np.array([random.uniform(self.min_range_v, self.max_range_v) for s in range(self.dimension)])
                              for tmp in range(size)])
        self.object_function_values = [self.get_object_function_value(v) for v in self.X]
        self.pbest = self.X.copy()
        self.gbest = self.X[np.argmin(self.object_function_values)]

        # self.opx = [np.array([self.k * (self.X[:,s].min() + self.X[:,s].max) - self.X[tmp][s] for s in range(self.dimension)])
        #                       for tmp in range(size)]
        self.opx = np.zeros_like(self.X)
        self.m = np.zeros_like(self.gbest)

    #生成反向精英向量
    def make_op(self):
        for i in range(self.size):
            for j in range(self.dimension):
                da=self.X[:,j].min()
                db=self.X[:,j].max()
                self.opx[i][j] = self.k*(da+db) - self.X[i][j]
                if self.opx[i][j] < self.min_range_x or self.opx[i][j] > self.max_range_x:
                    self.opx[i][j] = random.uniform(self.min_range_x, self.max_range_x)

    #选择
    def select(self):
        for i in range(self.size):
            x1 = self.X[i]
            x2 = self.opx[i]
            if self.get_object_function_value(x1) >= self.get_object_function_value(x2):
                self.pbest[i] = x2
            else:
                self.pbest[i] = x1
            if self.get_object_function_value(self.pbest[i]) <= self.get_object_function_value(self.gbest):
                self.gbest = self.pbest[i]

    # 变异
    def mutate(self):
        for i in range(self.size):
            r0, r1, r2, r3 = 0, 0, 0, 0
            while r0 == r1 or r1 == r2 or r2 == r3 or r0 == r3 or r0 == r2 or r1 == r3 or r0 == i:
                r0 = random.randint(0, self.size - 1)
                r1 = random.randint(0, self.size - 1)
                r2 = random.randint(0, self.size - 1)
                r3 = random.randint(0, self.size - 1)
            #变异向量
            for j in range(self.dimension):
                self.m[j] = self.gbest[j] + self.f * (self.X[r0][j] - self.X[r1][j]) + self.f * (self.X[r2][j] - self.X[r3][j])
                if self.m[j] > self.max_range_x or self.m[j] < self.min_range_x:
                    self.m[j] = random.uniform(self.min_range_x, self.max_range_x)

    #交叉
    def crossover(self):
        Jrand = random.randint(0, self.dimension)
        for j in range(self.dimension):
            if random.random() >= self.CR and j != Jrand:
                self.gbest[j] = self.m[j]

    #更新速度和位置
    def updata(self):
        for i in range(self.size):
            for j in range(self.dimension):
                self.V[i][j] = self.w * self.V[i][j] + self.c1 * self.r1 * (self.pbest[i][j] - self.X[i][j]) + \
                self.c2 * self.r2 * (self.gbest[j] - self.X[i][j])
                self.X[i][j] = self.X[i][j] + self.V[i][j]

    def print_best(self):
        m = min(self.object_function_values)
        i = self.object_function_values.index(m)
        print("轮数:" + str(self.cur_round))
        print("最佳个体:" + str(self.X[i]))
        print("目标函数值:" + str(m))

    def evolution(self):
        JR = 0.3
        while self.cur_round < self.rounds:
            if random.random() < JR:
                self.make_op()
                self.select()
            else:
                self.updata()
            self.mutate()
            self.crossover()
            self.print_best()
            self.cur_round = self.cur_round + 1

if __name__ == "__main__":
    def func(x):
        return x**2
    p = Population(min_range_x=-3,max_range_x=3,min_range_v=-3,max_range_v=3,w=0.6,c1=1.193,c2=1.193,
                   r1=random.random(),r2=random.random(),size=30,dim=1,rounds=100,f=1,CR=0.1,k=random.random()
                   ,object_func=func)
    p.evolution()

  

 

标签:object,PSO,min,python,max,self,random,range,变体
From: https://www.cnblogs.com/lyansu/p/16926608.html

相关文章

  • Python: 50个能够满足所有需要的模块
    Python具有强大的扩展能力,我列出了50个很棒的Python模块,包含几乎所有的需要:比如Databases,GUIs,Images,Sound,OSinteraction,Web,以及其他。推荐收藏。  Graphicalint......
  • 学习python-Day93
    bs4搜索文档树rombs4importBeautifulSouphtml_doc="""<html><head><title>TheDormouse'sstory</title></head><body><pid="myp"class="title">asdfasdf<b......
  • Python---open()函数
    """文件和文件夹:open(file,mode,encoding)--->file:可以是相对路径,也可以是绝对路径--->编码格式--->模式:r/rb:只读模式,默认可不写......
  • [NEFU]Python应用课程 PPT速记
    Python为了应试,被迫背单词。个人认为这种玩意,就该开卷考,然后丢你个实际点的题目让你做。Numpy代码含义importnumpyasnp导入numpy库a1=np.array([1,2,3,4,5,6])参数为列表......
  • [Python]numpy数据分析练习[21~30]
    [Python]numpy数据分析练习[21~40]​​题目和解析地址​​此博客主要用于自己做些知识点笔记题目和答案21.如何在numpy数组中只打印小数点后三位?只打印或显示numpy数组ran......
  • [Python]常用代码块
    [Python]常用代码块3天速通了一波pythonPTA的语法题,感觉和c/c++差不了太多吧。东西很少都是基础的玩意,主要防止暑假上去忘记了,以后如果有别的那再补充好了。代码片段输入每......
  • python_小练习
    #3种forin区别#foriteminlist:#item为列表元素#foriinrange(len(list)):#i为列表索引#forkeyindict:#key为字典的键#建议餐厅录入系统#创......
  • 【视频】Python用LSTM长短期记忆神经网络对不稳定降雨量时间序列进行预测分析|数据分
    全文下载链接:http://tecdat.cn/?p=23544 在本文中,长短期记忆网络——通常称为“LSTM”——是一种特殊的RNN递归神经网络,能够学习长期依赖关系。最近我们被客户要求撰写......
  • [oeasy]python0020换行字符_feed_line_lf_反斜杠n_B语言_安徒生童话
    ​ 换行字符 回忆上次内容struct包可以让我们使用封包格式把数字封包到字节里pack函数负责封包unpack函数负责解封我们通过封到不同的字节状态遍历了......
  • 李峋同款爱心代码(python版),跳动的心,给你爱的人一个惊喜(附源代码)
    Hello大家好如何浪漫的表白,作为程序员出身的小编,今天就带你实现热播剧《点燃我,温暖你》中超火的李峋同款爱心代码!前面是教程,怕麻烦的朋友可以直接划到文末,下载现成的,下载......