Weer een berichtje van mij

. Ik had gehoopt er vandaag wat mee bezig te zijn op kantoor maar er kwamen andere dringendere zaken tussendoor

, maar heb ondertussen wel de tijd gehad om dingen eens in mijn hoofd uiteen te zetten.
Anyway, ik had wat getallen beloofd. Vergeet niet dat mijn GA pas daadwerkelijk begon nádat er een deterministisch algo overheen was gegaan, zoals ik in een van de eerste posts in deze draad al zei - deze opmerking lijkt een beetje ondergesneeuwd te zijn. Dit algoritme lag niet zo heel erg ver van jullie oplossing vandaan (een greedy algo dat in plaats van groepen de batches bij elkaar voegt, en ondertussen wat slims probeert te doen met de resources binnen die batches om de seektijden te minimaliseren). Dit algo was echter takketraag en ik zag niet echt een manier om het sneller te maken, plus het feit dat het snel op een lokaal minimum bleef hangen. Vandaar dat ik op dat moment ben overgestapt op een GA die door z'n randomheid weliswaar een stuk minder deterministisch was maar wel veel sneller oplossingen probeerde.
De initiele start van de GA met deze data lag rond de 850.000, na een dagje rekenen zat het rond de 750.000. Die hebben jullie tot op heden dus nog niet gebeat

, maar daar staat tegenover dat ik ook nog geen computing times van 24+ uur zie

.
Máár, geïnspireerd door jullie discussie ben ik weer eens gaan nadenken om verbeteringen aan te brengen aan het deterministische startup deel. Jullie hadden aangetoond dat gewoon groepen bij elkaar stoppen ook best een goed uitgangspositie vormt, maar waarvan de code wel een stuk simpeler is. En omdat de code veel simpeler werd, leek het me ook een stuk makkelijker om de kosten incrementeel te updaten terwijl je aan het proberen bent.
Ik heb dus vanavond het een en ander uit zitten werken, en ben op een oplossing gekomen die binnen een minuut de volledige set bij elkaar graait (en heb daarbij vergelijkbare conclusies gevonden als Soultaker, zoals sorteren op grootte, maar bijvoorbeeld ook de batches sorteren op aantal groepen en daar dan overheen lopen en alle groepen pakken die je nog niet hebt gehad), en daarna incrementeel gewoon steeds een willekeurig element verwijderen en die op de meest efficiente plek weer terugzetten. Na een 10 minuten looptijd duikt hij onder de 800.000, maar progress is daarna wel heel langzaam. Na totaal 20 minuten staat de teller momenteel op 792.940. Dit alles is overigens nog op een enkele core (van een C2Q @ 3GHz)
Maar goed, dit is slechts een eerste implementatie. Door steeds maar 1 resource te verplaatsen blijf je natuurlijk al snel in een lokaal minimum hangen, je zult er meerdere tegelijk moeten doen om daar overheen te komen.
Ik wil jullie in ieder geval even bedanken voor de hint in deze richting, die ik in eerste instantie had afgeschreven door een brakke implementatie van mijn kant.
Mijn incrementele methode werkt door voor iedere batch een lijst bij te houden welke resources hij allemaal aandoet, en wat de kosten zijn tussen die resources. Vervolgens loop ik voor een te inserten resource van voor naar achter over de al gevormde permutatie, waarbij ik voor elke batch bijhoud waar ik momenteel zit in de batch. Voor batches waar de huidige resource niet inzit hoef je alleen te updaten als je resource uit die batch passeert (omdat de afstand tussen de vorige en de huidige dan kleiner wordt, en die tussen de huidige en de volgende groter). Voor batches waar je resource wel inzit moet je updaten voor elke iteratie, door de link A-B op te splitsen in A-X-B, met A en B de al bestaande resources en X de te inserten resource. Dan heb je niet eens een sort nodig.
En ik hoop dat jullie ook slim genoeg waren om batches met 1 resource te negeren, en batches die meerdere keren voorkomen samen te voegen. Uiteindelijk kom ik op 808 verschillende relevante batches, ipv de 1226 (dacht ik) van het origineel
.edit: 789710 inmiddels na 30 minuten.
[
Voor 4% gewijzigd door
.oisyn op 20-11-2012 00:34
]