https://github.com/benami171/Financial_Algorithms-assignment_02
Implementation of the egalitarian division algorithm.
https://github.com/benami171/Financial_Algorithms-assignment_02
division-algorithms
Last synced: 6 months ago
JSON representation
Implementation of the egalitarian division algorithm.
- Host: GitHub
- URL: https://github.com/benami171/Financial_Algorithms-assignment_02
- Owner: benami171
- Created: 2025-03-27T12:21:41.000Z (6 months ago)
- Default Branch: main
- Last Pushed: 2025-03-27T12:56:00.000Z (6 months ago)
- Last Synced: 2025-04-11T20:57:59.128Z (6 months ago)
- Topics: division-algorithms
- Language: Python
- Homepage:
- Size: 191 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Egalitarian Division Assignment
This repository contains an implementation of an egalitarian division algorithm using CVXPY. The algorithm computes an allocation of resources among several people such that the minimum utility is maximized. Multiple examples are provided to demonstrate different configurations.
## File Overview
- **question_3.py**:
Contains the implementation of the `egalitarian_division` function and several example valuation matrices. The function uses convex optimization to determine the best fair allocation, checks the validity of the results, and then outputs a neatly formatted allocation table.## Dependencies
Make sure you have the following installed:
- [Python 3.x](https://www.python.org/)
- [CVXPY](https://www.cvxpy.org/) (`pip install cvxpy`)
- [NumPy](https://numpy.org/) (`pip install numpy`)
- [Tabulate](https://pypi.org/project/tabulate/) (`pip install tabulate`)## How to Run
Open a terminal in the repository folder and run:
```
python question_3.py
```## Sample Output
When you run the script, you will see output similar to the following:
```
Valuation matrix #1:
[[81 19 1]
[70 1 29]]Egalitarian division found with minimum utility: 61.91390727
Allocation Table:
+----------+------------+------------+------------+---------------+
| Person | Resource 1 | Resource 2 | Resource 3 | Total Utility |
+----------+------------+------------+------------+---------------+
| Person 1 | 0.52980132 | 1.00000000 | 0.00000000 | 61.91390729 |
| Person 2 | 0.47019868 | 0.00000000 | 1.00000000 | 61.91390728 |
+----------+------------+------------+------------+---------------+Valuation matrix #2:
[[ 9 20 11]
[12 18 10]
[14 17 9]
[10 15 20]]Egalitarian division found with minimum utility: 12.28070175
Allocation Table:
+----------+------------+------------+------------+---------------+
| Person | Resource 1 | Resource 2 | Resource 3 | Total Utility |
+----------+------------+------------+------------+---------------+
| Person 1 | 0.00000000 | 0.61403508 | 0.00000001 | 12.28070175 |
| Person 2 | 0.12280702 | 0.38596492 | 0.38596490 | 12.28070175 |
| Person 3 | 0.87719298 | 0.00000000 | 0.00000000 | 12.28070175 |
| Person 4 | 0.00000000 | 0.00000000 | 0.61403509 | 12.28070175 |
+----------+------------+------------+------------+---------------+Valuation matrix #3:
[[15 25 10]
[20 10 30]
[25 40 5]]Egalitarian division found with minimum utility: 25.85106380
Allocation Table:
+----------+------------+------------+------------+---------------+
| Person | Resource 1 | Resource 2 | Resource 3 | Total Utility |
+----------+------------+------------+------------+---------------+
| Person 1 | 0.00000003 | 0.97872338 | 0.13829787 | 25.85106380 |
| Person 2 | 0.00000000 | 0.00000000 | 0.86170213 | 25.85106386 |
| Person 3 | 0.99999996 | 0.02127662 | 0.00000000 | 25.85106381 |
+----------+------------+------------+------------+---------------+Valuation matrix #4:
[[10 20 30 40]
[40 30 20 10]
[25 25 25 25]]Egalitarian division found with minimum utility: 43.74999997
Allocation Table:
+----------+------------+------------+------------+------------+---------------+
| Person | Resource 1 | Resource 2 | Resource 3 | Resource 4 | Total Utility |
+----------+------------+------------+------------+------------+---------------+
| Person 1 | 0.00000000 | 0.00000000 | 0.12500000 | 1.00000000 | 43.74999998 |
| Person 2 | 1.00000000 | 0.12500000 | 0.00000000 | 0.00000000 | 43.74999998 |
| Person 3 | 0.00000000 | 0.87500000 | 0.87500000 | 0.00000000 | 43.74999998 |
+----------+------------+------------+------------+------------+---------------+Valuation matrix #5:
[[12 7 3 15]
[ 4 17 10 6]]Egalitarian division found with minimum utility: 26.99999983
Allocation Table:
+----------+------------+------------+------------+------------+---------------+
| Person | Resource 1 | Resource 2 | Resource 3 | Resource 4 | Total Utility |
+----------+------------+------------+------------+------------+---------------+
| Person 1 | 1.00000000 | 0.00000000 | 0.00000000 | 1.00000000 | 27.00000000 |
| Person 2 | 0.00000000 | 1.00000000 | 1.00000000 | 0.00000000 | 26.99999999 |
+----------+------------+------------+------------+------------+---------------+Valuation matrix #6:
[[ 0 0 0 0 -30]
[ 15 -25 0 5 20]
[-30 12 18 22 8]]Egalitarian division found with minimum utility: 0.00000000
Allocation Table:
+----------+------------+------------+------------+------------+------------+---------------+
| Person | Resource 1 | Resource 2 | Resource 3 | Resource 4 | Resource 5 | Total Utility |
+----------+------------+------------+------------+------------+------------+---------------+
| Person 1 | 0.65067101 | 0.65179483 | 0.44839439 | 0.60393209 | 0.00000000 | 0.00000000 |
| Person 2 | 0.15500286 | 0.17808530 | 0.44839439 | 0.29842270 | 0.25569098 | 4.47884336 |
| Person 3 | 0.19432613 | 0.17011987 | 0.10321122 | 0.09764521 | 0.74430902 | 6.17212325 |
+----------+------------+------------+------------+------------+------------+---------------+Valuation matrix #7:
[[10 20 30 40]
[40 30 20 10]
[25 35 30 20]
[15 25 35 45]]Egalitarian division found with minimum utility: 37.30569948
Allocation Table:
+----------+------------+------------+------------+------------+---------------+
| Person | Resource 1 | Resource 2 | Resource 3 | Resource 4 | Total Utility |
+----------+------------+------------+------------+------------+---------------+
| Person 1 | 0.00000000 | 0.00000000 | 0.00000000 | 0.93264249 | 37.30569948 |
| Person 2 | 0.93264249 | 0.00000000 | 0.00000000 | 0.00000000 | 37.30569948 |
| Person 3 | 0.06735751 | 1.00000000 | 0.02072539 | 0.00000000 | 37.30569948 |
| Person 4 | 0.00000000 | 0.00000000 | 0.97927461 | 0.06735751 | 37.30569948 |
+----------+------------+------------+------------+------------+---------------+
```## Description
The `egalitarian_division` function in `question_3.py` uses convex optimization (via CVXPY) to solve a fair division problem. For a given valuation matrix (with rows corresponding to persons and columns to resources), the function:
- Sets up the decision variable matrix `x` for allocations.
- Defines each person's utility.
- Adds constraints to ensure that 100% of each resource is allocated and that each person receives a utility at least equal to a variable `min_utility`.
- Maximizes the `min_utility` to ensure an equitable division.
- Validates the solution (ensuring that every resource is fully allocated and each person meets the minimum utility).
- Constructs and prints a nicely formatted table of allocations and total utilities using the `tabulate` module.Feel free to modify the valuation matrices in the examples to test different scenarios.
Happy coding!