You may have some luck with an approach similar to Karl Sims' genetic images.
He uses a simple set of operators in a LISP-like language such that any operator's output can be utilised to influence the image, similarly to in some shader languages (ie. a scalar would be a greyscale value, a
vector3 would be
Though I guess that's implementation stuff, so what you probably want is his keywords, which (iirc) contain all the basics:
- trig functions (
sin, cos, tan, etc..)
- position (
- basic math operators (
sqrt, pow, abs, inverse )
- noise functions (
fBm, noise2, noise3 )
- other fractals (
mandelbrot, julia )
- interpolation functions (
lerp, quad, step, smoothstep )
(Some of the above may not be in his implementation; I found his work a long time ago and have actually made a few attempts at what you're describing over the years - so memories may be leaking :)
Keeping it interesting (and fast)
I had a bit of luck with a multi-layered approach which massively reduced the amount of dead evolutions.
- a set of ranges are generated for each operator (or mutated from previous rounds)
- these ideally keep the values within a "sane" range for each function, but can evolve into ranges which have surprisingly useful results, which seems like the "right" thing to do
- generate a few algorithm trees
- for each of these generate a few heightmaps at random positions and evaluate fitness
- if we have a lot of good matches then evolve down this branch a bit, perturbing the ranges from step 1 slightly in each child
- otherwise, we've probably got bad ranges, go back to step 1
Now I've conveniently skipped over the fitness algorithm, I mostly used Karl Sims' approach of "unnatural selection" where you see the current generation in the middle square of a bunch of offspring (popularised by Kai's Power Tools back in the day - here's an image of what I mean)..
However you could probably have a set of training images, perhaps some from satellite imagery and a few artificial ones with particular qualities and then maybe use wavelet or 2D FFT analysis on them vs. the terrain you're testing?
This is an interesting topic, but I doubt what you needed an answer on :)
EDIT: ahh. had to remove a bunch of links because I'm a new user :-|