bonjour,
je viens a vous en dernier recours, j' ai testé pas mal de chose mais rien n y a fait...
j ai hésité a poster dans algo, mais je ne pense pas que ce soit celui ci qui peche, il y a surement un fondement vb.net que je ne maitrise pas et qu il me reste a découvrir ...
petite intro, pour centrer les choses, je suis un un moteur d echecs en vb.net
je me penche donc vers un minimax ( l alphabeta suivra bien entendu .. )
et pour ce faire j ai : ( préciser pour comprendre le code )
classe branche
=> arborescence_en_cours
=> evaluation_en_cours
==> methode d ajout_coup
==> methode de suppression dernier coup
classe algo
=> branche_en_cours as branche
=> etc etc
==> fonction minimax
voila la fonction
:
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 Public Function minimax(ByRef chessboard As bitboard, ByVal profondeur As Integer) As branche 'création de la branche de refelerence Dim local_best_eval As Integer = 0 Dim local_best_arbo As String = "" 'si feuille : 0 If profondeur = 0 Then 'dans ce cas, on retourne l evaluatoion de la branche entiere branche_en_cours.eval_en_cours = evaluator.eval(chessboard) Return branche_en_cours ' End If ' création de la liste de coups possible Dim mvts As New mouvement.list_of_move mvts = chessboard.generate_move 'pour chaque coup possible For i = 0 To mvts.moves.Count - 1 ' on ajoute le coup a l echiquier chessboard.jouer(mvts.moves.Item(i)) 'on ajoute au png branche.add_move(mvts.moves.Item(i), branche_en_cours.arborescence_en_cours) ' on ajoute une node add_nodes() 'si blanc on minimise( puisque on recoi une reponse noir maximisé ) If chessboard.parametre_game.trait = constante.couleur.blanc Then best_branche = minimax(chessboard, profondeur - 1) If local_best_arbo = "" Then local_best_arbo = best_branche.arborescence_en_cours local_best_eval = best_branche.eval_en_cours Else ' la branche la mieux evaluer est la meilleurs ( on maximise ) If local_best_eval > best_branche.eval_en_cours Then local_best_eval = best_branche.eval_en_cours local_best_arbo = best_branche.arborescence_en_cours Else ' on ne fait rien la branche en cours est la meilleur End If End If 'si noir on minimise ( puisque on recoi une reponse noir minimise ) Else best_branche = minimax(chessboard, profondeur - 1) If local_best_arbo = "" Then local_best_arbo = best_branche.arborescence_en_cours local_best_eval = best_branche.eval_en_cours Else ' la branche la moins evaluer est la meilleurs ( on minimise ) If local_best_eval < best_branche.eval_en_cours Then local_best_eval = best_branche.eval_en_cours local_best_arbo = best_branche.arborescence_en_cours Else ' on ne fait rien la branche en cours est la mini End If End If End If ' on dejoue le coup chessboard.dejouer(mvts.moves.Item(i)) branche.supp_last_move(branche_en_cours.arborescence_en_cours) Next best_branche.arborescence_en_cours = local_best_arbo best_branche.eval_en_cours = local_best_eval Return best_branche End Function
explication du pb :
1) cette partie la
qui etait au préalable :'création de la branche de refelerence
Dim local_best_eval As Integer = 0
Dim local_best_arbo As String = ""
ou je créais une branche local, en modifiant la suite en consequencedim branche_local as new branche ( etc etc...)
pb 1 cette solution me renvoi une arborescence vide !!
pointeur ? autre chose ? ( c pas vb qui gere les pointeurs ??? ! )
cette variable est locale comment peut elle etre vide puisqu elle correspond a la meilleurs reponse ( minimisé ou maximisé de l etage en dessous !!! )
en faisant cela retour toujours nul quelque soit la profondeur ...
2) un début de solution ( qui ne me convient pas vraiment)
j ai donc changé par ca pour essayer d identifier le pb'création de la branche de refelerence
Dim local_best_eval As Integer = 0
Dim local_best_arbo As String = ""
et la miracle : a profondeur de 1 ca fonctionne ( pour l instant il ne fait que que la balance materiel et sort donc le coup correspondant a la prise immédiate de la plus grosse pièce a prendre... )
le pb intervient a une profondeur supérieur
2/3 etc etc
et la le bug est le suivant
le minimax renvoi des qu un gain est possible ( est donc qu il max ou min )
des valeurs bizarres sur l arbo ( l eval semble elle correcte )
ex :
0 | e1d1 c7c6 => correct
-960 | a1b1 d1c1 d1e1 e1d1 c7c6 => incorrect
-960 | c2d1 a1b1 e1d1 => incorrect
on est a une profondeur de 2
il présente plusieurs coups blancs et un coup noir ...
pb de variable comme precedement ??
pb d algo , la suppression de la branche en cours est mal placé ???
pb de compréhension de l algo ( proceder autrement ) ???
bref, merci davance
l
ps : dsl d en avoir mis autant :p
pps : s il vous manque des elements, dites le![]()
Partager