Bonjour,
J'avais codé un programme récursif Tours de Hanoi qui imprime chaque étape (sous forme de listes) du jeu
(toutes les étapes de résolution les unes à la suite des autres)
Maintenant, pour un projet d'apprentissage par renforcement (paradigme différent de la récursion donc),
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 # Tours de Hanoi n = 3 # nombre de disques depart = [ n-i for i in range(n)] intermediaire = [] arrivee = [] tours = [depart, intermediaire, arrivee] def deplacer(depart, arrivee) : sommet_depart = 0 sommet_arrivee = 0 if len(tours[depart]) > 0 : sommet_depart = tours[depart][len(tours[depart]) - 1] if sommet_depart > sommet_arrivee and sommet_arrivee != 0 : print("erreur : sommet", depart, " > sommet", arrivee) # règles du Jeu else: tours[depart].pop(len(tours[depart]) - 1) tours[arrivee].append(sommet_depart) print(tours) ; print() def Hanoi(n, depart = 0, intermediaire = 1, arrivee = 2): if n > 0 : Hanoi(n - 1, depart, arrivee, intermediaire) deplacer(depart, arrivee) Hanoi(n - 1, intermediaire, depart, arrivee) Hanoi(n) # Résulat : [[3, 2], [], [1]] [[3], [2], [1]] [[3], [2, 1], []] [[], [2, 1], [3]] [[1], [2], [3]] [[1], [], [3, 2]] [[], [], [3, 2, 1]]
j'ai besoin de créer une liste d'états (ou étapes si vous voulez) du jeu, liste qui se remplit au fur et
à mesure que mon agent d'apprentissage explore (ce sera par un random() dans un premier temps dans le cas du
Quality-learning justement) son environnement des Tours de hanoi (les règles ayant été correctement implémentées
comme je l'ai fait).
Donc j'aimerais obtenir ceci par exemple (dans le cas idéal ou l'agent remplit sa "liste d'exploration" (ordonnée) en
réussissant le jeu en une seule partie s'il connaît le principe de récursivité (ce n'est pas le cas) ) :
Pour expliquer le problème auquel je suis confronté, je vous montre ce qui marche avec ce code test suivant
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 Espace_des_etats_explorés = [ [[3, 2], [], [1]] , [[3], [2], [1]] , [[3], [2, 1], []] , [[], [2, 1], [3]] , [[1], [2], [3]] , [[1], [], [3, 2]] , [[], [], [3, 2, 1]] ]
puis ce qui ne marchera pas avec le même raisonnement par la suite. .
Quand vous examinez ce code ci-dessus vous observez bien que la liste "space" se remplit au fur et à mesure de
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 space = [] temp = [[] for i in range(4)] j = -1 print(j) temp[j] = [] print(temp[j]) space.append(temp[j]) print(space) ; print() j += 1 print(j) temp[j] = [0] print(temp[j]) space.append(temp[j]) print(space) ; print() j += 1 print(j) temp[j] = [1] print(temp[j]) space.append(temp[j]) print(space) ; print() j += 1 print(j) temp[j] = [2] print(temp[j]) space.append(temp[j]) print(space) #sortie: -1 [] [[]] 0 [0] [[], [0]] 1 [1] [[], [0], [1]] 2 [2] [[], [0], [1], [2]]
l'incrémentation du compteur j, et ce avec des listes différentes les unes des autres.
Cependant si j'injecte le même processus dans le programme suivant :
Des idées ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91 #Tours de Hanoi n = 3 Depart = [ n - i for i in range(n)] Intermediaire = [] Arrivee = [] Tours = [ Depart, Intermediaire, Arrivee] Space = [ [[ n - i for i in range(n)], [], []] ] Temp = [ [] for i in range(n**3)] j = 0 def move(Depart, Arrivee): sommet_D = 0 sommet_A = 0 if len(Tours[Depart]) > 0 : sommet_D = Tours[Depart][len(Tours[Depart]) - 1] if len(Tours[Arrivee]) > 0 : sommet_A = Tours[Arrivee][len(Tours[Arrivee]) - 1] if sommet_D > sommet_A and sommet_A != 0 : print("Error") else : global j #on oublie pas le global Tours[Depart].pop(len(Tours[Depart]) - 1) Tours[Arrivee].append(sommet_D) print(Tours) # La liste Tours change à chaque fois print(j) # Vérification de j bien incrémenté Temp[j] = Tours # affectation : print(Temp[j]) # On vérifie bien qu'on place Tours # (à chaque fois une liste différente) à une variable incrémentée également # différente à chaque fois (j ième élément de la liste globale Temp) Space.append(Temp[j]) # La liste est donc censée se remplir au fur et # à mesure avec des listes Tours différentes (comme dans le code test plus haut) print(Space) # MAIS on se retrouve avec j +1 fois la même liste Tours (à # l'état/étape correspondant/e du jeu) à chaque # incrémentation de j j += 1 # compteur j incrémenté pour la phase suivante.... def hanoi(n, Depart = 0, Intermediaire = 1, Arrivee = 2): if n > 0 : hanoi(n - 1, Depart, Arrivee, Intermediaire) move(Depart, Arrivee) hanoi(n - 1, Intermediaire, Depart, Arrivee) hanoi(n) Out : [[3, 2], [], [1]] #Première étape du jeu (liste Tours) 0 # vérification du compteur j [[3, 2], [], [1]] # vérification de la variable Temp[j] ainsi différente à chaque phase, contenant alors Tours # Space : [[[3, 2, 1], [], []], [[3, 2], [], [1]]] # jusqu'ici tout va bien avec .append( Temp[0]) [[3], [2], [1]] # état (étape) suivant(e) du jeu des tours de Hanoi, liste différente de la précédente 1 # idem compteur vérifié [[3], [2], [1]] # idem la NOUVELLE variable Temp[j = 1] contient le NOUVEL état du jeu (liste Tours actualisée),c'est vérifié # print(Space.append(Temp[1] = Tours) ): [[[3, 2, 1], [], []], [[3], [2], [1]], [[3], [2], [1]]] #?? # pas logique, # 2 fois la même liste Tours ajoutée à l'étape 3 # (ensuite ce sera 6 fois la même liste à l'étape finale 7 juste à la suite de l'élément initial) # On devrait à mon sens obtenir: [[[3, 2, 1], [], []], [[3, 2], [], [1]], [[3], [2], [1]]] # Des listes différentes comme prévu (?) ... puis même observation ... rien ne va plus pour toute la suite et fin, même problème!
Merci !!
Partager