Ошибка типа: объект ‘list’ не вызывается, проблема с передачей сгенерированного массива на вторую итерацию

#python #python-3.x #list #numpy

#python #python-3.x #Список #numpy

Вопрос:

Я пытаюсь выполнить 500 итераций в задаче оптимизации. Я вношу некоторые изменения в массив pop, а затем пытаюсь снова передать его на следующую итерацию, однако сталкиваюсь с ошибкой, хотя первая итерация работает нормально, я получаю массив pop, а затем передаю его в created_moved_pop и create_star_pop и получаю некоторые проблемы. Буду очень благодарен, если кто-нибудь объяснит мне, почему это происходит

трассировка ошибки C:UsersyuliyPycharmProjectsmethod_deform_starsvenvScriptspython.exe C:/Users/yuliy/PycharmProjects/method_deform_stars/DS.py [0.8575697060274371, 0.8802225709314421, 0.6098937002728221, 0.5482650148523068, 0.5395302259903021, 0.6330576538506912, 0.734280095260012, 0.6826885236666879, 0.5797401283594749, 0.8381278588403586, 0.4983449567579089, 0.37081148554598065, 0.19916270916904044, 0.7590390380364216, 0.8272752130297748, 0.8837021413140848, 0.9750382019031415, 0.5436068899712437, 0.6490739970397773, 0.3014768191053475] Обратная трассировка (последний последний вызов): Файл «C:/Users/yuliy/PycharmProjects/method_deform_stars/DS.py «, строка 70, в star_pop = create_star_pop(pop) [(0.11503376215798591, 6.794025806650792), (0.5133530350808552, 1.0230252795290697), (0.37081148554598065, 0.8887201815324006), (0.4201038734097051, 0.8215339609930865), (0.6098937002728221, 0.7952234761836543), (0.19916270916904044, 0.7689552603259296), (0.250319764137194, 0.7111682294644993), (0.3014768191053475, 0.7008819653567403), (0.6582300480283956, 0.6632231712798371), (0.6666685334677784, 0.658688271415733), (0.7646482839856097, 0.6322183223530311), (0.8120560994714594, 0.6155315414048562), (0.7590390380364216, 0.59962403681057), (0.8609150000772217, 0.569512653796447), (0.8083043720319294, 0.5354111445749077), (0.620024614496207, 0.4887918787850577), (0.5035114962372264, 0.4844464118877576), (0.8670977366853939, 0.48321853250106644), (0.5541193285153655, 0.4821747663938167), (0.8575697060274371, 0.47491541406252397)] Файл «C:/Users/yuliy/PycharmProjects/method_deform_stars/DS.py «, строка 60, в create_star_pop new_element = star_pop(население) Ошибка типа: объект ‘list’ не вызывается [0.11503376215798591, 0.5133530350808552, 0.37081148554598065, 0.4201038734097051, 0.6098937002728221, 0.19916270916904044, 0.250319764137194, 0.3014768191053475, 0.6582300480283956, 0.6666685334677784, 0.7646482839856097, 0.8120560994714594, 0.7590390380364216, 0.8609150000772217, 0.8083043720319294, 0.620024614496207, 0.5035114962372264, 0.8670977366853939, 0.5541193285153655, 0.8575697060274371]

Процесс завершен с кодом выхода 1

 import numpy as np
import math
import random
import operator

# Global variables
a = 0.1
b = 1


def function(x):
    return (math.sin(40*math.pi*x) math.pow(x-1, 4))/(2*x)


def initial_pop():
    pop = np.random.uniform(a, b, 20)
    pop = pop.tolist()
    return pop


def moving_pop(population):
    # e c
    rand_item = population[random.randrange(len(population))]
    # print(rand_item)
    direction_arr = [-1, 1]
    direction = direction_arr[random.randrange(len(direction_arr))]
    # print(direction)
    new_element = rand_item   direction * np.random.normal(0, 0.2)
    if new_element > b:
        extra = new_element - b
        new_element = a   extra
    if new_element < a:
        extra = abs(new_element - a)
        new_element = b - extra
    # print(new_element)
    return new_element


def create_moved_pop(population):
    new_population = []
    for x in range(0, 20):
        new_element = moving_pop(population)
        new_population.append(new_element)
    # print(new_population)
    return new_population


def star_pop(population):
    random_item1 = population[random.randrange(len(population))]
    random_item2 = population[random.randrange(len(population))]
    while random_item2 == random_item1:
        random_item2 = population[random.randrange(len(population))]
    e_star = (random_item1   random_item2)/2
    return e_star


def create_star_pop(population):
    star_population = []
    for x in range(0, 20):
        new_element = star_pop(population)
        star_population.append(new_element)
    # print(new_population)
    return star_population


pop = initial_pop()
print(pop)
for i in range(0, 500):
    moved_pop = create_moved_pop(pop)
    star_pop = create_star_pop(pop)
    pop_combined = sorted(sorted(pop)   sorted(moved_pop)                   
sorted(star_pop))
    y_array = []
    for x in range(0, len(pop_combined)):
        y_array.append(function(pop_combined[x]))
    x_y_array = dict(zip(pop_combined, y_array))

    sorted_x_y_array = sorted(x_y_array.items(), key=operator.itemgetter(1), reverse=True)
    sorted_x_y_array = sorted_x_y_array[0:20]
    print(sorted_x_y_array)
    pop.clear()
    for x in sorted_x_y_array:
        pop.append(x[0])
    print(pop)
  

Комментарии:

1. Пожалуйста, добавьте к своему вопросу полное сообщение об ошибке, которое вы получаете, включая трассировку стека . Это избавляет от необходимости просматривать код, пытаясь определить, какая строка может вызывать сообщение об ошибке. И это, в свою очередь, скорее всего, даст вам полезный ответ.

Ответ №1:

вы переопределяете star_pop как список

 star_pop = create_star_pop(pop)
  

найдите приведенный ниже исправленный код

 import numpy as np
import math
import random
import operator

# Global variables
a = 0.1
b = 1


def function(x):
    return (math.sin(40*math.pi*x) math.pow(x-1, 4))/(2*x)


def initial_pop():
    pop = np.random.uniform(a, b, 20)
    pop = pop.tolist()
    return pop


def moving_pop(population):
    # e c
    rand_item = population[random.randrange(len(population))]
    # print(rand_item)
    direction_arr = [-1, 1]
    direction = direction_arr[random.randrange(len(direction_arr))]
    # print(direction)
    new_element = rand_item   direction * np.random.normal(0, 0.2)
    if new_element > b:
        extra = new_element - b
        new_element = a   extra
    if new_element < a:
        extra = abs(new_element - a)
        new_element = b - extra
    # print(new_element)
    return new_element


def create_moved_pop(population):
    new_population = []
    for x in range(0, 20):
        new_element = moving_pop(population)
        new_population.append(new_element)
    # print(new_population)
    return new_population


def star_pop(population):
    random_item1 = population[random.randrange(len(population))]
    random_item2 = population[random.randrange(len(population))]
    while random_item2 == random_item1:
        random_item2 = population[random.randrange(len(population))]
    e_star = (random_item1   random_item2)/2
    return e_star


def create_star_pop(population):
    star_population = []
    for x in range(0, 20):
        new_element = star_pop(population)
        star_population.append(new_element)
    # print(new_population)
    return star_population


pop = initial_pop()
print(pop)
for i in range(0, 500):
    moved_pop = create_moved_pop(pop)
    star_pop_ = create_star_pop(pop)
    pop_combined = sorted(sorted(pop)   sorted(moved_pop)                   
sorted(star_pop_))
    y_array = []
    for x in range(0, len(pop_combined)):
        y_array.append(function(pop_combined[x]))
    x_y_array = dict(zip(pop_combined, y_array))

    sorted_x_y_array = sorted(x_y_array.items(), key=operator.itemgetter(1), reverse=True)
    sorted_x_y_array = sorted_x_y_array[0:20]
    print(sorted_x_y_array)
    pop.clear()
    for x in sorted_x_y_array:
        pop.append(x[0])
    print(pop)
  

Комментарии:

1. Ну, сейчас это не выдает ошибку, однако каждая итерация должна создавать разные значения, и я получаю одинаковые значения со второй итерации и так далее

Ответ №2:

Вы получили метод с именем star_pop и объект с именем star_pop во 2-й итерации цикла for, который вы пытаетесь выполнить

     new_element = star_pop(population)
  

после выполнения

 star_pop = create_star_pop(pop)
  

который возвращает список

Я думаю, вы перепутали свои имена. Вы можете исправить это, переименовав либо функцию, либо список star_pop.

Не связанный с этим, вам не нужно включать 0 в диапазон (0, 500). Диапазоны по умолчанию всегда начинаются с 0.