web-dev-qa-db-ja.com

100未満の組み合わせの数

異なるグループに属する13のリストがあります。

  • グループA(リスト1)

  • グループB(リスト2)、(リスト3)、(リスト4)、(リスト5)、(リスト6)

  • グループC(リスト7)、(リスト8)、(リスト9)、(リスト10)、(リスト11)

  • グループD(リスト12)、(リスト13)

すべてのグループの合計は1になる必要があります

  • グループAは0〜0.7の値を取ることができます

  • グループBは0〜0.6の値を取ることができます

  • グループCは0〜0.9の値を取ることができます

  • グループDは0〜0.1の値を取ることができます

これらのリストがグループの制限を超えずに作成できるさまざまな組み合わせをすべて見つけたいと思っています。

例えば:

1つの組み合わせの場合、List2要素= 0.6、List3、List4、List5、およびList6は0でなければなりません

それを行う簡単な方法はありますか? (RまたはPythonを使用できます)

(リストは0からグループの制限まで、.1の増分で値をとります)

# i.e. 
List1=[0.0,0.1,0.2,...,0.7]
List2 = [0.0,0.1,0.2,...,0.6]
# etc.
7

新しい質問に応じて編集された回答


合理的に速いリスト内包表記を使用できます。次のコードは、私のPCで数秒しかかかりませんでした。 John Colemanのアイデアを使用して、グループごとの合計の可能な組み合わせを最初に見つけました。浮動小数点数ではなく整数も使用しました。質問で述べたように、ソリューションを問題に戻すには、すべてのリストの値を10で割ります。

from itertools import product

A = range(8)  # 1 value from this group
B = range(7)  # 5 values from this group (with replacement)
C = range(10) # 5 values from this group (with replacement)
D = range(2)  # 2 values from this group (with replacement)

# use John Coleman's idea:
# first find all possible combinations of sums per group
groupsums = [sums for sums in product(A, B, C, D) if sum(sums) == 10]
print(len(groupsums))  # -> 95

def picks(maxi, n):
    """Returns list of combinations of n integers <= maxi 
       that sum to maxi."""
    return [combi for combi in product(range(maxi + 1), repeat=n)
                  if sum(combi) == maxi]

# make list of lists that each have 13 items from the above ranges, 
# with constraints as stated in the question
samples = [[a, b0, b1, b2, b3, b4, c0, c1, c2, c3, c4, d0, d1] 
           for a, b, c, d in groupsums
           for b0, b1, b2, b3, b4 in picks(b, 5)
           for c0, c1, c2, c3, c4 in picks(c, 5)
           for d0, d1 in picks(d, 2)]

# show the first 5 and last 5 results
for i in range(5):
    print(samples[i])
print('...')
for i in range(1, 6):
    print(samples[-i])

# show the number of solutions
print(len(samples))
95
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 1]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 1, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 8, 0, 1]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 8, 1, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 7, 0, 1]
...
[7, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[7, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[7, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[7, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
[7, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
313027
2
Arne