在循环中交换多维数组中的元素的正确方法是什么?

2024-09-30 05:17:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一段代码,它在一个表中运行,并且具有“pxover”的可能性,可以交换其中的一些元素。哪些元素应该交换,找到的概率为0.5。算法在找到两个元素时进行交换。评估表的组成如下:

[[(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的数字。你知道吗

我做了一些研究并应用了这个答案:

Can't swap the elements in a list, Python

但同样的问题依然存在。你知道吗

另外,一些根本不应该改变值的元素,从随机位置获取元素!你知道吗

编辑:我将代码运行到一个调试器中,并按照交换顺序计算出:

 evaluation_table[i][element], evaluation_table[j][element] = evaluation_table[j][element], evaluation_table[i][element]

它不仅随机交换i和j的内容,还随机交换一个或两个以上的内容。怎么回事?你知道吗


Tags: 代码in元素ifcounttableelementselement
1条回答
网友
1楼 · 发布于 2024-09-30 05:17:05

正如我所想,这与表单元格之间的引用有关。有趣的是,当我复制表格时,同样的问题仍然存在。我所做的是解决这个问题,是深入复制每个行分别。所以,我在这里发布解决方案:

xover_positions = []
for i in range(pop):
    xover_positions.append(deepcopy(evaluation_table[i]))

然后使用“xover\u positions”表进行交换。似乎存在前一个函数中表的行之间的关系,所以这就解决了这个问题。你知道吗

相关问题 更多 >

    热门问题