daily pastebin goal
4%
SHARE
TWEET

TPR lab2_1

osipyonok Nov 17th, 2017 (edited) 87 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. mat = [
  2.     [5, 3,  1,  2,  8,  4,  6,  7],
  3.     [5, 4,  3,  1,  8,  2,  6,  7],
  4.     [1, 7,  5,  4,  8,  2,  3,  6],
  5.     [6, 4,  2.5,    2.5,    8,  1,  7,  5],
  6.     [8, 2,  4,  6,  3,  5,  1,  7],
  7.     [5, 6,  4,  3,  2,  1,  7,  8],
  8.     [6, 1,  2,  3,  5,  4,  8,  7],
  9.     [5, 1,  3,  2,  7,  4,  6,  8],
  10.     [6, 1,  3,  2,  5,  4,  7,  8],
  11.     [5, 3,  2,  1,  8,  4,  6,  7],
  12.     [7, 1,  3,  2,  6,  4,  5,  8],
  13.     [1, 6,  5,  3,  8,  4,  2,  7]
  14. ]
  15.  
  16.  
  17. def ar_mean():
  18.     print('Впорядкування за середнiми арифметичними рангiв:')
  19.     mean = list()
  20.     freq = dict()
  21.     freq[-1.0] = 1
  22.     for j in range(0, 8):
  23.         cur = 0
  24.         for o in mat:
  25.             cur += o[j]
  26.         cur = round(cur / 12, 3)
  27.         if cur not in freq:   freq[cur] = 0
  28.         freq[cur] += 1
  29.         mean.append((cur, chr(1040 + j)))
  30.     mean.sort(key=lambda o: o[0])
  31.     rank = -1
  32.     last = -1.0
  33.     ranking = dict()
  34.     for o in mean:
  35.         if last != o[0]:
  36.             rank += freq[last]
  37.             last = o[0]
  38.         ranking[o[1]] = rank + (freq[o[0]] + 1) / 2
  39.         print('\t', o[1], 'новий ранг', rank + (freq[o[0]] + 1) / 2, 'cередня оцiнка', o[0])
  40.     return ranking
  41.  
  42.  
  43. def ar_med():
  44.     print('Впорядкування за медiанами рангiв:')
  45.     med = list()
  46.     freq = dict()
  47.     freq[-1.0] = 1
  48.     for j in range(0, 8):
  49.         col = []
  50.         for o in mat:
  51.             col.append(o[j])
  52.         col.sort()
  53.         cur = round((col[5] + col[6]) / 2.0, 3)
  54.         if cur not in freq:   freq[cur] = 0
  55.         freq[cur] += 1
  56.         med.append((cur, chr(1040 + j)))
  57.     med.sort(key=lambda me: me[0])
  58.     rank = -1
  59.     last = -1.0
  60.     ranking = dict()
  61.     for o in med:
  62.         if last != o[0]:
  63.             rank += freq[last]
  64.             last = o[0]
  65.         ranking[o[1]] = rank + (freq[o[0]] + 1) / 2
  66.         print('\t', o[1], 'новий ранг', rank + (freq[o[0]] + 1) / 2, 'медiана', o[0])
  67.     return ranking
  68.  
  69.  
  70. def dfs(cur, used, res, flag, g):
  71.     used[cur] = 1
  72.     for to in g[cur]:
  73.         if not used[to]:
  74.             if used[cur] == 1:
  75.                 used[cur] = 2
  76.                 res[0] += '{ '
  77.             dfs(to, used, res, True, g)
  78.     res[0] += chr(1040 + cur)
  79.     if flag:
  80.         res[0] += ' , '
  81.     if used[cur] == 2:
  82.         res[0] += ' }'
  83.  
  84.  
  85. def cluster(ranking1, ranking2):
  86.     g = [[] for _ in range(8)]
  87.     print('Ядро суперечностей:')
  88.     for i in range(0, 8):
  89.         g[i].append(i)
  90.         for j in range(i + 1, 8):
  91.             u = chr(1040 + i)
  92.             v = chr(1040 + j)
  93.             if (ranking1[u] < ranking1[v] and ranking2[u] > ranking2[v]) or (ranking1[u] > ranking1[v] and ranking2[u] < ranking2[v]):
  94.                 g[i].append(j)
  95.                 g[j].append(i)
  96.                 print('\t(', u, ',', v, ')')
  97.     print('\nКластеризоване ранжування:')
  98.     pos = list(range(0, 8))
  99.     pos.sort(key=lambda p: [ranking1[chr(1040 + p)], ranking2[chr(1040 + p)]])
  100.     used = [0] * 8
  101.     res = ['']
  102.     for e in pos:
  103.         if not used[e]:
  104.             if len(res[0]):    res[0] += ' < '
  105.             dfs(e, used, res, False, g)
  106.     print('\t', res[0])
  107.  
  108.  
  109. ar_ranking = ar_mean()
  110. print('\n')
  111. med_ranking = ar_med()
  112. print('\n')
  113. cluster(ar_ranking, med_ranking)
RAW Paste Data
Top