在循环中交换多维数组中的元素的正确方法是什么?
What is the correct way to swap elements in multidiamensional arrays in loops?
我有一段代码 运行 通过 table 并且概率为 "pxover",交换其中的一些元素。哪些元素应该交换,概率为 0.5。当找到两个元素时,该算法会进行交换。 evaluation_table阵型是这样的:
[[(x11,y11),(x12,y12), ... (x1el,y1el)],[(x21,y21),(x22,y22), ...,
(x2el,y2el)], ... ,[(xpop1,ypop1),(xpop2,ypop2), ..., (xpopel,ypopel)]]
代码如下:
def crossover(evaluation_table, pop, no_of_elements, pxover):
xover_positions = []
chosen_count = 0
for i in range(pop):
x = uniform(0,1)
if x<=pxover:
chosen_count = chosen_count + 1
if chosen_count % 2 == 0:
for element in range(no_of_elements):
element_swap_prop = uniform(0, 1)
if element_swap_prop <= 0.5:
evaluation_table[i][element], evaluation_table[j][element] = evaluation_table[j][element], evaluation_table[i][element]
else:
j = i
xover_positions.append(evaluation_table[i])
但是,代码没有正确交换所有元素。一些元素被正确交换,而另一些元素与正确的索引 "el" 但错误的索引 "pop" 交换。
例如 (x11,y11) 应该与 (x31,y31) 交换,但只有第一个替换第二个,而第一个替换 (xk1,xk2) 的 k 大于 3 .
我做了一些研究并应用了这个答案:
但同样的问题仍然存在。
另外,一些根本不应该改变值的元素,从随机位置获取元素!
编辑:我运行将我的代码放入调试器中并按交换顺序计算出:
evaluation_table[i][element], evaluation_table[j][element] = evaluation_table[j][element], evaluation_table[i][element]
它不仅会随机交换i和j的内容,还会随机交换一两个以上的内容。怎么回事?
正如我所想,它与 table 单元格之间的引用有关。有趣的是,当我深度复制 table 时,同样的问题仍然存在。我为解决此问题所做的是分别对每个行进行深度复制。所以,我post这里的解决方案:
xover_positions = []
for i in range(pop):
xover_positions.append(deepcopy(evaluation_table[i]))
然后使用 "xover_positions" table 进行交换。上一个函数的 table 的行之间似乎存在关系,所以这就解决了。
我有一段代码 运行 通过 table 并且概率为 "pxover",交换其中的一些元素。哪些元素应该交换,概率为 0.5。当找到两个元素时,该算法会进行交换。 evaluation_table阵型是这样的:
[[(x11,y11),(x12,y12), ... (x1el,y1el)],[(x21,y21),(x22,y22), ...,
(x2el,y2el)], ... ,[(xpop1,ypop1),(xpop2,ypop2), ..., (xpopel,ypopel)]]
代码如下:
def crossover(evaluation_table, pop, no_of_elements, pxover):
xover_positions = []
chosen_count = 0
for i in range(pop):
x = uniform(0,1)
if x<=pxover:
chosen_count = chosen_count + 1
if chosen_count % 2 == 0:
for element in range(no_of_elements):
element_swap_prop = uniform(0, 1)
if element_swap_prop <= 0.5:
evaluation_table[i][element], evaluation_table[j][element] = evaluation_table[j][element], evaluation_table[i][element]
else:
j = i
xover_positions.append(evaluation_table[i])
但是,代码没有正确交换所有元素。一些元素被正确交换,而另一些元素与正确的索引 "el" 但错误的索引 "pop" 交换。
例如 (x11,y11) 应该与 (x31,y31) 交换,但只有第一个替换第二个,而第一个替换 (xk1,xk2) 的 k 大于 3 .
我做了一些研究并应用了这个答案:
但同样的问题仍然存在。
另外,一些根本不应该改变值的元素,从随机位置获取元素!
编辑:我运行将我的代码放入调试器中并按交换顺序计算出:
evaluation_table[i][element], evaluation_table[j][element] = evaluation_table[j][element], evaluation_table[i][element]
它不仅会随机交换i和j的内容,还会随机交换一两个以上的内容。怎么回事?
正如我所想,它与 table 单元格之间的引用有关。有趣的是,当我深度复制 table 时,同样的问题仍然存在。我为解决此问题所做的是分别对每个行进行深度复制。所以,我post这里的解决方案:
xover_positions = []
for i in range(pop):
xover_positions.append(deepcopy(evaluation_table[i]))
然后使用 "xover_positions" table 进行交换。上一个函数的 table 的行之间似乎存在关系,所以这就解决了。