Partage
  • Partager sur Facebook
  • Partager sur Twitter

aide optimisation

sudoku recuit simulé

    25 mai 2019 à 10:40:50

    bonjour à tous, je viens de passer 3 jours à réaliser ce code (qui marche :) ), mais qui résout le sudoku en 1h :(
    Je pense qu'il y a un moyen d'optimiser le code notamment dans la boucle for de programme recuit simulé, ou même dans les sous fonctions, mais je débute sur python...  Pourriez vous m'aider ?

    Merci d'avance

    import random
     import numpy
    
    def nbroccurences (grille,chiffre,i,j) :
        imini = i - (i%3)
        jmini = j - (j%3)
        compteur=0
        if grille[i][j]==chiffre:
            compteur = -3      #on ne compte pas wij
        
        for k in range (0,9) : #compte pour i donné (colonne)
            if grille[i][k] == chiffre :
                compteur = compteur +1
                
        for k in range (0,9): #compte pour j donné (ligne)
            if grille [k][j] == chiffre :
                compteur = compteur + 1 
                
        for k in range(imini, imini+3): #compte dans la sous-grille 
            for z in range(jmini, jmini +3) :
                if grille[k][z] == chiffre :
                    compteur = compteur +1
                
        return compteur
    
    def fonctioneconomique (w):#score
        a = 0
        for i in range (0,9):
            for j in range (0,9):
                a = a + nbroccurences(w,w[i][j],i,j) #formule du polycopié
        
        return 0.5*a
    
    
    
    def recuitsimule(w):
       
        delta=0.1
        ep=810
        T=ep
        i=random.randint(0,8)
        j=random.randint(0,8)
        grille=creerGrille(9,9) 
        
        L=[] #liste des indices des chiffres a ne pas modifier 
        for u in range (0,9):
            for v in range (0,9):
                if w[u][v]!=0:
                    L.append([u,v])
                grille[u][v]=w[u][v]
                
                
        while [i,j]  in L: #on crée un voisinage
            i=random.randint(0,8)
        grille[i][j] = random.randint(1,9)
      
        c= fonctioneconomique(grille)
        
        while T>0.002:
            for k in range(81):
                
            
            
                d = random.randint(0,8)
                b=random.randint(0,8)
            
                while [d,b] in L:  #choix de la case à modifier
                    d = random.randint(0,8)
                    b=random.randint(0,8)
                    
                
           
                    
                    
                t=grille[d][b] #valeur initiale
        
                cun=nbroccurences(grille,grille[d][b],d,b)
            
                grille[d][b] = random.randint(1,9) #on modifie le chiffre en i,j
                while grille[d][b]==t:     
                    grille[d][b]=random.randint(1,9)
            
           
                cdeux=nbroccurences(grille,grille[d][b],d,b) 
                    
                cprime = c-cun+cdeux #c(wprime)
                
                u=random.random()
                a=numpy.exp((-(cprime-c)/T))
                
                if cprime == 0: #si résolu
                    h=grille
                    return (h,cprime) 
                    
                elif  u <= a: #si cdeux < cun alors exp() >1 ==> (wprime est mieux que w)
                    c=cprime 
                       
                else : #on recupère la valeur initiale 
                    grille[d][b]= t
                print (T,c)   
            T= T / (1 + (numpy.log(1+delta)/(ep+1))*T)
           
        return grille,f
                
    def creerGrille(nombreLignes, nombreColonnes):
        grid = [[]] * nombreLignes
        for ligne in range(nombreLignes):
            grid[ligne] = [0] * nombreColonnes
        return grid    
    
    • Partager sur Facebook
    • Partager sur Twitter

    aide optimisation

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown