TypeError: объект 'list' не вызывается, проблема с передачей сгенерированного массива во вторую итерацию - PullRequest
0 голосов
/ 02 апреля 2019

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

трассировка ошибок C: \ Users \ yuliy \ PycharmProjects \ method_deform_stars \ venv \ Scripts \ python.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] Traceback (самый последний вызов последнего): Файл "C: /Users/yuliy/PycharmProjects/method_deform_stars/DS.py", строка 70, в star_pop = create_star_pop (pop) [(0.11503376215798591, 6.794025806650792), (0.513353035080) 0808 0808 0808 0680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080808080-230язкское КПК0,8215339609930865) (0,6098937002728221, 0,7952234761836543) (0,1991627091690404)4, 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 (популяции) TypeError: 'список' объект не вызываемая [+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,85756970604 * 0 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 100 * 100

Ответы [ 2 ]

0 голосов
/ 02 апреля 2019

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

    new_element = star_pop(population)

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

star_pop = create_star_pop(pop)

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

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

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

0 голосов
/ 02 апреля 2019

вы переопределяете 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...