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?


1 Answer 1


I eventually used the keep-efficient function from this answer to calculate the Pareto front and used the k-means function to calculate the centroid of the front. This gave me the approximate knee-point of the front, which is usually the optimal solution. One of the calculations was to maximise the distance moved in x direction (dx) vs. minimising the energy consumed (e), so since the x axis needed positive maximization and the y axis needed minimization, I inverted the y axis, since min(f(y)) = - max(-f(y)). This helped get the pareto front toward the top right side of the graph and both the x and y axes were maximization objectives. The optimal point calculated was the robot that had the best fitness.


You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .