"""Многокритериальная оптимизация: Парето и выбор компромисса.

Среда: встроенный Python FEMM 5.
Проверяется только авторский аналитический эталон, полевой решатель не вызывается.
Полученные числа не являются квитанцией расчёта электромагнита или машины.
"""

# Оба специально заданных безразмерных критерия минимизируются; все четыре точки допустимы.
# Проверяем строгое доминирование, затем выбираем минимальный первый критерий при трёх порогах второго.
points = {"A": (0, 4), "B": (2, 3), "C": (4, 0), "D": (3, 4)}

def dominates(a, b):
    return all(a[j] <= b[j] for j in range(len(a))) and any(a[j] < b[j] for j in range(len(a)))

front = []
for name, value in points.items():
    if not any(other != name and dominates(candidate, value) for other, candidate in points.items()):
        front.append(name)
print("Дискретное Парето:", front)
for limit in (4, 3, 2):
    allowed = [(value[0], name) for name, value in points.items() if value[1] <= limit]
    print("Порог второго критерия:", limit, "Выбор:", min(allowed)[1] if allowed else "нет допустимых точек")
