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 :

algorithme de factorisation en somme de nombre


Sujet :

Macros et VBA Excel

  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 78
    Par défaut algorithme de factorisation en somme de nombre
    Bonjour à tous

    Je développe une appli en VBA et j'aurais besoin de retrouver toutes les solutions de sommes de termes d'un nombre plus grand. exemple :

    Voici mes nombre sources:
    48 50 51 52 54 56 57 58 60 62 63 64

    Voici le nombre à factoriser : 321

    Solutions :
    - 2*64+58+3*45
    - 6*45+51
    - 5*54+51
    ...

    si je ne me trompe pas, cela reviendrait à trouver les solutions de :
    321 = a*48 + b*50 + c*51 + d*52 + e*54 +...
    sachant que le nombre à factoriser n'est jamais un nombre premier.

    J'avais commencé à faire un code du genre :
    NbPv=321
    Nsource(12)=(48,50,51,52,54,56,57,58,60,62,63,64)

    pour j = 1 à 12
    si NbPv/Nsource(12-j) > 0
    NbNsource = entier(NbPv / Nsource(12-j))
    NbPv = NbPv - NbNsource*Nsource(12-j)
    FinSi
    Suivant

    Mais je me retrouve avec une partie entière qui me gène.

    est ce que vous avez déjà eu à faire une factorisation en somme de termes?
    Quelle méthode vous semble abordable?

    Merci beaucoup pour votre aide!

    Pierre

  2. #2
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut
    Une piste à suivre serait déjà de comprendre la résolution de ton équation polynomiale(si c'est bien ça[Edit]<- heureusement que je l'avais mis celui la!!^^ parce que visiblement j'ai fait fausse route[/Edit]), ensuite convertir le raisonnement en code... bon courage

    Une autre piste, ce site qui fourmille d'algo de toutes sortes
    A++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  3. #3
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Bonjour.

    Les coefficients a, b, c, ... sont des varaiables. Dans ton exemple il y en a 12, et une seule équation. Cela veut dire qu'il y a entre 0 et n solutions, n ne ne pouvant être calculé simplement.

    Voici une idée de méthode, qui peut suivant les cas conduire à des calculs trop longs et qui ne marche que si tu cherches des coefficients positifs.
    Tu crées un tableau des "valeurs sources", et un tableau des coef, éventuellement le même avec 2 colonnes.

    si NbPv = a*S1 + b*S2 + ..., alors a<= int(Nbpv/S1)
    Tu peux ainsi calculer aMax, bMax, ... valeurs à enregistrer dans le tableau des coef.

    Il reste à faire :
    Pour a = 0 à aMax
    Pour b = 0 à bMax
    Pour c ...
    ...
    si NbPv = a*S1 + b*S2 + ... alors
    'ici j'ai une solution
    fin si
    ....
    c suivant
    b suivant
    a suivant

    Reste à voir où tu ranges toutes les solutions...

    Cordialement,

    PGZ

  4. #4
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Bonjour Quaz.

    Je crois qu'il ne s'agit pas d'un polynome.

    Cordialement,

    PGZ

  5. #5
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut Pgz
    Citation Envoyé par Pgz
    Bonjour Quaz.

    Je crois qu'il ne s'agit pas d'un polynome.

    Cordialement,

    PGZ
    A ca... c'est loin dêtre impossible

    [Edit]
    Ceci étant dit, il y a bien matière a résolution avec une fonction de type
    48a+50b+26c+... j'avoue humblement, que les maths, même si je ne les détestais pas, elles, elles n'ont visiblement jamais eu d'attirance pour moi ^^

    Le problème avec les méthode brute comme celle que tu proposes, c'est qu'il faut prévoir le café ou manipuler les intégrales si mes souvenirs sont bons :s
    [/Edit]

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  6. #6
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 78
    Par défaut
    Bonjour à vous,

    Merci pour vos réponses, pgz, c'est une solution que je vais essayer de développer, effectivement, ça va être assez lourd.
    Une méthode peut être proche serait d'y aller par brute force : définir des valeurs de 1 à 10 par exemple et tester les sommes de produits qui sont égales à la valeur cible.
    Une autre solution qu'on m'a suggéré, serait d'utiliser l'algorithme du simplexe, que je ne connais pas encore, je vais m'y pencher.

    Merci encore

    Cordialement,

    Pierre

  7. #7
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Re,

    Je ne crois pas que ce soit un développement lourd.
    Si tu reviens demander de l'aide, il faudra préciser
    • Où et comment est saisi NbPv
    • Où et comment sont saisis les nombres sources
    • Si le nombre de nombres sources est variable
    • Où sont rangées les solutions


    Bon courage,

    PGZ

  8. #8
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 78
    Par défaut
    Pour l'info,

    -NbPv correspond à une valeur entrée à la main dans une cellule de la feuille excel.
    -Les nombres sources sont rangés dans une liste qui est saisie à la main, leur quantité peut être variable, cela correspond à une amélioration future mais pour l'instant cette liste est fixe.
    -Les solutions peuvent être rangé dans un tableau de cellules, peut importe

    Pour la petite histoire, NbPv correspond au nombre de panneaux photovoltaïque qu'on peut mettre sur une toiture
    Les nombres sources correspondent au nombre de panneaux qu'on peut mettre sur un onduleur, le but est d'optimiser le nombre d'onduleur.

  9. #9
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Re,

    J'ai placé les données de la façon suivante
    • En A1, j'ai écrit "NbPv"
    • B1 est réservée pour la saisie de NbPv
    • En A2, j'ai écrit "Nombre de sources"
    • En B2, la formule "=NbVal(3:3)
    • En C3, la première valeur de source
    • Les autres valeurs de sources sur la même ligne vers la droite (D3, E3, ...)
    • J'ai ajouté au dessus de C3 un bouton de commande (Contrôle Active X); Sur click : call SubCalculer


    Dans un module standard, le code
    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
    Private wSh As Excel.Worksheet, MaBalise As Excel.Range
    Private iLigne As Long
     
    Private Sub subIter(ByRef Ind() As Long, ByVal iRang As Long, ByRef Source() As Long, _
        ByRef Coef() As Long, ByVal iSomme As Long, ByVal iCible As Long)
    Dim iTot As Long, i As Integer
     
    For Ind(iRang) = 0 To Coef(iRang)
        iTot = iSomme + Ind(iRang) * Source(iRang)
        If iRang < UBound(Ind) Then
            If iTot < iCible Then Call subIter(Ind, iRang + 1, Source, Coef, iTot, iCible)
        Else
            If iTot = iCible Then
                'on a une solution
                For i = 1 To UBound(Ind)
                    MaBalise.Offset(iLigne, i - 1).Value = Ind(i)
                Next i
                iLigne = iLigne + 1
            End If
        End If
    Next Ind(iRang)
     
    End Sub
     
    Public Sub subCalculer()
    Dim Ind() As Long, Source() As Long, Coef() As Long
    Dim Cible As Long, NbSources As Long
    Dim i As Integer
     
    'instanciations
    Set wSh = ThisWorkbook.Worksheets(1)
    Set MaBalise = wSh.Range("C3")
     
    'lecture des paramètres
    Cible = wSh.Range("B1").Value
    NbSources = wSh.Range("B2").Value
     
    ReDim Ind(1 To NbSources)
    ReDim Source(1 To NbSources)
    ReDim Coef(1 To NbSources)
     
    'charger les valeurs des sources, et des coef max
    For i = 1 To NbSources
        Source(i) = MaBalise.Offset(0, i - 1)
        Coef(i) = Int(Cible / Source(i))
    Next i
     
    'caler la première ligne de résultats
    iLigne = 1
     
    'effacer les résultats précédents
    wSh.Rows("4:" & Application.Rows.Count).ClearContents
     
    Call subIter(Ind(), 1, Source(), Coef(), 0, Cible)
     
    Set wSh = Nothing
    Set MaBalise = Nothing
    End Sub
    La procédure principale subCalculer, ne fait que charger les données. Le calcul est fait par la procédure subIter qui n'est pas bien longue. J'ai choisis une procédure récursive pour m'affranchir du pb de nombre des sources. Ce nombre est donc variable.
    Pour les valeurs, j'ai choisi des entiers longs.

    Pour ton exemple initial, il y a 21 solutions.

    Cordialement,

    PGZ

  10. #10
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 78
    Par défaut
    Bonjour,

    Yes! merci pgz t'es un boss! ça marche bien, c'est plus rapide et ça correspond exactement à mon cas!
    On voit la maitrise du VBA...

    Je vais pouvoir l'adapter à mon cas, c'est super.

    Encore merci!

    Bon weekend

    Cordialement,

    Pierre

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. algorithme de factorisation en somme de nombre
    Par 7ider5 dans le forum Mathématiques
    Réponses: 5
    Dernier message: 26/02/2010, 10h48
  2. Excel somme de nombre rouge
    Par pavilion dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/07/2007, 05h39
  3. algorithme qui détecte et compte le nombre de visages et leur temps d'attention
    Par aptchagi dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 13/06/2007, 14h46
  4. Somme de nombre arrondis
    Par Lou_anne dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 11/05/2007, 16h22
  5. Somme de nombres limitée
    Par DC dans le forum SQL Procédural
    Réponses: 7
    Dernier message: 29/11/2005, 13h54

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