Багатокритеріальний вибір. Визначення оптимальних альтернатив за Парето та Слейтором

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
КН
Кафедра:
Кафедра САПР

Інформація про роботу

Рік:
2013
Тип роботи:
Звіт про виконання лабораторної роботи
Предмет:
Математичні методи дослідження операцій

Частина тексту файла (без зображень, графіків і формул):

МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ Національний університет “Львівська Політехніка”  Кафедра САПР Багатокритеріальний вибір. Визначення оптимальних альтернатив за Парето та Слейтором Звіт про виконання лабораторної роботи № 1 з курсу: “Математичні методи дослідження операцій” Ознайомитися з поняттям оптимальності за Парето і Слейтером при багатокритеріальному виборі. Теоретичні відомості Основна проблема прийняття рішень в умовах визначеності пов'язана з наявністю декількох критеріїв. У цьому випадку виникає необхідність у формуванні деякого компромісного векторного критерію. Нехай є сукупність критеріїв:   які необхідно максимізувати, і належить допустимій області. Якщо всі критерії вимірюються в одній шкалі, то компромісний критерій можна записати у вигляді зваженої суми критеріїв: , , (2.1) де - вага відповідного критерію. У цьому випадку необхідно знайти  . (2.2) Якщо ж критерії вимірюються в різних шкалах, то необхідно привести їх до єдиної шкали. Для цього критерій може бути сформований у наступному вигляді:  , (2.3) У цьому випадку потрібно мінімізувати величину відхилення кожного критерію від його оптимального значення. При такому формуванні узагальненого критерію можна досягти високих показників по одним критеріям за рахунок погіршення показників по інших. На деякі власні критерії можуть бути накладені обмеження  . (2.4) Тоді вихідна багатокритеріальна задача може бути перетворена до виду (2.1) або (2.3) з доповненням системи обмеженням виду (2.4). Рішення багатокритеріальних задач залежить від вибору вагових коефіцієнтів. Для особи, що приймає рішення, важливо вміти не тільки вирішувати багатокритеріальні задачі, але і порівнювати отримані рішення між собою з метою виділення найбільш оптимальних. Одним з критеріїв порівняння може бути критерій Парето. Рішення називається оптимальним за Парето, якщо не існує ніякого іншого рішення, поліпшуючого значення одного з критеріїв і незмінного значення решти критеріїв. Так як Парето-оптимальне рішення може бути не єдиним, то виникає поняття Парето-оптимальної множини рішень. При визначенні Парето-оптимального безлічі корисно зобразити на графіку зміни допустимих значень критеріїв. Так, в одновимірному випадку, коли критерії залежать від однієї змінної (див. рис. 2.1), Парето-оптимальна множина складається з однієї точки, відповідної максимальним значенням критеріїв, а на рис. 2.2. Парето-оптимальним є множиною рішень.   Рис. 2.1. Значення критеріїв F1 і F2 (Парето-оптимальний безліч - одна точка)   Рис. 2.2. Значення критеріїв F1 і F2 У випадку, коли критерії залежать більше, ніж від однієї змінної зручно зобразити безліч значень критеріїв у координатах F1 і F2 (рис. 2.3). Якщо критерії F1 і F2 необхідно максимізувати, то Парето-оптимальною множиною є межа області допустимих значень, зазначена на рис. 2.3 фігурною дужкою.  Рис. 2.3. Знаходження Парето-оптимального безлічі в координатах критеріїв Висновок Під час виконання лабораторної роботи я ознайомився з поняттям оптимальності за Парето і Слейтером при багатокритеріальному виборі. Навчився реалізовувати алгоритм багатокритеріального вибору за Парето і Слейтером за допомогою засобів С++. А1 А2 А3 А4 А5 А6 А7 А8 А9 А10 А11 А12 А13 А14 А15 А16 А17 А18 А19 А20  С1 46 83 38 25 95 40 21 72 26 34 58 25 56 52 45 72 46 39 11 83  С2 3 61 25 42 16 39 74 44 96 30 67 94 13 57 19 60 50 92 32 76  С3 79 90 53 35 95 98 7 41 37 70 76 40 84 1 83 51 92 9 96 40  Варіант 24 Код програми #include<iostream> #include<conio.h> #include<fstream> using namespace std; const int N = 20; const int K = 3; const char* Message1 = "File wasn`t open!"; void defaultInitialize(int* A); void intputDataToArr(int A[][N]); void showArr(int A[][N]); void showDomination(int B[]); void dominatePareto(int A[][N]); void dominateSlater(int A[][N]); bool comparePareto(int A[][N], /*candidate*/int i, /*index in array*/int j); bool compareSlater(int A[][N], /*candidate*/int i, /*index in array*/int j); void defaultInitialize(int* A) //Fill in array by value -1 { for(int i = 0; i<N; ++i) { A[i] = -1; } } void intputDataToArr(int A[][N]) { fstream File; // Create an object of class fstream. File.open("Data.txt"); //Connecting the object to the file. if (!File.is_open()) //Checking whether a file is opened. { cout << endl << Message1 << endl; } else { for(int i = 0; i<K; ++i) for(int j = 0; j<N; ++j) { File >> A[i][j]; //Read from file to array. } } } void showArr(int A[][N]) { cout << "Inputed Data to Array:" << endl << endl; for(int i = 0; i<K; ++i) { for(int j = 0; j<N; ++j) { cout << A[i][j] << " "; } cout << endl; } } bool comparePareto(int A[][N], /*candidate*/ int i, /*index in array*/int j) { int r = 0; if( (A[r][i] >= A[r][j]) && (A[r+1][i] >= A[r+1][j]) && (A[r+2][i] >= A[r+2][j]) ) return true; else return false; } void dominatePareto(int A[][N]) //Domionation by Pareto. { int ParetoDominationArr[N]; defaultInitialize(ParetoDominationArr); //Pareto int r = 0; for(int i = 0; i<N; ++i) //claiming alternative. for(int j = 0; j<N; ++j) //Bust alternatives for determining dominance over them. { if( (A[r][i] >= A[r][j]) && (A[r+1][i] >= A[r+1][j]) && (A[r+2][i] >= A[r+2][j]) ) if(ParetoDominationArr[j]!= -1) //Conflict situation { //The one that dominated less by the candidate. if(comparePareto(A, i, ParetoDominationArr[j])) //recording new dominant alternative. ParetoDominationArr[j] = i; } else //Array element was equal to -1. ParetoDominationArr[j] = i; } for(int j = 0; j<N; ++j) //Finding alternatives dominance over themself. { if( ParetoDominationArr[j] == j) { ParetoDominationArr[j] = -1; } } for(int j = 0; j<N; ++j) //+1 to all values than -1 { if( ParetoDominationArr[j]!= -1) ParetoDominationArr[j]++; } cout << "\nDomination by Paretor:" << endl; showDomination(ParetoDominationArr); } bool compareSlater(int A[][N], /*candidate*/ int i, /*index in array*/int j) { int r = 0; if( (A[r][i] > A[r][j]) && (A[r+1][i] > A[r+1][j]) && (A[r+2][i] > A[r+2][j]) ) return true; else return false; } void dominateSlater(int A[][N]) //Domination by Slater { //Slater int SlaterDominationArr[N]; defaultInitialize(SlaterDominationArr); int r = 0; for(int i = 0; i<N; ++i) //claiming alternative. for(int j = 0; j<N; ++j) //Bust alternatives for determining dominance over them. { if( (A[r][i] > A[r][j]) && (A[r+1][i] > A[r+1][j]) && (A[r+2][i] > A[r+2][j]) ) if(SlaterDominationArr[j]!= -1) //Conflict situation { //The one that dominated less by the candidate. if( compareSlater(A, i, SlaterDominationArr[j]) ) //recording new dominant alternative SlaterDominationArr[j] = i; } else //Array element was equal to -1 SlaterDominationArr[j] = i; } for(int j = 0; j<N; ++j) //+1 to all values than -1 { if(SlaterDominationArr[j]!= -1) SlaterDominationArr[j]++; } cout << "\nDomination by Slater:" << endl; showDomination(SlaterDominationArr); } void showDomination(int B[]) //Output Domination { for(int i = 0; i<N; ++i) //Checking domination over others { bool choise = false; cout << "A[" << i+1 << "] "; for(int j = 0; j<=N; ++j) { if( (i+1) == B[j]) { choise = true; break; } } if(choise == true) { cout << "dominate: "; for(int k = 0; k<N; ++k) //Show domination over others { if( (i+1) == B[k]) { cout << "A[" << k+1 << "] "; } } cout << endl; } else cout << "don`t dominate" << endl; } } int main(void) { int Arr[K][N] = {0}; intputDataToArr(Arr); showArr(Arr); dominatePareto(Arr); dominateSlater(Arr); _getch(); return 0; } Результати виконання програми 
Антиботан аватар за замовчуванням

03.05.2014 20:05-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!