Мета та підготовка
Створити прозорий рейтинг альтернатив із різними одиницями вимірювання. Потрібно знати напрям критерію, нормалізацію за мінімумом і максимумом та зважену суму. Встановіть Python 3.11 або новіший і створіть папку weighted-choice з файлом demo.py. Для демонстрації достатньо стандартної бібліотеки; таблицю можна також перевірити у spreadsheet.
Теоретичний мінімум
Після перевірки обмежень кожен критерій переводять до шкали, де більше означає бажаніший результат. Для вигоди використовується , для витрат — . Ваги невід’ємні й сумуються до одиниці. Сума допускає компенсацію між критеріями, тому обов’язкові пороги потрібно перевіряти до рейтингу.
Демонстраційний вибір стосується трьох майданчиків. Вартість є витратним критерієм, доступність — вигодою. Шкалу доступності в навчальному наборі вважаємо погодженою; у власній роботі потрібно описати її рівні. Якщо стовпець сталий, приклад повертає однакову оцінку 1 для всіх. Це погоджене навчальне правило, яке не змінює різницю між підсумками.
Повний код демонстрації
from math import isclose, isfinite
rows = [("A", 400, 8), ("B", 300, 6), ("C", 500, 10)]
weights = [0.4, 0.6]
benefit = [False, True]
def normalize(values, is_benefit):
if not values or not all(isfinite(x) for x in values):
raise ValueError("Потрібні скінченні значення")
low, high = min(values), max(values)
if high == low:
return [1.0 for _ in values] # Однакова оцінка сталого критерію.
if is_benefit:
return [(x - low) / (high - low) for x in values]
return [(high - x) / (high - low) for x in values]
if len(weights) != len(benefit) or any(w < 0 for w in weights):
raise ValueError("Некоректні ваги")
if not isclose(sum(weights), 1.0):
raise ValueError("Сума ваг має дорівнювати 1")
columns = [normalize([row[j + 1] for row in rows], direction)
for j, direction in enumerate(benefit)]
rank = []
for i, row in enumerate(rows):
score = sum(w * col[i] for w, col in zip(weights, columns))
rank.append((row[0], score))
print(sorted(rank, key=lambda item: item[1], reverse=True))
assert isclose(dict(rank)["C"], 0.6)
Очікується порядок C, A, B з оцінками приблизно 0.6, 0.5, 0.4. enumerate надає індекс критерію, щоб вибрати стовпець. Нормалізація виконується по стовпцях, підсумок — по альтернативах. isfinite відкидає нескінченність і NaN. isclose порівнює дробові результати з урахуванням похибки представлення.
Покрокове виконання
Спочатку вручну обчисліть два нормалізовані стовпці та оцінку A. Запустіть python demo.py і зіставте результат із таблицею. Поміняйте напрям ціни на вигоду лише для експерименту та поясніть, чому рейтинг змінюється. Поверніть правильний напрям. Потім зробіть усі значення доступності рівними й перевірте визначене правило сталого стовпця.
Перевірте ваги 0.7 та 0.3. Збережіть обидві таблиці та пояснення переваг. Додайте четверту альтернативу з великою ціною, щоб дослідити зміну меж нормалізації. Відділіть вплив нової альтернативи від впливу ваг: змінюйте одну частину за раз. Не округлюйте проміжні результати до завершення підсумовування.
Самостійне завдання
Оберіть щонайменше чотири навчальні альтернативи та три критерії, серед яких є витрати й вигода. Можливі теми: обладнання лабораторії, місце семінару або план доставки навчальних матеріалів. Вкажіть мету, одиниці, джерела та два обмеження. Реалізуйте відбір допустимих варіантів і рейтинг за власними даними.
Складіть паспорт рішення з обґрунтуванням ваг. Покажіть один ручний розрахунок, сталий критерій, помилкову суму ваг і нічию. Додаткове завдання: порівняйте нормалізацію за поточним набором із фіксованими зовнішніми межами. Основний індивідуальний набір і висновок потрібно створити самостійно; демонстраційний рейтинг не є готовою відповіддю.
Помилки, налагодження та результат
Якщо найдорожчий варіант отримує максимальну цінову оцінку, перевірте напрям. Якщо оцінка виходить за межі від 0 до 1 за min–max на цьому наборі, перевірте індекси. Ділення на нуль вказує на сталий стовпець без визначеного правила. Рейтинг із малою різницею потребує пояснення чутливості, а не категоричного висновку.
Подайте код, вихідну таблицю, нормалізовану матрицю, ваги та інтерпретацію. Поясніть, які обмеження перевірено до суми. Чому додавання крайнього значення змінює шкалу? Як оброблено рівні оцінки? Які дані потрібно уточнити перед реальним рішенням?
Ручна перевірка та відтворюваність
Побудуйте допоміжну таблицю: первинні значення, мінімум, максимум, напрям, нормалізований бал, вага й внесок у суму. Для одного рядка виконайте всі обчислення вручну. Це дозволяє локалізувати помилку: неправильно обраний напрям змінює бал ще до множення на вагу, а переплутана вага проявляється у внеску.
Окремо перевірте сталий критерій. Якщо всі варіанти мають однакове значення, він не розрізняє альтернативи. Узгодьте правило його обробки та поясніть, чи ваги решти критеріїв змінюються. Різні правила можуть мати однаковий порядок рейтингу, але різні підсумкові числа, тому потрібен явний контракт.
Для власного набору збережіть первинний CSV з назвами колонок та одиницями. Програма має перевірити довжину рядків, скінченність чисел і ваг. Значення NaN може поширюватися через арифметику та робити порівняння незрозумілими; відхиліть його з повідомленням про конкретний критерій.
У висновку назвіть найбільший внесок у оцінку переможця та найближчого конкурента. Потім змініть одну вагу за погодженим способом нормування інших і повторіть обчислення. Поясніть, чи змінилася перевага й за яких припущень ваш результат актуальний. Сам підсумковий бал має сенс лише разом зі шкалою й набором варіантів.
Окремий контрольний сценарій
Для власного рейтингу введіть одну альтернативу, що повторює всі оцінки іншої. За однакових даних їхні підсумки мають збігатися. Потім змініть лише один критерій у погодженому напрямі та перевірте, що його внесок змінюється відповідно. Такий тест перевіряє зв’язок даних і результату без залежності від випадкового списку назв. Нічия є допустимою відповіддю; задайте спосіб її представлення у звіті. Не приховуйте рівність автоматичним вибором першого елемента без пояснення.
Схема процесу
Збираємо дані й одиниці.
Самоперевірка
Як обґрунтувати відповідь своїми словами?
Підсумок
Прозорий рейтинг зберігає вихідні дані, перетворення й ваги. Правила сталих стовпців та нічиїх визначають заздалегідь. Результат інтерпретують разом із перевіркою чутливості.