chuuupa

dyploma

Jun 23rd, 2022 (edited)
541
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 32.06 KB | None | 0 0
  1. import sys
  2. import math
  3. import numpy as np
  4.  
  5. from tkinter import *
  6. from PIL import Image, ImageTk
  7.  
  8.  
  9. def recount_pow(_indexes_arr, _covered_rows):
  10.     _pow_col = np.zeros([2, appr_sol_binary.shape[1]])
  11.  
  12.     for i in range(appr_sol_binary.shape[1]):
  13.         for j in range(appr_sol_binary.shape[0]):
  14.             if i in _indexes_arr:
  15.                 _pow_col[:, i] = 0
  16.             if j not in _covered_rows:
  17.                 _pow_col[0, i] += appr_sol_binary[j, i]
  18.                 _pow_col[1, i] += appr_sol_weighted[j, i]
  19.  
  20.     return _pow_col
  21.  
  22.  
  23. def L1_func(_appr_sol_binary, _marks, _covered_rows, _indexes_arr):
  24.     _L1 = 0
  25.  
  26.     for i in range(_appr_sol_binary.shape[1]):
  27.         if i in mark_mass:
  28.             _L1 += -alpha + betta * alpha_j[i]
  29.  
  30.     _tmp_sum_pow = 0
  31.     _tmp_pow = recount_pow(_indexes_arr, _covered_rows)
  32.     max_index = 0
  33.  
  34.     while _tmp_sum_pow < _appr_sol_binary.shape[0] - len(_covered_rows):
  35.         for i in range(_tmp_pow.shape[1]):
  36.             if _tmp_pow[1, i] == np.max(_tmp_pow[1]):
  37.                 max_index = i
  38.  
  39.         _L1 += -alpha + betta * _tmp_pow[1, max_index]
  40.         _tmp_sum_pow += _tmp_pow[0, max_index]
  41.         _tmp_pow[:, max_index] = 0
  42.  
  43.     return _L1
  44.  
  45.  
  46. def _quit():
  47.     global root
  48.     root.destroy()
  49.  
  50.  
  51. def remember_message():
  52.     global root, alpha, betta
  53.  
  54.     alpha = var_alpha.get()
  55.     betta = var_betta.get()
  56.  
  57.     root.destroy()
  58.  
  59.  
  60. def remember_matrix_weights():
  61.     global root
  62.  
  63.     get_values_tmp = [float(entry.get()) for entry in root.entries]
  64.  
  65.     k = 0
  66.     for i in range(weighted_matrix.shape[0]):
  67.         for j in range(weighted_matrix.shape[1]):
  68.             weighted_matrix[i, j] = get_values_tmp[k]
  69.             k += 1
  70.  
  71.     root.destroy()
  72.  
  73.  
  74. def remember_k():
  75.     get_values_tmp_ki = [float(entry.get()) for entry in root.entries_ki]
  76.     get_values_tmp_kij = [float(entry.get()) for entry in root.entries_kij]
  77.  
  78.     k = 0
  79.     for i in range(len(character_names)):
  80.         character_names[i][4] = get_values_tmp_kij[i]
  81.  
  82.         if i == 0:
  83.             character_names[i][1] = get_values_tmp_ki[0]
  84.         if character_names[i][0] == character_names[i - 1][0] and i > 0:
  85.             character_names[i][1] = get_values_tmp_ki[k]
  86.         if character_names[i][0] != character_names[i - 1][0] and i > 0:
  87.             k += 1
  88.             character_names[i][1] = get_values_tmp_ki[k]
  89.  
  90.     root.destroy()
  91.  
  92.  
  93. def rgb(r, g, b):
  94.     return "#%s%s%s" % tuple([hex(c)[2:].rjust(2, "0") for c in (r, g, b)])
  95.  
  96. from itertools import permutations
  97.  
  98. data = []
  99.  
  100. with open('datascience/binary_matrix.tsv', 'r') as fin:
  101.     for line in fin:
  102.         data.append([int(x) for x in line.split()])
  103.  
  104. data = np.asarray(data, dtype=np.int64)
  105.  
  106. sums_by_rows = data.sum(axis=1)
  107. sums_by_cols = data.sum(axis=0)
  108.  
  109. if 0 in sums_by_rows:
  110.     print('Решения нет')
  111.     sys.exit()
  112.  
  113. appr_sol = np.zeros(data.shape, dtype=np.int64)
  114.  
  115. redundant_rows = []
  116.  
  117. while len(redundant_rows) < data.shape[0]:
  118.     for j in range(data.shape[1]):
  119.         if sums_by_cols[j] == max(sums_by_cols):
  120.             appr_sol[:, j] = data[:, j]
  121.  
  122.             for i in range(data.shape[0]):
  123.                 if data[i][j] == 1 and i not in redundant_rows:
  124.                     redundant_rows.append(i)
  125.             sums_by_cols[j] = 0
  126.  
  127. appr_sol_indexes = [j for j in range(data.shape[1]) if appr_sol.sum(axis=0)[j] > 0]
  128. appr_sol_sums_by_rows = appr_sol.sum(axis=1)
  129. exact_sol = np.zeros(data.shape, dtype=np.int64)
  130.  
  131. for i in range(data.shape[0]):
  132.     if appr_sol_sums_by_rows[i] > 1:
  133.         for j in range(data.shape[1]):
  134.             if appr_sol[i, j] == 1:
  135.                 exact_sol[:, j] = appr_sol[:, j]
  136.  
  137. exact_sol_sums_by_rows = exact_sol.sum(axis=1)
  138. exact_sol_sums_by_cols = exact_sol.sum(axis=0)
  139.  
  140. exact_sol_col_num = []
  141.  
  142. for i in range(data.shape[1]):
  143.     if exact_sol_sums_by_cols[i] > 0:
  144.         exact_sol_col_num.append(i)
  145.  
  146. uncovered_rows_num = 0
  147.  
  148. for i in range(exact_sol_sums_by_rows.shape[0]):
  149.     if exact_sol_sums_by_rows[i] == 0:
  150.         uncovered_rows_num += 1
  151.  
  152. if uncovered_rows_num > 0:
  153.     print('cтрок осталось не покрыто: ' + str(uncovered_rows_num))
  154.  
  155.     uncovered_cols_num = len(appr_sol_indexes) - len(exact_sol_col_num)
  156.     _matrix = np.zeros((uncovered_rows_num, uncovered_cols_num), dtype=np.int64)
  157.     interior_matrix_j = np.zeros(uncovered_cols_num, dtype=np.int64)
  158.     interior_matrix_i = np.zeros(uncovered_rows_num, dtype=np.int64)
  159.  
  160.     q, p = 0, 0
  161.  
  162.     for i in range(exact_sol_sums_by_rows.shape[0]):
  163.         if exact_sol_sums_by_rows[i] == 0:
  164.             for j in appr_sol_indexes:
  165.                 if j not in exact_sol_col_num:
  166.                     _matrix[q, p] = appr_sol[i, j]
  167.                     interior_matrix_j[p] = j
  168.                     p += 1
  169.             interior_matrix_i[q] = i
  170.             q += 1
  171.         p = 0
  172.         q = 0
  173.  
  174.     print('матрица, для которой будем искать оптимальное решение')
  175.     print(_matrix)
  176.  
  177.     L0 = uncovered_cols_num
  178.     L1 = 0
  179.  
  180.     matrix_attrs = np.zeros((3, uncovered_cols_num), dtype=np.int64)
  181.     mass_sum_cnt = matrix_attrs.copy()
  182.  
  183.     covered_rows = []
  184.     mass_tmp_ind0 = []
  185.  
  186.     L1_tmp = 0
  187.     sum_pow = 0
  188.     max_pow = 0
  189.  
  190.     validated_sol = []
  191.  
  192.     while L1 < L0 and len(covered_rows) < uncovered_rows_num:
  193.         for i in range(uncovered_rows_num):
  194.             for j in range(uncovered_cols_num):
  195.                 matrix_attrs[0, j] = 0
  196.                 if _matrix[i, j] == 1 and i not in covered_rows:
  197.                     matrix_attrs[0, j] += 1
  198.  
  199.         for j in range(uncovered_cols_num):
  200.             if len(covered_rows) < uncovered_rows_num and \
  201.                     matrix_attrs[1, j] == 0 and matrix_attrs[0, j] == max(matrix_attrs[0]):
  202.                 validated_sol.append(j)
  203.                 matrix_attrs[1, j] = 1
  204.                 matrix_attrs[2, j] = 1
  205.  
  206.                 for i in range(uncovered_rows_num):
  207.                     if _matrix[i, j] == 1:
  208.                         covered_rows.append(i)
  209.  
  210.                 for m in matrix_attrs[2]:
  211.                     if m == 1:
  212.                         L1_tmp += 1
  213.  
  214.                 for n in range(uncovered_cols_num):
  215.                     if matrix_attrs[1, n] == 0:
  216.                         mass_tmp_ind0.append(n)
  217.  
  218.                 candidates = np.array(list(permutations(mass_tmp_ind0)))
  219.                 mass_sum_cnt = np.zeros(candidates.shape, dtype=np.int64)
  220.  
  221.                 for k in range(len(candidates)):
  222.                     for t in range(len(candidates[k])):
  223.                         sum_pow += matrix_attrs[0, candidates[k, t]]
  224.                         mass_sum_cnt[k, t] = sum_pow
  225.                     sum_pow = 0
  226.  
  227.                 mass_sum_cnt = mass_sum_cnt.transpose()
  228.  
  229.                 for a in range(len(mass_sum_cnt)):
  230.                     for b in range(len(mass_sum_cnt[a])):
  231.                         if mass_sum_cnt[a, b] >= uncovered_rows_num - len(covered_rows):
  232.                             L1 = L1_tmp + a + 1
  233.                             break
  234.                     break
  235.  
  236.                 if L1_tmp >= L1:
  237.                     L1 = uncovered_rows_num
  238.  
  239.                 L0 = len(validated_sol)
  240.  
  241.     cnt_ind0 = 0
  242.     L0 = len(validated_sol)
  243.     L1_tmp = 0
  244.     mass_tmp_ind1 = []
  245.  
  246.     if uncovered_cols_num > 1:
  247.         while cnt_ind0 < uncovered_cols_num:
  248.             validated_sol = list(reversed(validated_sol))
  249.             uncovered_cols_num = len(validated_sol)
  250.  
  251.             for j in range(uncovered_cols_num):
  252.                 if matrix_attrs[2, validated_sol[j]] == 1:
  253.                     matrix_attrs[2, validated_sol[j]] = 0
  254.  
  255.                     for i in range(uncovered_rows_num):
  256.                         if _matrix[i, validated_sol[j]] == 1:
  257.                             covered_rows.remove(i)
  258.                 else:
  259.                     if matrix_attrs[1, validated_sol[j]] == 1:
  260.                         matrix_attrs[1, validated_sol[j]] = 0
  261.                     else:
  262.                         cnt_ind0 += 1
  263.  
  264.                 while L0 < L1 and uncovered_cols_num > 1:
  265.                     for m in range(uncovered_cols_num):
  266.                         if matrix_attrs[2, validated_sol[m]] == 1:
  267.                             L1_tmp += 1
  268.  
  269.                     for n in range(len(validated_sol)):
  270.                         if matrix_attrs[1, validated_sol[n]] == 0:
  271.                             mass_tmp_ind1.append(n)
  272.  
  273.                     candidates = np.array(list(permutations(mass_tmp_ind1)))
  274.                     mass_sum_cnt = np.zeros(candidates.shape, dtype=np.int64)
  275.  
  276.                     for k in range(len(candidates)):
  277.                         for t in range(len(candidates[k])):
  278.                             sum_pow += matrix_attrs[0, candidates[k, t]]
  279.                             mass_sum_cnt[k, t] = sum_pow
  280.                         sum_pow = 0
  281.  
  282.                     mass_sum_cnt = mass_sum_cnt.transpose()
  283.  
  284.                     for a in range(len(mass_sum_cnt)):
  285.                         for b in range(len(mass_sum_cnt[a])):
  286.                             if mass_sum_cnt[a, b] >= uncovered_rows_num - len(covered_rows):
  287.                                 L1 = L1_tmp + a + 1
  288.                                 break
  289.                         break
  290.  
  291.     for k in range(uncovered_cols_num):
  292.         exact_sol_col_num.append(interior_matrix_j[validated_sol[k]])
  293.  
  294.     exact_sol_col_num.sort()
  295.  
  296. root = Tk()
  297.  
  298. x_window = (root.winfo_screenwidth() - root.winfo_reqwidth()) / 2
  299. y_window = (root.winfo_screenheight() - root.winfo_reqheight()) / 2
  300.  
  301. root.title("Выбор вакансии")
  302. root.geometry("%dx%d+%d+%d" % (900, 400, x_window - 200, y_window - 220))
  303. root.config(relief=RIDGE, bg='lavender')
  304.  
  305. var = StringVar()
  306.  
  307. Radiobutton(root, text="Аналитик данных", width=20, height=5, bd=5, font="Vernada 16", relief=RIDGE,
  308.             bg="gainsboro", fg="grey4", variable=var, indicatoron=False, value='analytics',
  309.             command=_quit).place(relx=.03, rely=.14)
  310. Radiobutton(root, text="Разработчик", width=20, height=5, bd=5, font="Vernada 16", relief=RIDGE,
  311.             bg="gainsboro", fg="grey4", variable=var, indicatoron=False, value='developer',
  312.             command=_quit).place(relx=.36, rely=.14)
  313. Radiobutton(root, text="Специалист DS", width=20, height=5, bd=5, font="Vernada 16", relief=RIDGE,
  314.             bg="gainsboro", fg="grey4", variable=var, indicatoron=False, value='datascience',
  315.             command=_quit).place(relx=.69, rely=.14)
  316.  
  317. image_analyst = ImageTk.PhotoImage(Image.open("pictures/analyst.jpg"))
  318. image_developer = ImageTk.PhotoImage(Image.open("pictures/developer.jpg"))
  319. image_ds = ImageTk.PhotoImage(Image.open("pictures/ds.jpg"))
  320.  
  321. Label(root, image=image_analyst).place(relx=.09, rely=.55)
  322. Label(root, image=image_developer).place(relx=.42, rely=.55)
  323. Label(root, image=image_ds).place(relx=.75, rely=.55)
  324. Label(root, text="Выберите вакансию для отбора кандидатов", font="Vernada 14", bg='lavender',
  325.       fg="grey4").place(relx=.5, rely=.07, anchor=CENTER)
  326.  
  327. root.mainloop()
  328.  
  329. position = var.get()
  330.  
  331. binary_matrix = np.array(np.genfromtxt(position + '\\binary_matrix.tsv', delimiter='\t'))
  332. weighted_matrix = np.array(np.genfromtxt(position + '\\weighted_matrix.tsv', delimiter='\t'))
  333.  
  334. row_sum = binary_matrix.sum(axis=1)
  335. col_sum = binary_matrix.sum(axis=0)
  336.  
  337. root = Tk()
  338. root.title("Этап отбора тестов")
  339. root.geometry("%dx%d+%d+%d" % (400, 150, x_window - 100, y_window - 80))
  340. root.config(relief='sunken', bg='lavender')
  341.  
  342. Label(root, text="Этап №1.\n\nФормирование оптимального набора тестов", font="Vernada 14",
  343.       bg='lavender', fg="grey4").place(relx=.5, rely=.3, anchor=CENTER)
  344.  
  345. Button(text="Начать", command=_quit, width=6, height=1, bd=3, font="Vernada 14", bg="lavender",
  346.        fg="grey4").place(relx=.5, rely=.8, anchor=CENTER)
  347.  
  348. root.mainloop()
  349.  
  350. root = Tk()
  351. root.title("Определение коэффициентов")
  352. root.geometry("%dx%d+%d+%d" % (680, 320, x_window - 180, y_window - 100))
  353. root.config(relief='sunken', bg='lavender')
  354.  
  355. Label(root,
  356.       text="Необходимо задать значения коэффициентов α и β:\nα - коэффициент важности условия минимизации количества "
  357.            "тестов;\nβ - коэффициент важности условия максимизации степени соответствия теста качеству.\nПо умолчанию "
  358.            "коэффициенты имеют равную значимость.\nПри необходимости измените значения:", font="Vernada 12",
  359.       justify=LEFT, bg='lavender', fg="grey4").place(relx=.03, rely=.03, anchor="nw")
  360.  
  361. var_alpha = DoubleVar()
  362. var_betta = DoubleVar()
  363. var_alpha.set(0.5)
  364. var_betta.set(0.5)
  365.  
  366. Label(root, text="α =", font="Vernada 14", bg='lavender', fg="grey4").place(relx=.42, rely=.4,
  367.                                                                               anchor=CENTER)
  368. Entry(textvariable=var_alpha, width=6, font="Vernada 16", bg="white", fg="grey4").place(
  369.     relx=.52, rely=.4, anchor=CENTER)
  370.  
  371. Label(root, text="β =", font="Vernada 14", bg='lavender', fg="grey4").place(relx=.42, rely=.55,
  372.                                                                               anchor=CENTER)
  373. Entry(textvariable=var_betta, width=6, font="Vernada 16", bg="white", fg="grey4").place(
  374.     relx=.52, rely=.55, anchor=CENTER)
  375.  
  376. Label(root, text="Обратите внимание:\nα + β = 1", font="Vernada 14", bg='lavender',
  377.       fg="grey4").place(relx=.5, rely=.7, anchor=CENTER)
  378. Button(text="OK", command=remember_message, width=4, height=1, bd=3, font="Vernada 13",
  379.        bg="lavender", fg="grey4").place(relx=.5, rely=.87, anchor=CENTER)
  380.  
  381. root.mainloop()
  382.  
  383. if alpha + betta != 1:
  384.     root = Tk()
  385.     root.geometry("%dx%d+%d+%d" % (250, 120, x_window - 100, y_window - 50))
  386.     root.config(relief='sunken', bg='lavender')
  387.     root.title("Определение коэффициентов")
  388.  
  389.     Label(root, text="α+β != 1", font="Vernada 14", bg='lavender', fg="grey4").place(
  390.         relx=.5, rely=.2, anchor=CENTER)
  391.     Button(root, text="OK", command=_quit, width=4, height=1, bd=3, font="Vernada 13",
  392.            bg="lavender", fg="grey4").place(relx=.5, rely=.6, anchor=CENTER)
  393.  
  394.     root.mainloop()
  395.     sys.exit()
  396.  
  397. covered_rows = []
  398. empty_cols = []
  399. exact_cols = []
  400. sum_by_rows_binary_matrix = binary_matrix.sum(axis=1)
  401.  
  402. with open("test_numbers.txt", "r", encoding='utf-8') as fin:
  403.     test_numbers = [line.split('\t') for line in fin.read().split('\n')]
  404.  
  405. root = Tk()
  406. root.title("Полный список тестов")
  407. root.geometry("%dx%d+%d+%d" % (800, 670, x_window - 300, y_window - 270))
  408. root.config(relief='sunken', bg='lavender')
  409.  
  410. with open("test_numbers.txt", "r", encoding='utf-8') as fin:
  411.     text = Text(root, width=87, height=34, font="Vernada 13", bg='lavender', fg="grey4")
  412.     text.place(x=5, y=8)
  413.     text.insert('end', fin.read())
  414.  
  415. Button(root, text="OK", command=_quit, width=4, height=1, bd=3, font="Vernada 13", bg="lavender",
  416.        fg="grey4").place(relx=.5, rely=.95, anchor=CENTER)
  417.  
  418. root.mainloop()
  419.  
  420. with open(position + '/character_names.tsv', "r", encoding='utf-8') as fin:
  421.     character_names = [name.split('\t') for name in fin.read().split('\n')]
  422.  
  423. root = Tk()
  424. root.title("Важность оцениваемых личных качеств кандидатов")
  425. root.geometry("%dx%d+%d+%d" % (730, 700, x_window - 260, y_window - 290))
  426. root.config(relief='sunken', bg='lavender')
  427.  
  428. for i in range(4):
  429.     Label(root, text="", bg="lavender", fg="grey4", font="Vernada 10", justify=LEFT).grid(row=i, column=0,
  430.                                                                                             sticky=NW)
  431.  
  432. Label(root, text="Задайте веса важности общих критериев и частных критериев", bg="lavender", fg="grey4",
  433.       font="Vernada 11 bold", justify=LEFT).place(relx=.5, rely=.02, anchor=CENTER)
  434. Label(root, text="Сумма весов важности общих критериев должна быть равна 1", bg="lavender", fg="gray23",
  435.       font="Vernada 11 italic", justify=LEFT).place(relx=.0, rely=.05, anchor="nw")
  436. Label(root, text="Сумма весов важности частных критериев должна быть равна 1 в группировке до общего критерия",
  437.       bg="lavender", fg="gray23", font="Vernada 11 italic", justify=LEFT).place(relx=.0, rely=.08,
  438.                                                                                   anchor="nw")
  439. Label(root, text="Общий критерий", bg="lavender", fg="grey4", font="Vernada 11 bold", justify=LEFT).grid(
  440.     row=5, column=0, sticky=NW)
  441. Label(root, text="Частный критерий", bg="lavender", fg="grey4", font="Vernada 11 bold", justify=LEFT).grid(
  442.     row=5, column=2, sticky=NW)
  443.  
  444. for i in range(len(character_names)):
  445.     b_tmp = StringVar()
  446.     b_tmp.set(character_names[i][0])
  447.  
  448.     if character_names[i][0] != character_names[i - 1][0] and i != 0:
  449.         b = Label(root, textvariable=b_tmp, bg="lavender", fg="grey4", font="Vernada 11", justify=LEFT)
  450.     elif i == 0:
  451.         b = Label(root, textvariable=b_tmp, bg="lavender", fg="grey4", font="Vernada 11", justify=LEFT)
  452.     else:
  453.         b = Label(root, textvariable=StringVar(), bg="lavender", fg="grey4", font="Vernada 11", justify=LEFT)
  454.  
  455.     b.grid(row=i + 6, column=0, sticky=NW)
  456.  
  457. root.entries_ki = []
  458.  
  459. for i in range(len(character_names)):
  460.     b_tmp = StringVar()
  461.     b_tmp.set(character_names[i][1])
  462.  
  463.     if character_names[i][0] != character_names[i - 1][0] and i != 0:
  464.         b = Entry(root, textvariable=b_tmp, width=5, bg="white", fg="grey4", font="Vernada 11", justify=LEFT)
  465.         root.entries_ki.append(b)
  466.     elif i == 0:
  467.         b = Entry(root, textvariable=b_tmp, width=5, bg="white", fg="grey4", font="Vernada 11", justify=LEFT)
  468.         root.entries_ki.append(b)
  469.     else:
  470.         b = Label(root, textvariable=StringVar(), bg="lavender", fg="grey4", font="Vernada 11",
  471.                   justify=LEFT)
  472.  
  473.     b.grid(row=i + 6, column=1, sticky=NW)
  474.  
  475. for i in range(len(character_names)):
  476.     b_tmp = StringVar()
  477.     b_tmp.set(character_names[i][2])
  478.     b = Label(root, textvariable=b_tmp, bg="lavender", fg="grey4", font="Vernada 11", justify=LEFT)
  479.     b.grid(row=i + 6, column=2, sticky=NW)
  480.  
  481. root.entries_kij = []
  482.  
  483. for i in range(len(character_names)):
  484.     b_tmp = StringVar()
  485.     b_tmp.set(character_names[i][4])
  486.     b = Entry(root, textvariable=b_tmp, width=5, bg="white", fg="grey4", font="Vernada 11", justify=LEFT)
  487.     root.entries_kij.append(b)
  488.     b.grid(row=i + 6, column=3, sticky=NW)
  489.  
  490. Button(root, text="Сохранить", command=remember_k, bd=3, font="Vernada 11", bg="lavender",
  491.        fg="grey4").grid(row=len(character_names) + 7, column=2, sticky=S)
  492.  
  493. root.mainloop()
  494.  
  495. root = Tk()
  496. root.geometry("%dx%d+%d+%d" % (1350, 510, x_window - 580, y_window - 250))
  497. root.config(relief='sunken', bg='lavender')
  498. root.title("Степени соответствия тестов качествам")
  499.  
  500. for i in range(weighted_matrix.shape[1]):
  501.     b_tmp = IntVar()
  502.     b_tmp.set(i+1)
  503.     b = Entry(root, width=5, textvariable=b_tmp, bg="gainsboro", fg="grey4", font="Vernada 9 bold")
  504.     b.grid(row=0, column=i+1)
  505.  
  506. for i in range(len(character_names)):
  507.     b_tmp = StringVar()
  508.     b_tmp.set(character_names[i][3])
  509.     b = Entry(root, width=12, textvariable=b_tmp, bg="gainsboro", fg="grey4", font="Vernada 9 bold")
  510.     b.grid(row=i+1, column=0)
  511.  
  512. root.entries = []
  513.  
  514. for i in range(weighted_matrix.shape[0]):
  515.     for j in range(weighted_matrix.shape[1]):
  516.         b_tmp = DoubleVar()
  517.         b_tmp.set(weighted_matrix[i, j])
  518.         b = Entry(root, width=5, textvariable=b_tmp, bg='thistle' + str(math.floor(weighted_matrix[i, j]*4 + 1)),
  519.                   font="Vernada 9")
  520.         b.grid(row=i+1, column=j+1)
  521.         root.entries.append(b)
  522.  
  523. Button(root, text="Сохранить", command=remember_matrix_weights, bd=3, font="Vernada 11", bg="lavender",
  524.        fg="grey4").grid(row=weighted_matrix.shape[0] + 1, column=0)
  525.  
  526. root.mainloop()
  527.  
  528. exact_sol_binary = np.zeros(binary_matrix.shape, dtype=np.int64)
  529.  
  530. for i in range(row_sum.shape[0]):
  531.     if row_sum[i] == 0:
  532.         print('Решения нет')
  533.         sys.exit()
  534.  
  535.     if row_sum[i] == 1:
  536.         for j in range(binary_matrix.shape[1]):
  537.             if binary_matrix[i, j] == 1 and j not in exact_cols:
  538.                 exact_cols.append(j)
  539.  
  540.                 for k in range(binary_matrix.shape[0]):
  541.                     if binary_matrix[k, j] == 1 and k not in covered_rows:
  542.                         covered_rows.append(k)
  543.  
  544. size_exact_sol = [binary_matrix.shape[0], len(exact_cols)]
  545.  
  546. appr_sol_binary = binary_matrix.copy()
  547. appr_sol_weighted = weighted_matrix.copy()
  548.  
  549. for i in range(binary_matrix.shape[0]):
  550.     if i in covered_rows:
  551.         for j in range(binary_matrix.shape[1]):
  552.             appr_sol_binary[i, j] = 0
  553.  
  554. for j in range(binary_matrix.shape[1]):
  555.     if j in exact_cols:
  556.         for i in range(binary_matrix.shape[0]):
  557.             appr_sol_binary[i, j] = 0
  558.  
  559. for i in range(weighted_matrix.shape[0]):
  560.     if i in covered_rows:
  561.         for j in range(weighted_matrix.shape[1]):
  562.             appr_sol_weighted[i, j] = 0
  563.  
  564. for j in range(weighted_matrix.shape[1]):
  565.     if j in exact_cols:
  566.         for i in range(weighted_matrix.shape[0]):
  567.             appr_sol_weighted[i, j] = 0
  568.  
  569. SumInStrAppr = appr_sol_binary.sum(axis=1)
  570. redundant_rows = []
  571.  
  572. for i in range(len(SumInStrAppr)):
  573.     if SumInStrAppr[i] == 0:
  574.         redundant_rows.append(i)
  575.  
  576. appr_sol_binary = np.delete(appr_sol_binary, redundant_rows, axis=0)
  577. appr_sol_weighted = np.delete(appr_sol_weighted, redundant_rows, axis=0)
  578.  
  579. # 3.Решение
  580. alpha_j = weighted_matrix.sum(axis=0)
  581. weights_j = -alpha + betta * alpha_j
  582.  
  583. ind_mass = []
  584. mark_mass = []
  585.  
  586. L1 = 0
  587. L0 = -1
  588.  
  589. exact_sol_v2_tmp = []
  590. exact_sol_v2 = []
  591. exact_sol = []
  592. cov_str_v2 = []
  593.  
  594. tmp_pow = np.zeros([2, appr_sol_binary.shape[1]])
  595. pow_col = np.zeros([2, appr_sol_binary.shape[1]])
  596.  
  597. rev = 0
  598. tmp_sum_pow = 0
  599. cov_str_v2_tmp = []
  600. pow_str = appr_sol_binary.sum(axis=1)
  601.  
  602. while (len(ind_mass) > 0 or rev == 0) and len(cov_str_v2) < appr_sol_binary.shape[0]:
  603.     if len(exact_sol_v2_tmp) == len(mark_mass) or rev == 0:
  604.         if rev > 0:
  605.             del_ind = mark_mass[-1]
  606.  
  607.             for i in range(appr_sol_binary.shape[0]):
  608.                 if appr_sol_binary[i, del_ind] == 1 and i in cov_str_v2_tmp:
  609.                     cov_str_v2_tmp.remove(i)
  610.  
  611.             if len(mark_mass) > 0:
  612.                 mark_mass.pop()
  613.             L1 = L1_func(appr_sol_binary, mark_mass, cov_str_v2_tmp, ind_mass)
  614.  
  615.         if L1 > L0:
  616.             cov_str_v2.clear()
  617.  
  618.             while len(cov_str_v2) < appr_sol_binary.shape[0]:
  619.  
  620.                 if L1 > L0:
  621.                     pow_col = recount_pow(ind_mass, cov_str_v2)
  622.  
  623.                     for j in range(appr_sol_binary.shape[1]):
  624.                         if (pow_col[1, j]) == max(pow_col[1]):
  625.                             ind_mass.append(j)
  626.                             mark_mass.append(j)
  627.                             exact_sol_v2.append(j)
  628.                             exact_sol_v2_tmp.append(j)
  629.  
  630.                             for i in range(appr_sol_binary.shape[0]):
  631.                                 if appr_sol_binary[i, j] == 1 and i not in cov_str_v2 and i not in cov_str_v2_tmp:
  632.                                     cov_str_v2.append(i)
  633.                                     cov_str_v2_tmp.append(i)
  634.  
  635.                     L1 = L1_func(appr_sol_binary, mark_mass, cov_str_v2, ind_mass)
  636.                     rev += 1
  637.                 else:
  638.                     break
  639.             L0 = L1
  640.  
  641.     else:
  642.         ind_mass.pop()
  643.         exact_sol_v2_tmp.pop()
  644.  
  645. exact_col_all = exact_cols + exact_sol_v2
  646. exact_test_names = []
  647.  
  648. for i in range(len(test_numbers)):
  649.     if int(test_numbers[i][0]) - 1 in sorted(exact_col_all):
  650.         exact_test_names.append(test_numbers[i][1])
  651.  
  652. with open('exact_test_names.txt', 'w', encoding='utf-8') as fout:
  653.     for i in range(len(exact_test_names)):
  654.         fout.write(exact_test_names[i])
  655.         fout.write('\n')
  656.  
  657. root = Tk()
  658. root.title("Оптимальный список тестов")
  659. root.geometry("%dx%d+%d+%d" % (800, 290, x_window - 300, y_window - 100))
  660. root.config(relief='sunken', bg='lavender')
  661.  
  662. with open("exact_test_names.txt", "r", encoding='utf-8') as fin:
  663.     text = Text(root, width=70, height=12, font="Vernada 14", bg='lavender', fg="grey4")
  664.     text.place(x=10, y=10)
  665.     text.insert('end', fin.read())
  666.  
  667. b_tmp = StringVar()
  668. b_tmp.set(str(round(L1, 1)))
  669.  
  670. Label(root, text="Оценка =", bg="lavender", fg="grey4", font="Vernada 11 bold").place(relx=.48, rely=.75,
  671.                                                                                         anchor=CENTER)
  672. Label(root, textvariable=b_tmp, bg="lavender", fg="grey4", font="Vernada 11 bold").place(relx=.55, rely=.75,
  673.                                                                                            anchor=CENTER)
  674. Button(root, text="OK", command=_quit, width=4, height=1, bd=3, font="Vernada 13", bg="lavender",
  675.        fg="grey4").place(relx=.5, rely=.85, anchor=CENTER)
  676.  
  677. root.mainloop()
  678.  
  679. print('Номера тестов, входящих в оптимальное решение:')
  680. print(sorted(exact_col_all))
  681.  
  682. class Fuzzy:
  683.     a = 0
  684.     b = 0
  685.     c = 0
  686.     d = 0
  687.  
  688.     def __init__(self, a, b, c, d):
  689.         self.a = a
  690.         self.b = b
  691.         self.c = c
  692.         self.d = d
  693.  
  694.     def print(self):
  695.         print(self.a, " ", self.b, " ", self.c, " ", self.d)
  696.  
  697.     def isNull(self):
  698.         return (self.a == 0) and (self.b == 0) and (self.c == 0) and (self.d == 0)
  699.  
  700. root = Tk()
  701. root.title("Этап оценки кандидатов")
  702. root.geometry("%dx%d+%d+%d" % (400, 150, x_window - 100, y_window - 80))
  703. root.config(relief=FLAT, bg='lavender')
  704.  
  705. Label(root, text="Этап №2.\n\nОценка кандидатов", font="Vernada 14", bg='lavender',
  706.       fg="gray4").place(relx=.5, rely=.3, anchor=CENTER)
  707. Button(text="Начать", command=_quit, width=6, height=1, bd=3, font="Vernada 14", bg="gainsboro",
  708.        fg="gray4").place(relx=.5, rely=.8, anchor=CENTER)
  709.  
  710. root.mainloop()
  711.  
  712. bin_matr = np.genfromtxt(position + '\\binary_matrix.tsv', delimiter='\t')
  713. w_matr = np.genfromtxt(position + '\\weighted_matrix.tsv', delimiter='\t')
  714.  
  715. bin_matr_mass = np.array(bin_matr)
  716. w_matr_mass = np.array(w_matr)
  717. charact_w_mass = np.zeros(len(character_names))
  718.  
  719. for i in range(len(character_names)):
  720.     charact_w_mass[i] = character_names[i][1] * character_names[i][4]
  721.  
  722. weight_tests = np.zeros(w_matr_mass.shape)
  723.  
  724. for i in range(w_matr_mass.shape[0]):
  725.     for j in range(w_matr_mass.shape[1]):
  726.         if j in exact_col_all:
  727.             weight_tests[i, j] = w_matr_mass[i, j]
  728.  
  729. SumInStrWT = weight_tests.sum(axis=1)
  730. CountInStrWT = np.zeros(w_matr_mass.shape[0])
  731.  
  732. for i in range(weight_tests.shape[0]):
  733.     for j in range(weight_tests.shape[1]):
  734.         weight_tests[i, j] = weight_tests[i, j] / SumInStrWT[i]
  735.         if weight_tests[i, j] > 0:
  736.             CountInStrWT[i] += 1
  737.  
  738. with open('weight_tests.txt', 'w') as fout:
  739.     for i in range(weight_tests.shape[0]):
  740.         for j in range(weight_tests.shape[1]):
  741.             if j in exact_col_all:
  742.                 fout.write(str(round(weight_tests[i, j], 2)))
  743.                 fout.write('\t')
  744.         fout.write('\n')
  745.  
  746.  
  747. root = Tk()
  748. root.title("Выбор кандидата для оценивания")
  749. root.geometry("%dx%d+%d+%d" % (500, 150, x_window - 170, y_window - 70))
  750. root.config(relief='sunken', bg='lavender')
  751.  
  752. Label(root, text="Введите номер кандидата,\n для которого необходимо сформировать оценку",
  753.       font="Vernada 14", bg='lavender', fg="gray4").place(relx=.5, rely=.3, anchor=CENTER)
  754.  
  755. cand_num = StringVar()
  756. cand_num.set(str(1))
  757.  
  758. Entry(root, textvariable=cand_num, width=5, bg="white", fg="gray4", font="Vernada 11",
  759.       justify=CENTER).place(relx=.5, rely=.5, anchor=CENTER)
  760. Button(text="OK", command=_quit, width=6, height=1, bd=3, font="Vernada 14", bg="gainsboro",
  761.        fg="gray4").place(relx=.5, rely=.8, anchor=CENTER)
  762.  
  763. root.mainloop()
  764.  
  765. with open(position + '\\candidates\\Trap_numb_x' + cand_num.get() + '.tsv') as fin:
  766.     rows = fin.readlines()
  767.  
  768. strMass_spl = [row.split('\t') for row in rows]
  769.  
  770. strMass_spl_exact = []
  771.  
  772. for i in range(len(strMass_spl)):
  773.     arr = [strMass_spl[i][j] for j in range(len(strMass_spl[i])) if j in exact_col_all]
  774.     strMass_spl_exact.append(arr)
  775.  
  776. strMass_spl_exact_ling = []
  777. for i in range(len(strMass_spl_exact)):
  778.     strMass_spl_exact_ling.append([])
  779.  
  780.     for j in range(len(strMass_spl_exact[i])):
  781.         if strMass_spl_exact[i][j] == '0,0,0,0':
  782.             strMass_spl_exact_ling[i].append('-')
  783.         if strMass_spl_exact[i][j] == '0,0,1,2':
  784.             strMass_spl_exact_ling[i].append('слишком слабо')
  785.         if strMass_spl_exact[i][j] == '1,2,2,3':
  786.             strMass_spl_exact_ling[i].append('слабо')
  787.         if strMass_spl_exact[i][j] == '2,3,4,5':
  788.             strMass_spl_exact_ling[i].append('немного слабо')
  789.         if strMass_spl_exact[i][j] == '4,5,5,6':
  790.             strMass_spl_exact_ling[i].append('удовлетворительно')
  791.         if strMass_spl_exact[i][j] == '5,6,7,8':
  792.             strMass_spl_exact_ling[i].append('не очень хорошо')
  793.         if strMass_spl_exact[i][j] == '7,8,8,9':
  794.             strMass_spl_exact_ling[i].append('хорошо')
  795.         if strMass_spl_exact[i][j] == '8,9,10,10':
  796.             strMass_spl_exact_ling[i].append('очень хорошо')
  797.  
  798. root = Tk()
  799. root.title("Оценки кандидатов по отобранным тестам")
  800. root.geometry("%dx%d+%d+%d" % (750, 520, x_window - 300, y_window - 200))
  801. root.config(relief='sunken', bg='lavender')
  802.  
  803. for i in range(len(exact_col_all)):
  804.     b_tmp = IntVar()
  805.     b_tmp.set(exact_col_all[i]+1)
  806.     b = Entry(root, width=10, textvariable=b_tmp, bg="gainsboro", fg="gray4", font="Vernada 9 bold")
  807.     b.grid(row=0, column=i+1)
  808.  
  809. for i in range(len(character_names)):
  810.     b_tmp = StringVar()
  811.     b_tmp.set(character_names[i][3])
  812.     b = Entry(root, width=12, textvariable=b_tmp, bg="gainsboro", fg="gray4", font="Vernada 9 bold")
  813.     b.grid(row=i+1, column=0)
  814.  
  815. for i in range(len(strMass_spl_exact)):
  816.     for j in range(len(strMass_spl_exact[i])):
  817.         b_tmp = StringVar()
  818.         b_tmp.set(strMass_spl_exact[i][j])
  819.         b = Entry(root, width=10, textvariable=b_tmp, font="Vernada 9")
  820.         b.grid(row=i+1, column=j+1)
  821.  
  822. Button(text="OK", command=_quit, bd=3, font="Vernada 12", bg="gainsboro", fg="gray4").grid(
  823.     row=len(strMass_spl_exact) + 2, column=round(len(strMass_spl_exact[0]) / 2), sticky="s")
  824.  
  825. root.mainloop()
  826.  
  827. root = Tk()
  828. root.title("Оценки кандидатов по отобранным тестам (лингвистические значения)")
  829. root.geometry("%dx%d+%d+%d" % (1300, 520, x_window - 550, y_window - 200))
  830. root.config(relief=RIDGE, bg='lavender')
  831.  
  832. for i in range(len(exact_col_all)):
  833.     b_tmp = IntVar()
  834.     b_tmp.set(exact_col_all[i] + 1)
  835.     b = Entry(root, width=18, textvariable=b_tmp, bg="gainsboro", fg="gray4", font="Vernada 9 bold")
  836.     b.grid(row=0, column=i+1)
  837.  
  838. for i in range(len(character_names)):
  839.     b_tmp = StringVar()
  840.     b_tmp.set(character_names[i][3])
  841.     b = Entry(root, width=12, textvariable=b_tmp, bg="gainsboro", fg="gray4", font="Vernada 9 bold")
  842.     b.grid(row=i+1, column=0)
  843.  
  844. for i in range(len(strMass_spl_exact_ling)):
  845.     for j in range(len(strMass_spl_exact_ling[i])):
  846.         b_tmp = StringVar()
  847.         b_tmp.set(strMass_spl_exact_ling[i][j])
  848.         b = Entry(root, width=18, textvariable=b_tmp, font="Vernada 9")
  849.         b.grid(row=i+1, column=j +1)
  850.  
  851. Button(text="OK", command=_quit, bd=3, font="Vernada 12", bg="gainsboro", fg="gray4").grid(
  852.     row=len(strMass_spl_exact) + 2, column=round(len(strMass_spl_exact[0]) / 2), sticky="s")
  853.  
  854. root.mainloop()
Add Comment
Please, Sign In to add comment