粒子群最適化(PSO)の実装

OneMax問題(10ビット)を解いてみる。

import numpy as np
import random
import pdb
import matplotlib.pyplot as plt

T = 100

N_bit = 10
N = 20 
x = np.random.rand(N,N_bit)
v = np.random.rand(N,N_bit)
g = np.zeros(N_bit)
p = np.zeros((N,N_bit))
w = 0.8 
c1 = 1
c2 = 1

def evalOneMax(x):
    for xj in x:
        if xj>1:
            return 0
    return sum(x)

gs = []
for gen in range(T):
    for i in range(N):
        for j in range(N_bit):
            vj = w*v[i,j] + random.random()*c1*(p[i,j]-x[i,j])+random.random()*c2*(g[j]-x[i,j])
            xj = x[i,j] + vj
            x[i,j] = xj.copy()
            v[i,j] = vj.copy()
        val_xi = evalOneMax(x[i]) #ある粒子iの値
        val_pi = evalOneMax(p[i])
        val_g = evalOneMax(g)
        if val_xi > val_pi:
            p[i] = x[i].copy()
        if val_xi > val_g:
            g = x[i].copy()
    print(val_g)
    gs.append(val_g)

plt.plot(gs)
plt.show()

f:id:seinzumtode:20211010021756p:plain