優化算法(一)粒子羣算法

import numpy as np


def pso(fitness, D=1, c1=2, c2=2, w=0.8, N=200, M=1000):

    # 函數返回待優化函數的最小值和對應的解

    # fitness 表示待優化函數
    # D 表示數據的維度
    # c1,c2 表示學習因子
    # w 表示慣性權重
    # N 表示粒子數量
    # M 表示主循環迭代次數

    # 初始化位置和速度
    x = np.random.rand(N, D)
    v = np.random.rand(N, D)

    # 初始化粒子歷史最優值
    p = np.zeros(N)

    # 初始化各個粒子的歷史最優解
    y = [0] * N

    # 初始化粒子自身的歷史最優值
    for i in range(N):
        p[i] = fitness(x[i])
        y[i] = x[i]

    # 初始化粒子羣最優解
    pg = x[-1]
    for i in range(N-1):
        if fitness(x[i]) < fitness(pg):
            pg = x[i]

    # 主循環
    for t in range(M):
        for i in range(N):

            # 更新粒子的速度和位置
            v[i] = w * v[i] + c1 * np.random.random() * (y[i] - x[i]) + c2 * np.random.random() * (pg - x[i])
            x[i] += v[i]

            # 更新粒子的歷史最優解
            if fitness(x[i]) < p[i]:
                p[i] = fitness(x[i])
                y[i] = list(x[i])
                
            # 更新粒子羣的最優解
            if p[i] < fitness(pg):
                pg = y[i]

    # 返回待優化函數的最優解和最優值
    return pg, fitness(pg)


def func(x):
    x1, x2, x3 = x
    return x1 ** 2 + x2 ** 2 + x3 ** 2


xm, fv = pso(func, 3)

print(xm, fv)

# [8.900130642125157e-17, 1.810901815514498e-17, 4.631944512800519e-17] 1.039466008019917e-32

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章