我正在尝试制作一个程序,如果某个条件通过,则将其从一组列表中删除,如果某个其他条件发生,则将其复制。但是我有以下问题:程序在100的迭代50中时,它会标记IndexError并关闭。
这是我遇到问题的代码段:
nnl_len = len(neuralNetworkList) # longitud de lista de objetos
fitl_copy = fitness # lista de floats
best_fitness_reproduced = 0
if worst_fitness < 0 and first_iteration == 0: # supongo que esto se
worst_fitness = 0 # puede ignorar
for i in range(nnl_len):
print(i)
if fitl_copy[i] < best_fitness: # LINEA EXACTA DEL ERROR <------------------
print("I DIED WITH A FITNESS OF ",fitness[i], ", BEING THE LIMIT ",best_fitness)
neuralNetworkList.pop(i)
x.pop(i)
y.pop(i)
fitness.pop(i)
colors.pop(i)
elif fitl_copy[i] == best_fitness and best_fitness_reproduced:
print("I DIED BECAUSE A TOP FITNESS CREATURE ALREADY REPRODUCED ",fitness[i])
neuralNetworkList.pop(i)
x.pop(i)
y.pop(i)
fitness.pop(i)
colors.pop(i)
else:
best_fitness_reproduced = 1
for j in range(99): # plus the mother is 100
print("I SURVIVED WITH A FITNESS OF ",fitness[i], ", BEING THE LIMIT ",best_fitness)
neuralNetworkList.append(neuralNetworkList[i])
if random.randint(1,3) == 1:
neuralNetworkList[i].mutate(i)
x.append(width)
y.append(height)
fitness.append(0)
newcolor = []
for h in range(3):
newcolor.append(round( colors[i][h]*random.choice((0.9, 1.1)) ))
colors.append(newcolor)
#except IndexError:
# pass
# print("I NEITHER DIED NOR REPRODUCED BECAUSE OF AN INDEX ERROR")
nnl_len = len(neuralNetworkList)
for i in range(nnl_len):
x[i] = width
y[i] = height
fitness[i] = 0
print("population after reproduction:", len(neuralNetworkList))
更新:
回溯(最近通话最近):
文件“ C:\ Users \ User \ Desktop \ Archivos pavos \ Sublime Text 3 \ pruebas_phyton.pyw“,第4921行,如果fitl_copy [i] < best_fitness:#Fitness [i] <=最差健身* 4 IndexError:列表索引 超出范围
答案 0 :(得分:1)
当程序在100的迭代50中时,它将标记IndexError并关闭。
这是线索;问题发生在过程的一半。这是尝试remove from a list while iterating over it的标志;每次循环时都删除一个元素,因此50次之后i == 50
仍然只有50个元素在列表中,因此索引超出范围。
为什么会这样?好吧...
fitl_copy = fitness # lista de floats
这不会复制fitness
;它使fitness
成为另一个名称。
因此,这两行...
if fitl_copy[i] < best_fitness:
# ...
fitness.pop(i)
在同一列表上操作;和繁荣。
我认为您应该首先尝试重新考虑算法。我的猜测是,您根本不需要做所有从列表中弹出的操作。我认为,如果您:
重写,以便从头开始创建一个包含所有新生物的 new 列表(空列表)
在执行此操作时,请保留旧生物列表,然后将其替换为最后的新列表
您还可以从为动物使用某种结构化数据中受益,而不是拥有所有属性的平行列表。以及使用列表推导和生成器代替for循环。