Thanks for your answer.
I'm simulating every turn until crash/landing. My initial chromosomes have 120 genes, which is enough since you don't need more than 80 turns, or so, to land.
For the canyon, I think I'll use some kind of checkpoint, but that's if I can finish ML2 with a good enough success rate.
I didn't thought about limiting the speed, but that could be an idea If I give a penalty for high speed, that might help. Because for the one with an initial velocity, sometimes my program fails to reduce enough the speed.
I know I've landed if the five first values of my tuple are 0.
I also know that python is not that fast, but since it's almost working, I think I can optimize it a little bit to increase my success ratio.
I've tried using populations. With populations of 20 chromosomes, I can do something like 10 or 11 generations. It's also "almost" working...
Maybe I'll have to switch to C or Java, but I really prefer Python.
One other way I can try to do better, is to change my genes by the actual values I'll get after the simulation. For example genes like [(90,4),(90,4),(-90,4)] will result in [(15,1),(30,2),(15,3)] if I start with (0,0). So maybe, I can replace the genes by the actual states the module will be in. Maybe that can help to get better results after the mutation...