Лекція 29. Багатокритеріальна оптимізація та Парето-компроміси
Коротко про лекцію
Тут одна ціль замінюється кількома критеріями, які можуть конфліктувати. Ви навчитеся знаходити доміновані рішення, будувати множину Парето та обґрунтовано вибирати компроміс через ваги або інший прозорий критерій.
Практичний сенс. У прикладній задачі часто є кілька цілей: зменшити витрати, скоротити час, знизити ризик, підвищити якість або надійність. Такі цілі можуть конфліктувати. Багатокритеріальна оптимізація допомагає відсіяти явно гірші рішення, побудувати множину раціональних компромісів і прозоро пояснити, чому фінальний вибір залежить від пріоритетів.
Постановка та базові поняття
1. Коли одного критерію недостатньо
У звичайній однокритеріальній задачі ми маємо одне число, яке потрібно мінімізувати або максимізувати. Після цього два допустимі рішення легко порівняти: менше значення краще для мінімізації, більше — для максимізації. Такий порядок дає зрозумілий математичний орієнтир.
У реальній системі часто одночасно важливі кілька показників. Логістичний план оцінюють за вартістю та часом доставки. Інженерну конструкцію — за масою, міцністю та ціною. Виробничий план — за прибутком, ризиком і використанням дефіцитного ресурсу. Один варіант може виграти за першим показником і програти за другим.
Через це слово «краще» потребує уточнення. Якщо план A дешевший, а план B швидший, математична модель ще не має підстав автоматично оголосити один із них переможцем. Спочатку треба формально описати окремі критерії, їхні напрями та правило порівняння.
Нехай допустиме рішення позначено через \(x\). Для двох критеріїв записуємо:
Вектор \(F(x)\) називають вектором критеріїв. Кожна його компонента має власний предметний зміст, одиниці вимірювання та напрям покращення.
2. Вектор критеріїв, напрями та одиниці
У цій лекції основна домовленість така: усі критерії приводимо до мінімізації. Тоді менше числове значення означає краще значення конкретного критерію. Така домовленість робить правило домінування однозначним.
Якщо початковий показник треба максимізувати, його можна перетворити. Наприклад, максимізацію прибутку \(p(x)\) можна записати як мінімізацію:
У звіті предметне значення прибутку варто показувати в природному знаку. Перетворення потрібне для внутрішньої математичної логіки порівняння.
Одиниці критеріїв також мають значення. Вартість може вимірюватися в гривнях, час — у годинах, ризик — у безрозмірній шкалі. Ці величини можна зберігати окремо без проблем. Питання масштабу стає критичним тоді, коли критерії об’єднують в одну скалярну ціль.
Для \(k\) критеріїв загальний запис має вигляд:
Вектор критеріїв зберігає більше інформації, ніж одна зважена сума. Тому на початку багатокритеріального аналізу корисно працювати саме з окремими компонентами.
3. Домінування на дискретному прикладі
Розглянемо чотири допустимі варіанти. Обидва критерії мінімізуються.
| Варіант | \(f_1\) | \(f_2\) |
|---|---|---|
| A | 1 | 8 |
| B | 2 | 5 |
| C | 5 | 2 |
| D | 3 | 7 |
Порівняймо B та D. Для першого критерію:
Для другого:
Варіант B кращий за D за обома критеріями. Тому D можна вилучити з подальшого аналізу компромісів.
Формально для задачі мінімізації рішення \(x^{(A)}\) домінує \(x^{(B)}\), якщо виконуються дві умови. Перша:
для кожного критерію \(i\). Друга: хоча б для одного критерію \(j\) виконується строга нерівність:
Перша умова означає, що A ніде не гірше. Друга гарантує реальне покращення хоча б однієї компоненти.
Тепер порівняймо B та C. Для першого критерію B кращий:
Для другого критерію C кращий:
Ці рішення непорівнянні за домінуванням. Кожне має власну перевагу, тому математична модель зберігає обидва як можливі компроміси.

Математична логіка
4. Парето-оптимальність і фронт Парето
Допустиме рішення називають Парето-оптимальним, якщо серед допустимих рішень немає іншого рішення, яке його домінує. Для скінченного набору це означає просту перевірку: для кожного кандидата треба пошукати кращий або рівний за всіма критеріями варіант із хоча б одним строгим покращенням.
У дискретному прикладі D домінується B, тому D не входить до Парето-множини. Варіанти A, B і C попарно мають різні компроміси. Вони утворюють недомінований набір для цієї таблиці.
Тут важливо розділити два простори. Парето-множина містить самі рішення \(x\) у просторі змінних. Фронт Парето містить відповідні вектори критеріїв \(F(x)\) у просторі критеріїв.
Схематично:
Одне рішення переходить у точку простору критеріїв. Два різні рішення можуть мати однаковий вектор критеріїв, тому фронт Парето не завжди зберігає всю інформацію про альтернативи.
Парето-оптимальність ще не визначає остаточний вибір. Вона відсіює рішення, для яких існує однозначно краща альтернатива. Після цього залишається множина компромісів, між якими потрібне окреме правило переваг.
Геометрично для двох критеріїв простір критеріїв можна намалювати на площині. Оскільки обидва критерії мінімізуються, бажаний напрям лежить до нижнього лівого кута. Точка, яка розташована правіше й вище іншої, програє за обома показниками та є очевидним кандидатом на вилучення. Недоміновані точки формують межу, за якою подальший рух до нижнього лівого кута вже потребує компромісу.
Такий рисунок особливо корисний перед скаляризацією. Він дозволяє побачити, чи одна точка справді домінує іншу, чи два рішення є непорівнянними. Для трьох критеріїв аналогічна логіка працює у тривимірному просторі, але візуальне читання стає складнішим. Тому алгоритмічна перевірка домінування залишається основним інструментом для більшої кількості критеріїв.
5. Наскрізний неперервний приклад
Розглянемо одну змінну:
і два критерії мінімізації:
Перший критерій має мінімум у точці \(x=0\). Другий має мінімум у точці \(x=4\). Спільного мінімізатора немає.
У кількох точках отримуємо:
| \(x\) | \(f_1(x)\) | \(f_2(x)\) |
|---|---|---|
| 0 | 0 | 16 |
| 1 | 1 | 9 |
| 2 | 4 | 4 |
| 3 | 9 | 1 |
| 4 | 16 | 0 |
Коли \(x\) зростає від 0 до 4, перший критерій монотонно погіршується, а другий монотонно покращується. Через це жодна точка інтервалу не домінує іншу.
Для будь-яких \(x_a<x_b\) маємо:
і водночас:
Отже, весь інтервал \([0,4]\) є Парето-множиною цієї навчальної задачі. Відповідний фронт задається параметрично:

Цей приклад корисний тим, що Парето-оптимальність тут можна підтвердити аналітично, без перебору сітки. Монотонність двох критеріїв дає повний доказ для всього інтервалу.
Цей приклад також показує різницю між рішенням і його образом у просторі критеріїв. Значення \(x\) відповідає конкретному рішенню, а пара \((f_1(x),f_2(x))\) показує наслідки цього рішення за двома показниками. У прикладному звіті потрібно зберігати обидва представлення, бо сам фронт показує компроміс, але не завжди містить достатньо інформації для реалізації плану.
Для двох критеріїв фронт легко показати на площині. Уздовж цієї кривої корисно позначити кілька характерних точок: два однокритеріальні оптимуми та один або два внутрішні компроміси. Такий рисунок допомагає студенту побачити Парето-аналіз як структуру можливих обмінів між критеріями та множину раціональних компромісів.
6. Зважена сума та явний компроміс
Один із найпростіших способів вибрати конкретну Парето-точку — об’єднати критерії в одну ціль. Для двох критеріїв:
де:
Параметр \(w\) задає числовий пріоритет першого критерію після того, як масштаби критеріїв уже узгоджені.
Для наскрізної задачі:
Обчислимо похідну:
Розкриваємо дужки:
Стаціонарність дає:
Тому:
Формула дозволяє побачити весь рух компромісу. При \(w=0\) маємо \(x^*=4\), тобто оптимізується другий критерій. При \(w=1\) маємо \(x^*=0\), тобто пріоритет отримує перший критерій. Для \(w=0.5\):
і:
Симетрія цього результату пов’язана з однаковим масштабом і симетричною формою двох критеріїв.
7. Нормування та зміст ваг
Нехай перший критерій вимірюється десятками, а другий — сотнями тисяч. Тоді однакові ваги \(0.5\) і \(0.5\) не створюють однаковий вплив на скалярну ціль. Більший числовий масштаб може переважити зміст ваг.
Один із способів — перейти до безрозмірних критеріїв. Наприклад:
Після цього зважена сума будується вже для \(\widetilde f_i\). Значення \(f_i^{\min}\) і \(f_i^{\max}\) треба отримати з прозорого правила: відомих предметних меж, окремих однокритеріальних оптимумів або обґрунтованого діапазону.
Нормування змінює числовий зміст ваг. Тому фінальний звіт повинен зберігати три речі: початкові критерії в природних одиницях, правило нормування та ваги після нормування.
Вага \(w=0.7\) сама по собі ще мало що пояснює. Її інтерпретація залежить від шкал, у яких об’єднані критерії. Тому багатокритеріальна модель повинна робити масштабування явним.
Корисно спочатку розв’язати кілька однокритеріальних задач. Мінімум кожного критерію окремо показує його найкраще досяжне значення, а значення інших критеріїв у цій точці демонструють ціну крайніх пріоритетів. Так з’являються природні опорні точки для пояснення масштабу та конфлікту.
Із цих однокритеріальних мінімумів можна побудувати ідеальну точку в просторі критеріїв:
Для наскрізного прикладу маємо:
Проте жодне \(x\in[0,4]\) не дає одночасно \(f_1=0\) і \(f_2=0\). Ідеальна точка тут є орієнтиром, а не допустимим результатом. Вона показує, у якому напрямі хотілося б рухати фронт, і допомагає пояснити відстань реальних компромісів від недосяжного еталона.
У прикладному звіті варто уникати фрази «вага 0.7 означає 70% важливості» без додаткового обґрунтування. Математично вага визначає коефіцієнт у скалярній цілі. Предметний зміст виникає після фіксації нормування, одиниць і способу отримання самої ваги. Це розділення захищає від надто сильних інтерпретацій одного технічного параметра.
8. Метод епсилон-обмеження та межі зваженої суми
Інший спосіб побудувати компроміс — залишити один критерій ціллю, а інший перенести в обмеження:
за умови:
Параметр \(\varepsilon\) має зрозумілий предметний зміст, якщо другий критерій має природну допустиму межу. Наприклад: мінімізуємо вартість, а час доставки повинен бути не більшим за 8 годин.
Змінюючи \(\varepsilon\), можна отримувати різні Парето-рішення. Такий підхід зручний, коли фахівцю простіше сформулювати межу, ніж абстрактну вагу.
Метод зваженої суми має геометричне обмеження. Для опуклої множини досяжних векторів критеріїв він добре знаходить підтримувані точки фронту. На неопуклому фронті можуть існувати Парето-точки, які не є оптимальними для жодної додатної зваженої суми.
Тому серія ваг не гарантує повного відновлення довільного Парето-фронту. Для складних задач використовують епсилон-обмеження, інші скаляризації або спеціалізовані багатокритеріальні алгоритми.
Покажемо епсилон-обмеження на наскрізному прикладі. Нехай другий критерій повинен задовольняти:
Тоді:
На відрізку \([0,4]\) це означає:
Тепер мінімізуємо \(f_1(x)=x^2\) на новій допустимій області. Найменше значення отримуємо при \(x=2\). Таким чином, поріг \(\varepsilon=4\) приводить до тієї самої компромісної точки \((4,4)\) у просторі критеріїв, яку для симетричного прикладу дала вага \(w=0.5\).
Цей збіг пов’язаний зі структурою конкретної задачі. В іншій моделі вага та епсилон-поріг можуть приводити до різних частин фронту. Тому параметри скаляризації слід трактувати як різні способи формалізувати пріоритети.
Алгоритм і покроковий розбір
9. Фільтрація недомінованих рішень
Для скінченного набору алгоритм прямо повторює означення домінування.
Спочатку беремо кандидат \(i\). Далі перебираємо всі інші кандидати \(j\). Якщо знайдено хоча б один \(j\), який домінує \(i\), кандидат \(i\) вилучається. Якщо домінуючого рішення немає, кандидат залишається в Парето-наборі.
Для \(N\) кандидатів і \(m\) критеріїв прямий попарний перебір потребує приблизно:
операцій порівняння. Для десятків або сотень точок такий алгоритм достатньо прозорий і швидкий. Він також корисний як еталонний перевіряльник для складнішої реалізації.
Покроково для таблиці A, B, C, D:
- A порівнюємо з B, C, D. Домінуючої точки немає.
- B порівнюємо з A, C, D. Домінуючої точки немає.
- C порівнюємо з A, B, D. Домінуючої точки немає.
- D порівнюємо з A, B, C. B домінує D, тому D вилучаємо.
Після фільтрації залишаються A, B і C.
10. Допуск, рівність і дублікати
Для точних цілих чисел правило домінування реалізується буквально. Для чисел із рухомою комою маленька різниця може бути наслідком обчислювальної похибки.
Наприклад, значення:
і:
можуть бути предметно еквівалентними в задачі, де точність даних значно грубіша. Тому практичний перевіряльник може використовувати допуск \(\tau\).
Ідея «не гірше» тоді записується приблизно як:
Строге покращення теж треба визначити узгоджено. Наприклад:
Значення \(\tau\) входить до контракту перевірки. Його треба зберігати в коді та звіті разом із правилом порівняння.
Практичний варіант перевірки з допуском може використовувати дві логічні умови. Перша дозволяє малі числові відхилення під час перевірки «не гірше». Друга вимагає покращення, яке перевищує допуск. Це зменшує ризик випадково оголосити домінування через шум останніх десяткових знаків.
Значення допуску треба пов’язати з масштабом критеріїв. Якщо один критерій має порядок \(10^{-3}\), а інший \(10^6\), один абсолютний допуск для обох компонент може бути невдалим. У таких випадках корисно використовувати масштабовані або відносні правила порівняння.
Практична функція домінування з абсолютним допуском може виглядати так:
def dominates_with_tolerance(
first,
second,
tolerance,
):
# "Не гірше" дозволяє мале перевищення в межах tolerance.
no_worse = all(
a <= b + tolerance
for a, b in zip(first, second)
)
# Строге покращення повинно перевищувати числовий шум.
strictly_better = any(
a < b - tolerance
for a, b in zip(first, second)
)
# Обидві умови відповідають означенню домінування з допуском.
return (
no_worse
and strictly_better
)
Такий код підходить лише тоді, коли один абсолютний tolerance має сенс для всіх компонент. За дуже різних масштабів критеріїв краще спочатку нормувати їх або використовувати окремі допуски.
Окремо треба вирішити питання дублікатів. Якщо два різні рішення мають однаковий вектор критеріїв, у просторі критеріїв це одна точка. У просторі рішень це дві різні альтернативи. Залежно від задачі їх можна зберігати обидві або дедуплікувати лише для візуалізації фронту.
11. Побудова набору компромісів
Одна вага у зваженій сумі дає один компроміс. Щоб побачити, як змінюється рішення, можна використати сітку ваг:
Для нашої формули:
отримуємо:
| \(w\) | \(x^*\) | \(f_1(x^*)\) | \(f_2(x^*)\) |
|---|---|---|---|
| 0 | 4 | 16 | 0 |
| 0.25 | 3 | 9 | 1 |
| 0.5 | 2 | 4 | 4 |
| 0.75 | 1 | 1 | 9 |
| 1 | 0 | 0 | 16 |
Таблиця показує ціну компромісу. Рух у бік покращення першого критерію поступово погіршує другий.
У загальній задачі різні ваги можуть давати однаковий розв’язок. Тоді результат варто дедуплікувати з допуском, але зберегти інформацію про ваги, які привели до цієї точки.
Для епсилон-обмеження аналогічно будують сітку порогів \(\varepsilon\). Кожен поріг створює окрему оптимізаційну задачу, а результати потім перевіряють на домінування.
Програмна реалізація та перевірка
12. Перевірка домінування у Python
Спочатку зафіксуємо відповідність між математикою та кодом.
| Математика | Python | Зміст |
|---|---|---|
| \(F(x)\) | point |
вектор критеріїв одного рішення |
| \(f_j\) | компонент point[j] |
один критерій |
| домінування | dominates(first, second) |
логічна перевірка двох векторів |
| Парето-набір | points[pareto_mask] |
недоміновані вектори |
| \(w\) | weight |
вага першого критерію |
| \(x^*(w)\) | weighted_solution(weight) |
компроміс для заданої ваги |
Функція домінування для точних чисел:
import numpy as np
# first і second мають однаковий порядок критеріїв [f1, f2, ...].
# У цій лекції всі критерії приведені до мінімізації.
def dominates(first, second):
# Перша умова: first ніде не має більшого значення критерію.
no_worse = np.all(
first <= second
)
# Друга умова: хоча б один критерій у first строго менший.
strictly_better = np.any(
first < second
)
# Домінування виконується лише за одночасного виконання двох умов.
return bool(
no_worse
and strictly_better
)
Перевіримо B та D:
# Вектори записані в порядку [f1, f2].
B = np.array([2.0, 5.0])
D = np.array([3.0, 7.0])
# B має менші значення за обома критеріями, тому очікуємо True.
print(
dominates(B, D)
)
Очікуваний результат:
True
Тепер відфільтруємо всю таблицю:
# Рядки відповідають A, B, C, D.
points = np.array([
[1.0, 8.0],
[2.0, 5.0],
[5.0, 2.0],
[3.0, 7.0],
])
# На старті вважаємо всі точки недомінованими.
pareto_mask = np.ones(
len(points),
dtype=bool,
)
for i in range(len(points)):
for j in range(len(points)):
# Точку не порівнюємо із самою собою.
if i == j:
continue
# Якщо j домінує i, кандидат i вилучаємо.
if dominates(
points[j],
points[i],
):
pareto_mask[i] = False
break
# Очікуємо A, B і C. Точка D повинна зникнути.
print(
points[pareto_mask]
)
Очікувано:
[[1. 8.]
[2. 5.]
[5. 2.]]
Цей результат потрібно зіставити з ручною перевіркою. Така незалежність важлива: код реалізує означення, а маленька таблиця дозволяє перевірити реалізацію без довіри до самого коду.
13. Зважена сума, перевірка та результат
Для наскрізної неперервної задачі аналітичний розв’язок відомий:
Тому код можна перевірити без чисельного оптимізатора:
def weighted_solution(weight):
# Формула отримана аналітично зі стаціонарності зваженої цілі.
return 4.0 * (1.0 - weight)
weights = [
0.0,
0.25,
0.5,
0.75,
1.0,
]
for weight in weights:
# Обчислюємо компромісне рішення для поточної ваги.
x_star = weighted_solution(weight)
# Повторно обчислюємо обидва початкові критерії.
f1 = x_star ** 2
f2 = (x_star - 4.0) ** 2
# Виводимо всі величини, потрібні для перевірки компромісу.
print(
weight,
x_star,
f1,
f2,
)
Для \(w=0.5\) очікуємо:
0.5 2.0 4.0 4.0
Незалежна перевірка складається з кількох кроків. Спочатку перевіряємо межі:
Далі повторно обчислюємо \(f_1(x^*)\) і \(f_2(x^*)\). Для зваженої суми можна також перевірити стаціонарність:
Для набору дискретних кандидатів повторно запускаємо перевірку домінування. Остаточна точка, яку називаємо Парето-оптимальною відносно набору, не повинна мати домінуючого конкурента в цьому наборі.
Мінімальний машинозчитуваний блок може мати вигляд:
STATUS: OK
DECISION: ...
OBJECTIVES: [...]
DOMINATED: False
SCALARIZATION_METHOD: weighted_sum
WEIGHTS: [...]
NORMALIZATION_RULE: ...
TOLERANCE: ...
Якщо використано метод епсилон-обмеження, замість ваг зберігаємо значення \(\varepsilon\) та точний запис відповідного обмеження.
Інтерпретація, межі та підсумок
14. Як читати Парето-результат і де легко помилитися
Парето-оптимальна точка означає відсутність однозначно кращого допустимого рішення за всіма критеріями. Цей статус не містить готового управлінського рішення. Дві Парето-точки можуть представляти дуже різні компроміси, і вибір між ними потребує додаткових пріоритетів.
Типова помилка виникає, коли однакові ваги використовують для критеріїв із різними масштабами. Наприклад, 0.5 для вартості в сотнях тисяч і 0.5 для часу в годинах не дають симетричного змістового впливу. Перед інтерпретацією потрібне обґрунтоване нормування.
Ще одна проблема пов’язана з напрямами критеріїв. Якщо частину показників мінімізують, а частину максимізують, правило домінування повинно враховувати цей факт. Найпростіше привести критерії до спільного напряму та задокументувати перетворення.
Серія зважених сум може показати значну частину фронту, але для неопуклої геометрії цього недостатньо. Відсутність точки серед результатів для вибраних ваг не доводить її домінованість. Метод епсилон-обмеження або інша скаляризація може відкрити додаткові компроміси.
Фінальний вибір варто формулювати окремим правилом. Наприклад: «серед Парето-рішень із часом доставки не більше 8 годин вибираємо мінімальну вартість». Тоді предметний пріоритет стає частиною моделі й може бути перевірений.
Ще один корисний спосіб читання фронту — аналіз приростів. Якщо перехід від рішення A до B зменшує вартість на 1000 гривень, але збільшує час на 20 хвилин, предметний фахівець уже бачить конкретну ціну компромісу. Наступний перехід може давати лише 50 гривень економії за ті самі 20 хвилин. Такі порівняння часто зрозуміліші за самі координати фронту.
Для сусідніх Парето-точок можна також оцінити відношення змін критеріїв:
Це число описує локальну ціну покращення одного показника через погіршення іншого. Його предметний сенс залежить від одиниць, тому після нормування та в початкових одиницях воно може мати різну інтерпретацію. У звіті важливо явно вказати, в якій шкалі виконано такий розрахунок.
Для великої кількості критеріїв візуалізація ускладнюється, але принцип залишається тим самим. Потрібно показати значення кожного критерію, пояснити правило відбору недомінованих точок і відокремити математичну фільтрацію від фінального вибору. Це робить результат придатним для обговорення з людиною, яка відповідає за предметне рішення.
Інтерактивна самоперевірка лекції
Пройдіть 10 коротких питань. Після кожної відповіді ви побачите пояснення, а за потреби — підказку й повний розбір.
15. Підсумок
Багатокритеріальна оптимізація працює з вектором критеріїв, тому порівняння рішень починається з формального правила домінування. Доміновані рішення можна вилучити без втрати раціональних компромісів. Недоміновані рішення утворюють Парето-множину, а їхні значення критеріїв — фронт Парето.
Наскрізний приклад із \(f_1(x)=x^2\) та \(f_2(x)=(x-4)^2\) показує чистий конфлікт двох цілей. Увесь інтервал \([0,4]\) є Парето-множиною, бо рух уздовж нього покращує один критерій і водночас погіршує інший. Зважена сума дає явну формулу \(x^*(w)=4(1-w)\) і дозволяє простежити, як числовий пріоритет переміщує компроміс уздовж фронту.
Ваги потрібно інтерпретувати разом із напрямами, одиницями та масштабуванням критеріїв. Метод епсилон-обмеження дає інший спосіб задати пріоритет через предметно зрозумілу межу. Для неопуклого фронту він також може знайти точки, які звичайна зважена сума пропускає.
Практична перевірка включає допустимість рішення, повторне обчислення всіх критеріїв, контроль домінування, збереження допуску та документування способу скаляризації. Після побудови Парето-набору математична частина завершується прозорим описом компромісів, а фінальний вибір виконується за окремо сформульованими предметними пріоритетами.