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
| n, i , j , jmin , tmax , nKkk , Kkk0 est un entier
sum_min , Sum19 , Moy6 , Plafond est un réel
Best_scenar est un_scenar
Qscenar , newscenar , zzscenar est un_scenar
Tbscenar est un tableau de un_scenar
qscore , best_score est un réel
pb est un booléen
ch est une chaîne
dh1 , dh2 est une DateHeure
ch = "56.94624,39.104,27.98432,26.9568,60.54048,48.8072,49.55808,31.85,50.752,55.3696, 46.78128,34.80048,38.75508,55.13664,39.3354,37.37448,80.3374,19.24208,12.3786"
POUR TOUTE CHAÎNE sCh DE ch SEPAREE PAR ","
i = i+1
Tbval[i]=Val(sCh)
Sum19 = Sum19 + Tbval[i]
FIN
Moy6 = Sum19 / 6
Trace ( " la somme ideale pour chaque groupe est de " , Moy6 )
TableauTrie(Tbval,ttDécroissant) // pas obligatoire, mais ça aide à faire en sorte que dès la première solution cherchée, on tombe sur une solution performante.
POUR i = 1 À 19
Trace(Tbval[i])
FIN
dh1 = DateHeureSys()
POUR i = 1 À 6
jmin=i
Best_scenar.tt[i] = jmin
Best_scenar.sumtt[jmin] = Best_scenar.sumtt[jmin] + Tbval[i]
Best_scenar.tt[13-i] = jmin
Best_scenar.sumtt[jmin] = Best_scenar.sumtt[jmin] + Tbval[13-i]
Best_scenar.tt[i+12] = jmin
Best_scenar.sumtt[jmin] = Best_scenar.sumtt[jmin] + Tbval[i+12]
FIN
POUR i = 19 À 19
sum_min = 999999999
POUR j = 1 À 6
SI Best_scenar.sumtt[j] < sum_min ALORS
jmin = j
sum_min = Best_scenar.sumtt[j]
FIN
FIN
Best_scenar.tt[i] = jmin
Best_scenar.sumtt[jmin] = Best_scenar.sumtt[jmin] + Tbval[i]
FIN
best_score = calcule_score ( Best_scenar )
Trace ( " A ce niveau, on a une valeur de référence")
affiche_resu ( Best_scenar, best_score )
Plafond = Moy6 + 5 * best_score / 6
Trace ( " On peut chercher d'autres solutions, mais dès qu'un des 6 groupes va dépasser " , Plafond, " cette solution ne peut être meilleure que la solution actuelle ")
j=1
i = 1
Qscenar.tt[j] = i
Qscenar.sumtt[i] = Tbval[j]
Qscenar.nB_placés = 1
Qscenar.nMax_non_vide = 1
TableauAjouteLigne(Tbscenar, Qscenar )
Kkk0 = 5000
TANTQUE TableauOccurrence(Tbscenar) > 0
n = TableauOccurrence(Tbscenar)
Qscenar = Tbscenar[n]
TableauSupprime(Tbscenar, n )
tmax = Qscenar.nMax_non_vide+1
SI tmax > 6 ALORS tmax = 6
POUR j = 1 À tmax
newscenar = Qscenar
newscenar.tt[Qscenar.nB_placés+1] = j
newscenar.sumtt[j] = newscenar.sumtt[j] +Tbval[ Qscenar.nB_placés+1 ]
SI newscenar.sumtt[j] < Plafond ALORS
newscenar.nB_placés = Qscenar.nB_placés+1
SI j > newscenar.nMax_non_vide ALORS newscenar.nMax_non_vide = j
SI newscenar.nB_placés < 19 ALORS
TableauAjouteLigne( Tbscenar, newscenar )
SINON
qscore = calcule_score ( newscenar )
SI qscore < best_score ALORS
// Si en plus la solution est valide (au moins 3 éléments dans chaque boite)
SI solution_valide(newscenar ) ALORS
best_score = qscore
Best_scenar = newscenar
Plafond = Moy6 + 5 * best_score / 6
// Je vire tous les scénarios en attente qui ne sont plus compétitifs
POUR ii = TableauOccurrence(Tbscenar) À 1 PAS - 1
zzscenar = Tbscenar[ii]
pb = Faux
POUR jj = 1 À 6
SI zzscenar.sumtt[jj] > Plafond ALORS pb = Vrai
FIN
SI pb ALORS
//trace ( " suppression scenar n°" , ii )
TableauSupprime(Tbscenar, ii )
FIN
FIN
FIN
//info( " ok on a amélioré ")
FIN
FIN
FIN
FIN
FIN
dh2 = DateHeureSys()
Trace ( " Résultat final " )
affiche_resu ( Best_scenar, best_score )
Info ( " fini" , DateHeureDifférence( dh1, dh2 )) |
Partager