39 lines
1.1 KiB
Python
39 lines
1.1 KiB
Python
def compute_value_function(request):
|
|
levels = request.levels
|
|
cards = request.blank_cards
|
|
refs = request.references
|
|
|
|
p, q = sorted(int(k) for k in refs)
|
|
up, uq = refs[str(p)], refs[str(q)]
|
|
|
|
if len(levels) < 3:
|
|
raise ValueError("Mínimo debe haber 3 niveles para esta funcionalidad.")
|
|
|
|
total_units = sum(cards[i] + 1 for i in range(p, q))
|
|
if total_units == 0:
|
|
raise ValueError("Las cartas no pueden generar 0 unidades.")
|
|
|
|
alpha = (uq - up) / total_units
|
|
|
|
values = [0] * len(levels)
|
|
values[p] = up
|
|
|
|
for i in range(p + 1, len(levels)):
|
|
units = sum(cards[r] + 1 for r in range(p, i))
|
|
values[i] = up + alpha * units
|
|
|
|
for i in range(p - 1, -1, -1):
|
|
units = sum(cards[r] + 1 for r in range(i, p))
|
|
values[i] = up - alpha * units
|
|
|
|
return {
|
|
"criterion_name": request.criterion_name,
|
|
"values": {levels[i]: round(values[i], 4) for i in range(len(levels))}
|
|
}
|
|
|
|
|
|
def compute_points(request):
|
|
result = compute_value_function(request)
|
|
values = list(result["values"].values())
|
|
return {"points": [{"x": i, "y": values[i]} for i in range(len(values))]}
|