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