I have a neural network (NN) that controls a ragdoll. The NN is modified using a genetic algorithm (GA). The fitness function of the GA determins how the ragdoll moves.
For instance, if the fitness function only rewards forwards torso movement without taking any other measures into consideration, the NN evolves so that the ragdoll crawls along the ground. It will more or less use any of it's appendages in any way it can to generate forward movement.
Now, if I add to that fitness function the stipulation that the head be kept above a certain hight, and that the center of the torso be in certainly alignment with the head (so that he's not diving through the air), then somewhat "normal" walking is generated. Although, in most cases, it's seems to turn out as hopping with a controlled fall.
The problem here is, how does one determine the best fitness function? Well, this requires a lot of thought into exactly what one is trying to accomplish. If one's goals are vague, then one will have trouble coming up with a good fitness function. If you are certain on the outcome you are trying to achieve, then a sort of layered fitness function may be best. For example, you have a fitness function
Fitness = (torsoDistance * weightA) + (skullStability * WeightB) - (energyConsumption * weightC); //
We know that we are taking torsoDistance, skullStability, and energyConsumption into consideration. But which one is more important? This is where the weights come in. You can run a GA on top of this one to determine which weight proportions are the best.