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;
            }