перестановки и комбинации itertools - PullRequest
0 голосов
/ 29 октября 2018

Я борюсь с использованием перестановок и комбинаций itertools вместе. В конечном счете, я пытаюсь создать матрицу возможных комбинаций Клиентов на разных машинах. Я считаю, что у меня есть часть комбинаций, но я не смог добавить перестановки в сценарий.

Вот мой код:

import itertools

Mach = [1,2,3,4]
Cust = [1,2,3,4,5,6,7,8,9,10,11,12]

a = len(Cust)

for n in range(a):
    print list(itertools.combinations(Cust,n))
    n = n+1

В идеале я хотел бы решить все возможные выводы:

1 - 1,2,3
2 - 4,5,6
3 - 7,8,9
4 - 10,11,12

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

Обновление: Прости мое невежество, использование Продукта не обязательно обеспечивает результаты, к которым я стремился. То, что я пытаюсь сделать, - это создать список клиентов на машинах, причем каждый клиент отражается только на одном компьютере (за один раз), а затем итеративно создавать другую матрицу этой комбинации; для всех возможных комбинаций. Я считаю, что это комбинация, а не проблема перестановки, так как для вывода я считаю 1: 1, 2, 3 и 1: 3, 2, 1 одинаковыми.

Пример: (Cust1, Mach1); (Cust2, Mach1); (Cust3, Mach2); (Cust4, Mach2); (Cust5, Mach2); (Cust6, Mach3); (Cust7, Mach3); (Cust8, Mach3); (Cust9, Mach3); (Cust10, Mach3); (Cust11, Mach4); (Cust12, Mach4)

Далее следует (в качестве примера): (Cust1, Mach1); (Cust2, Mach2); (Cust3, Mach2); (Cust4, Mach2); (Cust5, Mach2); (Cust6, Mach3); (Cust7, Mach3); (Cust8, Mach3); (Cust9, Mach3); (Cust10, Mach4); (Cust11, Mach4); (Cust12, Mach4)

и т.д ...

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Вот рекурсивное решение, которое использует itertools.combination. Идея состоит в том, чтобы выбрать комбинацию для первой машины, а затем рекурсивно генерировать комбинации для оставшихся клиентов и машин.

Это решение было разработано в Python3, но должно работать для Python2.

код

import itertools

def group_combinations(machines, customers):
    if not machines:
        yield {}
    else:
        for group in itertools.combinations(customers, len(customers) // len(machines)):
            remaining = [c for c in customers if c not in group]
            for others in group_combinations(machines[1:], remaining):
                arrangement = {machines[0]: group}
                arrangement.update(others)
                yield arrangement

Пример

machines = [1, 2]
customers = [1, 2, 3, 4]
groups = group_combinations(machines, customers)

for comb in groups:
    print(comb)

Выход

{1: (1, 2), 2: (3, 4)}
{1: (1, 3), 2: (2, 4)}
{1: (1, 4), 2: (2, 3)}
{1: (2, 3), 2: (1, 4)}
{1: (2, 4), 2: (1, 3)}
{1: (3, 4), 2: (1, 2)}
0 голосов
/ 29 октября 2018

Ни product, ни combinations на самом деле не то, что вы хотите. Вы хотите соединить каждый элемент Mach с набором элементов из Cust.

n = len(cust)/len(m)
for i, m in enumerate(mach):
    print(m, cust[n*i: n*(i+1)])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...