XL 2013 Problème tableau avec 25 variables

paddy67

XLDnaute Nouveau
Bonjour,

Je n'arrive pas à résoudre le problème suivant (voir fichier joint) :

- tableau avec 5 ligne et 5 colonnes = 25 cellules variables
- le total de chaque ligne = 90
- le total de chaque colonne = 90
- la diagonale en bleu dans le tableau = 90
- les 25 variables doivent être des nombres entiers compris entre 6 et 30 et doivent être uniques
- 9 sont déjà connues

Est-ce qu'il est possible de résoudre ce problème avec Excel ? J'ai essayé avec le solveur (voir dans le fichier), mais je n'arrive à rien.

Merci de votre aide.
Paddy67
 

Pièces jointes

  • Classeur1.xlsx
    10.8 KB · Affichages: 72
  • Classeur1.xlsx
    10.8 KB · Affichages: 77

Victor21

XLDnaute Barbatruc
Re : Problème tableau avec 25 variables

Bonjour, paddy67.

Il semble que ces deux contraintes soient incompatibles * : - les 25 variables doivent être [...] compris entre 6 et 30 et doivent être uniques.

Peut-être est-il possible de détourner cette incompatibilité en modifiant les bornes (1 à 26) et les totaux à 85, mais chez moi le solveur mouline depuis plus d'1/4h... (Core2 Quad CPU Q6600 2.40GHz )
Je reviens s'il se calme

Edit : * pour le solveur
 
Dernière édition:

Modeste geedee

XLDnaute Barbatruc
Re : Problème tableau avec 25 variables

Bonsour®
il s'agit de carré magique d'ordre 5
dont on aura augmenté chaque élément de 5 unités...
Capture.jpg

de nombreuses méthodes existent certaines ont été exposées ici, faire une recherche

le nombre de carrés magiques d'ordre 5 s'élève à 275 305 224
méthode siamoise, du losange, du cavalier
ex :
https://www.youtube.com/watch?v=ZS7G1s9mrKQ pour solveur XL 2010 !!
carrés magiques 5x5 construction
carrés magiques, méthode de construction de Pheru
 

Pièces jointes

  • Capture.jpg
    Capture.jpg
    83.9 KB · Affichages: 66
  • carré latin 5.xlsx
    24.8 KB · Affichages: 68
Dernière édition:

paddy67

XLDnaute Nouveau
Re : Problème tableau avec 25 variables

Bonjour, paddy67.
Peut-être est-il possible de détourner cette incompatibilité en modifiant les bornes (1 à 26) et les totaux à 65
[/COLOR]Edit : * pour le solveur

Merci pour vos réponses.

J'ai essayé cette méthode, ça me donne un résultat mais qui ne correspond pas à mon tableau d'origine.

Les variables connues (en vert dans le tableau) sont fixes et ne sont pas bien placées.
 

ROGER2327

XLDnaute Barbatruc
Re : Problème tableau avec 25 variables

Bonjour à tous.


Bonjour,

Je n'arrive pas à résoudre le problème suivant (voir fichier joint) :

- tableau avec 5 ligne et 5 colonnes = 25 cellules variables
- le total de chaque ligne = 90
- le total de chaque colonne = 90
- la diagonale en bleu dans le tableau = 90
- les 25 variables doivent être des nombres entiers compris entre 6 et 30 et doivent être uniques
- 9 sont déjà connues

Est-ce qu'il est possible de résoudre ce problème avec Excel ? (...)
Je crains que non, avec ou sans Excel...
En abandonnant la quatrième contrainte, il me semble qu'il existe exactement deux solutions :




Mais peut-être me gouré-je ? Je ne demande qu'à être démenti.​


Bonne journée.


ℝOGER2327
#8212


Jeudi 5 Pédale 143 (Saint Ouducul, trouvère - fête Suprême Quarte)
9 Ventôse An CCXXIV, 4,6737h - marsault
2016-W08-7T11:13:00Z
 

Pièces jointes

  • Carré magique.JPG
    Carré magique.JPG
    24.3 KB · Affichages: 43
  • Carré magique (2).JPG
    Carré magique (2).JPG
    42.8 KB · Affichages: 57

ROGER2327

XLDnaute Barbatruc
Re : Problème tableau avec 25 variables

Re...


Bonjour,

Merci de ta contribution, peux-tu m'indiquer comment tu as fait pour trouver ces 2 solutions ?

Paddy67.
J'ai procédé par la méthode «papier-crayon-gomme». J'ai d'abord remarqué que la colonne 1 et la ligne 2 n'avaient que deux cases vides. Le nombre de possibilités pour les compléter est donc assez faible. J'ai fait des essais successifs. En remplissant la ligne 2, la colonne 4 n'a plus que deux cases vides. Cette colonne étant remplie, on peut compléter la ligne 5 qui ne comporte plus que deux cases vides. J'ai continué par la colonne3, puis les lignes 4, 3 et 1. C'est assez bourrin, je l'admets. Et j'ai dû faire beaucoup d'étourderies, car, contrairement à ce que j'ai imprudemment affirmé plus haut, il y a une solution qui respecte toutes les contraintes[SUP][1][/SUP], et bien plus de deux solutions si on oublie la contrainte sur la diagonale...
Pour m'en assurer, j'ai écrit la méthode «papier-crayon-gomme» en VBA. Voyez le classeur joint.

[SUP][1][/SUP]... et même plus : les deux diagonales ont 90 pour somme.


Bonne nuit.


ℝOGER2327
#8213


Jeudi 5 Pédale 143 (Saint Ouducul, trouvère - fête Suprême Quarte)
9 Ventôse An CCXXIV, 9,8790h - marsault
2016-W08-7T23:42:35Z
 

Pièces jointes

  • Carré magique.xlsm
    28.1 KB · Affichages: 63

ROGER2327

XLDnaute Barbatruc
Re : Problème tableau avec 25 variables

Re...


Merci, il me reste plus qu'à analyser la macro (ce qui ne va pas me faire coucher très tôt) :)
Je ne commente que rarement mon code car :
  • c'est long à faire ; quelquefois plus long que la conception du code ;
  • souvent, ça embrouille plus que ça n'éclaircit un code proprement écrit ;
  • trop de personnes qui posent des questions ne reviennent pas voir les réponses : inutile donc de se casser la tête.
Mais vous n'êtes pas de ces personnes puisque vous voulez analyser la chose. Je m'empresse donc de vous faire part de mes commentaires.
Code:
Option Explicit

'|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯|
'| Ajouter la référence à la bibliothèque Microsoft Scripting Runtime (scrrun.dll) au projet ! |
'|_____________________________________________________________________________________________|

Private d As New Scripting.Dictionary
Private n%, tl(0 To 6, 1 To 6)

Sub tata()
      'Cette procédure initialise les paramètres puis lance le calcul.

Dim i%, j%, c
  [B2:AI24].ClearContents
  Set d = Nothing
  Erase tl

      'Chargement du dictionaire 'd'. Les enregistrements ont pour clés "6", "7", ..., "30" et pour items 6, 7, ..., 30.
      '(Ce sont les nombres à placer dans le carré.)

  For i = 6 To 30: d(i) = i: Next

      'Le tableau 'c' décrit les données initiales que sont les neufs nombres déjà placés.
      'Le premier item 'Array(2, 1, 29)' doit se comprendre ainsi : en ligne 2, colonne 1, on a placé 29.
      'Le deuxième indique qu'on a placé 13 en ligne 3, colonne 1, etc.

  c = Array(Array(2, 1, 29), Array(3, 1, 13), Array(5, 1, 21), _
    Array(5, 2, 14), Array(2, 3, 15), Array(4, 3, 23), _
    Array(1, 4, 24), Array(3, 4, 27), Array(2, 5, 16))

      'Le tableau 'tl' représente l'état du carré et ses bordures inférieures et droites.
      'Description du tableau :
      'Le carré proprement dit est dans 'tl(1 to 5, 1 to 5)'.
      ''tl(0,1)','tl(0,2)','tl(0,3)','tl(0,4)','tl(0,5)' sont inutilisés.
      ''tl(0,6)' (respectivement 'tl(6,6)') contient la somme des éléments
      'de la diagonale bas-gauche à haut-droite (resp. haut-gauche à bas-droite).
      'La ligne du bas, colonnes 1 à 5, contient les sommes des éléments des colonnes correspondantes dans le carré.
      'La colonne de droite, lignes 1 à 5, contient les sommes des éléments des lignes correspondantes dans le carré.
      'Chargement du tableau et suppression du dictionnaire des nombres déjà placés dans le tableau :

  For i = 0 To UBound(c): tl(c(i)(0), c(i)(1)) = c(i)(2): d.Remove (c(i)(2)): Next
  For i = 1 To 5: For j = 1 To 5: tl(6, i) = tl(6, i) + tl(j, i): tl(i, 6) = tl(i, 6) + tl(i, j): Next: tl(0, 6) = tl(0, 6) + tl(6 - i, i): tl(6, 6) = tl(6, 6) + tl(i, i): Next
      'Dans toute la suite, on s'arrangera pour que le dictionnaire contienne toujours les nombres restant à placer.

      'Affichage du tableau dans la plage B2:G8 :
      '('n' compte le nombre de tableaux affichés.)

  [B2].Resize(7, 6).Value = tl: [B2].Value = "Données initiales": n = 1

  col1 'Lance la recherche d'une solution...

End Sub

Private Sub col1()
      'Cette procédure complète si possible la colonne 1 ;
      'le cas échéant, elle appelle à compléter la ligne 2.

Dim i%, s%

      'Somme des éléments dans la colonne 1.

  For i = 1 To 5: s = s + tl(i, 1): Next

      'Complément à 90.

  s = 90 - s

      'Recherche de deux éléments du dictionnaire ayant 's' pour somme.

  For i = 5 To 30
    If d.Exists(i) Then
      d.Remove (i)
      If d.Exists(s - i) Then

      'On a trouvé deux éléments complétant la colonne à 90 :
      'On les place dans le tableau et on les supprime du dictionnaire.

        d.Remove (s - i): tl(1, 1) = i: tl(4, 1) = s - i

      'Passage au complément de la ligne 2.

        lig2

      'Rétablissement des paramètres avant le passage à la recherche d'une autre solution.

        tl(4, 1) = 0: tl(1, 1) = 0: d(s - i) = s - i
      End If
      d(i) = i
    End If
  Next
End Sub

Private Sub lig2()
      'Cette procédure et les suivantes sont semblables à la précédente...

Dim i%, s%
  For i = 1 To 5: s = s + tl(2, i): Next
  s = 90 - s
  For i = 5 To 30
    If d.Exists(i) Then
      d.Remove (i)
      If d.Exists(s - i) Then
        d.Remove (s - i): tl(2, 2) = i: tl(2, 4) = s - i

        col4

        tl(2, 4) = 0: tl(2, 2) = 0: d(s - i) = s - i
      End If
      d(i) = i
    End If
  Next
End Sub

Private Sub col4()
Dim i%, s%
  For i = 1 To 5: s = s + tl(i, 4): Next
  s = 90 - s
  For i = 5 To 30
    If d.Exists(i) Then
      d.Remove (i)
      If d.Exists(s - i) Then
        d.Remove (s - i): tl(4, 4) = i: tl(5, 4) = s - i

        lig5

        tl(5, 4) = 0: tl(4, 4) = 0: d(s - i) = s - i
      End If
      d(i) = i
    End If
  Next
End Sub

Private Sub lig5()
Dim i%, s%
  For i = 1 To 5: s = s + tl(5, i): Next
  s = 90 - s
  For i = 5 To 30
    If d.Exists(i) Then
      d.Remove (i)
      If d.Exists(s - i) Then
        d.Remove (s - i): tl(5, 3) = i: tl(5, 5) = s - i

        lig4

        tl(5, 5) = 0: tl(5, 3) = 0: d(s - i) = s - i
      End If
      d(i) = i
    End If
  Next
End Sub

Private Sub lig4()
Dim i%, s%
  For i = 1 To 5: s = s + tl(4, i): Next
  s = 90 - s
  For i = 5 To 30
    If d.Exists(i) Then
      d.Remove (i)
      If d.Exists(s - i) Then
        d.Remove (s - i): tl(4, 2) = i: tl(4, 5) = s - i

        col2

        tl(4, 5) = 0: tl(4, 2) = 0: d(s - i) = s - i
      End If
      d(i) = i
    End If
  Next
End Sub

Private Sub col2()
Dim i%, s%
  For i = 1 To 5: s = s + tl(i, 2): Next
  s = 90 - s
  For i = 5 To 30
    If d.Exists(i) Then
      d.Remove (i)
      If d.Exists(s - i) Then
        d.Remove (s - i): tl(1, 2) = i: tl(3, 2) = s - i

        col3

        tl(3, 2) = 0: tl(1, 2) = 0: d(s - i) = s - i
      End If
      d(i) = i
    End If
  Next
End Sub

Private Sub col3()
Dim i%, s%
  For i = 1 To 5: s = s + tl(i, 3): Next
  s = 90 - s
  For i = 5 To 30
    If d.Exists(i) Then
      d.Remove (i)
      If d.Exists(s - i) Then
        d.Remove (s - i): tl(1, 3) = i: tl(3, 3) = s - i:

        col5

        tl(3, 3) = 0: tl(1, 3) = 0: d(s - i) = s - i
      End If
      d(i) = i
    End If
  Next
End Sub

Private Sub col5()
Dim i%, j%, s%, u%
  For i = 1 To 5: s = s + tl(i, 5): Next
  s = 90 - s
  For i = 5 To 30
    If d.Exists(i) Then
      d.Remove (i)
      If d.Exists(s - i) Then
        d.Remove (s - i): tl(1, 5) = i: tl(3, 5) = s - i

      'À cet endroit, le tableau est rempli.
      'On contrôle que la ligne 1 a 90 pour somme.

        u = 0: For j = 1 To 5: u = u + tl(1, j): Next

      'Si la ligne 1 a 90 pour somme, on affiche le tableau.

        If u = 90 Then
          tl(0, 6) = 0: tl(6, 6) = 0: For j = 1 To 5: tl(6, j) = u: tl(j, 6) = u: tl(0, 6) = tl(0, 6) + tl(6 - j, j): tl(6, 6) = tl(6, 6) + tl(j, j): Next
          [B2].Resize(7, 6).Offset(8 * (n \ 5), 7 * (n Mod 5)).Value = tl
          n = n + 1
        End If

        tl(3, 5) = 0: tl(1, 5) = 0: d(s - i) = s - i
      End If
      d(i) = i
    End If
  Next
End Sub


Bonne nuit.


ℝOGER2327
#8217


Vendredi 6 Pédale 143 (Vers Belges - fête Suprême Quarte)
10 Ventôse An CCXXIV, 9,8874h - bêche
2016-W09-1T23:43:47Z
 

Discussions similaires

Réponses
7
Affichages
315

Statistiques des forums

Discussions
312 378
Messages
2 087 760
Membres
103 660
dernier inscrit
205 Peugeot