8嵌套循环可能的组合

时间:2017-03-22 03:25:17

标签: python equation brute-force

我已经构建了一个程序,在这个等式中找到8个不同的常量:

a*40  +b*0  +c*3  +d*10 +e*10 +f*0  +g*9   +h*7.5 =292(+-5)
a*4   +b*7  +c*5  +d*3  +e*0  +f*0  +g*7   +h*0   =63(+-5)
a*0   +b*6  +c*3  +d*0  +e*0  +f*5  +g*7   +h*0   =85(+-5)
a*175 +b*50 +c*50 +d*75 +e*75 +f*50 +g*110 +h*50  =635(+-5)

使用强力(a-h <= 5)。 但这需要很长时间(我知道,我知道你不需要说) 我怎样才能加快这个过程?

基本上,这是我的代码。实际上我的程序中有4个:

chofound=[]
konstanta=[5,5,5,5,5,5,5,5]
##    konstanta=[10,0,5,8,2,0,4,
for h in range(0,5):
    for g in range(0,5):
        for f in range(0,5):
            for e in range(0,5):
                for d in range(0,5):
                    for c in range(0,5):
                        for b in range(0,5):
                            for a in range(0,5):
                                hasil= a*konstanta[0]+\
                                       b*konstanta[1]+\
                                       c*konstanta[2]+\
                                       d*konstanta[3]+\
                                       e*konstanta[4]+\
                                       f*konstanta[5]+\
                                       g*konstanta[6]+\
                                       h*konstanta[7]

                                if (hasil>=(292-5) and hasil <=(292+5)):

                                    asd=[a,b,c,d,e,f,g,h]
                                    print ("found with config: {}".format(asd))
                                    chofound.append(asd)


return chofound

有没有有效的方法来实际知道没有暴力的a-h?或任何使我的代码高效运行的算法?

1 个答案:

答案 0 :(得分:0)

我认为这样做的速度非常快,并为您提供了所有良好的配置:

import numpy as np
from itertools import product

konstanta = np.array([5,5,5,5,5,5,5,5])

configs = np.array(list(product(range(5),repeat=8))) # big array: iterating over rows is equivalent to your 8 nested for loops
hasil = (konstanta*configs).sum(axis=1) # element wise multiplication followed by sum over rows
good_configs = configs[(hasil>=0) & (hasil<=10)] # keep only rows where `hasil` is in desired range