What I did:
Created a population of 2D legged robots in a simulated environment. Found the best motor rotation values to make the robots move rightward, using an objective function with Differential Evolution (could use PSO or GA too), that returned the distance moved rightward. Gradient descent used for improving fitness.
What I want to do:
Add more objectives. To find the best motor rotation, with the least motion possible, with the least jittery motion, without toppling the body upside down and making the least collision impact on the floor.
What I found:
Spent almost two weeks searching for solutions, reading research papers, going through tutorials on Pareto optimality, installing libraries and trying the example programs.
Using pairing functions to create a cost function wasn't good enough.
There are many multi-objective PSO, DE, GA etc., but they seem to be built for solving some other kind of problem.
Where I need help:
Existing multi objective algorithms seem to use some pre-existing minimization and maximization functions (Fonseca, Kursawe, OneMax, DTLZ1, ZDT1, etc.) and it's confusing to understand how I can use my own maximization and minimization functions with the libraries. (minimize(motorRotation), maximize(distance), minimize(collisionImpact), constant(bodyAngle)).
How do I know which is the best Pareto front to choose in a multi-dimensional space? There seem to be ways of choosing the top-right Pareto front or the top-left or the bottom-right or bottom-left. In multi-dimensional space, it'd be even more varied.
Libraries like Platypus, PyGMO, Pymoo etc. just define the problem using
problem = DTLZ2(), instantiate an algorithm
algorithm = NSGAII(problem)and run it
algorithm.run(10000), where I assume 10000 is the number of generations. But since I'm using a legged robot, I can't simply use
run(10000). I need to assign motor values to the robots, wait for the simulator to make the robots in the population move and then calculate the objective function cost. How can I achieve this?
Once the pareto optimal values are found, how is it used to create a cost value that helps me determine the fittest robot in the population?