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

C# Discussion :

Algorithme calcul config


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 29
    Par défaut Algorithme calcul config
    Bonjour à la communauté et merci à ceux qui me liront ...

    Alors voilà, je débute en c# et n'est jamais fait d'algo auparavant, mais j'ai réussi à sortir quelque chose qui marche partiellement...
    En quelques lignes :
    Le but est de trouver tous les arrangements de combinaisons qui forment un Nb. de panneaux identique à celui donné qui est nb_pan.
    dc par exemple, si j'ai nb_pan = 200 et 3 config dispo, telles que :
    Config1 = 30 pan, Config2= 20 pan et Config3 = 5 pan

    je commence par la config qui contient le max de pan : Config1
    Donc nb_config1 = 200 / 30 = 6
    Reste = 200 % 30 = 20
    Ensuite nb_config2 = 20 / 20 = 1
    Reste = 0
    Une bonne config que je garde à afficher !!

    Mais je ne veux pas une seul config, je veux toutes les configs ...
    Donc la procédure á suivre ensuite est : enlever un au nb_config de la 1ère config, ici config1 et refaire le même test.

    donc nb_config1 = 6 - 1 = 5
    Reste = 20 + 30 = 50(Puisque j'enlève une config de 30 pan)
    puis nb_config2 = 50 / 20 = 2
    Reste = 10
    et nb_config3 = 10 / 5 = 2
    Reste =0

    Dc encore une bonne config !!
    Dc j'ai dit que l'on répète cette étape jusqu'à ce que nb_config1 = 0

    Ensuite quand nb_config1 = 0, dans le code il y à une boucle for, tu remarqueras que le do while qui fonctionne avec ok2, se quitte lorsque le nb_config arrive 'à 0.

    le for se décrémente donc, ce qui nous fait commencer dans le dataview contenant les configs, à une ligne en moins, donc ici par ex config1 ne sera pas utilisé.

    Et cela car nous avons déjà têster toutes les configs possibles avec celle-ci.

    Je me rend bien compte du travail que cela représente à me lire, je remercie d'avance tous ceux qui le feront.
    J'ai essayé de trouver mes erreurs, mais le résultat est que je ne trouve pas toutes les configs. Si quelqu'un peut m'aider à trouver pourquoi ...

    Salut

    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
     
    // Dataview contenant les configurations retenues, triees 
                DataView Config_tri = Config.DefaultView;
                Config_tri.Sort = "Pow, Nbtot";
                // Nb de panneaux à configurer
                int Reste = Nb_pan;
                int Min = 0;
                bool ok = true, ok2 = true, Decrementation_Nbond = false;
                // Calcul le nb de panneau Mini contenu dans toutes les config
                // Cela permet de vérifier avec le reste car si le reste est inférieur
                // aucune config ne pourra être utilisée
                Min = Convert.ToInt32(Config.Compute("MIN(Nbtot)", "Nbtot >= 0"));
                int Num = 0, config = 0, Nb_de_decrementation = 0;
                // Boucle permettant de parccourir toutes les config dans l'ordre décroissant
                for (int i = Config_tri.Count; i > 0; i--)
                {    
                    // Ce do while permet de tester en commencant par la plus grosse config en cours, définit par "i"
                    // jusqu'à ce que le Nbond de la boucle if(test) arrive à 0
                    do
                    {
                        // On commence une nouvelle combinaison de config ac Nb_pan donc reste = Nb_pan
                        Reste = Nb_pan;
                        // Ce do while permet de parcourir toutes les configs depuis la plus grosse config en cours, 
                        // définit par "i" et de tester d'intégrer toutes les config suivantes, jusqu'à ce que
                        // reste = 0. Les conditions de sortie sont reste == 0 ou "i" == 0 car plus de config dispo
                        do
                        {
                            // Décrémentation de i car je commence à parcourir mon Dataview à Config_tri.Cout ce qui 
                            // me donnerait une erreur, car il ya Config_tri - 1 lignes ds le DataView.
                            // Celame permet également de tester ac toutes les configs dans lórdre de mon dataView
                            i--;
                            // Ce test sert à optimiser la boucle, Il vérifie que le nb de pan contenu par la config
                            // est inférieur ou égale au reste car sinon l'utilisation dela config donnerait un 
                            // reste négatif. De plus elle vérifie également que l'utilisation de la config si le reste
                            // n'est pas égal à 0, donne un reste supérieur au Min car sinon même pb, aucune config
                            // ne couvrera le nb de pan
                            if (Convert.ToInt32(Config_tri[i]["Nbtot"]) <= Reste && ((Reste - Convert.ToInt32(Config_tri[i]["Nbtot"]) == 0) || (Reste - Convert.ToInt32(Config_tri[i]["Nbtot"]) > Min)))
                            {
                                //Donc si une config passe la boucle de test, je calcule cb de config je peux utiliser
                                // ac la variable NbOnd et le reste de panneaux non configurés ac Reste
                                int NbOnd = Reste / Convert.ToInt32(Config_tri[i]["Nbtot"]);
                                Reste = Reste % Convert.ToInt32(Config_tri[i]["Nbtot"]);
                                // Ce test permet de savoir si je suis sorti de la boucle do_while qui signifie que je dois faire le test avec
                                // avec le Nbond de la plus grosse config en cours décrémenter de 1 
                                if (Decrementation_Nbond)
                                {
                                    // ici je vérifie d'abord que le Reste est < Min car sinon dans la boucle précédente
                                    // ou Nbond n'a pas été décrémenté, le if (Reste < Min && Reste != 0) qui suit aura
                                    // déja décrémentë le Nbond donc j'obtiendrai le même résultat qu'auparavant
                                    if (Reste < Min)
                                    {
                                        NbOnd--;
                                        Reste = Reste + Convert.ToInt32(Config_tri[i]["Nbtot"]);
                                    }
                                    // Ici je décrémente NbOnd du nb de fois que je suis sorti de ma boucle do
                                    NbOnd = NbOnd - Nb_de_decrementation;
                                    // Le reste est donc incrémenter du nb de pan qui correspond aux configs retirées
                                    Reste = Reste + Nb_de_decrementation * Convert.ToInt32(Config_tri[i]["Nbtot"]);
                                    // Si j'arrive à 0,, j'ai testé toutes les valeurs de Nbond possible pour cette 
                                    //Config, je dois donc sortir de mon do et décrémenter la ligne lue du 
                                    //Dataview ce qui me renvoit au for du début
                                    if (NbOnd == 0)
                                        ok2 = false;
                                }
                                // Ce test permet de vérifier que le Reste est supérieur au Min car sinon aucue des 
                                // config suivante ne sera utilisable. Si ce n'est pas le cas, je décrémente NbOnd et
                                // rajoute au Reste le NbOnd de Panel correspondant
                                if (Reste < Min && Reste != 0)
                                {
                                    if (NbOnd != 0)
                                    {
                                        do
                                        {
                                            NbOnd--;
                                            Reste = Reste + Convert.ToInt32(Config_tri[i]["Nbtot"]);
                                        }
                                        while (Reste < Min);
                                    }
                                }
                                // Enfin ici, si j'ai un NbOnd > 0, j'ajoute ma config à config_auto
                                // Une config auto est composée de toutes les configs non nulles (Nbond>0)
                                // de la même boucle do while gérer par ok
                                // Je change de config auto en incrémentant "Num"
                                if (NbOnd != 0)
                                {
                                    DataRow conf = Config_Auto.NewRow();
                                    conf["Nbond"] = NbOnd;
                                    conf["Nom"] = Config_tri[i]["Nom"];
                                    conf["Nb"] = Num;
                                    conf["Conf"] = Config_tri[i]["Conf"];
                                    conf["Nbtot"] = Config_tri[i]["Nbtot"];
                                    conf["Ratio"] = 100 * Convert.ToDouble(Panneau.Rows[0]["puissance"]) * Convert.ToDouble(Config_tri[i]["Nbtot"]) / (1000 * Convert.ToDouble(Config_tri[i]["Pow"]));
                                    Config_Auto.Rows.Add(conf);
                                }
                                //J'ai déjà décrémenté Nbond dans cette boucle, dc ma condition devient fausse
                                Decrementation_Nbond = false;
                            }
                            // Condition de sorti du premier do : Reste = 0 ou ttes les configs parcourues
                            if (Reste == 0 || i == 0)
                                ok = false;
                        }
                        while (ok);
                        // J'incrémente le num de configs
                        Num++;
                        // J'incrémente le Nb de Nbond à retiré
                        Nb_de_decrementation++;
                        // La condition de mon do redevient vrai
                        ok = true;
                        //Je redonne le num de la ligne de départ du parcours des configs 
                        i = Config_tri.Count - config;
                        // Ma condition de décrémentation devient vrai
                        Decrementation_Nbond = true;
                    }
                    while (ok2);
                    //Je recommence un test en commencant parla config suivante
                    ok2 = true;
                    // Decrementation de i pour commencer de la config suivante
                    i = Config_tri.Count - config;
                    // Valeur qui permet de décrémenter i
                    config++;
                    //Je repars  à 0 mon nb de décrémentation de NbOnd
                    Nb_de_decrementation = 0;
                    //Premier passage donc pas de décrémentation
                    Decrementation_Nbond = false;
                }

  2. #2
    Membre Expert Avatar de sisqo60
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2006
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 754
    Par défaut
    Bonjour,

    J'ai lu et relu ton sujet et j'avoue ne rien avoir compris de tes explications.

  3. #3
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Par défaut
    Bonjour,

    Effectivement comme tu l'indiques il sagit d'un problème d'algorithme.

    Je l'ai écrit en VB.NET, (désolé) mais ce sera facile de le transposer en C#.

    Je prend les hypothèse que :
    1) nb_pan peut être découpé de façcon entière par la config la plus petite
    2) que les autre configs sont des multiples de la plus petite.

    Note : je pars de l'ensemble de config les plus petites.
    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
        Function decoupage(ByVal nbpan As Integer, ByVal c1 As Integer, ByVal c2 As Integer, ByVal c3 As Integer) As String
            Dim x As Integer = 0
            Dim y As Integer = 0
            Dim z As Integer = 0
            Dim reste As Integer = nbpan
            Dim LesConfig As New System.Text.StringBuilder()
     
            While nbpan > (x * c1)
                z = reste \ c3
                If z < 0 Then z = 0
                LesConfig.AppendFormat("{0} pan de {1}     +     {2} pan de {3}     +     {4} pan de {5}     =     {6}", (z).ToString, (c3).ToString, (y).ToString, c2.ToString, (x).ToString, c1.ToString, (z * c3 + y * c2 + x * c1).ToString)
                LesConfig.AppendLine()
                y += 1
                If nbpan - (y * c2) - (x * c1) >= 0 Then
                    reste = nbpan - (y * c2) - (x * c1)
                Else
                    LesConfig.AppendLine()
                    y = 0
                    x += 1
                    If nbpan - (x * c1) >= 0 Then
                        reste = nbpan - (x * c1)
                    End If
                End If
            End While
            Return LesConfig.ToString
        End Function
    Appel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            If Integer.Parse(txtNbPan.Text) Mod Integer.Parse(txtC3.Text) <> 0 Then
                MessageBox.Show(" impossible de découper de façon entière.")
            Else
                rtfConfig.Text = decoupage(Integer.Parse(txtNbPan.Text), Integer.Parse(txtC1.Text), Integer.Parse(txtC2.Text), Integer.Parse(txtC3.Text))
            End If
    Résultat
    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
        //40 pan de 5     +     0 pan de 20     +     0 pan de 30     =     200
        //36 pan de 5     +     1 pan de 20     +     0 pan de 30     =     200
        //32 pan de 5     +     2 pan de 20     +     0 pan de 30     =     200
        //28 pan de 5     +     3 pan de 20     +     0 pan de 30     =     200
        //'24 pan de 5     +     4 pan de 20     +     0 pan de 30     =     200
        //'20 pan de 5     +     5 pan de 20     +     0 pan de 30     =     200
        //'16 pan de 5     +     6 pan de 20     +     0 pan de 30     =     200
        //'12 pan de 5     +     7 pan de 20     +     0 pan de 30     =     200
        //'8 pan de 5     +     8 pan de 20     +     0 pan de 30     =     200
        //'4 pan de 5     +     9 pan de 20     +     0 pan de 30     =     200
        //'0 pan de 5     +     10 pan de 20     +     0 pan de 30     =     200
     
        //'34 pan de 5     +     0 pan de 20     +     1 pan de 30     =     200
        //'30 pan de 5     +     1 pan de 20     +     1 pan de 30     =     200
        //'26 pan de 5     +     2 pan de 20     +     1 pan de 30     =     200
        //'22 pan de 5     +     3 pan de 20     +     1 pan de 30     =     200
        //'18 pan de 5     +     4 pan de 20     +     1 pan de 30     =     200
        //'14 pan de 5     +     5 pan de 20     +     1 pan de 30     =     200
        //'10 pan de 5     +     6 pan de 20     +     1 pan de 30     =     200
        //'6 pan de 5     +     7 pan de 20     +     1 pan de 30     =     200
        //'2 pan de 5     +     8 pan de 20     +     1 pan de 30     =     200
     
        //'28 pan de 5     +     0 pan de 20     +     2 pan de 30     =     200
        //'24 pan de 5     +     1 pan de 20     +     2 pan de 30     =     200
        //'20 pan de 5     +     2 pan de 20     +     2 pan de 30     =     200
        //'16 pan de 5     +     3 pan de 20     +     2 pan de 30     =     200
        //'12 pan de 5     +     4 pan de 20     +     2 pan de 30     =     200
        //'8 pan de 5     +     5 pan de 20     +     2 pan de 30     =     200
        //'4 pan de 5     +     6 pan de 20     +     2 pan de 30     =     200
        //'0 pan de 5     +     7 pan de 20     +     2 pan de 30     =     200
     
        //'22 pan de 5     +     0 pan de 20     +     3 pan de 30     =     200
        //'18 pan de 5     +     1 pan de 20     +     3 pan de 30     =     200
        //'14 pan de 5     +     2 pan de 20     +     3 pan de 30     =     200
        //'10 pan de 5     +     3 pan de 20     +     3 pan de 30     =     200
        //'6 pan de 5     +     4 pan de 20     +     3 pan de 30     =     200
        //'2 pan de 5     +     5 pan de 20     +     3 pan de 30     =     200
     
        //'16 pan de 5     +     0 pan de 20     +     4 pan de 30     =     200
        //'12 pan de 5     +     1 pan de 20     +     4 pan de 30     =     200
        //'8 pan de 5     +     2 pan de 20     +     4 pan de 30     =     200
        //'4 pan de 5     +     3 pan de 20     +     4 pan de 30     =     200
        //'0 pan de 5     +     4 pan de 20     +     4 pan de 30     =     200
     
        //'10 pan de 5     +     0 pan de 20     +     5 pan de 30     =     200
        //'6 pan de 5     +     1 pan de 20     +     5 pan de 30     =     200
        //'2 pan de 5     +     2 pan de 20     +     5 pan de 30     =     200
     
        //'4 pan de 5     +     0 pan de 20     +     6 pan de 30     =     200
        //'0 pan de 5     +     1 pan de 20     +     6 pan de 30     =     200
    Si tu as du mal, je le traduirais en C#.

    A+, Hervé.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

Discussions similaires

  1. Algorithme calcul date paiement à partir conditions de paiement
    Par Cereal123 dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 22/05/2010, 16h19
  2. Réponses: 7
    Dernier message: 28/03/2008, 10h29
  3. Y-a t-il plusieurs algorithmes de calcul de l'amortissement d'un prêt?
    Par kouka dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 12/09/2007, 13h33
  4. Recherche : Algorithme Calcul Semaine Fiscal - Calendrier
    Par Arvulis dans le forum Mathématiques
    Réponses: 1
    Dernier message: 26/06/2007, 11h31
  5. Réponses: 5
    Dernier message: 30/11/2005, 11h54

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