我需要通过以下方式获取排列:我有N
个插槽,并且该插槽可以填充从1 to D
开始的变量。为了获得所有可能的排列,我写了一个循环,给了我各种可能性。循环看起来有点“奇怪”,因为它是需要可变的嵌套循环。此循环将需要两天才能完成(对于我的N = 8,D = 25的条件),但是我只需要排列,其中插槽中变量的总和等于"D"
。
import numpy as np
from tqdm import tqdm
N = 4 # actualy 8
D = 16 # actually 25
test = np.ones(shape=N)
for k in range(0,pow(D-1,N)):
if sum(test) == D:
print("this is a suiting fit!",test)
# last one gets always changed
if test[N-1]+1 < D:
test[N-1] += 1
else:
test[N-1] = 1
for idx in range(2,len(test)+1):
if test[len(test) -idx] + 1 < D:
test[len(test) - idx] += 1
break
else:
test[len(test) - idx] = 1
由于上述循环可能看起来有些混乱,因此我将其注册到嵌套循环中
for i in range(0,D-1):
for j in range(0,D-1):
for k in range(0,D-1):
for l in range(0,D-1):
if k+1+l+1+j+1+i+1 == D:
print("this is a suting fit!",k+1,l+1,j+1,i+1)
我无法理解如何通过简化或通过遍历排列之前应用条件来使其更快地获得任何帮助,感激不尽]
您可以使用排列并给出长度。
[我可能没有完全理解这个问题,但是,如果我这样做,这种完全不同的方法将在几秒钟内解决N=8
,D=25
实例。