Library / SDK
Project-Platypus/Platypus avatar
Project-Platypus/Platypus

Platypus: an evolutionary computing framework built for multiobjective problems

A Free and Open Source Python Library for Multiobjective Optimization

654 stars165 forksPythonGPL-3.0

At a glance

What is it?
Platypus is a Python framework for evolutionary computing whose centre of gravity is multiobjective optimisation, shipping ten MOEA algorithms and the analysis tools to judge them, and it is the project researchers reach for when the problem has more than one objective.
Who is it for?
Adopt Platypus if your problem has two or more conflicting objectives and you want an analysis tool alongside the algorithm, since the library is built around that case rather than bolting it on. Do not adopt it for single objective work, where a general library will serve you, or if you need a method it does not implement, since the algorithm list is fixed at ten.
Can I use it commercially?
Yes, with conditions. GPL-3.0 is a copyleft licence: if you distribute software that includes it, you must release that software's source code under the same licence. Running it internally without distributing it does not trigger that obligation.
Is it still maintained?
Yes. The repository last received commits 14 days ago.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.

Editorial analysis

A framework whose centre of gravity is multiobjective

Platypus is described as a framework for evolutionary computing in Python with a focus on multiobjective evolutionary algorithms, and the project description calls it a free and open source Python library for multiobjective optimisation. The README is direct about how it differs from the alternatives, naming PyGMO, Inspyred, DEAP and Scipy and saying that Platypus provides optimisation algorithms and analysis tools for multiobjective optimisation. That sentence is the whole product decision. A multiobjective problem does not have one best answer, it has a set of trade-off solutions forming a front, and the hard part is not only producing that front but measuring, comparing and plotting it. The audience is a researcher or engineer in engineering design, scheduling or similar, who has a problem with genuinely conflicting objectives and wants a library where the visualisation and comparison tooling is a first class citizen rather than an afterthought. The repository is GPL-3.0, the last push was on 2026-10-09, and the package requires Python 3.10 or newer.

Ten algorithms, from NSGA-II to SMPSO

The supported algorithm list is the substance of the library. It covers NSGA-II, NSGA-III, MOEA/D, IBEA, Epsilon-MOEA, SPEA2, GDE3, OMOPSO, SMPSO and Epsilon-NSGA-II. That range spans the two main families. The decomposition based methods, MOEA/D and NSGA-III, work well on many objective problems with expensive evaluations, while the indicator based ones such as IBEA and the epsilon based ones such as Epsilon-MOEA take a different route to selecting a front. NSGA-II remains the reference point almost everything else is measured against, and Epsilon-NSGA-II is the variant that makes the epsilon constraint idea work in a non-dominance framework. On the other side, OMOPSO and SMPSO are particle swarm variants adapted for many objectives, which gives you a different search operator from the genetic ones. If a method you want to compare against is missing from that list, Platypus will not have it, and the README points to the examples directory and the online documentation for detail on each.

The example is short enough to read in one sitting

The README's example solves a simple biobjective problem with a single real valued decision variable, and the whole thing is a dozen lines. You define the objective function to return the two objective values, build a Problem with one variable and two objectives, set the variable type to Real with bounds, assign the function, create the algorithm and run it for a number of generations. The structure of that snippet is the library's API in miniature. Problem takes the number of decision variables and the number of objectives, the types slice is assigned the variable types, the function is a plain Python callable returning a list of objective values, and the algorithm is constructed around the problem before a run call with a generation count. Because the function is just a callable, plugging in a simulator or a solver as the evaluator is a matter of calling it, which is how the framework is meant to be used with expensive real world objectives.

Installing the release, the development version, or the conda package

There are three documented install paths. The release comes from PyPI under the distribution name platypus-opt, which is worth noting because the import name is platypus and the repository is Platypus, so the pip name, the import name and the project name are all slightly different.

bash
    pip install platypus-opt

The development version is built from a clone, which means upgrading build and setuptools first, then building the wheel and installing it in editable mode.

bash
    pip install -U build setuptools
    git clone https://github.com/Project-Platypus/Platypus.git
    cd Platypus
    python -m build
    python -m pip install --editable .

And the conda route, which needs the conda-forge channel added first.

bash
    conda config --add channels conda-forge
    conda install platypus-opt

The package declares no runtime dependencies at all, which is unusual and worth pausing on, since it means the base install gives you the algorithms and the framework without plotting or numerical libraries. Those come from the extras, with a test extra holding pytest, mock, flake8, numpy, matplotlib and jsonpickle, a docs extra with sphinx and the read the docs theme, and a full extra adding mpi4py on top. So the parallel execution and the plotting are opt-in, and the MPI extra is the one to install if you want the message passing variants of the examples.

The examples directory is the real feature list

The examples directory is more informative than the README, because it shows what the library actually supports. There is a DTLZ2.2D.pf file, a reference Pareto front, plus constrained_problem_class.py and constrained_problem_function.py, which show both ways of expressing a constraint, and custom_problem_class.py and custom_problem_function.py for the other extension point. There is customize_variator.py for swapping the genetic operators, experimenter.py and experimenter_parallel.py for running a study, experimenter_plot.py and plot_operators.py and plot_results.py and runtime_plot.py for the analysis side, and print_results.py and print_attributes.py for inspecting a run. There are knapsack.py, permutation.py, problem_with_arguments.py and particle_swarm.py for other problem shapes and operators. Then the operational ones: resumable_run.py, save_results_extension.py, save_results_json.py, parallel_mpi.py, parallel_multiprocess.py, logging_example.py and performance_indicators.py. That list is essentially the feature set of a research framework, and the presence of a resumable run example and the two parallel examples is a good sign for anyone doing long runs.

Where Platypus is the wrong tool

The limits are structural. The first is scope. If you have a single objective, Platypus is the wrong shape of tool, because its machinery is built around fronts, indicators and reference directions, and a general library will get you there with less to learn. The second is the algorithm list. Ten MOEAs is a good number but it is a closed set, and if your field's method of comparison is something not implemented here, you either implement it yourself against the framework's interfaces or you run it elsewhere and compare by hand. The third is that the analysis tooling, which is the reason to pick this library, is Python and matplotlib based, so a very large study produces a lot of data to load and plot, and the example called parallel_mpi.py exists precisely because that combination gets expensive. The alternative worth naming is running the search in a more specialised framework and using Platypus for the front-end analysis, or sticking with the general libraries the README names and building the comparison tooling yourself, which is more work up front and less to maintain later. The honest summary is that Platypus is worth it exactly when the analysis is half the work.

Packaging, testing and how the project asks to be used

A few details from the manifest are worth knowing before you depend on it. The package name is Platypus-Opt, the console script is registered as platypus pointing at platypus.__main__:main, so you get a command line entry point, and the version is read dynamically from the platypus.__version__ attribute rather than written into the manifest, which is the standard way to keep a single source of truth. The pytest configuration runs with -rA -Werror, so warnings are errors in the test suite, and the test paths are the platypus package rather than a separate tests directory, which means the tests live next to the code they cover. The package is classified as Development Status 5, Production/Stable, with intended audience of education and science and research. The README asks you to cite the work in APA style, naming version 1.4.1 and David Hadka as the author, and the last tagged releases are 1.4.1 and 1.4.0 in October 2024, with the branch having seen work since.

Editorial conclusion

Adopt Platypus if your problem has two or more conflicting objectives and you want an analysis tool alongside the algorithm, since the library is built around that case rather than bolting it on. Do not adopt it for single objective work, where a general library will serve you, or if you need a method it does not implement, since the algorithm list is fixed at ten. Verify first which of the ten algorithms matches your problem, and read the citation request in the README, because the project asks users to cite it by version.

Frequently asked questions

What is Platypus and how is it different from DEAP or PyGMO?

It is a framework for evolutionary computing in Python with a focus on multiobjective evolutionary algorithms, and the README says it differs from PyGMO, Inspyred, DEAP and Scipy by providing optimisation algorithms and analysis tools specifically for multiobjective optimisation. The package is installed as platypus-opt and imported as platypus.

Which multiobjective algorithms does Platypus implement?

The README lists NSGA-II, NSGA-III, MOEA/D, IBEA, Epsilon-MOEA, SPEA2, GDE3, OMOPSO, SMPSO and Epsilon-NSGA-II, with further details in the examples directory and the online documentation.

How do I install Platypus?

The release installs with pip install platypus-opt, the development version is built from a clone with python -m build followed by an editable pip install, and Platypus is also on conda-forge, installable after adding that channel with conda config --add channels conda-forge.

What does Platypus need for parallel runs and plotting?

The base install declares no runtime dependencies, so plotting and numerical libraries come from the optional extras. The test extra carries pytest, mock, flake8, numpy, matplotlib and jsonpickle, and the full extra adds mpi4py, which is what the parallel examples in the repository use.

Official sources

  1. Issues
  2. License: GPL-3.0
  3. Project-Platypus/Platypus on GitHub
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/project-platypus-platypus.svg)](https://hysenlabs.com/projects/project-platypus-platypus)

Was this useful?