|
|
|
|
| 请大家帮我看看这个函数为什么运行以后为什么对参数没有起作用~谢谢 |
|
|
|
[Original]
[Print]
[Top]
|
是这样,想写一个类似于遗传算法的code,其中有一个交叉和变异(crossover&mutate)的部分,而个体是二维0,1数组,用下面的makeArray(1,0)生成:
def makeArray(a, b):
ROW = 18
COL = 20
A_PERC = .9
B_PERC = .1
total = ROW * COL
tempList = [a] * int(total * A_PERC) + * int(total * B_PERC)
random.shuffle(tempList)
return [tempList[COL*i:COL*i+COL] for i in range(ROW)]
下面的一段code中,前面三个bit_crossvoer(a,b),chromosome_crossover(a,b)和mutate(a)都是为第四个mate(A)所调用的,其中A是将n个个体(就是由makeArray(1,0)产生的n个二维数组)组成的list(感觉这样比较方便)。但是运行以后,唯一的变化就是将A中的元素颠倒了一个顺序放到了Children中,而并没有进行crossover和mutate,实在想不出来是怎么回事,请大家帮我看看吧~
def bit_crossover(a,b):
crossover_point = random.randint(0,19)
if random.random() <= 0.7:
c = a[:crossover_point]+b[crossover_point:]
d = b[:crossover_point]+a[crossover_point:]
a = c
b = d
return a, b
def chromosome_crossover(a,b):
for i in range(len(a)):
a[i], b[i] = bit_crossover(a[i],b[i])
def mutate(a):
for i in range(len(a)):
for j in range(len(a[i])):
if random.random() <= 0.001:
if a[i][j] == 1:
a[i][j] = 0
else:
a[i][j] = 1
return a
def mate(A):
global Children
Children = []
for i in range(len(A)/2):
B = random.sample(A,2)
for j in range(2):
A.__delitem__(A.index(B[j]))
chromosome_crossover(B[0],B[1])
mutate(B[0])
mutate(B[1])
Children.extend(B)
举个例子:
a1,a2,a3,a4 = GA.makeArray(1,0),GA.makeArray(1,0),GA.makeArray(1,0),GA.makeArray(1,0)
A = [a1,a2,a3,a4]
mate(A)
运行以后,Children[0]总会和a1-a4中的一个相同,Children[1],Children[2],Children[3]也是一样。并没有进行crossover和mutate,实在想不出来为什么了。
对不起,不知道为什么这里发贴code中的空格显示不出,我把code放到附件里面了。
|
|
|
--
|
|
[Original]
[Print]
[Top]
|
|
|