Генерация всех возможных комбинаций с помощью N перестановок - PullRequest
0 голосов
/ 03 ноября 2019

У меня есть список списков ([[a,b,c],[d,e,f],[g,h,i]...]).

Я пытаюсь сгенерировать все возможные списки, которые достижимы из этого состояния, сделав N свопов в текущем состоянии, меняя элемент из списка однимиз другого списка.

Так, например, - поменять местами a с d, b с e и f с g (обратите внимание, что мы ищем N перестановок, которые возможны из ЭТОГО состояния)

ОднакоЯ не хочу выполнять фактический обмен, а скорее сгенерировать список инструкций для обмена, который также будет включать индекс sublist.

. Таким образом, пример вывода с N = 3 будет:

((1: a, 2: d), (1: b, 2: e), (1: c, 2: f))

(имеется в виду замена a с l1 на d с l2, замена b на l1 на e с l2, замена c на l1 на f с l2)

((1: a, 2: e), (1: b, 2: d), (1: c, 2: f))

((1: a, 3: g), (1: b, 3: h), (1: c, 3: i))

etc..

Тем не менее, большая проблема заключается в том, что первая инструкция подкачки и вторая приведут к в одном и том же списке , и я не уверен, как определить иэффективно устранять такие случаи.

Прямо сейчас я использую довольно глупый повторфункция Sive, которая не различает, был ли уже выполнен обмен или нет. Вот код:


def swap(list, num_of_swaps, current_swap, swap_instructions = []):
    for l1 in range(0,len(list)):
        for l2 in range(l1+1,len(list)):
            for e1 in list[l1]:
                for e2 in list[l2]:
                    swap_instructions.append({l1:{'add': e2, 'remove': e1},
                                              l2:{'add': e1, 'remove':e2}})

                    if current_round < max_repetitions:
                        swap(list, num_of_swaps, current_round+1, swap_instructions)

                    success = swap_and_do_checks(list, swap_instructions)
                    if success:
                        return swap_instructions

                    del swap_instructions[-1]

    return []

Я не уверен, как избежать повторения, если это не слишком дорого.

Буду признателен за вашу помощь.

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...