Python实现粒子群算法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhenguipa8450/article/details/79056606

问题描述

用粒子群算法优化函数
maxf(x1,x2)=21.5+x1sin(4πx1)+x2sin(20πx2)
3.0x112.1
4.1x25.8

解决方案

利用粒子群算法解决优化问题
其中参数设置为:
c1=c2=2
w=0.9
Vmax=0.5
Vmin=0.0005

具体代码

import numpy as np
import random
import math
import copy

class Ind:
    def __init__(self):
        self.x = []
        self.v = []
        self.fitness = 0.0
        self.Bestx = []
        self.Bestfitness = 0.0

    def Fitness(self):
        self.fitness = 21.5 + self.x[0] * math.sin(4 * math.pi * self.x[0]) + self.x[1] * math.sin(20 * math.pi * self.x[1])

    def Init(self, Upper, Lower, Vmax, Vmin, N):
        for i in range(N):
            self.x.append(random.uniform(Lower[i], Upper[i]))
            self.v.append(random.uniform(Vmin, Vmax))
        self.Fitness()
        self.Bestx = copy.deepcopy(self.x)
        self.Bestfitness = self.fitness

def Find_Best(Pparent, Pop):
    Best = copy.deepcopy(Pparent[0])
    for i in range(Pop):
        if Best.fitness < Pparent[i].fitness:
            Best = copy.deepcopy(Pparent[i])
    return Best

if __name__ == '__main__':
    w = 0.9
    c1 = c2 = 2
    Pop = 100
    N = 2
    Upper = [12.1, 5.8]
    Lower = [-3.0, 4.1]
    Vmax = 0.5
    Vmin = 0.000005
    Gmax = 200
    Pparent = [Ind() for _ in range(Pop)]
    for i in range(Pop):
        Pparent[i].Init(Upper, Lower, Vmax, Vmin, N)
    Best = Find_Best(Pparent, Pop)
    for i in range(Gmax):
        Bestcurrent = Find_Best(Pparent, Pop)
        if Bestcurrent.fitness > Best.fitness:
            Best = copy.deepcopy(Bestcurrent)
        print(Best.fitness)
        for j in range(Pop):
            for k in range(N):
                Pparent[j].v[k] = w * Pparent[j].v[k] + c1 * random.random() * (Best.x[k] - Pparent[j].x[k]) + c2 * random.random() * (Pparent[j].Bestx[k] - Pparent[j].x[k])
                if abs(Pparent[j].v[k]) > Vmax:
                    if Pparent[j].v[k] > 0:
                        Pparent[j].v[k] = Vmax
                    else:
                        Pparent[j].v[k] = -Vmax
                if abs(Pparent[j].v[k]) < Vmin:
                    if Pparent[j].v[k] > 0:
                        Pparent[j].v[k] = Vmin
                    else:
                        Pparent[j].x[k] = -Vmax
                Pparent[j].x[k] += Pparent[j].v[k]
                if Pparent[j].x[k] > Upper[k] or Pparent[j].x[k] < Lower[k]:
                    Pparent[j].x[k] = random.uniform(Lower[k], Upper[k])
            Temp = copy.deepcopy(Pparent[j])
            Pparent[j].Fitness()
            if Pparent[j].fitness > Pparent[j].Bestfitness:
                Pparent[j].Bestfitness = Pparent[j].fitness
                Pparent[j].Bestx = copy.deepcopy(Pparent[j].x)

猜你喜欢

转载自blog.csdn.net/zhenguipa8450/article/details/79056606