【问题标题】:What is the correct way to swap elements in multidiamensional arrays in loops?在循环中交换多维数组中元素的正确方法是什么?
【发布时间】:2018-07-27 06:17:45
【问题描述】:

我有一段代码在表格中运行,并且具有“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),ka 数大于 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 的内容,还会随机交换另外一两个的内容。怎么回事?

【问题讨论】:

    标签: python loops multidimensional-array swap


    【解决方案1】:

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

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

    然后使用“xover_positions”表进行交换。似乎存在上一个函数中表的行之间的关系,所以这就解决了。

    【讨论】:

      猜你喜欢
      • 2011-05-15
      • 2014-03-06
      • 1970-01-01
      • 2018-07-30
      • 2015-03-03
      • 1970-01-01
      • 1970-01-01
      • 2014-03-10
      • 1970-01-01
      相关资源
      最近更新 更多