Как я могу создать список спецификаций c вместо списка всех перестановок - PullRequest
0 голосов
/ 07 мая 2020

Если я использую следующий код, он создает все списки перестановок данного списка.

def permutation_list(items, i = 0):
    if i == len(items):
        yield items
    else:
        for j in range(i, len(items)):
            items[i], items[j] = items[j], items[i]
            for x in permutation_list(items, i + 1):
                yield x
            items[i], items[j] = items[j], items[i]    

for x in permutation_list([1,2,3,4], i = 0):
    print(x)

Вывод:

[1, 2, 3, 4]
[1, 2, 4, 3]
[1, 3, 2, 4]
[1, 3, 4, 2]
[1, 4, 3, 2]
[1, 4, 2, 3]
[2, 1, 3, 4]
[2, 1, 4, 3]
[2, 3, 1, 4]
[2, 3, 4, 1]
[2, 4, 3, 1]
[2, 4, 1, 3]
[3, 2, 1, 4]
[3, 2, 4, 1]
[3, 1, 2, 4]
[3, 1, 4, 2]
[3, 4, 1, 2]
[3, 4, 2, 1]
[4, 2, 3, 1]
[4, 2, 1, 3]
[4, 3, 2, 1]
[4, 3, 1, 2]
[4, 1, 3, 2]
[4, 1, 2, 3]

Но я хочу определить другой функция, которая генерирует только список c . В моем списке целых чисел от 1 до n , и я хочу сгенерировать список некоторых c перестановок, который удовлетворяет следующим условиям.

1) Сумма любые два члена сгенерированной perm должны быть минимум s (скажем, s = 3 или 5). e, g Если мы рассмотрим [1, 2, 3, 4] и s = 4, сумма будет (1,2) = 3, (2,3) = 5, (3,4) = 7, минимальная сумма здесь равно 3, что меньше s = 4. Поэтому я не хочу создавать эту химическую завивку. Но предположим, что [4, 1, 3, 2], сумма равна (4,1) = 5, (1,3) = 4, (3,2) = 5, поэтому минимальная сумма равна 4. Что равно s. Так что это обязательно.

2) В любом perm (списке) должно быть не менее r (скажем, r = 2 или 4) пар последовательных терминов, которые являются четно-нечетными или нечетно-четными числами. Например, в [4, 1, 3, 2] четно-нечетные пары - это (4,1) и (3,2). В [9, 3, 6, 8, 2, 5, 1, 4, 7] четно-нечетные пары - это (3,6), (2,5), (1,4) и (4,7). Минимальное количество таких четно-нечетных пар должно быть r.

Таким образом, в определении моей функции будут еще две переменные:

def my_permutation_list(items, m, r, i = 0):

Примечание: я хочу применить l oop в этом списке, поэтому он должен быть повторяемым. Если я использую функцию permutations из itertools , она показывает MemoryError для списка большей длины.

counter=0
for combi in my_permutation_list(list(range(1,14)), 4, 5, i = 0): 
    vlh=[] #helper
    for i in range(13):
        for j in range(13):
                if a[i][j] == 1: #a is an two dimensional array
                    if (combi[i] + combi[j]) != 0 and i>j:
                         vlh.append(combi[i] + combi[j])

приведенный выше минимальный пример. Заранее спасибо.

...