
- •Конспект лекций
- •Лекция 1. Множества и алгебра логики
- •1.1. Основные определения
- •1.2. Операции над множествами
- •1.3. Свойства операций
- •1.4. Декартово произведение множеств
- •1.5 Основные определения алгебры логики
- •1.6 Простейшие функции
- •1.7 Дизъюнктивные нормальные формы
- •1.8 Минимизация функций в классе днф
- •1.9 Минимизация функций. Метод минимизации по картам Карно
- •1.10 Функциональная полнота.
- •Лекция 2. Графы
- •2.1. Основные определения
- •2.2. Частичный граф
- •2.3. Неориентированные графы
- •2.4. Расширения модели
- •2.5. Оптимизационные задачи на графах
- •2.5.1. Поиск путей в графе
- •2.5.1.1. Кратчайшие пути
- •2.5.1.2. Нахождение максимального пути
- •3.5.1.3. Циклы Эйлера
- •2.5.6. Поток в транспортной сети
- •2.5.7. Транспортная задача
2.5. Оптимизационные задачи на графах
Большое количество практических задач формулируются как задачи поиска фрагментов графа или каких-то его характеристик, причем существует множество вариантов решения. Каждое решение оценивается числом, и среди множества решений нужно найти такое, для которого оценка имеет экстремальное значение - минимальное или максимальное. Чаще всего в качестве оценок используется сумма весов дуг или ребер, входящих в решение, - тогда оценка называется аддитивной, или произведение весов - тогда говорят омультипликативнойоценке. Наиболее часто ограничиваются случаем, когда веса дуг являются неотрицательными целыми числами.
2.5.1. Поиск путей в графе
Пусть в графе заданы две вершины aн и aк, названные соответственно начальной и конечной. Выделим несколько задач, связанных с поиском путей в графе:
- найти путь между начальной и конечной вершиной. Эта задача называется задачей поиска пути в лабиринте;
- найти минимальный путь между заданными вершинами;
- найти максимальный путь;
- найти цикл Эйлера.
2.5.1.1. Кратчайшие пути
Рассмотрим задачу поиска минимального пути между двумя заданными вершинами aн и aк в графе при условии, что каждой дуге (i,j) сопоставлен вес ci,j-неотрицательное число и оценка аддитивна. Если веса обозначают длину дуги, то задача формулируется как задача нахождения кратчайшего пути между заданными вершинами.
Рассмотрим классический алгоритм решения этой задачи - алгоритм Дейкстры, в основе которого лежит следующий
тезис Дейкстры: если кратчайший путь проходит через вершину ai, то длина части пути от aн до ai должна быть минимально возможной.
Алгоритм представим следующей последовательностью шагов.
1. Начальные присваивания. Каждой вершине, кроме начальной, сопоставим вес l(ai), равный бесконечности, назовем этот вес временным. Начальной вершине сопоставим вес, равный нулю: l(aн)=0, назовем этот вес постоянным, вершину aн назовем текущей и обозначим как p .
2. Обновление весов. Всем вершинам, связанным с текущей по исходящим дугам и имеющим временные веса, изменим веса по правилу l(аi)=min(l(аi), l(p)+сp,j)
3. Смена текущей вершины. Среди вершин с временной оценкой найдем вершину с минимальным весом и назовем ее текущей, а ее вес - постоянным. Если это есть вершина aк, то перейдем к пункту 4, иначе - к пункту 2.
Пример. Заданный граф приведен на рис. 2.4. Ход решения представим таблицей 2.2.
Выполняя шаг 4 алгоритма, выделим путь 12-9-6-3-2-1. Но существует еще один путь той же длины-12-9-8-5-4-1, так как для вершины 9 имеем два одинаковых по длине пути к началу, проходящих через вершины 8 и 6.
Легко видеть, что решением задачи по алгоритму Дейкстры всегда будет путь минимальной длины.