Skip to main content

Let CVXPY support optimization in leximin order

Project description

CVXPY + Leximin

Tox result PyPI version

The cvxpy_leximin package extends cvxpy by adding two objectives: Leximin and Leximax. Each of these objectives takes as an argument a list of expressions. Solving a problem with the Leximin objective follows the leximin order, that is:

  • Find the solutions in which the smallest expression is as large as possible (subject to the constraints).
  • If there are two or more such solutions, then among all these solutions, find the ones in which the next-smallest expression is as large as possible.
  • If there are two or more such solutions, then among all these solutions, find the ones in which the third-smallest expression is as large as possible. And so on.

The Leximax objective is solved in the opposite way: find the solutions that minimize the largest expression (subject to the constraints); among them, minimize the next-largest expression; and so on.

Note that the current implementation works only when domain (as defined by the constraints) is convex. In particular, it does not work for integer programming.

Installation

pip install cvxpy_leximin

Usage example

Leximin optimization can be used to find an egalitarian allocation of resources among people (see Egalitarian item allocation.)

import cvxpy, logging
from cvxpy_leximin import Problem, Leximin

# There are four resources to allocate among two people: Alice and George.
# The variables a[0], a[1], a[2], a[3] denote the fraction of each resource given to Alice:
a = cvxpy.Variable(4)

# The following constraint represents the fact that the allocation is feasible:
feasible_allocation = [x >= 0 for x in a] + [x <= 1 for x in a]

# Alice values the resources at 5, 3, 0, 0:
utility_Alice = a[0] * 5 + a[1] * 3 + a[2] * 0

# George values the resources at 2, 4, 9, 0:
utility_George = (1 - a[0]) * 2 + (1 - a[1]) * 4 + (1 - a[2]) * 9

# The leximin objective is: maximize the smallest utility, and subject to that, the next-smallest utility.
objective = Leximin([utility_Alice, utility_George])

# A problem is defined and solved like any cvxpy problem:
problem = Problem(objective, constraints=feasible_allocation)
problem.solve()
print("Problem status: ", problem.status)   # Should be optimal
print("Objective value: ", objective.value)  
   # It is (8, 9). It maximizes the smallest utility (8), and subject to that, the next-smallest one (9).
print("Allocation: ", a.value)
   # It is [1, 1, 0, 0]: Alice gets resources 0 and 1 (utility=8) and George resources 2 and 3 (utility=9).

For more examples, see the examples folder.

Credits

The ordered outcomes and ordered values algorithms are based on

Ogryczak and Sliwinski (2006), "On Direct Methods for Lexicographic Min-Max Optimization". Programmed by Moshe Ofer.

The saturation algorithm is based on:

Stephen J. Willson, "Fair Division Using Linear Programming" (1998). Part 6, pages 20--27. I am grateful to Sylvain Bouveret for his help with the algorithm. All remaining errors and bugs are my own.

Status

The functionality was tested only on fair allocation problems, only on objectives with linear expressions, and only on the default solver (SCIPY).

If you would like to contribute, it could be great to test leximin optimization on other kinds of problems, expressions and solvers.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cvxpy_leximin-0.5.tar.gz (16.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

cvxpy_leximin-0.5-py3-none-any.whl (15.1 kB view details)

Uploaded Python 3

File details

Details for the file cvxpy_leximin-0.5.tar.gz.

File metadata

  • Download URL: cvxpy_leximin-0.5.tar.gz
  • Upload date:
  • Size: 16.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.10

File hashes

Hashes for cvxpy_leximin-0.5.tar.gz
Algorithm Hash digest
SHA256 bb4b03446d877b97ee3393b471de92bd4e52f9dece09a4c360c00d07cb7958f4
MD5 5bae7abcb34b7bb836cdaeb3f71f3745
BLAKE2b-256 a3bf9e8ab98efe08a91cec967db7f4079e3bc395fe828d55368596af82b87a0e

See more details on using hashes here.

File details

Details for the file cvxpy_leximin-0.5-py3-none-any.whl.

File metadata

  • Download URL: cvxpy_leximin-0.5-py3-none-any.whl
  • Upload date:
  • Size: 15.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.10

File hashes

Hashes for cvxpy_leximin-0.5-py3-none-any.whl
Algorithm Hash digest
SHA256 03fad438bd08f3f03437fddcdf6296607ea18429f61e875d633ee3eab48a12f2
MD5 1142a41e9abde3f07343e6b0c4004340
BLAKE2b-256 191fdc24c8635ed5544fa0a2dfce943d0626f737ad735ec2694d2c8ad1f6d7de

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page