#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.