Skip to content

Дерево задач

Vad Drobinin edited this page Aug 15, 2015 · 2 revisions

Дерево задач

Выглядит примерно так

Дерево задач - это граф, который показывает, какие задачи являются похожими.

Поиск похожих задач

Похожие задачи ищется при помощи класса SimilarProblemsFinder (#205). Ему передаётся массив задач, и он возвращает список упорядоченных пар похожих задач (первой в паре идёт та задача, которая идёт раньше в списке задач). Также он может вернуть "похожесть" двух задач (число от 0 до 1) и количество одинаковых тестов. Задачи считаются похожими, если их "похожесть" не меньше 0.5.

Далее строится дерево задач (#236) - класс, который для каждой задачи находит наиболее похожую на неё из предыдущих. Он может по задаче вернуть наиболее похожую на неё, а также их "похожесть" и количество одинаковых тестов (#304).

Рисование дерева задач

Рисование производится при помощи класса Image (#258). Используется библиотека PIL.

Класс TreeDrawer (#256) принимает ProblemsTree и создаёт изображение дерева задач. Его можно сохранить в файл.

Алгоритм рисования

  • Задачи размещаются на изображении
  • Метод _locate_problems должен создать словарь self.problem_coords (по задач -её координаты) и массив пар self.problems_and_coords, содержащий ту же инфоормацию.
  • Сейчас задачи располагаются по контестам, контесты сверху вниз.
  • Нужно будет расположить задачи по-другому: группировка по контестам, параллелям, сменам. Нужно будет получать откуда-нибудь (из конфига?) информацию о контестах, сменах, параллелях, и передавать их в TreeDrawer (#305).
  • Линии размещаются на изображении
  • Метод _locate_lines должен создать список self.lines, содержащий для каждой линии массив последовательных точек.
  • Для размещения линии используется следующий алгоритм: текущая точка двигается по плоскости, существует сила притяжения к цели и сила отталкивания от задач и от других линий (но пересечения допустимы).
  • Нужно добавить стрелочки на концах и реализовать разные цвета линий: зелёным цветом - для одинаковых задач, шкала от жёлтого до красного - понижение "похожести" (#306).
  • Затем вызывается _draw_tree, который рисует дерево по массивам, которые были созданы методами _locate_problems и locate_lines.
  • Нужно дописать метод _draw_problem, который рисует задачу: добавить название задачи и контеста, цвет в зависимости от "похожести" на родительскую задачу, информацию о родительскй задаче, количество тестов (#307).