[VB.NET -> VBA]Algorithme de Combinaison contenant 7 Elements

Signaler
-
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
-
Hello a tous,

Voici mon soucis:

Je souhaite generer les combinaisons de 7 Variable (entre -1 et 1 ) a seulement 0.1 pres ( genre 0.9 , 0.5 ...mais pas 0.44) tel que la somme des 7 Variable soit egale a 0

Voici mon bout de code qui est loin d etre optimise....Peut etre existe il des types d algo plus puissant et sympa? on doit surement pouvoir diviser le temps de calcul par au moins 2 car il y a a mon sens symetrie....Si quelqu un se sent inspire n hesitez pas !



Sub Test()

Dim T1, T2, T3, T4, T5, T6, T7 As Double

Dim MaxExpo As Long
Dim Somme As Long
Dim Pas As Double
Dim Tolerance As Double
Dim Dico As Dictionary

Set Dico = New Dictionary

Pas = 0.2
Tolerance = 1
Somme = 0
MaxExpo = 2


T1 = -Abs(MaxExpo)

While T1 < Abs(MaxExpo)
T2 = -Abs(MaxExpo)
While T2 < Abs(MaxExpo)
T3 = -Abs(MaxExpo)
While T3 < Abs(MaxExpo)
T4 = -Abs(MaxExpo)
While T4 < Abs(MaxExpo)
T5 = -Abs(MaxExpo)

While T5 < Abs(MaxExpo)
T6 = -Abs(MaxExpo)
While T6 < Abs(MaxExpo)
T7 = -Abs(MaxExpo)

While T7 < Abs(MaxExpo)

If Abs(T1 + T2 + T3 + T4 + T5 + T6 + T7) <= Tolerance + Somme Then Dico.Add T1 & "#" & T2 & "#" & T3 & "#" & T4 & "#" & T5 & "#" & T6 & "#" & T7 & "#", 1

T7 = T7 + Pas

Application.StatusBar = T1 & "#" & T2 & "#" & T3 & "#" & T4 & "#" & T5 & "#" & T6 & "#" & T7 & "#"
Wend
T6 = T6 + Pas
Wend
T5 = T5 + Pas
Wend
T4 = T4 + Pas
Wend
T3 = T3 + Pas
Wend
T2 = T2 + Pas
Wend
T1 = T1 + Pas
Wend

15 réponses

Messages postés
14828
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
18 novembre 2021
157
Bonjour,

Essayes d'utiliser un tableau de valeur plutôt, et regardes comment faire une fonction récursive.

v----Signature--------v----------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
53
Salut

proposition

Private Function Makecombinaison() As List(Of String)
        'on utilise 19 nombres de -0.9 à 0 à 0.9

        'créer un truth table de 19 chiffres
        ' choisir les nombres binaires contenant sept 1 et calculer leur somme 

        Dim strbinary As String


        Dim binarydigit As Char()
        Dim list1 As New List(Of String)
        Dim word1 As String = "ABCDEFGHI0123456789"
        Dim combinaison As String
        Dim count As Integer
        Dim sum As Double
        For iter = 1 To 2 ^ (word1.Length) - 1

            strbinary = Convert.ToString(Convert.ToInt32(iter), 2)
            strbinary = strbinary.PadLeft(word1.Length, "0"c)
            binarydigit = strbinary.ToCharArray
            combinaison = String.Empty
            sum = 0
            count = 0
            For iter2 = 0 To binarydigit.Length - 1
                If binarydigit(iter2) = "1" Then
                    count += 1
                    binarydigit(iter2) = word1(iter2)
                    Select Case word1(iter2)
                        Case "A"c
                            sum += -0.9
                            combinaison &= "-0.9 "
                        Case "B"c
                            sum += -0.8
                            combinaison &= "-0.8 "
                        Case "C"c
                            sum += -0.7
                            combinaison &= "-0.7 "
                        Case "D"c
                            sum += -0.6
                            combinaison &= "-0.6 "
                        Case "E"c
                            sum += -0.5
                            combinaison &= "-0.5 "
                        Case "F"c
                            sum += -0.4
                            combinaison &= "-0.4 "
                        Case "G"c
                            sum += -0.3
                            combinaison &= "-0.3 "
                        Case "H"c
                            sum += -0.2
                            combinaison &= "-0.2 "
                        Case "I"c
                            sum += -0.1
                            combinaison &= "-0.1 "
                        Case "0"c
                            sum += 0.0
                            combinaison &= " 0.0 "
                        Case "1"c
                            sum += 0.1
                            combinaison &= " 0.1 "
                        Case "2"c
                            sum += 0.2
                            combinaison &= " 0.2 "
                        Case "3"c
                            sum += 0.3
                            combinaison &= "0.3 "
                        Case "4"c
                            sum += 0.4
                            combinaison &= " 0.4 "
                        Case "5"c
                            sum += 0.5
                            combinaison &= " 0.5 "
                        Case "6"c
                            sum += 0.6
                            combinaison &= " 0.6 "
                        Case "7"c
                            sum += 0.7
                            combinaison &= " 0.7 "
                        Case "8"c
                            sum += 0.8
                            combinaison &= " 0.8 "
                        Case "9"c
                            sum += 0.9
                            combinaison &= " 0.9 "
                    End Select
                    If count 7 AndAlso sum 0 Then
                        list1.Add(combinaison)

                    End If
                End If
            Next



        Next
        list1 = list1.Distinct.ToList
        Return list1
    End Function
Merci ShayW pour ta proposition...
Mais bon je t avour ne pas trop comprendre ton bout de code ...Je code que sur VBA et lorsque je fais un simple copier coller ca pas l air de vouloir complier ...Comment faire pour se serivr de ton code sur Excel ou VBA?
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
53
Salut

Je code que sur VBA

Perdu du temps pour rien
et c'est maintenant que tu le dis et tu as posté
ta question vb.net et vb2005

avant de coder saches d'abord la différence entre
vba vb6 et vb.net

quand tu vas chez le boucher et tu lui demande
une entrecote et il te donne un cote de mouton
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
Bonjour,

Tu pourrais essayer ceci
    Dim I As Integer
    Dim Valeur
    
    Randomize
    
    For I = 1 To 10
    Valeur = Valeur & Int((10 * Rnd) - 1) / 10 & vbCrLf
    Next
    MsgBox Valeur


Comme tu es nouveau, prend le temps de lire les règlements.
Regarde le lien dans ma signature.
Et lorsque tu mets du code, utilise le 3e icone en partant de la droite pour formater celui-ci en VB et le rendre plus lisible.

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
désolé, mais je viens de voir que tu voulais une somme = 0, ce que mon code ne fait pas...


MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
53
Salut Wasscraft
pour mieux comprendre ta question
tu veux choisir 7 nombres décimaux parmis une liste de
nombre et que la somme des 7 nombres choisis
= 0
ta liste de nombre est
-0.9 -0.8 -0.7 -0.6 -0.5 -0.4 -0.3 -0.2 -0.1
est ce 0.0 est compris dans ta liste ?
0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9
donc on a 18 nombres sans le 0.0
je choisis 7 nombres parmi les 18 ex
-0.9 -0.7 -0.2 0.2 0.3 0.4 0.9
encore un autre algo

Dim listnumber(17) As Double
Dim tableresult() As String
Sub combinaison()
Dim iter As Long
Dim num As Long
Dim sum As Double
Dim index, count, countone As Integer
Dim res As String
initlist
count = 0
For iter = 127 To 260096
num = iter
index = 0
sum = 0
countone = 0
 While num > 0
 'convertir en binaire
  
  If num Mod 2 = 1 Then
   countone = countone + 1
   sum = sum + listnumber(index)
   res = res & " " & listnumber(index) & " "
  End If
  num = Int(num / 2)
  index = index + 1
 Wend
 
 If sum 0 And countone 7 Then
 ReDim Preserve tableresult(count)
 tableresult(count) = res
 count = count + 1
 
 End If
 res = ""
 Next iter
End Sub
Sub initlist()
Dim iter As Integer
Dim value As Double
value = -0.9
For iter = 0 To 8
listnumber(iter) = value
value = value + 0.1
Next iter
value = 0.1
For iter = 9 To 17
listnumber(iter) = value
value = value + 0.1
Next iter

End Sub

Private Sub Form_Load()
combinaison
End Sub
Merci Shawn de persister avec moi !


Premierement oui le 0 peut etre une valeur possible !

Ensuite je viens de tester ton bout de code (passer par le binaire c est assez malin je ny aurai pas penser ...) par contre il ne sort pas toutes les combo possibles!

Ex -0.3 0.2 0.1 -0.1 0.1 -0.1 0.1

Ne sort pas...
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
Bonjour,
1)
Je souhaite generer les combinaisons de 7 Variable (entre -1 et 1 ) a seulement 0.1 pres ( genre 0.9 , 0.5 ...mais pas 0.44) tel que la somme des 7 Variable soit egale a 0

2)
par contre il ne sort pas toutes les combo possibles!

Ex -0.3 0.2 0.1 -0.1 0.1 -0.1 0.1

Et voilà un très bon exemple de la nécessité d'utiliser la bonne terminologie...
Tu aurais du dire :
Je souhaite generer les combinaisons avec remise de 7 Variables (entre -1 et 1 ) a seulement 0.1 pres ( genre 0.9 , 0.5 ...mais pas 0.44) tel que la somme des 7 Variable soit egale a 0

Que de temps perdu par imprécision...
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
Petite observation, en tout état de cause :
ce qui veut dire : choisir parmi toutes combinaisons avec répétition possibles de 7 nombres parmi 21, celles composées d'éléments dont la somme = 0
le nombre de combinaisons avec répétitions de 7 éléments parmi 21 est = au nombre de combinaisons de 7 objets parmi 21+7-1 (= 27) sans répétitions.
ça va déjà ramer pour passer en revue la liste de ces combinaisons ...
et il va falloir, pour chacune, vérifier (pour la retenir) que la somme des éléments = 0 !
Pauvre processeur ...


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
53
Bonsoir Ucfoutu
répétition possibles de 7 nombres parmi 21

pourquoi 21 et non 19 ?

possible que je me trompe
si j'ai 7 élements et que chaque élement
peut etre choisi parmi 19 ou 21 avec remise
donc
p = 19^7 ou 21^7
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
1) c'est parmi 21 de -1 à +1 inclus en acceptant le 0
2) n avec répétition 27 sans répétitions, parce que c'est ainsi mathématiquement : 21 nombres au total moins 7 composant la combinaison moins 1. mais tu est ici sur un forum de développement et non de mathématiques (ne pas confondre les genres). Si tu en veux la démonstration mathématique (parfaitement réalisable)>> ouvre une discussion sur un forum de mathématiques/... pas ici.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
et relis bien ce que j'ai écrit :
le nombre de combinaisons avec répétitions de 7 éléments parmi 21 est = au nombre de combinaisons de 7 objets parmi 21+7-1 (= 27) sans répétitions .

Et cela est clair pour moi, hein...
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
Salut,

Faudrait savoir si les 1.0 et -1.0 font partie de la suite possible...
parce que
entre 1 et -1
ne spécifie pas s'ils sont inclus ou non...
à moins que j'aie encore mal lu le problème...


MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
Bonjour, MPi,
Non. Toi, tu as tout-à-fait bien lu. Wasscraft, par contre, n'a pas su définir son intervalle (bornes incluses ou non ?).
Mais que ce soit bornes incluses ou non le principe est rigoureusement le même. Pour être plus clair et de manière générale === >>

le nombre de combinaisons avec répétitions de n éléments parmi T éléments est = au nombre de combinaisons de n éléments parmi T+n-1 sans répétitions.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.