2017-03-22 3 views
1

j'ai construire un programme qui trouvent 8 constantes différentes dans cette équation:8 boucles imbriquées de combinaison possible

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) 

en utilisant la force brute (a-h < = 5). mais cela prend vraiment beaucoup de temps (je sais, je sais que vous n'avez pas besoin de le dire) comment puis-je accélérer ce processus?

fondamentalement, ceci est mon code. en réalité, mon programme en possède 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 

Y a-t-il un moyen efficace de connaître le a-h sans force brute? ou tout algorithme pour faire fonctionner mon code de manière efficace?

+1

Je n'ai aucune idée ce que vous essayez de faire, mais suppose que 'itertools' est la clé pour le faire moins verbeusement. Aussi 5 ** 8 itérations est trivial pour un ordinateur moderne. Quoi que vous fassiez, la boucle elle-même n'est pas le goulot de la bouteille. Peut-être que c'est toute cette impression. –

+0

L'utilisation de la classe 'array' de' numpy' vous permettrait de réécrire ceci comme une opération vectorielle et devrait être beaucoup plus rapide que les boucles for. – Craig

+0

Est-ce que 292 (+ - 5) signifie que votre solution a une tolérance de +/- 5? – Crispin

Répondre

0

Je pense que cela va faire assez rapidement et vous donner toute bonne config ainsi:

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 
+0

cela fonctionne, mais comme je ne trouve pas de solution correspondante pour tous leur. puis-je changer l'étape de 'range (5)' à 0.1? – aji

+0

Vous pouvez utiliser 'np.arange (0,5,0.1)'. – Julien