IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Recuit simulé


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 3
    Par défaut Recuit simulé
    Bonjour tout le monde.
    Je suis bloqué dans la réalisation d'un devoir en sodoku en VBA Excel avec la méthode recuit simulé.
    Si quelqu'un peut m'aider... merci d'avance .

  2. #2
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2019
    Messages : 4
    Par défaut permutation colonne
    bonjour chere communauté,
    j'ai un damier qui contient une solution initiale et je veux effectuer une fonction qui permute 2 colonnes si de dames se trouvent dans la meme diagonale
    si quelqu'un peut m'aider
    nb: la fonction doit effectuer une seul transformation
    j'espère que ma question est claire
    par exemple j'ai
    R 0 0 0
    0 R 0 0
    0 0 R 0
    0 0 0 R
    la fonction doit retourner
    0 R 0 0
    R 0 0 0
    0 0 R 0
    0 0 0 R

  3. #3
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 241
    Par défaut
    Bonjour,

    A debutante_vb, une proposition:

    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
    Dim NbLig As Byte, NbCol As Byte, Lig As Byte, i As Byte, L As Byte, C As Byte
     
    Sub Permut()
        Application.ScreenUpdating = False
        NbLig = [A100].End(xlUp).Row '
        NbCol = NbLig
     
        'Traitement de la diagonale gauche-droite
        'Ecriture de chaque valeur de la diagonale
        Cells(1, "J") = Application.WorksheetFunction.Bin2Dec(1 & Application.WorksheetFunction.Rept(0, NbCol - 1))
        For L = 2 To NbLig
            Cells(L, "J") = Cells(L - 1, "J") / 2
        Next L
     
        'Conversion binaire décimal de la grille -diagonale gauche-droite
        Lig = 1
        For L = 1 To NbLig
            ValBin = ""
            For C = 1 To NbCol
                ValBin = ValBin & Cells(L, C)
            Next C
            Cells(Lig, "K") = Application.WorksheetFunction.Bin2Dec(ValBin * 1)
            Lig = Lig + 1
        Next L
     
        For i = 1 To NbLig
            If Cells(i, "J") = Cells(i, "K") Then
                Lig = i
                For j = Lig + 1 To NbLig
                    If Cells(j, "J") = Cells(j, "K") Then
                        Val1 = Cells(i, "K")
                        Val2 = Cells(j, "K")
                        Cells(i, "K") = Val2
                        Cells(j, "K") = Val1
                        Appliquer_en_binaire
                        End
                    End If
                Next j
            End If
        Next i
     
        'Traitement de la diagonale droite-gauche
        'Ecriture de chaque valeur de la diagonale
        Cells(, "J") = 1
        For L = 2 To NbLig
            Cells(L, "J") = Cells(L - 1, "J") * 2
        Next L
     
        'Conversion binaire décimal de la grille -diagonale gauche-droite
        Lig = 1
        For L = 1 To NbLig
            ValBin = ""
            For C = 1 To NbCol
                ValBin = ValBin & Cells(L, C)
            Next C
            Cells(Lig, "K") = Application.WorksheetFunction.Bin2Dec(ValBin * 1)
            Lig = Lig + 1
        Next L
     
        For i = 1 To NbLig
            If Cells(i, "J") = Cells(i, "K") Then
                Lig = i
                For j = Lig + 1 To NbLig
                    If Cells(j, "J") = Cells(j, "K") Then
                        Val1 = Cells(i, "K")
                        Val2 = Cells(j, "K")
                        Cells(i, "K") = Val2
                        Cells(j, "K") = Val1
                        Appliquer_en_binaire
                        End
                    End If
                Next j
            End If
        Next i
    End Sub
     
    Sub Appliquer_en_binaire()
        'Restituer sous forme binaire
        Lig = 1
        For L = 1 To NbLig
             ValBin = Format(Application.WorksheetFunction.Dec2Bin(Cells(Lig, "K")), Application.WorksheetFunction.Rept(0, NbLig))
             For C = 1 To NbCol
                Cells(L, C) = Mid(ValBin, C, 1)
             Next C
             Lig = Lig + 1
        Next L
        Columns("J:K").ClearContents
    End Sub
    Avec le fichier
    Pièce jointe 444665

    Cdlt

  4. #4
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2019
    Messages : 4
    Par défaut
    bonjour,
    merci pour votre réponse mais cette algorithme fonctionne que pour les 2 diagonales et sauf si un seul diagonale est remplie mais je dois avoir les permutation même pour les diagonales supérieurs gauche et droite et les diagonales inférieurs
    pour être plus claire je mettrais un exemple
    0 R 0 0 0 0 0
    0 0 R 0 0 0 0
    0 0 0 R 0 0 0
    0 0 0 0 R 0 0
    0 0 0 0 0 R 0
    0 0 0 0 0 0 R
    0 0 0 0 0 0 0
    deviendra
    0 0 R 0 0 0 0
    0 R 0 0 0 0 0
    0 0 0 R 0 0 0
    0 0 0 0 R 0 0
    0 0 0 0 0 R 0
    0 0 0 0 0 0 R
    0 0 0 0 0 0 0

  5. #5
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 241
    Par défaut
    Bonjour,

    Excusez pour la réponse tardive mais je n'étais pas disponible.
    Voici la solution avec les modifs demandé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
    Option Compare Text
    Dim Lig As Byte, NbLig As Byte, NbCol As Byte, n As Byte, L As Byte, i As Byte, j As Byte
    Dim ValBin_A As String, ValBin_B As String
    Dim Mem_A As Byte, Mem_B As Byte, Mem_C As Byte
     
    Sub Permut()
        Application.ScreenUpdating = False
        NbLig = [A100].End(xlUp).Row '
        NbCol = NbLig
     
        For x = 1 To NbLig - 1
            Val_A = ""
            Multi = 2
            For y = 1 To NbCol
                Val_A = Val_A & Cells(x, y)
            Next y
            Mem_A = Application.WorksheetFunction.Bin2Dec(Val_A) * 1
            For p = x + 1 To NbLig
                Val_B = ""
                For q = 1 To NbCol
                    Val_B = Val_B & Cells(p, q)
                Next q
                Mem_B = Application.WorksheetFunction.Bin2Dec(Val_B) * 1
                If Mem_A = Mem_B * Multi Or Mem_A * Multi = Mem_B Then
                    If Mem_A = Mem_B * Multi Then
                        Mem_C = Mem_B
                        Mem_B = Mem_A
                        Mem_A = Mem_C
                    ElseIf Mem_A * Multi = Mem_B Then
                        Mem_C = Mem_A
                        Mem_A = Mem_B
                        Mem_B = Mem_C
                    End If
                    ValBin_A = Format(Application.WorksheetFunction.Dec2Bin(Mem_A), Application.WorksheetFunction.Rept(0, NbLig))
                    ValBin_B = Format(Application.WorksheetFunction.Dec2Bin(Mem_B), Application.WorksheetFunction.Rept(0, NbLig))
                    For C = 1 To NbCol
                       Cells(x, C) = Mid(ValBin_A, C, 1)
                    Next C
                    For C = 1 To NbCol
                       Cells(p, C) = Mid(ValBin_B, C, 1)
                    Next C
                    End
                Else
                    Multi = Multi * 2
                End If
            Next p
        Next x
    End Sub
    Le principe:
    On compare la valeur binaire constituée par chaque cellule de la première ligne aux valeurs binaires constituées par chaque cellule des lignes suivantes.
    Comme on recherche une valeur en diagonale, la valeur sur la ligne suivante par rapport à la première ne peut avoir qu'une valeur double ou de moitié, puis par rapport à la ligne suivante que le quadruple ou le quart, ainsi de suite.
    en clair: si la ligne 1 a une valeur binaire =00100000 soit en décimal 32 la ligne 2 ne peut prendre que les valeurs 01000000 soit 64 en décimal ou bien 00010000 soit 16 en décimal
    si la ligne 1 a une valeur binaire =00100000 soit en décimal 32 la ligne 3 ne peut prendre que les valeurs 10000000 soit 128 en décimal ou bien 00001000 soit 8 en décimal et ainsi de suite..
    si aucune de ces conditions ne sont réunis alors on teste la 2ème avec les autres et ainsi de suite jusqu'à ce qu'on trouve une valeur sur la même diagonale.

    avec le fichier
    Pièce jointe 446135

    cdlt

Discussions similaires

  1. Probleme Voyageur de Commerce - Recuit Simulé
    Par dinver dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 21/06/2009, 22h26
  2. demande d'un programme de recuit simulé
    Par salim_1 dans le forum C++
    Réponses: 5
    Dernier message: 21/01/2008, 09h56
  3. voyageur de commerce par recuit simulé
    Par siviuze dans le forum C
    Réponses: 6
    Dernier message: 11/01/2007, 16h14
  4. sudoku, recuit simulé
    Par mimst dans le forum Langage
    Réponses: 5
    Dernier message: 19/12/2006, 15h13
  5. Double recuit simulé
    Par bbefa dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 05/05/2004, 20h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo