Python 卡交换排列

Python 卡交换排列,python,algorithm,data-structures,permutation,playing-cards,Python,Algorithm,Data Structures,Permutation,Playing Cards,所以我有一整副随机排列的牌。我的目标是找到4张牌,这样当它们的位置被交换时,将产生一副总方差最小的牌。所以我需要进行两次卡交换 牌组的总方差定义为牌组内连续牌之间距离的总和 距离定义为等级之间的差异,因此黑桃A和梅花9之间的距离为9-1=8 所以总方差需要求和1和2,2和3,3和4之间的距离,依此类推 卡交换只是更改卡在阵列/列表中的位置 这实际上是作业的第二部分。 第一部分要求我计算出一次掉期的最小总方差。本质上,我使用了两个for循环来迭代地改变卡片的位置,同时将卡片组的总方差与改变的位置进

所以我有一整副随机排列的牌。我的目标是找到4张牌,这样当它们的位置被交换时,将产生一副总方差最小的牌。所以我需要进行两次卡交换

牌组的总方差定义为牌组内连续牌之间距离的总和

距离定义为等级之间的差异,因此黑桃A和梅花9之间的距离为9-1=8

所以总方差需要求和1和2,2和3,3和4之间的距离,依此类推

卡交换只是更改卡在阵列/列表中的位置

这实际上是作业的第二部分。 第一部分要求我计算出一次掉期的最小总方差。本质上,我使用了两个for循环来迭代地改变卡片的位置,同时将卡片组的总方差与改变的位置进行比较。我的感觉是,第一次掉期解决方案中的暴力方法可能不适用于两次掉期

这是一个交换解决方案的代码片段:

for i, first_card in enumerate(data):
    new_deck = data
    TV= 600
    for j, second_card in enumerate(data):
        old_card = new_deck[i]
        new_deck[i] = second_card
        new_deck[j]= old_card
        new_TV = distance_cal(new_deck)
        if new_TV <TV:
            TV = new_TV
            TV_arr[i] = new_TV
            first_card = new_deck[i]
            second_card = new_deck[j]
            dict_list[i]= {"first_card":first_card,"second_card":second_card}
        new_deck = data

你的问题是什么?@Alex Reynolds练习的目标是在随机排列的牌组中找到最好的4张牌进行交换,以获得该牌组绝对差异的最小总和,其中,绝对差值定义为连续卡片之间的差值。提示1:必须在距离上求和的大多数术语与原始未触及卡片中的术语相同。我希望运行这个函数需要时间。看看你能不能想出一个函数,在交换一对卡片后,只需1倍的时间就可以计算出方差的变化。3次交换速度慢,4次交换不可行。有270725种方法可以从52张牌中选择4张牌。然后有3种方法将卡片分成2对。因此,您需要计算总共812175次的方差。如果允许使用itertools包,则可以使用组合范围52、4中的for cards生成索引。循环卡内部将是一个元组,包含四张卡的索引。如果没有itertools,您将需要编写四个嵌套循环来选择索引。提示2:如果可能使用更快的算法,则需要调查输入的属性和可以进行的交换。这里有一个可能有用的方法:请注意,如果第一张和第三张牌是3和10,第二张牌在3和10之间(含3和10),那么不管第二张牌是什么,这三张牌的方差正好是10-3=7。