Advertisement
Guest User

Untitled

a guest
May 18th, 2018
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scilab 8.99 KB | None | 0 0
  1. // Исходные данные
  2.  
  3. alts_n = evstr(x_dialog('Кол-во альтернатив', '5'));
  4. alts = ['Киевстар', 'Водафон', 'Лайфцел', 'ТриМоб', 'Билайн'];
  5. alts = x_dialog('Альтернативы:', alts);
  6.  
  7. crits_n = evstr(x_dialog('Кол-во критериев', '5'))'
  8. crits = ['Популярность', 'Обслуживание', 'Стоимость тарифа (в месяц)', 'Количество мб/мин', 'Стабильность работы',];
  9. crits = x_dialog('Критерии', crits);
  10.  
  11. L = evstr(x_dialog('Максимальное значение шкалы', '20'));
  12. crits_weights = [17 19 18 20 19];
  13. crits_weights = x_matrix('Весовой параметр каждого критерия', crits_weights);
  14.  
  15. crits_matrix = [20 19 17 10 17;
  16.                 16 17 14 10 19;
  17.                 18 16 19 20 18;
  18.                 12 19 10 17 20;
  19.                 16 18 17 13 19];
  20. crits_matrix = x_matrix('Матрица критериев:', crits_matrix);
  21. alts_conf = zeros(crits_n, (alts_n * alts_n - alts_n))
  22.  
  23. C = 0.5;
  24. d = 0.4;
  25.  
  26. f1 = figure(); // Создание графического объекта
  27. set(f1, 'position', [0, 0, 620, 827]); // Размер окна
  28.  
  29. uicontrol('style', 'text', ..
  30.           'position', [10, 797, 600, 20], ..
  31.           'string', 'Матрица критериев');
  32.  
  33. table = ["" alts' "Веса"; [crits string(crits_matrix(:, 1)) string(crits_matrix(:, 2)) string(crits_matrix(:, 3)) string(crits_matrix(:, 4)) string(crits_matrix(:, 5)) string(crits_weights')]];
  34.  
  35. uicontrol('style', 'table', ..
  36.           'string', table, ..
  37.           'position', [10 660 600 127]);
  38.  
  39. // Сравнение конфигураций
  40.  
  41. alts_conf = zeros(crits_n, (alts_n * alts_n - alts_n));
  42. k = 0;
  43. for j = 1 : alts_n
  44.     for i = 1 : alts_n
  45.         if j <> i then
  46.             k = k + 1;
  47.             for m = 1 : crits_n
  48.                 if crits_matrix(m, j) > crits_matrix(m, i) then
  49.                     alts_conf(m, k) = 1;
  50.                 elseif crits_matrix(m, j) == crits_matrix(m, i) then
  51.                     alts_conf(m, k) = 0;      
  52.                 elseif crits_matrix(m, j) < crits_matrix(m, i) then
  53.                     alts_conf(m, k) = -1;
  54.                 end
  55.             end
  56.         end
  57.     end
  58. end
  59.  
  60. uicontrol('style', 'text', ..
  61.           'position', [10, 630, 600, 20], ..
  62.           'string', 'Сравнение конфигураций (-1 <, 0 =, 1 >)');
  63.  
  64. table = ["" string([1 2 3 4 5 6]); [["AB"; "AC"; "AD"; "AE"; "BA"; "BC"; "BD"; "BE"; "CA"; "CB"; "CD"; "CE"; "DA"; "DB"; "DC"; "DE"; "EA"; "EB"; "EC"; "ED"] string(alts_conf'(:, 1)) string(alts_conf'(:, 2)) string(alts_conf'(:, 3)) string(alts_conf'(:, 4)) string(alts_conf'(:, 5)) string(alts_conf'(:, 6))]];
  65.  
  66. uicontrol('style', 'table', ..
  67.           'string', table, ..
  68.           'position', [10 493 600 127]);
  69.  
  70. // Расчёт матрицы несогласия
  71.  
  72. disagree_matrix = zeros(alts_n, alts_n);
  73. is_equal = 0;
  74. step = 1;
  75. for j = 1 : alts_n
  76.     for i = 1 : alts_n
  77.         if j <> i then
  78.             for m = 1 : crits_n
  79.                 if alts_conf(m, step) == -1 then
  80.                     x = j;
  81.                     y = i;
  82.                     is_equal = 1;
  83.                 end
  84.                 if is_equal == 1 then
  85.                     d = abs(((crits_matrix(m, y) - crits_matrix(m, x)) / L));
  86.                     disagree_index(m, 1) = d;
  87.                     disagree_index(m, 2) = x;
  88.                     disagree_index(m, 3) = y;
  89.                     disagree_matrix(disagree_index(m, 2), disagree_index(m, 3)) = max(disagree_index(:, 1));
  90.                     is_equal = 0;
  91.                 end
  92.             end
  93.             step = step + 1;
  94.         end
  95.         disagree_index = zeros(crits_n, 3);
  96.     end
  97. end
  98. // disp(disagree_matrix, 'Матрица несогласия');
  99.  
  100. uicontrol('style', 'text', ..
  101.           'position', [10, 463, 600, 20], ..
  102.           'string', 'Матрица несогласия');
  103.  
  104. alts_aliases = ["A" "B" "C" "D" "E"];
  105.  
  106. table = [["" alts_aliases]; [alts_aliases' string(disagree_matrix(:, 1)) string(disagree_matrix(:, 2)) string(disagree_matrix(:, 3)) string(disagree_matrix(:, 4)) string(disagree_matrix(:, 5))]];
  107.  
  108. uicontrol('style', 'table', ..
  109.           'string', table, ..
  110.           'position', [10 342 600 111]);
  111.  
  112. // Расчёт матрицы согласия и подмножеств I+, I=, I
  113.  
  114.  agree_matrix = zeros(alts_n, alts_n);
  115.    
  116.     // ВЫЧИСЛЕНИЕ СУММЫ ВЕСОВ КРИТЕРИЕВ ПОДМНОЖЕСТВА I+
  117.     sum_plus = zeros(alts_n, alts_n);
  118.     equals_flag = 1;
  119.     step = 1;
  120.    
  121.     for j = 1 : alts_n
  122.         for i = 1 : alts_n
  123.            if j<>i then
  124.                for m = 1 : crits_n
  125.                    agree_index = zeros(crits_n, 3);
  126.                    if ( alts_conf(m, step) == 1 ) then
  127.                       x = j;
  128.                       y = i;
  129.                       equals_flag = 0;
  130.                    end
  131.                    if equals_flag == 0 then
  132.                       d = crits_weights(m);
  133.                       agree_index_temporary(m, 1) = d;
  134.                       agree_index_temporary(m, 2) = x;
  135.                       agree_index_temporary(m, 3) = y;
  136.                       equals_flag = 1;
  137.                       element_plus = sum(agree_index_temporary(:, 1));
  138.                       sum_plus(x, y) = element_plus;
  139.                       equals_flag = 1;
  140.                    end
  141.                end
  142.                step = step + 1;
  143.            end
  144.            agree_index_temporary = zeros(crits_n, 3);
  145.         end
  146.     end
  147.     disp(sum_plus, 'Cуммы весов критериев подмножества I+');
  148.    
  149.     // ВЫЧИСЛЕНИЕ СУММЫ ВЕСОВ КРИТЕРИЕВ ПОДМНОЖЕСТВА I-
  150.     sum_minus = ones(alts_n, alts_n);
  151.     equals_flag = 1;
  152.     step = 1;
  153.    
  154.     for j = 1 : alts_n
  155.         for i = 1 : alts_n
  156.            if j<>i then
  157.                for m = 1 : crits_n
  158.                    agree_index = zeros(crits_n, 3);
  159.                    if ( alts_conf(m, step) == -1 ) then
  160.                       x = j;
  161.                       y = i;
  162.                       equals_flag = 0;
  163.                    end
  164.                    if equals_flag == 0 then
  165.                       d = crits_weights(m);
  166.                       disagree_indexTemp(m, 1) = d;
  167.                       disagree_indexTemp(m, 2) = x;
  168.                       disagree_indexTemp(m, 3) = y;
  169.                       equals_flag = 1;
  170.                       elementsum_minus = sum(disagree_indexTemp(:, 1));
  171.                       sum_minus(x, y) = elementsum_minus;
  172.                       equals_flag = 1;
  173.                    end
  174.                end
  175.                step = step + 1;
  176.            end
  177.            disagree_indexTemp = zeros(crits_n, 3);
  178.         end
  179.     end
  180.     disp(sum_minus, 'Cуммы весов критериев подмножеств I- ');
  181.    
  182.     agree_matrix =  sum_plus ./ sum_minus;
  183.  
  184. uicontrol('style', 'text', ..
  185.           'position', [10, 312, 600, 20], ..
  186.           'string', 'Матрица согласия');
  187.  
  188. table = [["" alts_aliases]; [alts_aliases' string(agree_matrix(:, 1)) string(agree_matrix(:, 2)) string(agree_matrix(:, 3)) string(agree_matrix(:, 4)) string(agree_matrix(:, 5))]];
  189.  
  190. uicontrol('style', 'table', ..
  191.           'string', table, ..
  192.           'position', [10 191 600 111]);
  193.  
  194. // Вычисление превосходства альтернатив и выбор лучшей альтернативы
  195.  
  196. // Матрица превосходства
  197. superior_alts = zeros(alts_n, alts_n);
  198. for i = 1 : alts_n
  199.     for j = 1 : alts_n
  200.         if agree_matrix(i, j) >= C & disagree_matrix(i, j) <= d then
  201.             superior_alts(i, j) = 1;
  202.         end
  203.     end
  204. end
  205. // disp(superior_alts, 'Матрица превосходства вариантов');
  206.  
  207. uicontrol('style', 'text', ..
  208.           'position', [10, 161, 600, 20], ..
  209.           'string', 'Матрица превосходства вариантов');
  210.  
  211. table = [["" alts_aliases]; [alts_aliases' string(superior_alts(:, 1)) string(superior_alts(:, 2)) string(superior_alts(:, 3)) string(superior_alts(:, 4)) string(superior_alts(:, 5))]];
  212.  
  213. uicontrol('style', 'table', ..
  214.           'string', table, ..
  215.           'position', [10 40 600 111]);
  216.  
  217. // Выбор лучшей альтернативы
  218.  
  219. best_alt = zeros(1, alts_n);
  220. best_alt = sum(superior_alts, 'c');
  221. max_best_alt = max(best_alt);
  222.  
  223. disp('------------------------------');
  224. disp('Результат:');
  225. for i = 1 : alts_n
  226.     disp(best_alt(i), alts(i));
  227. end
  228. disp('------------------------------');
  229. disp('Лучшая альтернатива:');
  230. for i = 1 : alts_n
  231.     if best_alt(i) == max_best_alt then
  232.         disp(max_best_alt, alts(i));
  233.         answer = alts(i);
  234.         break;
  235.     end
  236. end
  237.  
  238. uicontrol('style', 'text', ..
  239.           'position', [10, 10, 600, 20], ..
  240.           'string', 'Лучшая альтернатива - ' + answer);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement