PROMETHEE¶
Preference Ranking Organization METHod for Enrichment Evaluations
PROMETHEE ranks alternatives using pairwise preference comparisons. Each pair of alternatives is compared on every criterion using fuzzy dominance, producing net flow scores where higher = better.
Quick example¶
from znum import Znum, Promethee, MCDMUtils
# Weights
weights = [
Znum(A=[0.2, 0.3, 0.4, 0.5], B=[0.1, 0.2, 0.3, 0.4]),
Znum(A=[0.4, 0.5, 0.6, 0.7], B=[0.3, 0.4, 0.5, 0.6]),
]
# 3 alternatives, 2 criteria each
alt1 = [
Znum(A=[7, 8, 9, 10], B=[0.6, 0.7, 0.8, 0.9]),
Znum(A=[5, 6, 7, 8], B=[0.5, 0.6, 0.7, 0.8]),
]
alt2 = [
Znum(A=[4, 5, 6, 7], B=[0.5, 0.6, 0.7, 0.8]),
Znum(A=[8, 9, 10, 11], B=[0.6, 0.7, 0.8, 0.9]),
]
alt3 = [
Znum(A=[6, 7, 8, 9], B=[0.4, 0.5, 0.6, 0.7]),
Znum(A=[3, 4, 5, 6], B=[0.3, 0.4, 0.5, 0.6]),
]
criteria = [MCDMUtils.CriteriaType.BENEFIT, MCDMUtils.CriteriaType.BENEFIT]
table = [weights, alt1, alt2, alt3, criteria]
promethee = Promethee(table)
result = promethee.solve()
Decision table format¶
Same format as TOPSIS:
Constructor parameters¶
Accessing results¶
promethee = Promethee(table)
result = promethee.solve()
# Sorted tuple of (index, net_flow_znum) — best first
print(promethee.result)
# ((1, Znum(...)), (0, Znum(...)), (2, Znum(...)))
# Indices sorted by rank (best first)
print(promethee.ordered_indices)
# [1, 0, 2]
# Best and worst
print(promethee.index_of_best_alternative) # 1
print(promethee.index_of_worst_alternative) # 2
How it works¶
- Normalize each criterion column (benefit or cost normalization)
- Pairwise comparison: For each pair of alternatives (i, j), compute the fuzzy dominance score on each criterion using the NxF framework
- Apply weights: Multiply each preference value by its criterion weight
- Sum preferences: Collapse per-criterion preferences into a single value per pair
- Net flow: For each alternative, compute
leaving_flow - entering_flow - Rank: Sort by net flow (descending)
Symmetry optimization¶
The pairwise comparison only computes the upper triangle of the preference matrix. Each Sort.solver_main(z_i, z_j) call gives the scores for both directions, so preference[i][j] and preference[j][i] are computed together. This cuts comparison time roughly in half.
Table is modified in-place
Like TOPSIS, PROMETHEE normalizes the table during solving. Deep copy the table if you need original values.
PROMETHEE vs TOPSIS¶
| Feature | PROMETHEE | TOPSIS |
|---|---|---|
| Ranking method | Pairwise net flows | Distance to ideal |
| Result type | (index, Znum) tuples |
Float closeness coefficients |
| Distance options | N/A | Hellinger or Simple |
| Best for | Outranking relationships | Distance-based ranking |
Both methods typically agree on the best alternative, but may differ in intermediate rankings.