неподдерживаемые типы операндов для -: 'list' и 'list';решать с массивами? - PullRequest
0 голосов
/ 07 декабря 2018

В настоящее время я имею дело с вышеуказанным кодом.

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib import cm
import sympy 
import numpy as np
import random

Q = [None, None]
K = [None, None, None]
f = np.zeros((201, 201))
K[2] = f
X = []

d = 2
global_best_position = []
global_best_error = 10000
vec=np.random.rand(d)
R1=np.diag(vec)
vec=np.random.rand(d)
R2=np.diag(vec)

def akley(x, dim, a=20, b=0.2, c=2*np.pi):
    sum1 = 0
    sum2 = 0
    for i in range(2):
        sum1 += x[i]**2
        sum2 += np.cos(c*x[i])
    sum_sq_term = -a * np.exp(-b * np.sqrt(sum1) / 2)
    cos_term = -np.exp((sum2) / 2)
    Z = a + np.exp(1) + sum_sq_term + cos_term
    return Z

def plot_akley_2d():
    global d
    ymin, ymax, xmin, xmax = -16, 16, -16, 16

    for i in range(d):
        Q[i] = np.linspace(xmin, xmax, 201)

    for i in range(d):
        K[0], K[1]= np.meshgrid(Q[0], Q[1])

    for i in range(201):
        for h in range(201):
            u = [K[0][i][h], K[1][i][h]]
            u = np.array(u)
            K[2][i][h] = akley(u, 2)
    d = plt.contourf(K[0], K[1], K[2], 20, cmap=cm.rainbow)
    plt.ylim((ymin, ymax)), plt.xlim((ymin, ymax)), plt.colorbar(d);

class Particle():
    def __init__(self):
        global d
        self.position = []
        self.velocity = []
        self.best_position  = []
        self.best_error = 0
        self.error = 0

        for i in range(2):
            self.position.append(random.uniform(-16, 16))
            self.velocity.append(random.uniform(-1, 1))

        self.best_position = self.position
        self.error = akley(self.position, d)
        self.best_error = self.error
        self.evaluate_position()


    def evaluate_position(self):
        global d, global_best_position, global_best_error
        self.error = akley(self.position, d)
        if self.error < self.best_error:
            self.best_error = self.error
            self.best_position = self.position
            if self.best_error < global_best_error:
                global_best_position = self.best_position
                global_best_error = self.best_error

    def update_particle(self, w=0.5, c1=2, c2=2):
        global R1, R2, global_best_position
        self.velocity = self.velocity + c1*(self.best_position-self.position)*R1 + c2*(global_best_position - self.position)*R2
        self.position = self.position + self.velocity
        self.evaluate_position()

class PSO():
    def __init__(self, iterations, num_particles):
        self.particle_list = []
        self.iterations = iterations

        for i in range(num_particles):
            self.particle_list.append(Particle())

    def optimize(self):
        for i in range(self.iterations):
            for j in range(len(self.particle_list)):
                self.particle_list[j].update_particle()

PSO1 = PSO(100, 10)
PSO1.optimize()

print(global_best_error)
print(global_best_position)

При его выполнении я получаю следующую ошибку:

File "<ipython-input-47-e1f278f8304b>", line 84, in update_particle
self.velocity = self.velocity + c1*(self.best_position-self.position)*R1 + c2*(global_best_position - self.position)*R2

TypeError: unsupported operand type(s) for -: 'list' and 'list'

Я уже провел поиск, и мне кажется, что я не могу вычесть два списка друг из друга.Я пытался преобразовать их все в массивы, но, к сожалению, это вызывает еще больше ошибок в моем коде.Я проверил размеры всех списков, и это должно работать, я просто очень не уверен, как подходить к операциям матрицы / списка.

1 Ответ

0 голосов
/ 07 декабря 2018

В идеале преобразование в numpy массивов было бы наилучшим способом действий.Затем вы можете вычесть напрямую или использовать np.subtract().

. Если вы хотите обойти другие ошибки в своем коде, вы можете использовать списочные выражения, хотя они не будут такими же быстрыми, как простые операции:

например

... c2*[global_best_position[i] - self.position[i] for i in range(len(global_best_position))]...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...