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
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.