我编写了一个用于在Python中使用遗传算法计算函数最大值的代码。这是here。
当我想更改数组的值时,出现错误:
def _crossover_chromosomes(chromosome1,chromosome2):
crossover_chrom = Chromosome()
for i in range(8):
if random.random() >= 0.5:
crossover_chrom.get_genes()[0][i] = chromosome1.get_genes()[0][i]
crossover_chrom.get_genes()[1][i] = chromosome1.get_genes()[0][i]
else:
crossover_chrom.get_genes()[0][i] = chromosome2.get_genes()[0][i]
crossover_chrom.get_genes()[1][i] = chromosome2.get_genes()[0][i]
return crossover_chrom
在这部分中,'对于'只运行一次,当它想要更改第五行中的数组值时,退出程序。
错误:
crossover_chrom.get_genes()[0][i] = chromosome1.get_genes()[0][i]
TypeError: 'str' object does not support item assignment
答案 0 :(得分:0)
Python字符串是不可变的。您不能拥有a='10010110'
并指定a[3]='1'
。这是导致错误的原因。你需要避免字符串。请改用bool
数组或integers
数组。
类似的东西:
class Chromosome:
def __init__(self):
self._genes = [[],[]]
self._fitness = 0
self.xd = 0
self.yd = 0
xd = random.randint(0,256)
self._genes[0] = [ int(xd/2**i%2) for i in reversed(range(8))]
yd = random.randint(0,256)
self._genes[1] = [ int(yd/2**i%2) for i in reversed(range(8))]
答案 1 :(得分:0)
我可能错了,但看看你提供的内容似乎是
crossover_chrom.get_genes()[0]
返回一个字符串。所以你试图通过索引为字符串分配一个新值,因此错误。 如果分配给一个字符串是你想要的(也就是在第i个位置更改字符串的单个字符),你可以这样做:
crossover_chrom.get_genes()[0] = "{0}{1}{2}".format(
crossover_chrom.get_genes()[0][:i],
chromosome1.get_genes()[0][i],
crossover_chrom.get_genes()[0][i+1:])
或更好的方法是,为了清楚起见,将值分别分配给临时变量,并避免每次都调用get_gene函数:
orig_gene=crossover_chrom.get_genes()[0]
new_gene1=chromosome1.get_genes()[0]
#...
orig_gene = "{0}{1}{2}".format(
orig_gene[:i],
new_gene1[i],
orig_gene[i+1:])
否则你必须将字符串转换为列表(只需在对象上调用list即可:
list(crossover_chrom.get_genes()[0])
或修改get_genes()以返回列表而不是字符串列表。
答案 2 :(得分:0)
在python中解决字符串不变性的一种方法是重建字符串。 这是在某个索引处将字符更改为upercase的示例:
index=3
string="abcdefgh"
string= string[:index]+string[index].upper()+ string[index+1:]
print(string)
这将打印出来:
abcDefgh