Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- mat = [
- [5, 3, 1, 2, 8, 4, 6, 7],
- [5, 4, 3, 1, 8, 2, 6, 7],
- [1, 7, 5, 4, 8, 2, 3, 6],
- [6, 4, 2.5, 2.5, 8, 1, 7, 5],
- [8, 2, 4, 6, 3, 5, 1, 7],
- [5, 6, 4, 3, 2, 1, 7, 8],
- [6, 1, 2, 3, 5, 4, 8, 7],
- [5, 1, 3, 2, 7, 4, 6, 8],
- [6, 1, 3, 2, 5, 4, 7, 8],
- [5, 3, 2, 1, 8, 4, 6, 7],
- [7, 1, 3, 2, 6, 4, 5, 8],
- [1, 6, 5, 3, 8, 4, 2, 7]
- ]
- def ar_mean():
- print('Впорядкування за середнiми арифметичними рангiв:')
- mean = list()
- freq = dict()
- freq[-1.0] = 1
- for j in range(0, 8):
- cur = 0
- for o in mat:
- cur += o[j]
- cur = round(cur / 12, 3)
- if cur not in freq: freq[cur] = 0
- freq[cur] += 1
- mean.append((cur, chr(1040 + j)))
- mean.sort(key=lambda o: o[0])
- rank = -1
- last = -1.0
- ranking = dict()
- for o in mean:
- if last != o[0]:
- rank += freq[last]
- last = o[0]
- ranking[o[1]] = rank + (freq[o[0]] + 1) / 2
- print('\t', o[1], 'новий ранг', rank + (freq[o[0]] + 1) / 2, 'cередня оцiнка', o[0])
- return ranking
- def ar_med():
- print('Впорядкування за медiанами рангiв:')
- med = list()
- freq = dict()
- freq[-1.0] = 1
- for j in range(0, 8):
- col = []
- for o in mat:
- col.append(o[j])
- col.sort()
- cur = round((col[5] + col[6]) / 2.0, 3)
- if cur not in freq: freq[cur] = 0
- freq[cur] += 1
- med.append((cur, chr(1040 + j)))
- med.sort(key=lambda me: me[0])
- rank = -1
- last = -1.0
- ranking = dict()
- for o in med:
- if last != o[0]:
- rank += freq[last]
- last = o[0]
- ranking[o[1]] = rank + (freq[o[0]] + 1) / 2
- print('\t', o[1], 'новий ранг', rank + (freq[o[0]] + 1) / 2, 'медiана', o[0])
- return ranking
- def dfs(cur, used, res, flag, g):
- used[cur] = 1
- for to in g[cur]:
- if not used[to]:
- if used[cur] == 1:
- used[cur] = 2
- res[0] += '{ '
- dfs(to, used, res, True, g)
- res[0] += chr(1040 + cur)
- if flag:
- res[0] += ' , '
- if used[cur] == 2:
- res[0] += ' }'
- def cluster(ranking1, ranking2):
- g = [[] for _ in range(8)]
- print('Ядро суперечностей:')
- for i in range(0, 8):
- g[i].append(i)
- for j in range(i + 1, 8):
- u = chr(1040 + i)
- v = chr(1040 + j)
- if (ranking1[u] < ranking1[v] and ranking2[u] > ranking2[v]) or (ranking1[u] > ranking1[v] and ranking2[u] < ranking2[v]):
- g[i].append(j)
- g[j].append(i)
- print('\t(', u, ',', v, ')')
- print('\nКластеризоване ранжування:')
- pos = list(range(0, 8))
- pos.sort(key=lambda p: [ranking1[chr(1040 + p)], ranking2[chr(1040 + p)]])
- used = [0] * 8
- res = ['']
- for e in pos:
- if not used[e]:
- if len(res[0]): res[0] += ' < '
- dfs(e, used, res, False, g)
- print('\t', res[0])
- ar_ranking = ar_mean()
- print('\n')
- med_ranking = ar_med()
- print('\n')
- cluster(ar_ranking, med_ranking)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement