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

Algorithmes et structures de données Discussion :

Calcul de toutes les combinaisons possibles


Sujet :

Algorithmes et structures de données

  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Mai 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Andorre

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 8
    Points : 2
    Points
    2
    Par défaut Calcul de toutes les combinaisons possibles
    Bonjour à tous,
    Après avoir chercher sur le forum je n'ai pas trouvé de réponse à mon problème.
    Je souhaiterais faire un algorithme, qui calcul toutes les combinaison possibles de résistances.
    Exemple:

    voici mes résistances avec leurs valeurs:
    R1 1
    R2 2
    R3 4

    Je voudrais calculer les combinaisons possibles sachant que les résistances sont en parallèle :

    R1
    R2
    R3
    R1//R2
    R1//R3
    R2//R3
    R1//R2//R3

    J'ai en réalité plus d'une vingtaine de résistance et calculer toutes ces combinaisons à la main serait trop fastidieux (20!).
    Mon but est de créer un petit script Excel qui implémentera cet algorithme, mais c'est l'algorithme que je ne trouve pas.

    Merci d'avance

  2. #2
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bonjour,

    d'abord, je ne sais pas d'où viens ton 20!. Il s'agit de 2^20 (et généralement 2^n). Car à chaque résistance que tu ajoutes, tu multiplies par 2 les combinaisons possibles.

    Cela ne fait jamais que 1048576 valeurs de résistance possible. Reste à savoir le but réel. Excel n'est pas adapté à ton problème. Je ferais plutôt cela en c++.

    As-tu réellement besoin de ce million de valeurs ?
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Candidat au Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Mai 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Andorre

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    En fait le 20! correspond à 20 factoriel soit 20*19*18*...*1 tout simplement car tu as des calculs qui sont redondant. Ex: R1//R2 =R2//R1 donc tu ne fais qu'un calcul.

    Je n'ai pas dis le but réel pour éviter de rentrer dans un sujet complexe mais vu que tu demandes.
    Pour faire simple:
    Ces résistances servent à créer un courant dans un circuit avec la simple formule I=U/R.
    On veut fixer un certain I et nous avons des résistances prédéfinies.
    Mon but sera de définir quel résistances il faut brancher pour s'approcher le plus près du courant désiré.
    Donc oui j'ai besoin de toutes ces valeurs.

    Je suis prêt à le faire en C ou C++ mais je pense qu'on peut arriver à la même chose avec Visual Basic.
    Encore un fois, ce qui me pose problème ce n'est pas la programmation mais bien l'algorithme.

  4. #4
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Le problème d'Excel est que le calcul va prendre 4h ou + alors qu'il prendra une demi-seconde en C++ (si tu fais tous les cas).

    Ensuite, tu as une résistance idéale pour obtenir ton intensité. Je l'appelle Ri. Il faut donc viser 1/Ri et non Ri. A partir de tes 20 Rk, tu détermines les 1/Rk correspondants et tu retombes sur le célébrissime problème du sac-à-dos.

    Chaque résistance n'est en fait qu'un type de résistance? Donc réutilisable?

    Pas d'algorithme. Juste de la force brutale.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  5. #5
    Candidat au Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Mai 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Andorre

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Ok pour excel, je prends note.
    Par contre je ne comprends pas pourquoi tu veux viser 1/Ri et je ne connais pas le problème du sac à dos
    Voici une partie de mes résistances:
    Pièce jointe 165989

    Mon but est de faire une IHM où l'utilisateur rentre le courant souhaité pour un essais.
    Ensuite mon programme (Labview) calculera ma valeur de résistance idéale.
    Il cherchera ensuite la valeur la plus proche dans un tableau (rangé par ordre croissant) et viendra fermé les contactes de ces résultats.

    Exemple:
    Mon pogramme défini la valeur idéal Ri=3.1kOhm
    il vient donc scruter ce tableau

    Valeur état résistance(R0,R1,R2,R3)
    2.563kOhm 0,1,1,0
    3.256kOhm 1,0,0,1
    5kOhm 0,0,0,1

    il trouve la valeur 3.256 la plus proche et ferme donc le contacte de R0 et R3 et ouvre R1 et R2.

    Mon tableau sera donc calculé qu'une seule fois. C'est pour cette raison que je m'enfiche un peu que mon programme prendra 4h. Mais je le ferais quand même en C.


    Je sais pas si j'ai été assez claire mais dites-moi si vous ne comprenez pas quelque chose.
    Images attachées Images attachées  

  6. #6
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Tout est plus clair. On a bien 2^14=16384 possibilités. C'est très faisable.

    En ce qui concerne l'algorithme, je ferais une boucle sur un indice courant de 0 à 16384. Son écriture binaire donne la position des interrupteurs: 0 ouvert, 1 fermé. On calcule alors la résistance équivalente. En sortie, on écrit, sur une ligne, l'indice et la résistance équivalente séparés par un point-virgule. Puis on passe au suivant.

    Le calcul de la résistance équivalente peut même se faire par une fonction entièrement numérique à partir de l'indice.

    Bonne chance.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  7. #7
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 392
    Points
    9 392
    Par défaut
    1. Le nombre de combinaisons est 2^20, et pas 20!
    2. Dans Excel, (en VB),explorer toutes les combinaisons, ça prend environ 1 minute. On pourrait aussi envisager d'utiliser le Solver d'Excel. Du coup, avec le solver, on se fout de l'algorithme ou de la programmation, on a juste à comprendre le principe du solver.
    3. Tu as réduit le problème en disant : Je vais mettre différentes résistances en parallèle, pour obtenir un courant le plus proche possible de l'intensité voulue.
    Mais tu t'interdis de combiner série et parallèle ?
    Là, le problème deviendrait intéressant à résoudre
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  8. #8
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Tu vois bien son schéma. Il n'a pas le choix entre série et parallèle.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 42
    Points : 54
    Points
    54
    Par défaut
    Je vois apparaître la méthode du sac à dos ! Pour cela il faut encore que la somme des conductances soit cherchée inferieure à la valeur de conductance idéeale ! Ce qu'il faut si on cherche la plus proche valeur c'est minimiser le module de la différence entre la somme et la conductance !
    Et si tu t'autorises à mettre en série le problème s'élève un peu plus haut qu'une simple réflexion combinatoire je pense

    Mais de ce qui a été dit ça change rien, tu testes tout et tu tries ta liste selon les modules de différences croissants !

  10. #10
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Du coup, j'ai eu envie de le faire; et voici mon résultat trié selon la deuxième colonne (Résistance équivalente en Ohm). La première colonne est l'indice avec comme chiffre binaire de poids faible la résistance de 5.7 Ohm et comme chiffre de poids fort 4007 Ohm.

    [edit]La liste est trop longue pour être posée ici, et j'ai la flemme de la zipper. Je ne mets que le début et la fin pour comparaison avec vous.[/edit]

    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
    0 inf
    16383 2.23276
    8191 2.23401
    12287 2.23442
    14335 2.23526
    4095 2.23567
    6143 2.2365
    10239 2.23692
    15359 2.23771
    2047 2.23817
    ...
    5120 755.801
    9216 806.671
    14336 923.733
    1024 1010
    6144 1200.48
    10240 1334.11
    12288 1716.55
    2048 2000
    4096 3003
    8192 4007
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  11. #11
    Candidat au Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Mai 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Andorre

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Déjà merci à tous de vos réponses.
    Je vous avoue que c'est toujours pas très clair pour moi.
    Déjà pour le 2^20, comme dit on aura plusieurs fois les mêmes calculs ex: R1//R2 ou R2//R1 c'est pour cette raison que je dis que c'est 20! (factoriel).
    Mais à la limite je me dis pas grave, je calcul tout et par la suite je supprime les redondances.


    Citation Envoyé par Flodelarab Voir le message
    Du coup, j'ai eu envie de le faire; et voici mon résultat trié selon la deuxième colonne (Résistance équivalente en Ohm). La première colonne est l'indice avec comme chiffre binaire de poids faible la résistance de 5.7 Ohm et comme chiffre de poids fort 4007 Ohm.
    Par contre je ne vois pas du tout comment tu as fais. la première colonne la valeur des bits en décimal, ça c'est bon.
    Je suis capable de faire mais avec deux boucles for donc je suis limité à deux combinaison.
    Fais tu un tableau temporaire puis recommencer avec uniquement deux boucles for ?

    Peux tu me mettre le code que tu as utilisé pour faire le tableau ?

  12. #12
    Candidat au Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Mai 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Andorre

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par tbc92 Voir le message
    3. Tu as réduit le problème en disant : Je vais mettre différentes résistances en parallèle, pour obtenir un courant le plus proche possible de l'intensité voulue.
    Mais tu t'interdis de combiner série et parallèle ?
    Là, le problème deviendrait intéressant à résoudre
    En fait au niveau des résistances j'ai pas le choix, les résistances son en parallèle comme sur le schéma.
    Par contre j'ai aussi des inductances qui elle sont en série et les deux blocs Req et Leq sont en série.

    Nom : Capture2.JPG
Affichages : 2908
Taille : 136,6 Ko

    Je voulais pas trop rentré dans les détails et je me suis dis que si j'arrivais à le faire pour les résistances j'arriverai a le faire pour les inductances et ensuite combiner les deux assez facilement parce que c'est du calcul et plus de l'algo.
    Et là où je pêche c'est l'algo.

  13. #13
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Là, pour le coup, un bout de code vaut mieux qu'un long discours. Mais je ne pourrais pas le poster avant ce soir.

    Je ne fais qu'une seule boucle.

    Pour répondre à la question mathématique, pour chaque résistance, tu te demandes si elle participe ou non. Donc tu as deux cas x deux cas x deux cas ... donc 2^n. Le cas R1//R2 et R2//R1 ne sont pas redondants car c'est le cas unique ou R1 et R2 sont sollicités.

    La factorielle est pour les cas où les possibilités se multiplient. Ici, elles ne font que s'ajouter.
    Elles se multiplient quand n'importe quel résistance peut être associée à n'importe quelle résistance (et que l'ordre importe). Mais ici, tu es contraint par ton circuit figé.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  14. #14
    Candidat au Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Mai 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Andorre

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Il me semble que j'ai enfin compris, et effectivement je cherchais beaucoup trop compliqué, en fait en faisant plusieurs boucles c'est là que j'avais des redondances or ce que tu dis est exacte.
    Dites moi si j'ai bien compris:
    avec une seul boucle il me suffit d'avoir un nombre de bit correspondant à mon nombre de résistance et d'incrémenter de 1 à chaque tour pour déterminer quel résistances sont fermées.
    Une fois que j'ai déterminé quel résistances sont fermées il me suffit de faire le calcul.

    ex:
    R0 5.7
    R1 11
    R2 15

    Résultat si R en série:
    R2R1R0 Req
    000 inf.
    001 5.7
    010 11
    011 16.7
    100 15
    101 20.7
    110 26
    111 31.7

    Est-ce bien ça ?

    Je commence à coder cet après midi comme ça je pourrais comparer avec ton code ce soir.
    Merci encore pour votre aide

  15. #15
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Oulà. Presque. C'est bon mais tu fais une somme brute. Ce sont les inverses qu'on additionne...
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  16. #16
    Candidat au Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Mai 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Andorre

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    oui oui c'est pour ça que j'ai mis "calcul comme si R en série". J'avais pas envie de prendre la calculatrice :p

  17. #17
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Code c++ : 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
    #include <iostream>
     
    using namespace std;
     
    int pow(int n, int e)
    {
        if (e==0) 
            return 1;
        else
            return n*pow(n,e-1);
    }
     
    int main()
    {
        float Ri=5000;
        float iRi=1.0/Ri;
        float Rk[14]={5.7,11,15,22,46,46,93,138,265,480,1010,2000,3003,4007};
        float iRk[14];
     
        for (int i=0;i<14;i++)
            iRk[i]=1.0/Rk[i];
     
        for (int indice=0;indice<16384;indice++)
        {
            float Re, iRe=0;
            for (int resistance=0;resistance<14;resistance++)
                if ((indice/pow(2,resistance))%2==1)
                    iRe += iRk[resistance];
     
            Re=1.0/iRe;
            cout<< indice<<" "<<Re<<endl;
        }    
        cout<<"Fin\n";
     
        return 0;
    }

    Au départ, j'avais projeté de comparer avec la résistance idéale pour sortir la combinaison la plus proche. Mais c'est tombé à l'eau.

    Au temps pour moi; il y a deux boucles.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  18. #18
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 419
    Points : 5 818
    Points
    5 818
    Par défaut
    salut

    en utilisant des opération bit a bit tu devrais aussi pouvoir t'en sortir
    sachant que le test de bit peut se faire a l'aide de certaine operation sur les bit
    en connaissant les règles suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    1 and 1 := 1
    1 and 0 := 0
    0 and 0 := 0
    il nous faut donc créer un masque pour chaque bit afin de pouvoir tester la valeur bit à bit

    petite fonction pour controler si le bit est a 1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    function GetBit(Value: QWord; Index: Byte): Boolean;
    begin
      Result := ((Value shr Index) and 1) = 1;
    end;
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  19. #19
    Candidat au Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Mai 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Andorre

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Merci à tous pour vos réponses. Finalement je l'ai fais en labview grace aux indications que j'ai compris.
    voici ce que j'ai fais:
    Nom : LabviewCalculRetL.JPG
Affichages : 2608
Taille : 137,1 Ko

    Maintenant il me reste plus qu'a calculer toutes les combinaisons Req et Leq en série.
    Je ferais un code en C pour m'amuser dès que j'ai le temps.

Discussions similaires

  1. Algo pour toutes les combinaisons possibles
    Par rantanplan08 dans le forum Général Java
    Réponses: 6
    Dernier message: 03/01/2008, 09h45
  2. Réponses: 5
    Dernier message: 18/06/2007, 20h52
  3. Réponses: 22
    Dernier message: 27/10/2006, 02h26
  4. Réponses: 16
    Dernier message: 20/10/2006, 16h31
  5. toutes les combinaisons possibles
    Par marocleverness dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 29/05/2006, 00h11

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