Лучший способ генерировать все матрицы 0-1, которые являются стохастыми строк c со всеми суммами столбцов положительными? - PullRequest
0 голосов
/ 16 февраля 2020

Я пытаюсь эффективно сгенерировать список всех матриц 9 на 3, где каждая матрица удовлетворяет следующим свойствам:

  1. Каждая запись равна 0 или 1.
  2. Каждая строка равна 1.
  3. Каждый столбец содержит хотя бы один 1.

Мой первый подход был следующим:

  1. Создать список A всех матриц 0-1 размера 9 на 3.

     import numpy as np
     import itertools
     n=9
     k=3
     A=[np.reshape(np.array(i), (n,k)) for i in itertools.product([0, 1], repeat = n*k)]
    
  2. Извлечение из списка A тех, чьи суммы строк равны единице, а столбцы содержат в хотя бы одна положительная запись:

     matrix_list=[]
     N=len(A)
     for k in range(N):
         B=A[k]
         if (np.sum(B,axis=0)>1).all() and (np.sum(B,axis=1)==1).all():
             matrix_list.append(B)
    

Этот подход, на мой взгляд, работает, но он довольно неэффективен. Могу ли я как-то создать свой список матриц, просто подумав, как сгенерировать все возможные матрицы, которые получаются в результате взятия простой матрицы, S:

    S=np.matrix([[1,0,0],[1,0,0],[1,0,0],[1,0,0],[1,0,0],[1,0,0],[1,0,0],[1,0,0],[1,0,0]])

, и создать все возможные матрицы, которые получаются в результате перестановки записей в каждой строке, без включая две матрицы, чьи суммы столбцов (будь то столбец 0 или столбец 1) равны нулю?

1 Ответ

0 голосов
/ 16 февраля 2020

Друг, не отслеживающий мой вопрос, предложил это, что работает:

    from itertools import combinations
    matrices=[]
    nine=set(range(9))
    for i in range(1,9):
        for combinationI in combinations(nine,i):
            m=[0]*9
            for cI in combinationI:
                m[cI]=[1,0,0]
            remaining=nine.difference(combinationI)
            for j in range(1,9-i):
                for combinationJ in combinations(remaining,j):
                    matrix=m[:]
                    for cJ in combinationJ:
                        matrix[cJ]=[0,1,0]
                    r=remaining.difference(set(combinationJ))
                    for cR in r:
                        matrix[cR]=[0,0,1]
                    matrices.append(matrix)
...