Materials for the practicum for "Fundamentals of Algorithms" course at SpbU
Set up your environment
Go to Run and Debug
in the left panel, create a new launch file, select Python File
and add the following field:
"env": {
"PYTHONPATH": "${workspaceFolder}${pathSeparator}${env:PYTHONPATH}"
}
Изучение python
, numpy
и matplotlib
, необходимых для дальнейшей работы. Предполагается, что студент имеет базовые знания python.
План:
- Выполнить
intro_to_numpy_and_matplotlib.ipynb
Начало работы с графовыми и графовыми алгоритмами с помощью networkx
.
План:
- Выполнить
intro_to_networkx.ipynb
Домашнее задание (базовый вариант):
- Проверка на наличие циклов в ненаправленном графе:
practicum_2/homework/basic/cycles_in_undirected_graph.py
. Необходимо реализовать функциюhas_cycles
, которая принимает на вход объект графа и возвращает булевское значение, принимающее true при наличии цикла в графе. Предполагается, что, придя в узел n через ребро e в ненаправленном графе, мы можем пойти далее по любому ребру узла n, кроме e.
Домашнее задание (продвинутый вариант):
- Проверка на наличие циклов в направленном графе:
practicum_2/homework/advanced/cycles_in_directed_graph.py
. Необходимо реализовать функциюhas_cycles
, которая принимает на вход объект графа и возвращает булевское значение, принимающее true при наличии цикла в графе. Предполагается, что, придя в узел n через ребро e в направленном графе, мы можем пойти далее по любому исходящему ребру узла n.
Дедлайн: 2024.04.06
Изучение классических графовых алгоритмов: BFS, DFS, алгоритма Прима для нахождения MST и алгоритма Дейкстры для нахождения кратчайших путей в графе.
План:
- Реализовать рекурсивный DFS в функции
dfs_recursive
, итерационный DFS в функцииdfs_iterative
и топологическую сортировку в функцииdfs_recursive_postorder
в файлеdfs.py
. - Реализовать алгоритм Прима в функции
prim_mst
в файлеmst.py
. - Реализовать базовый алгоритм Дейкстры в функции
dijkstra_sp
и ускорить его с помощью очереди с приоритетом в функцииdijkstra_sp_with_priority_queue
в файлеsp.py
.
Домашнее задание (базовый вариант):
- Поиск пути в лабиринте:
practicum_3/homework/basic/bfs_maze.py
. Необходимо реализовать методMaze.solve
, который ищет путь в лабиринте. Лабиринт хранится в файлеpracticum_3/homework/basic/maze_2.txt
, где символ#
обозначает стену, аO
иX
вход и выход соответственно. Цель - построить путь отO
кX
. Под путем подразумевается последовательность символовL
(шаг влево),R
(шаг вправо),U
(шаг вверх),D
(шаг вниз). НапримерLLDLLDDR
. - Проверка на корректность раскрытия скобок:
practicum_3/homework/basic/valid_parentheses.py
. Необходимо реализовать класс LIFO очередиStack
и затем реализовать функциюare_parentheses_valid
, которая проверяет, содержит ли строка, переданная на вход и состоящая только из скобок(
,)
,[
,]
,{
,}
, корректно закрывающиеся/открывающиеся скобки. В файлеpracticum_3/homework/basic/valid_parentheses_cases.yaml
содержатся корректные и некорректные примеры таких строк.
Домашнее задание (продвинутый вариант):
- Нахождение максимального потока в транспортной сети:
practicum_3/homework/advanced/max_flow.py
. Необходимо реализовать функциюmax_flow
, которая принимает на вход объект направленного взвешенного графа (транспортной сети) и возвращает значение максимального потока. Существует множество методов решения этой задачи, так что требуется найти наиболее быстрый метод из доступных.
Дедлайн: 2024.04.20
Решение задач на графах с помощью линейного программирования.
План:
- Изучить представление графовых задач в виде задач линейного программирования.
- Поставить задачу линейного программирования в файле
practicum_4/sp_via_lp.py
для нахождения кратчайшего пути в графе и решить ее с помощьюscipy.optimize.linprog
.
Решение задач на графах с помощью метаэвристических алгоритмов.
План:
- Изучить постановку задачи раскраски графов.
- Изучить алгоритм Hill Climbing.
- Реализовать случайный поиск и Hill Climbing в файле
practicum_5/graph_coloring.py
.
Домашнее задание (базовый вариант):
- Обход бинарного дерева зигзагом:
practicum_5/homework/basic/binary_tree_zigzag_level_order_traversal.py
. Необходимо реализовать функциюbuild_tree
, строящую деревоBinaryTree
из списка, где узлы перечислены по слоям слева направо (см. пример). Далее необходимо реализовать методBinaryTree.zigzag_level_order_traversal
, выполняющий обход зигзагом и возвращающий двумерный список, где первая размерность соответствует глубине дерева, а вторая - узлам на этой глубине. Под зигзагом подразумевается обход слева направо на нулевом уровне (корень), затем справа налево на первом уровне и так далее.
Домашнее задание (продвинутый вариант):
- Раскраска графа с помощью имитации отжига:
practicum_5/homework/advanced/simulated_annealing.py
. Имитация отжига требует реализации двух объектов: оператора генерации новой точки (tweak) и расписания понижения температуры. Оба объекта реализуются по вашему усмотрению. Цель состоит в нахождении наилучшего решения (с точки зрения ожидаемой скорости сходимости к наименьшему количеству конфликтов) для произвольных графов Эрдеша-Реньи со 100 узлами и$p \ll 1$ .
Дедлайн: 2024.04.27
Разбор проблем вычислительной неустойчивости. Изучение прямых методов решения СЛАУ (метод Гаусса, LU-разложение, разложение Холецкого).
План:
- Изучить примеры вычислительной неустойчивости для вычисления корней квадртичного уравнения и значений полинома.
- Реализовать устойчивые схемы вычислений в файле
practicum_6/numerical_stability.py
. - Реализовать LU-разложение в файле
practicum_6/lu.py
.
Домашнее задание (базовый вариант):
- Разложение Холецкого:
practicum_6/homework/basic/cholesky.py
. Необходимо реализовать функциюcholesky
, возвращающую нижнюю треугольную матрицу, и убедиться, что разложение Холецкого работает корректно, то есть перемножениеL @ L.T
дает исходную матрицу.
Домашнее задание (продвинутый вариант):
- LU-разложение для реальных матриц:
practicum_6/homework/advanced/lu.py
. Необходимо наиболее эффективным образом реализовать функцииlu
иsolve
и протестировать их работоспособность на ряде матриц, взятых из практических задач, связанных с химической кинетикой, упругостью, гидродинамикой, экономикой и т.д. Под эффективностью LU-разложения подразумевается одновременно и скорость работы, и вычислительная точность разложения, выраженная в точности решения СЛАУ с произвольным векторомb
. Точность решения СЛАУ оценивается относительно LU-разложения, реализованного вscipy
. Скорость работы и точность решения СЛАУ выводятся на экран автоматически. Тестовые матрицы можно скачать здесь: https://drive.google.com/file/d/1VQClvicVQdw0hQgCDzckYu3pAKB7yzCH/view?usp=sharing . Их следует разместить в директорииpracticum_6/homework/advanced/matrices
. Справочная информация о матрицах находится в файлеpracticum_6/homework/advanced/matrix_details.md
. Для более эффективного LU-разложения вы можете использовать внешнюю информацию о матрице (например, степень ее разреженности и факт симметричности).
Дедлайн: 2024.05.04
Изучение прямых и итерационных методов нахождения собственных чисел и собственных векторов квадратных матриц.
План:
- Реализовать power method в файле
practicum_7/power_method.py
. - Реализовать QR и поиск собственных числе с его помощью в файле
practicum_7/qr.py
. - Реализовать итерацию Арнольди в файле
practicum_7/arnoldi.py
.
Домашнее задание (базовый вариант):
- Inverse power method для нахождения наименьшего по модулю собственного числа:
practicum_7/homework/basic/inverse_power_method.py
. Необходимо реализовать power method и воспользоваться им для нахождения наименьшего по модулю собственного числа. Для этого достаточно рассмотреть обратную матрицу.
Домашнее задание (продвинутый вариант):
- Нахождения всех собственных чисел произвольных матриц:
practicum_7/homework/advanced/all_eigenvalues.py
. Необходимо реализовать эффективный с точки зрения времени и точности алгоритм, возвращающий все собственные числа матрицы. Возможна реализация мета-алгоритма, который выбирает наиболее подходящий базовый алгоритм (power method, Arnoldi, Lanczos), исходя из свойств матрицы. Следует протестировать полученный алгоритм на тестовых матрицах из предыдущей практики.
Дедлайн: 2024.05.18
Изучение итерационных методов решения СЛАУ (методы Якоби и Гаусса-Зейделя, метод сопряженных градиентов) и итерационное улучшение.
План:
- Реализовать метод Якоби, метод Гаусса-Зейделя и метод релаксации в файле
practicum_8/fixed_point_iteration.py
. - Реализовать метод сопряженных градиентов и его предобусловленную версию в файле
practicum_8/conjugate_gradient_method.py
. - Реализовать итерационное улучшение в файле
practicum_8/iterative_refinement.py
.
Изучение приложений численной линейной алгебры (МНК, устойчивость линейных систем, задача упругости).
План:
- ХХХ.
- ХХХ.
- ХХХ.