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
'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 :
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)
'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