For my genetic-roller coaster generation project, I’m to the point where I would like to generate a fitness function. However, I need to know how RCT2 generates excitement scores for rides.
I’ve begun decompiling a function from x86 into C that hopefully computes excitement scores. I’ve also gotten the OpenRCT2 engine running in a virtual machine on my Mac, so I can make changes and see how the game is affected.
I’m also in Japan, so I’m not sure how much progress I’ll be able to make between the extraordinary sights, hikes, and sushi that’s here.
Basically, this is a way to iteratively create sets of (pseudo)randomly generated roller coasters. Each roller coaster will have a set of “traits” or “genes”. The genetic algorithm works over a series of “generations”. Each generation a “fitness function” kills certain roller coasters that do not sufficiently meet the requirements of the fitness function. Afterwards, a new “population” (set of randomly generated roller coasters) is created by mixing the traits of those roller coasters that survived.
The fitness function “selects” a subset of those roller coasters to “survive” to the next generation. One example of a fitness function in this case might be, “All roller coasters that have an excitement score above 8 and a nausea score below 2 can pass their traits on.” Or perhaps more subtly, “All roller coasters that have [arbitrary elevation change] and [minimum length of track] may produce offspring” Or more realistically, “All roller coasters that crash before [number of rides] shall not pass their traits on.”
Over successive generations, the fitness function gradually optimizes for the desired traits. This will make for a very interesting way to design roller coasters. Instead of explicitly designing each roller coaster, GP can declaratively state: “I would like to explore a subset-space of roller coasters that would pass these design thresholds.”
For my genetic-roller coaster generation project, I’m to the point where I would like to generate a fitness function. However, I need to know how RCT2 generates excitement scores for rides.
I’ve begun decompiling a function from x86 into C that hopefully computes excitement scores. I’ve also gotten the OpenRCT2 engine running in a virtual machine on my Mac, so I can make changes and see how the game is affected.
I’m also in Japan, so I’m not sure how much progress I’ll be able to make between the extraordinary sights, hikes, and sushi that’s here.
so you’re trying to create an open source roller coaster tycoon? Or am I totally not understanding what you’re making?
If I understand correctly, GP is developing genetic algorithms to create roller coasters in RCT2. https://en.wikipedia.org/wiki/Genetic_algorithm
Basically, this is a way to iteratively create sets of (pseudo)randomly generated roller coasters. Each roller coaster will have a set of “traits” or “genes”. The genetic algorithm works over a series of “generations”. Each generation a “fitness function” kills certain roller coasters that do not sufficiently meet the requirements of the fitness function. Afterwards, a new “population” (set of randomly generated roller coasters) is created by mixing the traits of those roller coasters that survived.
Right now GP is working on the prototype fitness function to apply to each set of roller coasters that is created. https://en.wikipedia.org/wiki/Fitness_function
The fitness function “selects” a subset of those roller coasters to “survive” to the next generation. One example of a fitness function in this case might be, “All roller coasters that have an excitement score above 8 and a nausea score below 2 can pass their traits on.” Or perhaps more subtly, “All roller coasters that have [arbitrary elevation change] and [minimum length of track] may produce offspring” Or more realistically, “All roller coasters that crash before [number of rides] shall not pass their traits on.”
Over successive generations, the fitness function gradually optimizes for the desired traits. This will make for a very interesting way to design roller coasters. Instead of explicitly designing each roller coaster, GP can declaratively state: “I would like to explore a subset-space of roller coasters that would pass these design thresholds.”