équation à 20 inconnue

Cernunnos -  
JvDo Messages postés 1978 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

Voilà mon souci : je ne suis ni programmeur ni mathématicien, et je cherche à résoudre une équation telle que celle-ci : 80 a + 148 b + 464 c + ... + 2498 m = 13378

Comme outils, je n'ai en tout et pour tout que excel... ^__^ Hem...

Pourquoi faire ? Je participe à un jeu de simulation en ligne, dans lequel on peut espionner les forces ennemies, ce qui nous donne un total de points. Et le but serait de pouvoir connaître la composition "précise" de son armée. J'essaye de faire ça "à la main", à tâton, mais ce n'est pas évident.

J'y ai réfléchi un petit peu, et je pense que des solutions multiples sont envisageables pour chaque équation. Je pensais qu'on pouvait peut-être faire appel à un algorithme qui explorerait toutes les possibilités. A part ça, je n'ai pas la plus petite idée de la manière de procéder. J'ai lu sur une autre page de votre forum que l'on pouvait réduire l'équation de manière à arriver à une seule inconnue et que ce n'était pas facile. Est-ce possible sous excel ? Faisable par un débutant motivé ?

Merci de m'avoir lu.

Yann
A voir également:

24 réponses

ADM
 
1 équation à 20 inconnues... votre résultat confirme ce que je disais sur une infinité de solutions ;) En ne gardant que les nombres entiers, effectivment il doit y en avoir un nombre fini, mais bonne chance quand même pour la quantité !
0
JvDo Messages postés 1978 Date d'inscription   Statut Membre Dernière intervention   859
 
Bonsoir,


pour tes coefficients, ça donne :

niveaux traités :___Nb_____durée___Nb solutions___Nb combinaisons
_____20 à 7_____14______8mn_______149________147 253
_____20 à 6_____15_____31mn_______649 ________579 436
_____20 à 5_____16___1h43mn______2,832_______2 343 533



voici le code :
(je précise que je n'ai pas fait dans la dentelle)
Sur une feuille, mettre en A1:T1 et A4:T4 les libellés I01 --> I20 pour rendre lisible l'affichage des résultats.
Puis, lancer la macro une_équation_20_inconnues()

Sub une_équation_20_inconnues()
  result = 13378
  C01 = 80: I01 = 0: C02 = 148: I02 = 0
  C03 = 196: I03 = 0: C04 = 260: I04 = 0
  C05 = 464: I05 = 0: C06 = 518: I06 = 0
  C07 = 650: I07 = 0: C08 = 688: I08 = 0
  C09 = 908: I09 = 0: C10 = 1326: I10 = 0
  C11 = 1452: I11 = 0: C12 = 1612: I12 = 0
  C13 = 1694: I13 = 0: C14 = 2040: I14 = 0
  C15 = 2498: I15 = 0: C16 = 2724: I16 = 0
  C17 = 5164: I17 = 0: C18 = 5180: I18 = 0
  C19 = 6042: I19 = 0: C20 = 8052: I20 = 0

  Som00 = 0: compteur = 0: [V3] = Now

  For I01 = 0 To Int((result - Som00) / C01)
      som01 = Som00 + I01 * C01: Cells(2, 1).Value = I01
      For I02 = 0 To Int((result - Som1) / C02)
          Som02 = Som1 + I02 * C02: Cells(2, 2).Value = I02
              For I03 = 0 To Int((result - Som02) / C03)
              Som03 = Som02 + I03 * C03: Cells(2, 3).Value = I03
                 For I04 = 0 To Int((result - Som03) / C04)
                 Som04 = Som03 + I04 * C04: Cells(2, 4).Value = I04
                    For I05 = 0 To Int((result - Som04) / C05)
                    Som05 = Som04 + I05 * C05: Cells(2, 5).Value = I05
                        For I06 = 0 To Int((result - Som05) / C06)
                        Som06 = Som05 + I06 * C06: Cells(2, 6).Value = I06
                            For I07 = 0 To Int((result - Som06) / C07)
                            Som07 = Som06 + I07 * C07: Cells(2, 7).Value = I07
                                For I08 = 0 To Int((result - Som07) / C08)
                                Som08 = Som07 + I08 * C08: Cells(2, 8).Value = I08
                                    For I09 = 0 To Int((result - Som08) / C09)
                                    Som09 = Som08 + I09 * C09: Cells(2, 9).Value = I09
                                        For I10 = 0 To Int((result - Som09) / C10)
                                        Som10 = Som09 + I10 * C10: Cells(2, 10).Value = I10
                                            For I11 = 0 To Int((result - Som10) / C11)
                                            Som11 = Som10 + I11 * C11: Cells(2, 11).Value = I11
                                                For I12 = 0 To Int((result - Som11) / C12)
                                                Som12 = Som11 + I12 * C12: Cells(2, 12).Value = I12
                                                    For I13 = 0 To Int((result - Som12) / C13)
                                                    Som13 = Som12 + I13 * C13: Cells(2, 13).Value = I13
                                                        For I14 = 0 To Int((result - Som13) / C14)
                                                        Som14 = Som13 + I14 * C14: Cells(2, 14).Value = I14
                                                            For I15 = 0 To Int((result - Som14) / C15)
                                                            Som15 = Som14 + I15 * C15: Cells(2, 15).Value = I15
                                                                For I16 = 0 To Int((result - Som15) / C16)
                                                                Som16 = Som15 + I16 * C16: Cells(2, 16).Value = I16
                                                                    For I17 = 0 To Int((result - Som16) / C17)
                                                                    Som17 = Som16 + I17 * C17: Cells(2, 17).Value = I17
                                                                        For I18 = 0 To Int((result - Som17) / C18)
                                                                        Som18 = Som17 + I18 * C18: Cells(2, 18).Value = I18
                                                                            For I19 = 0 To Int((result - Som18) / C19)
                                                                            Som19 = Som18 + I19 * C19: Cells(2, 19).Value = I19
                                                                                For I20 = 0 To Int((result - Som19) / C20)
                                                                                som20 = Som19 + I20 * C20: Cells(2, 20).Value = I20
                                                                                'If Abs(Som20 - result) / result < 0.0001 Then Call affiche(I01, I02, I03, I04, I05, I06, I07, I08, I09, I10, I11, I12, I13, I14, I15, I16, I17, I18, I19, I20,compteur)
                                                                                If som20 = result Then Call affiche(I01, I02, I03, I04, I05, I06, I07, I08, I09, I10, I11, I12, I13, I14, I15, I16, I17, I18, I19, I20, compteur)
                                                                                compteur = compteur + 1
                                                                                Next I20
                                                                            Next I19
                                                                        Next I18
                                                                    Next I17
                                                                Next I16
                                                            Next I15
                                                        Next I14
                                                    Next I13
                                                Next I12
                                            Next I11
                                        Next I10
                                    Next I09
                                Next I08
                            Next I07
                        Next I06
                    Next I05
                Next I04
            Next I03
    Next I02
Next I01
End Sub

Sub affiche(I01, I02, I03, I04, I05, I06, I07, I08, I09, I10, I11, I12, I13, I14, I15, I16, I17, I18, I19, I20, compteur)
  Set mapos = Range("A65000").End(xlUp).Offset(1, 0)
  mapos.Offset(0, 0).Value = I01: mapos.Offset(0, 1).Value = I02
  mapos.Offset(0, 2).Value = I03: mapos.Offset(0, 3).Value = I04
  mapos.Offset(0, 4).Value = I05: mapos.Offset(0, 5).Value = I06
  mapos.Offset(0, 6).Value = I07: mapos.Offset(0, 7).Value = I08
  mapos.Offset(0, 8).Value = I09: mapos.Offset(0, 9).Value = I10
  mapos.Offset(0, 10).Value = I11: mapos.Offset(0, 11).Value = I12
  mapos.Offset(0, 12).Value = I13: mapos.Offset(0, 13).Value = I14
  mapos.Offset(0, 14).Value = I15: mapos.Offset(0, 15).Value = I16
  mapos.Offset(0, 16).Value = I17: mapos.Offset(0, 17).Value = I18
  mapos.Offset(0, 18).Value = I19: mapos.Offset(0, 19).Value = I20
  mapos.Offset(0, 20).Value = compteur: mapos.Offset(0, 21).Value = Now
End Sub
0
cernunnos
 
Hé bien ça c'est sympa !
Je te remercie !
Je peux marquer le problème comme résolu !
0
JvDo Messages postés 1978 Date d'inscription   Statut Membre Dernière intervention   859
 
Bonsoir,

un complément pour ceux que ça intéresse : en C++ le temps de traitement devient raisonnable, environ 8mn pour toutes les solutions entières

niveau 6 : Duree traitement =  0 m  0 s. Nb Solutions =       398  nb combinaisons =       365.389
niveau 5 : Duree traitement =  0 m  0 s. Nb Solutions =     1.060  nb combinaisons =       854.376
niveau 4 : Duree traitement =  0 m  0 s. Nb Solutions =     3.264  nb combinaisons =     2.392.336
niveau 3 : Duree traitement =  0 m  1 s. Nb Solutions =     9.673  nb combinaisons =     6.922.952
niveau 2 : Duree traitement =  0 m  3 s. Nb Solutions =    34.978  nb combinaisons =    23.202.170
niveau 1 : Duree traitement =  0 m 31 s. Nb Solutions =   331.138  nb combinaisons =   207.110.348
niveau 0 : Duree traitement =  8 m 25 s. Nb Solutions = 5.340.371  nb combinaisons = 3.158.498.324


Cordialement
0