ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

粒子群算法python实现: 较复杂(即多元)情况

2021-12-19 15:02:00  阅读:186  来源: 互联网

标签:get python max self 多元 particles 算法 velocity best


@[TOC](粒子群算法python实现: 较复杂(即多元)情况)

求解一个较复杂的函数

 def function(x):
    #2004年考研题(我这里只求极小值):x^2-6xy+10^2-2yz-z^2+18=0,求z=z(x,y)的极值点和极值
    #此题答案极小值3,极小值点(9,3)
    #因为看答案知道z+y>0,所以只试z+y>0的情况
    z=(18+x[0]**2-6*x[0]*x[1]+11*x[1]**2)**0.5-x[1]#化成x1,x2即y表示z的形式
    return z

实现

class Particle:
    def __init__(self, dim, max_opsition=100, max_velocity=0.05):
        self.position = [random.uniform(-max_opsition, max_opsition) for i in range(dim)] #粒子初始位置
        self.velocity = [random.uniform(-max_velocity, max_velocity) for i in range(dim)]  # 粒子初始速度
        self.particle_best = [0.0 for i in range(dim)]  # 初始粒子最优解

    def set_position(self, i, value):
        self.position[i] = value

    def get_position(self):
        return self.position

    def set_particle_best(self, value):
        self.particle_best = value

    def get_particle_best(self):
        return self.particle_best

    def set_velocity(self, i, value):
        self.velocity[i] = value

    def get_velocity(self):
        return self.velocity
        
import random

particle_num = 100 #粒子数目
dim = 2
particles = [Particle(dim=2) for i in range(particle_num)] # 初始粒子
global_best = [0.0 for i in range(dim)] # 全局最优解

def update(particles,global_best,iter_num,W,n1,n2,max_velocity,function): 
    """
    状态更新
    """
    for j in range(iter_num):
        for i in range(len(particles)):
            
            # 计算每个粒子的最适应度,就是代个解看它的y是多少,如果y小于当前的最优解的值,就更新最优解为这个解
            if function(particles[i].get_position()) < function(particles[i].get_particle_best()):
                particles[i].set_particle_best(particles[i].get_position())
            # 更新全局最优解同理
            if function(particles[i].get_position()) < function(global_best):
                global_best = particles[i].get_position()
                
            for k in range(dim):
                # 套速度更新的公式
                particles[i].set_velocity(k, W * particles[i].get_velocity()[k] + \
                                          n1 * random.random() * (particles[i].get_particle_best()[k] - particles[i].get_position()[k]) \
                                          + n2 * random.random() * (global_best[k] - particles[i].get_position()[k]))
                # 限制速度,别让它飞了
                if particles[i].get_velocity()[k] > max_velocity:
                    particles[i].get_velocity()[k] = max_velocity
                elif particles[i].get_velocity()[k] < -max_velocity:
                    particles[i].get_velocity()[k] = -max_velocity
                # 套位置更新的公式
                particles[i].set_position(k,particles[i].get_position()[k] +  particles[i].get_velocity()[k])
    return global_best

W = 1 #惯性权重
n1 = 2 #认知学习因子
n2 = 2 #社会学习因子
max_velocity = 0.05 #速度限制
iter_num = 2000 #迭代次数

result=update(particles,global_best,iter_num,W,n1,n2,max_velocity,function)
print(result) #极值点,输出约为(9,3)
print(function(result)) #极小值, 输出约为3

标签:get,python,max,self,多元,particles,算法,velocity,best
来源: https://blog.csdn.net/weixin_42363934/article/details/122024133

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有