错误返回列表索引必须是整数或切片,而不是第121行的元组



我有这个当前群体,其中我指定了群体中的数量

[[10000]
[00010]
[01000]]
[[10000]
[10000]
[00001]]
.
.
.
[[01000]
[00100

我正在尝试选择和交叉。。。遗传算法步骤

这是以上人群的代码

for i in range(nbrofindv):
init_pop = numpy.zeros(pop_size, dtype=int)
init_pop = init_pop.astype(int)
k = 0
l = 0
for k in range(taskn):
l = random.randrange(solperpop - 1)
init_pop[k][l] = 1
arr.append(l)
matlist.append(init_pop)

这就是适应度函数

def cal_fitness(task1 , task2 , task3 , matix , mmax,array):
fitness = numpy.empty(len(matix))
S1=numpy.empty(len(matix),dtype=int)
z=0
for i in range(len(matix)):
S1[i] = task1[array[0+z]]+task2[array[1+z]]+task3[array[2+z]]
z+=3
if S1[i] <= mmax:
fitness[i] = S1[i]
else :
fitness[i] = 0
return fitness.astype(int)

当我尝试选择时

def selection(fitness, num_parents, population):
fitness = list(fitness)
parents = numpy.empty((num_parents, len(population)))
for i in range(num_parents):
max_fitness_idx = numpy.where(fitness == numpy.max(fitness))
parents[i,:] = population[max_fitness_idx[0][0], :]
fitness[max_fitness_idx[0][0]] = -999999
return parents.astype(int)
print(selection(cal_fitness(t1,t2,t3,matlist,300,arr),2,matlist))

它返回列表索引必须是整数或切片而不是元组

这是完整的代码

import numpy
import random
import pandas
wsn = numpy.arange(1, 6)
taskn = 3
t1 = numpy.random.randint(30, 200, size=len(wsn))
t2 = numpy.random.randint(30, 200, size=len(wsn))
t3 = numpy.random.randint(30, 200, size=len(wsn))
print('nGenerated Data:tnnNumber   t Task 1  t   Task 2  t   Task 3n')
ni = min(len(t1), len(t2), len(t3))
for i in range(ni):
print('t {0}    t   {1}    t    {2}  tt {3}n'.format(wsn[i], t1[i], t2[i], t3[i]))
print('nn')
qmin = 50
qmax = 140
for i in range(len(t1)):
if t1[i] <= qmin or t1[i] >= qmax:
# t1=numpy.delete(t1,i)
t1[i] = 0
for i in range(len(t2)):
if t2[i] <= qmin or t2[i] >= qmax:
# t2=numpy.delete(t2,i)
t2[i] = 0
for i in range(len(t3)):
if t3[i] <= qmin or t3[i] >= qmax:
# t3=numpy.delete(t3,i)
t3[i] = 0
i = 0
m = max(len(t1), len(t2), len(t3))
if t1[i] == 0 and t2[i] == 0 and t3[i] == 0:
t1 = numpy.delete(t1, i)
t2 = numpy.delete(t2, i)
t3 = numpy.delete(t3, i)
i += 1
solperpop = len(wsn)
gen = 20
j = 0
pop_size = (taskn, solperpop)
print('population size: {}'.format(pop_size))
# for j in range(ni):
#   pop_size=list(solperpop,taskn)
matlist = list()
print('nn')
i = 0
k = 0
nbrofindv=5
arr=[]
for i in range(nbrofindv):
init_pop = numpy.zeros(pop_size, dtype=int)
init_pop = init_pop.astype(int)
k = 0
l = 0
for k in range(taskn):
l = random.randrange(solperpop - 1)
# arr[i][k]=l
init_pop[k][l] = 1
arr.append(l)
matlist.append(init_pop)

print(arr)
count1 = 0
for m in range(len(matlist)):
print('n')
count1 += 1
print(matlist[m])
print('nnn')
pandas.set_option('display.max_columns',None)
pandas.set_option('display.width',None)
zipped=pandas.DataFrame(list(zip(*matlist)),columns=['Individual 1','Individual 2','Individual 3','Individual 4','Individual 5'])
print(zipped)
print('nn')
# print('the initial pop has ', count1, ' individuals')
i=0
for i in range(len(wsn)):
if t1[i] == 0:
if init_pop[0][i] != 0:
init_pop[0][i] == 0
if t2[i] == 0:
if init_pop[1][i] != 0:
init_pop[1][i] == 0
if t3[i] == 0:
if init_pop[2][i] != 0:
init_pop[2][i] == 0

def cal_fitness(task1 , task2 , task3 , matix , mmax,array):
fitness = numpy.empty(len(matix))
S1=numpy.empty(len(matix),dtype=int)
z=0
for i in range(len(matix)):
S1[i] = task1[array[0+z]]+task2[array[1+z]]+task3[array[2+z]]
z+=3
if S1[i] <= mmax:
fitness[i] = S1[i]
else :
fitness[i] = 0
return fitness.astype(int)
# print(len(matlist),len(cal_fitness(t1,t2,t3,matlist,250)))
#print('tn  individual  t fitness n')
fitness=cal_fitness(t1,t2,t3,matlist,300,arr)
ni=len(matlist)
w=0
for i in range(ni):
print('individual:',wsn[i],' | fitness:',fitness[i])
print('tn {0}   t t  t n'.format(matlist[i]))
print('nn')

def selection(fitness, num_parents, population):
fitness = list(fitness)
parents = numpy.empty((num_parents, len(population)))
for i in range(num_parents):
max_fitness_idx = numpy.where(fitness == numpy.max(fitness))
parents[i,:] = population[max_fitness_idx[0][0], :]
fitness[max_fitness_idx[0][0]] = -999999
return parents.astype(int)
print(selection(cal_fitness(t1,t2,t3,matlist,300,arr),2,matlist))
def crossover(parents, num_offsprings):
offsprings = numpy.empty((num_offsprings, parents.shape[1]))
crossover_point = int(parents.shape[1]/2)
crossover_rate = 0.5
i=0
while (parents.shape[0] < num_offsprings):
parent1_index = i%parents.shape[0]
parent2_index = (i+1)%parents.shape[0]
x = random.random()
if x > crossover_rate:
continue
parent1_index = i%parents.shape[0]
parent2_index = (i+1)%parents.shape[0]
offsprings[i,0:crossover_point] = parents[parent1_index,0:crossover_point]
offsprings[i,crossover_point:] = parents[parent2_index,crossover_point:]
i+=1
return offsprings

population在您的示例中是数组列表,因此您不能将其作为数组进行索引。使用[max_fitness_idx[0][0], :]是类似数组的索引;因此,这条线将被卡住:

parents[i, :] = population[max_fitness_idx[0][0], :]
# population:
# [array([[0, 1, 0, 0, 0],
#        [1, 0, 0, 0, 0],
#        [1, 0, 0, 0, 0]]), array([[0, 0, 0, 1, 0],
#        [0, 0, 1, 0, 0],
#        [0, 0, 1, 0, 0]]), array([[0, 0, 1, 0, 0],
#        [0, 1, 0, 0, 0],
#        [0, 0, 0, 1, 0]]), array([[0, 0, 0, 1, 0],
#        [1, 0, 0, 0, 0],
#        [0, 1, 0, 0, 0]]), array([[0, 0, 0, 1, 0],
#        [0, 1, 0, 0, 0],
#        [0, 1, 0, 0, 0]])]

如果我们需要这样的索引,那么一种方法是通过np.array(population)population列表转换为numpy数组,该数组将具有形状(5, 3, 5),因此np.array(population)[max_fitness_idx[0][0], :]将具有形状(3, 5):

np.array(population)[max_fitness_idx[0][0], :]
# [[0 0 1 0 0]
#  [0 0 1 0 0]
#  [1 0 0 0 0]]          <-- below examples will refer to it

由于parents的形状是(2, 5)parents[i, :]的形状是(5, ),因此不能将上述代码的3 * 5 = 15值仅分配给parents行中的5位置。我不知道代码会做什么,但如果你想要这样的索引,你必须为二维指定另一个行号,例如:

[max_fitness_idx[0][0], 2, :]
# [1 0 0 0 0]
parents[i, :]
# [4.065923e-215 8.124414e-206 1.1446152e-200 2.287846e-191 9.8291696e-182]
parents[i, :] = np.array(population)[max_fitness_idx[0][0], 2, :]
parents[i, :]
# [1. 0. 0. 0. 0.]

或者,您可以在不将列表转换为NumPy数组的情况下完成此操作,但可以通过列表索引一步一步进行,例如:

population[max_fitness_idx[0][0]]
# [[0 0 1 0 0]
#  [0 0 1 0 0]
#  [1 0 0 0 0]]          <==
population[max_fitness_idx[0][0]][2]
# [1 0 0 0 0]] 
parents[i, :] = population[max_fitness_idx[0][0]][2]
parents[i, :]
# [1. 0. 0. 0. 0.]

运行代码为:

wsn = numpy.arange(1, 6)
taskn = 3
t1 = numpy.random.randint(30, 200, size=len(wsn))
t2 = numpy.random.randint(30, 200, size=len(wsn))
t3 = numpy.random.randint(30, 200, size=len(wsn))
# print('nGenerated Data:tnnNumber   t Task 1  t   Task 2  t   Task 3n')
ni = min(len(t1), len(t2), len(t3))
# for i in range(ni):
#     print('t {0}    t   {1}    t    {2}  tt {3}n'.format(wsn[i], t1[i], t2[i], t3[i]))
# print('nn')
qmin = 50
qmax = 140
for i in range(len(t1)):
if t1[i] <= qmin or t1[i] >= qmax:
# t1=numpy.delete(t1,i)
t1[i] = 0
for i in range(len(t2)):
if t2[i] <= qmin or t2[i] >= qmax:
# t2=numpy.delete(t2,i)
t2[i] = 0
for i in range(len(t3)):
if t3[i] <= qmin or t3[i] >= qmax:
# t3=numpy.delete(t3,i)
t3[i] = 0
i = 0
m = max(len(t1), len(t2), len(t3))
if t1[i] == 0 and t2[i] == 0 and t3[i] == 0:
t1 = numpy.delete(t1, i)
t2 = numpy.delete(t2, i)
t3 = numpy.delete(t3, i)
i += 1
solperpop = len(wsn)
gen = 20
j = 0
pop_size = (taskn, solperpop)
# print('population size: {}'.format(pop_size))
# for j in range(ni):
#   pop_size=list(solperpop,taskn)
matlist = list()
# print('nn')
i = 0
k = 0
nbrofindv = 5
arr = []
for i in range(nbrofindv):
init_pop = numpy.zeros(pop_size, dtype=int)
init_pop = init_pop.astype(int)
k = 0
l = 0
for k in range(taskn):
l = random.randrange(solperpop - 1)
# arr[i][k]=l
init_pop[k][l] = 1
arr.append(l)
matlist.append(init_pop)
# print(arr)
count1 = 0
for m in range(len(matlist)):
# print('n')
count1 += 1
# print(matlist[m])
# print('nnn')
pandas.set_option('display.max_columns', None)
pandas.set_option('display.width', None)
zipped = pandas.DataFrame(list(zip(*matlist)), columns=['Individual 1', 'Individual 2', 'Individual 3', 'Individual 4', 'Individual 5'])
# print(zipped)
# print('nn')
# print('the initial pop has ', count1, ' individuals')
i = 0
for i in range(len(wsn)):
if t1[i] == 0:
if init_pop[0][i] != 0:
init_pop[0][i] == 0
if t2[i] == 0:
if init_pop[1][i] != 0:
init_pop[1][i] == 0
if t3[i] == 0:
if init_pop[2][i] != 0:
init_pop[2][i] == 0

def cal_fitness(task1, task2, task3, matix, mmax, array):
fitness = numpy.empty(len(matix))
S1 = numpy.empty(len(matix), dtype=int)
z = 0
for i in range(len(matix)):
S1[i] = task1[array[0 + z]] + task2[array[1 + z]] + task3[array[2 + z]]
z += 3
if S1[i] <= mmax:
fitness[i] = S1[i]
else:
fitness[i] = 0
return fitness.astype(int)

# print(len(matlist),len(cal_fitness(t1,t2,t3,matlist,250)))
# print('tn  individual  t fitness n')
fitness = cal_fitness(t1, t2, t3, matlist, 300, arr)
ni = len(matlist)
w = 0
# for i in range(ni):
#     print('individual:',wsn[i],' | fitness:',fitness[i])
#     print('tn {0}   t t  t n'.format(matlist[i]))
#
# print('nn')

def selection(fitness, num_parents, population):
fitness = list(fitness)
parents = numpy.empty((num_parents, len(population)))
for i in range(num_parents):
max_fitness_idx = numpy.where(fitness == numpy.max(fitness))
parents[i, :] = population[max_fitness_idx[0][0]][2]      # <== modified
fitness[max_fitness_idx[0][0]] = -999999
return parents.astype(int)

parents = selection(cal_fitness(t1, t2, t3, matlist, 300, arr), 2, matlist)  # <== modified

def crossover(parents, num_offsprings):
offsprings = numpy.empty((num_offsprings, parents.shape[1]))
crossover_point = int(parents.shape[1] / 2)
crossover_rate = 0.5
i = 0
while parents.shape[0] < num_offsprings:
parent1_index = i % parents.shape[0]
parent2_index = (i + 1) % parents.shape[0]
x = random.random()
if x > crossover_rate:
continue
parent1_index = i % parents.shape[0]
parent2_index = (i + 1) % parents.shape[0]
offsprings[i, 0:crossover_point] = parents[parent1_index, 0:crossover_point]
offsprings[i, crossover_point:] = parents[parent2_index, crossover_point:]
i += 1                       # <== modified
return offsprings                # <== modified
print(crossover(parents, 2))         # <== modified

我试图说明错误的原因(因为这是这个问题的标题和目的)以及如何纠正它,假设编写的代码满足OP的需要;没有根据OP的需要提出新的代码

最新更新