Probléme de variable dans algo minimax
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 )
Citation:
classe branche
=> arborescence_en_cours
=> evaluation_en_cours
==> methode d ajout_coup
==> methode de suppression dernier coup
Citation:
classe algo
=> branche_en_cours as branche
=> etc etc
==> fonction minimax
voila la fonction
:
Code:
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
Citation:
'création de la branche de refelerence
Dim local_best_eval As Integer = 0
Dim local_best_arbo As String = ""
qui etait au préalable :
Citation:
dim branche_local as new branche ( etc etc...)
ou je créais une branche local, en modifiant la suite en consequence
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)
Citation:
'création de la branche de refelerence
Dim local_best_eval As Integer = 0
Dim local_best_arbo As String = ""
j ai donc changé par ca pour essayer d identifier le pb
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 :)