Ik heb een lijstje met 42 mensen (spelers) die ingeschreven zijn voor een spel. Elke speler heeft een bepaalde rating wat in principe zijn niveau aangeeft. Een rating is gewoon een getal van ~100 (zeer slecht) tot ~8000 (zeer goed). Ik wil deze lijst spelers indelen in 21 teams van elk 2 spelers, met behulp van een genetisch algoritme om de optimale combinatie van spelers in teams te vinden.
Wellicht is een genetisch algoritme niet de beste keuze, in dat geval hoor ik graag wat beter zou zijn, maar ik vind dit ook een leuk projectje om mijn (basis) kennis over genetische algoritmen wat te vergroten, aangezien ik merk dat ik al snel vast loop.
Probleem 1: het 'encoden' van een oplossing in een genome... Voor zover ik begrijp moet (meestal?) een oplossing van een GA te coderen zijn als een string van bitjes (0110101001110) of misschien andere getallen. Ik ben hier niet te lang over ingegaan en heb wellicht al meteen de verkeerde keuze gemaakt: mijn genome is simpelweg een lijstje van de spelers op een bepaalde volgorde. De volgorde bepaald ook de teams: speler 1 en 2 zitten in het eerste team, speler 3 en 4 in het tweede team, speler 5 en 6 in het volgende team, enz. Voordat ik begin krijgt elke speler een nummer (1 t/m 42) dus zou je een oplossing/genome kunnen zien als een lijstje van deze nummers, zoals (8,18,1,32,42,...,2,9). Dit geeft dan team combinaties (8,18) en (1,32) en (32,42) , ... , en (2,9).
Probleem 2: de fitness function.
Het indelen van teams gebeurt natuurlijk aan de hand van een (aantal) criteria waar zo goed mogelijk aan voldaan moet worden. Deze criteria moeten uiteraard vertaald worden naar een fitness functie die ik in het GA kan gebruiken om te bepalen hoe goed een oplossing (21 ingedeelde teams) is. Er zijn meerdere criteria maar ik wil het niet meteen te moeilijk maken dus ik zal beginnen met een simpele, en zal later uitleggen op welke manier het nog lastiger wordt.
Alleen naar rating kijken
De makkelijkste manier om de teams te verdelen is door te zorgen dat elk team zoveel mogelijk gelijk is (qua gemiddelde rating van de twee spelers) aan de andere teams. Met andere woorden: de standaard deviatie van de gemiddelde ratings van een team (vergeleken met de gemiddelde rating van alle teams) moet zo klein mogelijk zijn. Een oplossing waarbij er een team met een rating van 8000 is en een team met een oplossing van 200 is dus heel slecht, veel beter is alle teams gemiddeld tussen 3500 en 4500 bijvoorbeeld.
De fitness functie hiervoor leek voor de hand te liggen: ik gebruik de reciproke van de standaard deviatie direct als fitness. Hoe hoger de fitness, hoe lager de std dev, hoe beter de teams met elkaar gematched zijn.
Rekening houden met auto keuze
Het spel in kwestie is een race spel, en spelers kunnen een van twee beschikbare auto's kiezen om mee te spelen. Elk team moet uit een auto A en een auto B bestaan (dus niet teams met twee keer auto A of twee keer B ). Bij het inschrijven heeft iedereen zijn keuze aangegeven, echter was er ook een optie om aan te geven dat de keuze niet belangrijk is; in dat geval mag elke auto aan jou toegewezen worden.
Dit heb ik in de fitness functie proberen te bouwen door een fitness van 0 terug te geven wanneer de auto keuze van één van de gemaakte teams niet geldig is: dat wil zeggen als er een team is wat twee keer dezelfde auto heeft. Dit klinkt makkelijk maar ik zie hier wel 'gevaar' in: wellicht is er een oplossing die bijna optimaal is behalve dat een team twee keer dezelfde auto is. Deze oplossing wordt meteen weg gegooid en zal dus nooit meedoen met recombinatie. Het lijkt erop dat ik hiermee dus goeie oplossingen ga verliezen, klopt dat? Hoe voer ik dit criteria beter in?
Rekening houden met teamgenoot keuze
Ten slotte konden spelers aangeven als ze een voorkeur voor teamgenoot hadden. Hiermee hoeft niet absoluut rekening mee gehouden te worden, als het niet lukt dan hebben de spelers pech en krijgen ze een andere teamgenoot. Maar een oplossing waarbij aan alle teamgenoot keuzes voldaan is zou wel een hogere fitness moeten hebben dan eentje waarbij dit niet het geval is. Hier weet ik ook weer niet hoe ik dit in een fitness functie ga stoppen...
Probleem 3: recombinatie...
Ten slotte het belangrijkste probleem: ik heb geen idee hoe ik een recombinatie van twee oplossingen ga doen om twee nieuwe 'kinderen' te maken. Het typische voorbeeld wat ik tegenkom is dat twee genomes (weergegeven door bitjes) op een willekeurige plek 'splicen' en elkaar vervangen (ik neem aan dat jullie weten wat ik bedoel). Dit werkt echter totaal niet voor mijn genome (lijstje van spelers), als ik twee willekeurige lijstjes halverwege met elkaar ga verwisselen dan krijg ik hoogstwaarschijnlijk twee ongeldige oplossingen terug omdat er spelers 2 keer voorkomen en spelers helemaal niet meer voorkomen..?
Simpel voorbeeldje met 4 spelers ( | symbool geeft punt van recombinatie aan)
123|4
432|1
------- Resultaat:
1231 (ongeldig)
4324 (ongeldig)
Hoe ga ik twee lijstjes van spelers recombineren zodat er (1) twee geldige oplossingen uitkomen en (2) de kans 'groot' is dat de kinderen beter zijn dan de ouders (dus dat de goeie eigenschappen behouden blijven)?
Mijn recombinatie is momenteel niks anders dan random een van de twee ouders terug geven
Dat wil zeggen dat er niks genetisch aan mijn algoritme is waardoor het ook niet echt goed werkt (het is nu meer een algoritme dat 10,000 random oplossingen maakt en hopelijk toevallig een goeie overhoudt).
Nogal een lange post, misschien is het wat te algemeen maar ik kom er niet meer uit. Ik snap dat het coderen van het genome en design van de fitness functie de hele clue van een GA is maar wellicht hebben jullie wat tips waarmee ik verder kan... Alvast bedankt!
Wellicht is een genetisch algoritme niet de beste keuze, in dat geval hoor ik graag wat beter zou zijn, maar ik vind dit ook een leuk projectje om mijn (basis) kennis over genetische algoritmen wat te vergroten, aangezien ik merk dat ik al snel vast loop.
Probleem 1: het 'encoden' van een oplossing in een genome... Voor zover ik begrijp moet (meestal?) een oplossing van een GA te coderen zijn als een string van bitjes (0110101001110) of misschien andere getallen. Ik ben hier niet te lang over ingegaan en heb wellicht al meteen de verkeerde keuze gemaakt: mijn genome is simpelweg een lijstje van de spelers op een bepaalde volgorde. De volgorde bepaald ook de teams: speler 1 en 2 zitten in het eerste team, speler 3 en 4 in het tweede team, speler 5 en 6 in het volgende team, enz. Voordat ik begin krijgt elke speler een nummer (1 t/m 42) dus zou je een oplossing/genome kunnen zien als een lijstje van deze nummers, zoals (8,18,1,32,42,...,2,9). Dit geeft dan team combinaties (8,18) en (1,32) en (32,42) , ... , en (2,9).
Probleem 2: de fitness function.
Het indelen van teams gebeurt natuurlijk aan de hand van een (aantal) criteria waar zo goed mogelijk aan voldaan moet worden. Deze criteria moeten uiteraard vertaald worden naar een fitness functie die ik in het GA kan gebruiken om te bepalen hoe goed een oplossing (21 ingedeelde teams) is. Er zijn meerdere criteria maar ik wil het niet meteen te moeilijk maken dus ik zal beginnen met een simpele, en zal later uitleggen op welke manier het nog lastiger wordt.
Alleen naar rating kijken
De makkelijkste manier om de teams te verdelen is door te zorgen dat elk team zoveel mogelijk gelijk is (qua gemiddelde rating van de twee spelers) aan de andere teams. Met andere woorden: de standaard deviatie van de gemiddelde ratings van een team (vergeleken met de gemiddelde rating van alle teams) moet zo klein mogelijk zijn. Een oplossing waarbij er een team met een rating van 8000 is en een team met een oplossing van 200 is dus heel slecht, veel beter is alle teams gemiddeld tussen 3500 en 4500 bijvoorbeeld.
De fitness functie hiervoor leek voor de hand te liggen: ik gebruik de reciproke van de standaard deviatie direct als fitness. Hoe hoger de fitness, hoe lager de std dev, hoe beter de teams met elkaar gematched zijn.
Rekening houden met auto keuze
Het spel in kwestie is een race spel, en spelers kunnen een van twee beschikbare auto's kiezen om mee te spelen. Elk team moet uit een auto A en een auto B bestaan (dus niet teams met twee keer auto A of twee keer B ). Bij het inschrijven heeft iedereen zijn keuze aangegeven, echter was er ook een optie om aan te geven dat de keuze niet belangrijk is; in dat geval mag elke auto aan jou toegewezen worden.
Dit heb ik in de fitness functie proberen te bouwen door een fitness van 0 terug te geven wanneer de auto keuze van één van de gemaakte teams niet geldig is: dat wil zeggen als er een team is wat twee keer dezelfde auto heeft. Dit klinkt makkelijk maar ik zie hier wel 'gevaar' in: wellicht is er een oplossing die bijna optimaal is behalve dat een team twee keer dezelfde auto is. Deze oplossing wordt meteen weg gegooid en zal dus nooit meedoen met recombinatie. Het lijkt erop dat ik hiermee dus goeie oplossingen ga verliezen, klopt dat? Hoe voer ik dit criteria beter in?
Rekening houden met teamgenoot keuze
Ten slotte konden spelers aangeven als ze een voorkeur voor teamgenoot hadden. Hiermee hoeft niet absoluut rekening mee gehouden te worden, als het niet lukt dan hebben de spelers pech en krijgen ze een andere teamgenoot. Maar een oplossing waarbij aan alle teamgenoot keuzes voldaan is zou wel een hogere fitness moeten hebben dan eentje waarbij dit niet het geval is. Hier weet ik ook weer niet hoe ik dit in een fitness functie ga stoppen...
Probleem 3: recombinatie...
Ten slotte het belangrijkste probleem: ik heb geen idee hoe ik een recombinatie van twee oplossingen ga doen om twee nieuwe 'kinderen' te maken. Het typische voorbeeld wat ik tegenkom is dat twee genomes (weergegeven door bitjes) op een willekeurige plek 'splicen' en elkaar vervangen (ik neem aan dat jullie weten wat ik bedoel). Dit werkt echter totaal niet voor mijn genome (lijstje van spelers), als ik twee willekeurige lijstjes halverwege met elkaar ga verwisselen dan krijg ik hoogstwaarschijnlijk twee ongeldige oplossingen terug omdat er spelers 2 keer voorkomen en spelers helemaal niet meer voorkomen..?
Simpel voorbeeldje met 4 spelers ( | symbool geeft punt van recombinatie aan)
123|4
432|1
------- Resultaat:
1231 (ongeldig)
4324 (ongeldig)
Hoe ga ik twee lijstjes van spelers recombineren zodat er (1) twee geldige oplossingen uitkomen en (2) de kans 'groot' is dat de kinderen beter zijn dan de ouders (dus dat de goeie eigenschappen behouden blijven)?
Mijn recombinatie is momenteel niks anders dan random een van de twee ouders terug geven

Nogal een lange post, misschien is het wat te algemeen maar ik kom er niet meer uit. Ik snap dat het coderen van het genome en design van de fitness functie de hele clue van een GA is maar wellicht hebben jullie wat tips waarmee ik verder kan... Alvast bedankt!