•Grimley
Strain
Karma: 1
Deconectat
Mesaje: 4
|
|
« Răspunde #5 : August 09, 2010, 20:09:13 » |
|
Buna, Am vazut acum link-ul catre problema care mai exista deja. O sa arunc o privire. Situatia este in felul urmator. Se poate ajunge pana la un numar de 2000 de scanduri. Si mai multe chiar. Partea buna a lucrurilor este ca dimensiunile se repeta. Adica eu construiesc un produs, la care am nevoie de 2 scanduri de 2 metri si 2 de 1.4 In proiectul meu pot sa am 2 mii de produse de acelasi fel, dar dimensiunile diferite pe scandura nu sunt foarte multe de obicei. Adica nu cred ca sunt mai mult de 20. Si ma gandesc sa aplic un algoritm pt un numar mai mic de scanduri si apoi sa ma folosesc de rezultate ca sa multiplic rezultatul final. Hai sa dau un rezultat mult mai concret si sa spun ce am facut eu pana acum. Plecand de la ideea ca oricum ar fi daca am o limita de L = 6, orice scandura mai mare de L/2 (3 m) formeaza un vector solutie, deci deja scot pe cele mari. Aplicand acest principiu am facut un algoritm care arata astfel: - vectorul V este vectorul initial, fiecare elemet reprezinta o scandura din necesar - matricea M a solutiilor, fiecare linie reprezinta o scandura standard de lungimea L iar componentele liniilor (coloanele) sunt dimensiunile din necesar care compun scandura de lungime L De ex: Am din raport un necesar de 10 bare sa spunem de urmatoarele dimensiuni: V( 4,3,3,4,2,3,2,2,3,4) LIMITA L=6 M = matricea finala a solutiilor care initial este nula 1) Sortez vectorul desc V=(4,4,4,3,3,3,3,2,2,2) 2) Pun primul element din V in M V = (4.4,3,3,3,3,2,2,2) M = ((4)) 3) Incerc sa pun urmatorul element din V, dar verific daca elementtul poate fi adaugat pe aceiasi linie (Suma elementelor pe linie nu depaseste LIMITA 6) In cazul meu 4+4 = 8 deci depaseste limita si trebuie sa mai creez o linie in M. V si M arata astfel: V = (4,3,3,3,3,2,2,2) M = ( (4) (4) ) 4) V = (3,3,3,3,2,2,2) M = ( (4), (4), (4), ) 5) V = (3,3,3,2,2,2) M = ( (4), (4), (4), (3) ) 6) Pasul 6 aduce ceva nou, pentru prima oara am un element care poate fi adaugat. Evident verifica daca poate fi adaugat in prima linie in a doua samd pana ajung la linia a 4a care imi permite sa adaug noul element din V deoarece 3+3 =<= L care este 6 V = (3,3,2,2,2) M = ( (4), (4), (4), (3,3) ) 7) V = (3,2,2,2) M = ( (4), (4), (4), (3,3), (3) ) 7) V = (2,2,2) M = ( (4), (4), (4), (3,3), (3,3) ) Pasul 8 aduce ceva nou, elementele vectorului V pot fi integrate in partea initiala a matricii finale deoarece V fiind sortat desc, elementele din V devin din ce in ce mai mici V = (2,2) M = ( (4,2), (4), (4), (3,3), (3,3) ) 9) V = (2) M = ( (4,2), (4,2), (4), (3,3), (3,3) ) 10) V = () M = ( (4,2), (4,2), (4,2), (3,3), (3,3) ) 11) PAS FINAL ;' o mica analiza V = () M = ( (4,2), = necesar 4+2 = 6 ; LIMITA - total necesar = 6 - 6; Pierdere = 0 (4,2),= necesar 4+2 = 6 ; LIMITA - total necesar = 6 - 6; Pierdere = 0 (4,2),= necesar 4+2 = 6 ; LIMITA - total necesar = 6 - 6; Pierdere = 0 (3,3),= necesar 3+3 = 6 ; LIMITA - total necesar = 6 - 6; Pierdere = 0 (3,3)= necesar 3+3 = 6 ; LIMITA - total necesar = 6 - 6; Pierdere = 0 ) Total Pierderi = 0 Concluzii : Acesta este un caz ideal evident dar solutie este foarte rapida, datorita numarului mic de iteratii si rezultatul este satisfacator. Am rulat exemplul pentru 20 de numere reale de aceasta data , toate diferite si am avut o pierdere de 5-10%. Ma bucuram de rezultate cand clientul a aplicat algoritmul pe o situatie reala si a aplicat alg unui alt soft(nemtesc - si care in opinia lui e cel mai bun, iar noi toti suntem prosti) iar comparatia dintre rezultatele mele si rezultatele lui au fost devastatoare pentru mine. El a avut o pierdere de 3 ori mai mica. O sa mai scriu un post si cu rezultatele algoritmului meu si cu rezultatele algoritmului lui , cu concluziile ce le-am tras...sa mai avem pe ce discuta. Mercik
|