Advertisement
Tetriss

Untitled

Feb 18th, 2020
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.44 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #include <iomanip>
  5. #include <algorithm>
  6. #include <math.h>
  7.  
  8. using namespace std;
  9.  
  10. vector<double> new_criterion(const vector<double>& criterion)
  11. {
  12. vector <double> new_criterion(4);
  13. for (auto i1 = 0; i1 <= 3; i1++)
  14. {
  15. for (auto i2 = 0; i2 <= 3; i2++)
  16. {
  17. if (i1 != i2)
  18. {
  19. if (criterion[i1] > criterion[i2]) new_criterion[i1]++;
  20. if (criterion[i1] == criterion[i2]) new_criterion[i1] = new_criterion[i1] + 0.5;
  21. }
  22. }
  23. }
  24. return new_criterion;
  25. }
  26.  
  27. vector<double> normalise_matrix_4x1(const vector<double>& matrix)
  28. {
  29. vector <double> new_matrix;
  30. double sum = 0;
  31. for (auto i = 0; i <= 3; i++) sum += matrix[i];
  32. for (auto i = 0; i <= 3; i++) new_matrix.push_back(matrix[i] / sum);
  33. return new_matrix;
  34. }
  35. void Sort(vector<vector<double>>& matrix)
  36. {
  37. double temp;
  38. for (auto i1 = 0; i1 <= 3; i1++)
  39. {
  40. for (auto i2 = 0; i2 <= 3; i2++)
  41. {
  42. for (auto j = i2; j <= 3; j++)
  43. {
  44. if (matrix[i2][i1] > matrix[j][i1])
  45. {
  46. temp = matrix[i2][i1];
  47. matrix[i2][i1] = matrix[j][i1];
  48. matrix[j][i1] = temp;
  49. }
  50. }
  51. }
  52. }
  53. }
  54.  
  55. vector<vector<double>> norm_without_criterion(const vector<vector<double>>& matrix, const int& criterion)
  56. {
  57. vector<vector<double>> matrix2 = matrix;
  58. Sort(matrix2);
  59. vector <vector<double>> new_matrix(4, vector<double>(4));
  60. for (auto i1 = 0; i1 <= 3; i1++)
  61. {
  62. for (auto i2 = 0; i2 <= 3; i2++)
  63. {
  64. if (i1 != criterion)
  65. {
  66. new_matrix[i2][i1] = (matrix[i2][i1] - matrix2[0][i1]) / (matrix2[3][i1] - matrix2[0][i1]);
  67. }
  68. else
  69. {
  70. new_matrix[i2][i1] = matrix[i2][i1];
  71. }
  72. }
  73. }
  74. return new_matrix;
  75. }
  76.  
  77. vector<vector<double>> normalise_matrix_4x4(const vector<vector<double>>& matrix)
  78. {
  79. vector <double> sum(4);
  80. vector <vector<double>> new_matrix(4, vector<double>(4));
  81. for (auto i1 = 0; i1 <= 3; i1++)
  82. {
  83. for (auto i2 = 0; i2 <= 3; i2++)
  84. {
  85. sum[i1] += matrix[i2][i1];
  86. }
  87. }
  88. for (auto i1 = 0; i1 <= 3; i1++)
  89. {
  90. for (auto i2 = 0; i2 <= 3; i2++)
  91. {
  92. new_matrix[i2][i1] = matrix[i2][i1] / sum[i1];
  93. }
  94. }
  95. return new_matrix;
  96. }
  97.  
  98. vector <double> operator * (const vector<vector<double>>& matrix4x4, const vector<double>& matrix1x4) //перегрузка умножить для матриц
  99. {
  100. vector <double> matrix(4);
  101. for (auto i1 = 0; i1 <= 3; i1++)
  102. {
  103. for (auto i2 = 0; i2 <= 3; i2++)
  104. {
  105. matrix[i1] += matrix4x4[i1][i2] * matrix1x4[i2];
  106. }
  107. }
  108. return matrix;
  109. }
  110.  
  111.  
  112. vector <vector<double>> set_matrix_criterion(const vector<vector<double>>& matrix, const int& criterion)
  113. {
  114. vector <vector<double>> new_matrix(4, vector<double>(4));
  115. for (auto i1 = 0; i1 <= 3; i1++)
  116. {
  117. for (auto i2 = 0; i2 <= 3; i2++)
  118. {
  119. if (matrix[i1][criterion] == matrix[i2][criterion]) new_matrix[i1][i2] = 1;
  120. if (matrix[i1][criterion] > matrix[i2][criterion])
  121. {
  122. if (matrix[i1][criterion] - matrix[i2][criterion] == 1) new_matrix[i1][i2] = 3;
  123. if (matrix[i1][criterion] - matrix[i2][criterion] == 2) new_matrix[i1][i2] = 5;
  124. if (matrix[i1][criterion] - matrix[i2][criterion] == 3) new_matrix[i1][i2] = 7;
  125. if (matrix[i1][criterion] - matrix[i2][criterion] == 4) new_matrix[i1][i2] = 9;
  126. }
  127. if (matrix[i1][criterion] < matrix[i2][criterion])
  128. {
  129. if (matrix[i2][criterion] - matrix[i1][criterion] == 1) new_matrix[i1][i2] = 1. / 3;
  130. if (matrix[i2][criterion] - matrix[i1][criterion] == 2) new_matrix[i1][i2] = 1. / 5;
  131. if (matrix[i2][criterion] - matrix[i1][criterion] == 3) new_matrix[i1][i2] = 1. / 7;
  132. if (matrix[i2][criterion] - matrix[i1][criterion] == 4) new_matrix[i1][i2] = 1. / 9;
  133. }
  134. }
  135. }
  136. return new_matrix;
  137. }
  138.  
  139. vector <vector<double>> matrix_of_criterions(const vector<double>& criterion)
  140. {
  141. vector <vector<double>> new_matrix(4, vector<double>(4));
  142. for (auto i1 = 0; i1 <= 3; i1++)
  143. {
  144. for (auto i2 = 0; i2 <= 3; i2++)
  145. {
  146. if (criterion[i1] == criterion[i2]) new_matrix[i2][i1] = 1;
  147. if (criterion[i1] > criterion[i2])
  148. {
  149. if (criterion[i1] - criterion[i2] == 1) new_matrix[i2][i1] = 3;
  150. if (criterion[i1] - criterion[i2] == 2) new_matrix[i2][i1] = 5;
  151. if (criterion[i1] - criterion[i2] == 3) new_matrix[i2][i1] = 7;
  152. if (criterion[i1] - criterion[i2] == 4) new_matrix[i2][i1] = 9;
  153. }
  154. if (criterion[i1] < criterion[i2])
  155. {
  156. if (criterion[i2] - criterion[i1] == 1) new_matrix[i2][i1] = 1. / 3;
  157. if (criterion[i2] - criterion[i1] == 2) new_matrix[i2][i1] = 1. / 5;
  158. if (criterion[i2] - criterion[i1] == 3) new_matrix[i2][i1] = 1. / 7;
  159. if (criterion[i2] - criterion[i1] == 4) new_matrix[i2][i1] = 1. / 8;
  160. }
  161. }
  162. }
  163. return new_matrix;
  164. }
  165.  
  166. vector <double> sumstr(const vector <vector<double>>& matrix)
  167. {
  168. vector <double> sum(4);
  169. for (auto i1 = 0; i1 <= 3; i1++)
  170. {
  171. for (auto i2 = 0; i2 <= 3; i2++)
  172. {
  173. sum[i1] += matrix[i1][i2];
  174. }
  175. }
  176. return sum;
  177. }
  178.  
  179. double utopia_coordinate(const vector<vector<double>>& matrix, const int& criterion)
  180. {
  181. vector <double> v(4);
  182. for (auto i = 0; i <= 3; i++)
  183. {
  184. v[i] = matrix[i][criterion];
  185. }
  186. sort(begin(v), end(v));
  187. return v[3];
  188. }
  189.  
  190. double evklid_distance(const vector<vector<double>>& matrix, const double& utopia1, const double& utopia2, const int& criterion1, const int& criterion2, const int& alternative)
  191. {
  192. double distance;
  193. distance = sqrt((utopia1 - matrix[alternative][criterion1]) * (utopia1 - matrix[alternative][criterion1]) + (utopia2 - matrix[alternative][criterion2]) * (utopia2 - matrix[alternative][criterion2]));
  194. return distance;
  195. }
  196.  
  197. // выводы
  198.  
  199. void print_abcd(const vector<vector<double>>& matrix)
  200. {
  201. cout << " 1 2 3 4" << endl;
  202. cout << "A ";
  203. for (auto i = 0; i <= 3; i++) cout << fixed << setprecision(2) << matrix[0][i] << " ";
  204. cout << endl << "B ";
  205. for (auto i = 0; i <= 3; i++) cout << matrix[1][i] << " ";
  206. cout << endl << "C ";
  207. for (auto i = 0; i <= 3; i++) cout << matrix[2][i] << " ";
  208. cout << endl << "D ";
  209. for (auto i = 0; i <= 3; i++) cout << matrix[3][i] << " ";
  210. }
  211.  
  212. void print_aabbccdd(const vector<vector<double>>& matrix, const vector<double>& sum, const vector<double>& normsum)
  213. {
  214. cout << " A B C D sum norm" << endl;
  215. cout << "A ";
  216. for (auto i = 0; i <= 3; i++) cout << fixed << setprecision(2) << setw(5) << matrix[0][i] << " ";
  217. cout << setw(5) << sum[0] << " " << normsum[0];
  218. cout << endl << "B ";
  219. for (auto i = 0; i <= 3; i++) cout << setw(5) << matrix[1][i] << " ";
  220. cout << setw(5) << sum[1] << " " << normsum[1];
  221. cout << endl << "C ";
  222. for (auto i = 0; i <= 3; i++) cout << setw(5) << matrix[2][i] << " ";
  223. cout << setw(5) << sum[2] << " " << normsum[2];
  224. cout << endl << "D ";
  225. for (auto i = 0; i <= 3; i++) cout << setw(5) << matrix[3][i] << " ";
  226. cout << setw(5) << sum[3] << " " << normsum[3];
  227. cout << endl;
  228. }
  229.  
  230. void print_1234(const vector < vector<double>>& matrix, const vector<double>& sum, const vector<double>& normsum)
  231. {
  232. cout << " 1 2 3 4 sum norm" << endl;
  233. cout << "1 ";
  234. for (auto i = 0; i <= 3; i++) cout << fixed << setprecision(2) << setw(5) << matrix[0][i] << " ";
  235. cout << setw(5) << sum[0] << " " << normsum[0];
  236. cout << endl << "2 ";
  237. for (auto i = 0; i <= 3; i++) cout << setw(5) << matrix[1][i] << " ";
  238. cout << setw(5) << sum[1] << " " << normsum[1];
  239. cout << endl << "3 ";
  240. for (auto i = 0; i <= 3; i++) cout << setw(5) << matrix[2][i] << " ";
  241. cout << setw(5) << sum[2] << " " << normsum[2];
  242. cout << endl << "4 ";
  243. for (auto i = 0; i <= 3; i++) cout << setw(5) << matrix[3][i] << " ";
  244. cout << setw(5) << sum[3] << " " << normsum[3];
  245. cout << endl;
  246. }
  247.  
  248. void print4x1(const vector<double>& matrix)
  249. {
  250. for (auto i : matrix) cout << i << endl;
  251. }
  252.  
  253. int main()
  254. {
  255. setlocale(LC_ALL, "Russian");
  256. vector <vector<double>> preferences = { {4, 7, 7, 7}, {4, 6, 7, 6}, {7, 4, 5, 5}, {5, 3, 5, 3} };
  257. vector <double> criterions = {8, 6, 2, 4};
  258. // vector <vector<double>> new_matrix_4x4;
  259. vector <double> new_matrix_4x1 = normalise_matrix_4x1(criterions);
  260. print_abcd(preferences);
  261. cout << endl << endl;
  262. print4x1(new_matrix_4x1);
  263. cout << endl;
  264. //метод змены критериев ограничения
  265. cout << "Метод замены критериев" << endl << endl;
  266. vector <vector<double>> new_matrix_4x4 = norm_without_criterion(preferences, 0);
  267.  
  268. cout << "Нормированная матрица (кроме главного критерия: Объем памяти)" << endl;
  269. print_abcd(new_matrix_4x4);
  270. cout << endl << endl;
  271. //метод сужения множества Парето для критериев 1 и 3
  272. cout << "Формирование и сужение множества Парето" << endl << endl;
  273. double utopia1 = utopia_coordinate(preferences, 0);
  274. double utopia2 = utopia_coordinate(preferences, 3);
  275. cout << "координаты точки утопии для критериев 1 и 4 (" << utopia1 << ", " << utopia2 << ")" << endl << endl;
  276. cout << "Расстояние Евклидово:" << endl;
  277. cout << "Компьютер: " << evklid_distance(preferences, utopia1, utopia2, 0, 3, 0) << endl;
  278. cout << "Ноутбук: " << evklid_distance(preferences, utopia1, utopia2, 0, 3, 1) << endl;
  279. cout << "Планшет: " << evklid_distance(preferences, utopia1, utopia2, 0, 3, 2) << endl;
  280. cout << "Смартфон: " << evklid_distance(preferences, utopia1, utopia2, 0, 3, 3) << endl;
  281. cout << endl;
  282. cout << "Взвешивание и объединение критериев" << endl << endl;
  283. cout << "Нормализованная матрица рейтингов альтернатив по критериям" << endl;
  284. new_matrix_4x4 = normalise_matrix_4x4(preferences);
  285. print_abcd(new_matrix_4x4);
  286. cout << endl << endl;
  287.  
  288. cout << "Вектор весов критериев" << endl;
  289. new_matrix_4x1 = new_criterion(criterions);
  290. print4x1(new_matrix_4x1);
  291. cout << endl;//вывод
  292.  
  293. cout << "Нормализованный вектор весов критериев" << endl;
  294. new_matrix_4x1 = normalise_matrix_4x1(new_matrix_4x1);
  295. print4x1(new_matrix_4x1);
  296. cout << endl;
  297.  
  298. cout << "Значения объединенного критерия для всех альтернатив" << endl;
  299. new_matrix_4x1 = new_matrix_4x4 * new_matrix_4x1;
  300. print4x1(new_matrix_4x1);
  301. cout << endl;
  302.  
  303. cout << "Метод анализа критериев" << endl << endl;
  304.  
  305. vector <double> matrix1(4), matrix2(4), matrix3(4), matrix4(4), matrix5(4);
  306. vector <double> matrix1sum(4), matrix2sum(4), matrix3sum(4), matrix4sum(4), matrix5sum(4);
  307.  
  308. new_matrix_4x4 = set_matrix_criterion(preferences, 0);
  309. matrix1sum = sumstr(new_matrix_4x4);
  310. matrix1 = normalise_matrix_4x1(matrix1sum);
  311. cout << endl << "Начальная цена" << endl;
  312.  
  313. print_aabbccdd(new_matrix_4x4, matrix1sum, matrix1);
  314. new_matrix_4x4 = set_matrix_criterion(preferences, 1);
  315. matrix2sum = sumstr(new_matrix_4x4);
  316. matrix2 = normalise_matrix_4x1(matrix2sum);
  317. cout << endl << "Стоимость обслуживания" << endl;
  318.  
  319. print_aabbccdd(new_matrix_4x4, matrix2sum, matrix2);
  320.  
  321. new_matrix_4x4 = set_matrix_criterion(preferences, 2);
  322. matrix3sum = sumstr(new_matrix_4x4);
  323. matrix3 = normalise_matrix_4x1(matrix3sum);
  324. cout << endl << "Объем памяти" << endl;
  325.  
  326. print_aabbccdd(new_matrix_4x4, matrix3sum, matrix3);
  327.  
  328. new_matrix_4x4 = set_matrix_criterion(preferences, 3);
  329. matrix4sum = sumstr(new_matrix_4x4);
  330. matrix4 = normalise_matrix_4x1(matrix4sum);
  331. cout << endl << "Размер экрана" << endl;
  332.  
  333. print_aabbccdd(new_matrix_4x4, matrix4sum, matrix4);
  334.  
  335. new_matrix_4x4 = matrix_of_criterions(criterions);
  336. matrix5sum = sumstr(new_matrix_4x4);
  337. matrix5 = normalise_matrix_4x1(matrix5sum);
  338. cout << endl << "Оценка приоритетов критериев" << endl;
  339.  
  340. print_1234(new_matrix_4x4, matrix5sum, matrix5);
  341. cout << endl << endl;
  342.  
  343. for (auto i = 0; i <= 3; i++)
  344. {
  345. new_matrix_4x4[i][0] = matrix1[i];
  346. new_matrix_4x4[i][1] = matrix2[i];
  347. new_matrix_4x4[i][2] = matrix3[i];
  348. new_matrix_4x4[i][3] = matrix4[i];
  349. }
  350.  
  351. for (auto i1 : new_matrix_4x4)
  352. {
  353. for (auto i2 : i1) cout << i2 << " ";
  354. cout << endl;
  355. }
  356.  
  357. cout << endl << endl;
  358.  
  359. new_matrix_4x1 = new_matrix_4x4 * matrix5;
  360. print4x1(new_matrix_4x1);
  361. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement