-
Notifications
You must be signed in to change notification settings - Fork 0
Terrenos
En el presente se definen los terrenos y la generación de los mismos.
Los terrenos se representan en la aplicación utilizando mapas de alturas, implementados en la clase Heightmap
en el archivo heightmap.py
. Son matrices bidimensionales de valores en el intervalo [0, 1], donde los valores representan las alturas del terreno.
Los mapas de alturas pueden ser gene1rados por la aplicación. El usuario final debe definir el porciento de elevaciones percentage
sobre el nivel del mar que desea que tenga el terreno. Para la generación de los terrenos se implementó un algoritmo genético en el archivo genetic.py
.
Los algoritmos genéticos comienzan a partir de una población inicial. En este caso se generan los mapas de alturas utilizando el Algoritmo de Ruido de Perlin. El Ruido de Perlin es utilizando en la bibliografía para generar mapas de alturas con apariencia natural.
Entonces se genera una población de tamaño poblation_size
, ejecutando poblation_size
veces el algoritmo de Perlin.
A cada miembro de la población se le asocia una puntuación denominada fitness
, que representa qué tan bueno es el miembro de la población, o sea, cuán cerca del porciento de elevaciones está el miembro de la población.
Se define el nivel del mar a partir del cual se define el concepto de elevación. El valor por defecto del nivel del mar es 0.45.
La función fitness en este caso se define como sigue:
- Se suma la cantidad valores superiores al nivel del mar.
- Se calcula el porciento de elevaciones.
- Si el porciento de elevaciones es superior al porciento requerido por el usuario, entonces al miembro se le asocia 0. En otro caso se le asocia ese porciento al miembro.
De esta forma, el valor máximo del fitness es el porciento requerido por el usuario.
En el proceso de selección se realiza un proceso conocido como selección competitiva. Se seleccionan dos parejas de miembros al azar de la población, de cada pareja se selecciona el miembro con mayor fitness, y estos serán los miembros que se mezclarán.
La mezcla de los progenitores para producir el próximo miembro de la población se realiza con la suma de los progenitores.
Una vez obtenido el próximo miembro se realizan mutaciones al mismo. Se genera un nuevo terreno t
para utilizar en la mutación. Se tienen definidas dos mutaciones, en dependencia del porciento de elevaciones deseado por el usuario.
- Si ese porciento es inferior a 0.4 entonces a cada posición por encima del nivel del mar se cambia por
h[i][j] - w * (t[i][j] + h[i][j])
dondew = h[i][j] - self.__sea__
- Si el porciento es superior a 0.4 entonces la mutación es
h - 1.5 * t