使用Pytorch加速PSO算法?

我已经实施了PSO算法使用PyTorch,torch.cuda.FloatTensor。 我设法加速了2次,但我期待的不止于此。 它认为步骤检查限制(line 41-55)和参数更新(line 58-72)是原因。有一个“GPU任何”这样做?使用Pytorch加速PSO算法?

有是我的代码:

import torch 

import numpy as np

import matplotlib.pyplot as plt

dtype = torch.cuda.FloatTensor

def fitness(x,y):

return -torch.abs(torch.sin(x)*torch.cos(y)*torch.exp(torch.abs(1-(torch.sqrt(x**2+y**2))/(3.1415))))

def velocity(v, gxbest, pxbest, pybest, x, pop, w, c1, c2):

return w*torch.rand(pop).type(dtype)*v + \

c1*torch.rand(pop).type(dtype)*(pxbest - x) + \

c2*torch.rand(pop).type(dtype)*(gxbest.expand(x.size(0)) - x)

def PSO(pop, xmax, xmin, niter, wmax, wmin, c1, c2):

vx = torch.rand(pop).type(dtype)

vy = torch.rand(pop).type(dtype)

best = np.zeros(niter)

x = (xmax - xmin)*torch.rand(pop).type(dtype) + xmin

y = (xmax - xmin)*torch.rand(pop).type(dtype) + xmin

z = fitness(x,y)

[minz, indexminz] = z.min(0)

gxbest = x[indexminz]

gybest = y[indexminz]

pxbest = x

pybest = y

pzbest = z

for K in range(niter):

w = wmax - ((wmax - wmin)/niter) * (K)

vnextx = velocity(vx, gxbest, pxbest, pybest, x, pop, w, c1, c2)

xnext = x + vnextx

vnexty = velocity(vy, gxbest, pxbest, pybest, y, pop, w, c1, c2)

ynext = y + vnexty

**(41)** xnext = xnext.cpu()

ynext = ynext.cpu()

idxmax = (xnext > xmax) # elements that are bigger that upper limit

idxmim = (xnext < xmin) # elements that are smaller that upper limit

xnext[idxmax] = xmax

xnext[idxmim] = xmin

idymax = (ynext > xmax) # elements that are bigger that upper limit

idymim = (ynext < xmin) # elements that are smaller that upper limit

ynext[idymax] = xmax

ynext[idymim] = xmin

xnext = xnext.cuda()

**(55)** ynext = ynext.cuda()

znext = fitness(xnext,ynext)

**(58)**[minznext, indexminznext] = znext.min(0)

if (minznext[0] < minz[0]):

minz = minznext

gxbest = xnext[indexminznext]

gybest = ynext[indexminznext]

indexpbest = (znext < pzbest)

pxbest[indexpbest] = xnext[indexpbest]

pybest[indexpbest] = ynext[indexpbest]

pzbest[indexpbest] = znext[indexpbest]

x = xnext

y = ynext

vx = vnextx

**(72)** vy = vnexty

best[K] = minz.cpu().numpy()

return gxbest, gybest , minz, best

def main():

pop, xmax, xmin, niter = 10000, 10, -10, 10

wmax = 0.9

wmin = 0.4

c1 = 2.05

c2 = 2.05

xbest, ybest, fitbest, best = PSO(pop, xmax, xmin, niter, wmax, wmin, c1, c2)

print(xbest)

print(ybest)

print(fitbest)

t = np.linspace(0,niter,niter)

plt.plot(t, best, 'k.-')

plt.show()

main()

感谢这么多的帮助。

回答:

好吧;它通过使用GPU为我工作!

8.0557 [torch.cuda.FloatTensor的大小1(GPU 0)]

9.6666 [torch.cuda.FloatTensor的大小1(GPU 0)]

-19.2107 [torch.cuda .FloatTensor大小为1(GPU 0)]

以上是 使用Pytorch加速PSO算法? 的全部内容, 来源链接: utcz.com/qa/264138.html

回到顶部