Engineering is like Tetris. Succes disappears and errors accumulate.
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Was het een goede permutatie van resources vinden waarvoor de cost minimaal is, of is de volgorde van batches van belang? Daarnaast heb je het in de post met testdata over groups, ik nam aan dat een group een batch was
Ach ja, je hebt het opgelost lijkt me. Maar ik had gewoon zin om even te puzzelen, maar als je niet snapt wat de bedoeling is wordt het lastig
En het doel is een volgorde van groups/resources te bepalen waarvoor de kosten minimaal zijn. De volgorde van batches is niet van belang.
[ Voor 23% gewijzigd door .oisyn op 20-11-2012 13:33 ]
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Verwijderd
Wanneer is ik de resources sorteer met de volgende functie:Soultaker schreef op maandag 19 november 2012 @ 23:54:
Nice. Een hele makkelijke verbetering is om de resources voor de eerste fase te sorteren op grootte (van groot naar klein); dan zit je fitness al direct rond de 852375 in plaats van 935190. Of het veel effect heeft op de kwaliteit van de eindoplossing weet ik niet.
1
2
3
| return (a->batches.size() * X + a->size) > (b->batches.size() * X + b->size); |
Waar X = 9472 kom direct op een score van 821886. Dat is uiteengezet in de volgende grafiek. Horizontaal = X, vertcaal = de fitness.

(grafiek wijkt een paar duizend punten af vanwege een programmeerfout)
Tevens heb ik mijn iteratiealgoritme de avond laten draaien. Daar is uitgekomen:

De verticale as weergeeft de fitness. Verticaal de tijd (lineair, de schaal is niet interessant). In totaal zijn er 148280 remove/insert operaties geweest. Weinig verrassende resultaten.
Waarom 5, en geen hele batch?.oisyn schreef op dinsdag 20 november 2012 @ 10:29:
Wow. Ik heb 'm een hele nacht laten lopen, waarbij hij elke keer 5 random elementen uit de oplossing haalde en die opnieuw ging inserten,
Teller staat hier overigens momenteel op 736.999.
De volgende stap is meerdere oplossingen bijhouden en daarmee doorrekenen. Is makkelijk te parallelliseren en verbreedt de search.
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
... en zo herhaalt het topic zich weer.
736.303
Dat is de laatste 9.999 iteraties (verder gaat m'n console window niet terug
[ Voor 65% gewijzigd door .oisyn op 21-11-2012 00:51 ]
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
736.303 .oisyn: GA
821.886 Darkstone: batch-size gesorteerd
852.375 Soultaker: sorteren
3.724.445 testbestand: zonder optimalisatie
[ Voor 11% gewijzigd door Bolukan op 21-11-2012 07:24 ]
Verwijderd
Soultaker en ik gebruiken dezelfde 'verbetermethode' (random element verwijderen en weer inserren), en .oisyn verwijdert er gewoon X tegelijk, het GA wordt niet meer gebruikt.
Beetje flauw om het zo te stellen, het algo in de topicstart is een ad hoc fitnesscalculatie gegeven louter een permutatie van resources, en is ook niet ontworpen om snel te zijn bij meerdere tests van minieme aanpassingen. Het is niet zo dat jouw algo in het algemene geval ook 12x sneller isMijn gedeeltelijke fitness was 12x sneller dan die van .oisyn
[ Voor 25% gewijzigd door .oisyn op 21-11-2012 09:03 ]
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Elke batch in de data wordt 1x opgevraagd. Sommige batches zijn identiek, als je daar rekening mee houdt dan hoef je minder te berekenen, maar het is niet zo dat een batch staat voor een lijst resources die op willekeurige momenten kan worden opgevraagd door de game. Een batch is gewoon een specifieke situatie. Als je die situatie meerdere keren creëert (bijv. door in de game de hele tijd heen en weer te gaan lopen), dan wordt een batch wel meerdere keren opgevraagd, maar hij blijft gelinkt aan 1 specifieke situatie.
[ Voor 72% gewijzigd door .oisyn op 21-11-2012 10:43 ]
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Ik ben benieuwd hoe je zeker gaat weten/afdekken dat je methode ook voor meerdere spelers en playthroughs efficient gaat zijn. Of is dat inherent aan de opbouw van de game?
Engineering is like Tetris. Succes disappears and errors accumulate.
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Zou het mogelijk zijn om je oplossing te visualiseren zodat je een gevoel hebt van hoe goed je oplossing nu is? Dan kun je misschien inschatten hoeveel verbetering er nog mogelijk is.
Mijn verbetermethode was oorspronkelijk net iets anders: ik swapte twee random elementen. Dat convergeerde minder snel.Verwijderd schreef op woensdag 21 november 2012 @ 08:36:
Soultaker en ik gebruiken dezelfde 'verbetermethode' (random element verwijderen en weer inserten)
Wel herhaalde ik de hele insertion routine een aantal keer, waardoor ik al lager begon (~820,000 ipv ~850,000 ofzoiets) en dan leek fase twee ook wat lager uit te komen (of dat was toeval). Dat is zo'n beetje enige truc die ik verzonnen had die ondertussen niet door anderen sneller en beter geïmplementeerd is, geloof ik.
Misschien dat het nuttig is om op subsequences een rotatie uit te voeren (bijvoorbeeld door random i < j < k te pakken, en dan v = v[0:i) + [j:k) + [i:j) + [k:N) te construeren) — dat is equivalent aan een subsequence extracten en dan elders weer inserten, zonder dat je je vastlegd op de lengte ervan. Maar het is nog wel lastig om dat efficiënt te implementeren, denk ik.
Darkstone had wel wat grafiekjes gepost maar het lijkt er op dat verschillende heuristieken naar verschillende waarden convergeren. Ik denk niet dat je uit het feit dat de ene techniek een bepaalde plateau laat zien zomaar kunt concluderen dat er geen andere techniek is die een stuk lager uitkomt.Waster schreef op woensdag 21 november 2012 @ 14:14:
Zou het mogelijk zijn om je oplossing te visualiseren zodat je een gevoel hebt van hoe goed je oplossing nu is? Dan kun je misschien inschatten hoeveel verbetering er nog mogelijk is.
[ Voor 12% gewijzigd door Soultaker op 21-11-2012 17:02 ]
Verwijderd
.oisyn onthoud de 10 laatste waarden zodat hij uit het lokale minimum komt tenzij dat pad meer dan 10 diep is.Waster schreef op woensdag 21 november 2012 @ 14:14:
Als ik het goed begrijp gebruik je nu toch een hillclimbing algoritme? Of heb je manieren om uit een lokaal minimum te komen?
De fitness is gewoon 'een score' waar je weinig waarde aan moet hechten. Je kan er betekenis aan hangen als je het optimum kan inden, maar dat is N! = 1017439 mogelijkheden om te bruteforcen. Misschien is het mogelijk een simpele heuristiek te maken, maar hoe je dat gaat doen, geen idee.Zou het mogelijk zijn om je oplossing te visualiseren zodat je een gevoel hebt van hoe goed je oplossing nu is? Dan kun je misschien inschatten hoeveel verbetering er nog mogelijk is.
Ah, was dat het idee van de laatste 10 waarden onthoudenVerwijderd schreef op woensdag 21 november 2012 @ 19:12:
[...]
.oisyn onthoud de 10 laatste waarden zodat hij uit het lokale minimum komt tenzij dat pad meer dan 10 diep is.
Het lijkt een beetje op tabu search. Als oisyn toch die kant opgaat zou hij een tabu search algoritme ook nog kunnen proberen. Heb je daar al naar gekeken?
Verwijderd
Verder gebruik ik een mechanisme om de boel af en toe wat door elkaar te schudden als er al een tijdje geen betere oplossing is gevonden, simpelweg door alle oplossingen behalve de beste weg te gooien. Hierdoor is er weer ruimte voor veel slechtere oplossingen. Zo blijft hij momenteel bijvoorbeeld al een tijdje hangen op 725844. De andere gevonden oplossingen liggen daar naar vervloop van tijd meestal vlak achter:
725844-725845-725846-725847-725848-725849-725850-725851
Een rijtje dat perfect oploopt dus. Gaat dat 100 iteraties zo door dan gooi ik alles behalve de 725844 weg, waardoor het na een paar iteraties uitgroeit naar een minder "perfect" rijtje van
725844-725919-725994-726148-726448-726668-726817-726818
Die oplossingen zijn essentieel anders en vormen vaak de basis van verdere progress.
Overigens krijg je alleen maar slechtere oplossingen als je meer dan 1 element verwijdert en weer toevoegt, want anders zal je altijd een minstens zo goede oplossing vinden (namelijk de plek waar ie stond)
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Dit volg ik niet.oisyn schreef op donderdag 22 november 2012 @ 00:55:
Overigens krijg je alleen maar slechtere oplossingen als je meer dan 1 element verwijdert en weer toevoegt, want anders zal je altijd een minstens zo goede oplossing vinden (namelijk de plek waar ie stond)
Als je definieert dat de oude plek niet gecontroleerd moet worden of niet valide is, dan kun je natuurlijk wel een slechter resultaat krijgen.
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.