Ik ben voor het eerst aan het experimenten met genetic algorithms.
Nu wil ik als test een programma maken in processing (java), waarin in een bronfoto (grayscale) probeer na te bouwen via evolutie. De doelfoto begint dus van pixels met random grijswaarden en probeert zoveel mogelijk te bronfoto te benaderen
Nu loop ik echter vast op 2 zaken:
1) Probleem 1:
hoe bepaal ik de fitness functie?
momenteel haal ik de brightness uit de bronpixel en evolution pixel (allebij de waardes kunnen tussen 0 en 100 liggen)
Nu moet ik de brightness kunnen omzetten naar een getal die de fitness voorstelt.
Hiervoor gebruik ik momenteel:
Bright is hierbij de brightness van de evolutie pixel en target is de te vinden waarde (waarde van de bronpixel helderheid)
Bovenstaande klopt.
Het probleem is echter wanneer de evolutiepixel een hogere brightness heeft dan de target pixel
De fitnessfunctie ligt dus niet meer tussen 0 en 100 wat voor problemen zorgt.
Ik heb ook al geprobeerd om verschil = target - bron, maar dit kan zowel positief als negatief zijn wat dan ook voor problemen zorgde.
2) Probleem 2:
Bij het maken van de volgende generatie doe je normaal het volgende:
Je kiest moeder en vader uit de matingpool (matingpool opgesteld via probability, dus hogere fitness komt meerdere keren voor in matingpool en heeft dus meer kans om als moeder / vader gekozen te worden van nieuwe child)
Via crossover + toepassen van mutatie bekom je het nieuwe child element.
Aangezien de DNA van mijn Color object slechts uit 1 gene bestaat (namelijk een integer met de grijswaarde gemapt tussen 0 en 100), weet ik niet hoe ik een combinatie kan vormen van delen van de moeder / vader om het child object te maken.
Nu wil ik als test een programma maken in processing (java), waarin in een bronfoto (grayscale) probeer na te bouwen via evolutie. De doelfoto begint dus van pixels met random grijswaarden en probeert zoveel mogelijk te bronfoto te benaderen
Nu loop ik echter vast op 2 zaken:
1) Probleem 1:
hoe bepaal ik de fitness functie?
momenteel haal ik de brightness uit de bronpixel en evolution pixel (allebij de waardes kunnen tussen 0 en 100 liggen)
Nu moet ik de brightness kunnen omzetten naar een getal die de fitness voorstelt.
Hiervoor gebruik ik momenteel:
code:
1
2
3
4
| float fitness(int target) { float percent = (100/(float)target)*bright; return percent; } |
Bright is hierbij de brightness van de evolutie pixel en target is de te vinden waarde (waarde van de bronpixel helderheid)
code:
1
2
3
| Voorbeeldberekening: bright = 37.5 en target = 75 percent = (100/75)*37,5 = 50% |
Bovenstaande klopt.
Het probleem is echter wanneer de evolutiepixel een hogere brightness heeft dan de target pixel
code:
1
2
3
| Voorbeeld: bright = 95 en target = 75 percent = (100/75)*95 = 126% |
De fitnessfunctie ligt dus niet meer tussen 0 en 100 wat voor problemen zorgt.
Ik heb ook al geprobeerd om verschil = target - bron, maar dit kan zowel positief als negatief zijn wat dan ook voor problemen zorgde.
2) Probleem 2:
Bij het maken van de volgende generatie doe je normaal het volgende:
Je kiest moeder en vader uit de matingpool (matingpool opgesteld via probability, dus hogere fitness komt meerdere keren voor in matingpool en heeft dus meer kans om als moeder / vader gekozen te worden van nieuwe child)
Via crossover + toepassen van mutatie bekom je het nieuwe child element.
Aangezien de DNA van mijn Color object slechts uit 1 gene bestaat (namelijk een integer met de grijswaarde gemapt tussen 0 en 100), weet ik niet hoe ik een combinatie kan vormen van delen van de moeder / vader om het child object te maken.