edit:
kut, ik zie net dat deze topic eigenlijk in "Software Engineering & Architecture" moet. Kan een modje hem moven?
kut, ik zie net dat deze topic eigenlijk in "Software Engineering & Architecture" moet. Kan een modje hem moven?
Sorry voor de wat vage topictitel maar ik kon geen echt passende verzinnen. Het gaat om het volgende probleem (half-abstract): ik heb dataset van N elementen en die wil ik opsplitsen in X groepen. Voor elk van deze groepen bereken ik een fitness aan de hand van een bepaalde criterium en ik kies de beste uit resultaat.
Een klein voorbeeld met N = 4 en X = 3.
Alle mogelijke combinaties van N zijn de volgende (ik heb ze niet allemaal opgesomd) (4! = 24 mogelijkheden):
code:
1
2
3
4
5
6
7
8
9
10
11
12
| 1234 1243 1324 1423 1432 2134 2143 2314 2341 2413 2431 ... |
Om deze op te splitsen in X (=3) groepen zijn voor elk element C(3,2) = 3 mogelijkheden. Eg
code:
1
2
3
4
5
6
7
8
| 1, 2, 34 1, 23, 4 12, 3, 4 ... 1, 2, 43 1, 24, 3 12, 4, 3 ... |
Dus de totale aantal combinaties die ik uit kan/moet proberen zijn N! * C(N-1, X-1), voor dit probleem 24*3 = 72 mogelijkheden. Dit heb ik ook geimplementeerd, en het werkt.
Maar zoals je zelf ook kan zien, wordt explodeert dit met grotere N. Bij N = 20 heb je al 2.4*10^18 alleen al permutaties en dan moet je nog combineren. Dit is duidelijk ondoenlijk veel.
Zoals je zelf ook ziet, en ik ook heb gezien heb je heel veel dubbele. Het maakt namelijk niet uit of de groep "1, 2, 34" of "1, 2, 43" is, het is dezelfde groep. Zo kan ik het totale terugbrengen naar 6. Eg
code:
1
2
3
4
5
6
| 12, 3, 4 13, 4, 2 14, 2, 3 23, 1, 4 24, 1, 3 34, 1, 2 |
N=4, X=3 was wel makkelijk met de hand, ik zie het patroon ook; maar voor N=5, X=3 kan je al groepen maken van 3,1,1 of 2,2,1 en zijn al gelijk veel meer unieke combinaties mogelijk. Volgens mij is dit trekken zonder teruglegging.
Een groep van drie:
C(5,3) = 10, blijven er 2 over, ik trek er 1 C(2,1) = 2, blijft er 1 over C(1,1) = 1. 10*1*1 = 10.
Een groep van twee:
C(5,2) = 10, blijven er 3 over, ik trek er 2 C(3,2) = 3, blijft er 1 over C(1,1) = 1. 10*3*1 = 30;
Totaal 40? Maar het maakt niks uit of ik in de eerste groep dezelfde twee trek als in de derde groep; eg 12, 5, 34 is hetzelfde als 34, 5, 12, dus misschien? delen door 2, dan blijven in groepen van twe 15 over en is het totale combinaties 25.
Ik ben niet zo'n wiskundeknobbel, ziet iemand de regelmaat? En hoe zou ik dit in C moeten doen?
[ Voor 16% gewijzigd door Darkvater op 13-05-2009 11:30 . Reden: beter voorbeeld voor N=5 ]
Windows Vista? *NEVER* Het waarom - Opera forever!!!
I've seen chickens that were more menacing. Chickens in a coma. On ice. In my fridge