- •Содержание
- •Введение
- •1.1.4 Матрица весов двудольного графа:
- •1.1.5 Описание графа k1,2 матрицей смежности (вершина-верниша):
- •1.1.6 Степени вершин двудольного графа
- •1.5.2 Задача о назначениях с максимизацией потерь
- •2. Постановка задачи на программирование
- •2.2.2. Организация объекта
- •2.3. Интерфейс программы
1.1.4 Матрица весов двудольного графа:
Двудольный граф, так же, как и обычный, можно представить матрицей весов:
-
1
2
3
4
A
3
5
∞
7
B
2
2
1
∞
C
8
4
4
7
D
∞
∞
5
∞
1.1.5 Описание графа k1,2 матрицей смежности (вершина-верниша):
-
1
2
3
4
A
1
1
1
∞
B
1
1
∞
1
C
1
1
1
1
D
∞
∞
1
1
1.1.6 Степени вершин двудольного графа
Степени вершин рассматриваемого графа приведены в табл.1.1
Таблица 1.1 Степенная последовательность вершин графа G
-
Вершины
1
2
3
4
A
B
C
D
Степени
3
3
3
2
3
3
4
1
Выбираем из таблицы наибольшую и наименьшую степени:
Dmax = 4, Dmin = 1.
Примечание. Степенью вершины неориентированного графа называется количество ребер, инцидентных данной вершине.
1.2 Эйлеров путь и Эйлеров цикл на графе
1.2.1 Для определения Эйлерова путь требуется выписать степенную последовательность вершин графа G и указать в графе G Эйлеров путь. Если такового пути не существует, то в графе G добавить наименьшее число ребер таким образом, чтобы в новом графе можно было указать Эйлерову цепь.
Степенная последовательность вершин графа G:
(3, 3, 3, 2, 3, 3, 4, 1)
Для существования Эйлерова пути допустимо только две вершины с нечетными степенями, в данном случае таких вершин 6 – две пары из этих трех надо соединить. Это можно сделать двумя способами (мал допустимый набор ребер от доли к доле). Полученные графы показаны на рис.1.3, a и b:
a)
Полученный Эйлеров путь: 1,A,2,B,3,C,4,A,3,D,1,C,2.
b)
Полученный Эйлеров путь: 1,A,2,B,3,C,4,A,3,D,2,C,1,B.
Рисунок 1.3 Варианты добавления ребер в граф для получения Эйлерова пути
1.2.2 Эйлеров цикл
Эйлеров цикл позволяет обойти граф, проходя по каждому ребру только один раз. Незадействованных ребер быть не должно. Если такого цикла не существует, то в графе G добавить наименьшее число ребер таким образом, чтобы в новом графе можно было указать Эйлеров цикл.
Из-за ограничений двудольности минимальности добавление будет состоять из 4 (четырех!) ребер, превращая этот граф в полносвязный (в литературе такие двудольные графы еще именуют веерами или звездами), рис.1.4:
Рисунок 1.4 Эйлеров путь на графе после добавления ребер
1.3 Поиск остовного (остевого) дерева алгоритмом Прима-Краскала
Выписываем таблицу весов ребер, упорядоченную по убыванию, табл.1.2.
Таблица 1.2 Веса ребер графа K1,2
-
Вес
Ребра
1
(3,B)
2
(1,B), (2,B)
3
(1,A)
4
(2,C), (3,C)
5
(2,A), (3,D)
7
(4,A), (4,C)
8
(1,C)
Последовательность шагов по решению задачи Прима-Краскла:
1) выбираем ребро (3,B), окрашиваем вершины V3 и VB в красный цвет;
2) выбираем ребро (1,B), вершина VB красная, V1 пока бесцветна, окрашиваем V1 в красный цвет;
3) следующим выбираем ребро (2,B), вершина VB красная, V2 - бесцветная, следовательно, заливаем V2 красным цветом;
4) выбираем ребро (1,А), V1 – красная, VA – бесцветная, закрашиваем это ребро в красный цвет;
5) выбираем ребро (2,C), вершина V2 красная, вершина VС пока бесцветная, закрашиваем VС в красный цвет;
6) пытаемся выбрать ребро (3,С), но его вершины V3 и VC красные, это ребро в решение не пойдет;
7) пытаемся выбрать ребро (2,А), но его вершины V2 и VА красные, это ребро в решение не пойдет;
8) берем ребро (3,D), вершина VD бесцветная, теперь будет красной;
9) берем ребро (4,A), вершина V4 бесцветная, теперь будет красной;
10) мы выбрали 7 ребер на графе из 8 вершин, дерево построено.
Вес найденного дерева - 14. Построенное дерево приведено на рис.1.5.
Рисунок 1.5 – Остовное дерево, полученное по алгоритму Прима-Краскла
1.4 Решение задачи о максимальном паросочетании
Решение начинаем с определения связей жадным алгоритмом, рис.1.6:
Рисунок 1.6 – Первый шаг решения задачи о паросочетании, выполненный жадным алгоритмом
На этом графе легко найти повышающую цепочку:
D → 3 C → 2 B → 1 A → 4
Инвертируем цепочку:
D 3 → C 2 → B 1 → A 4
Задача решена, рис. 1.7:
Рисунок 1.7 – Решение задачи о паросочетании, после инверсии повышающей цепочки
1.5 Задача о назначениях
В классическом варианте задача о назначениях решается с минимизацией потерь, с нее и начнем решение.
1.5.1 Задача о назначениях с минимизацией потерь
,
осуществляем привидение матрицы по
столбцам.
В качестве привидения выносятся минимальные элементы столбцов – 2, 2, 1 и 7, остается матрица:
,
остается возможность осуществить
привидение по строке D
еще на 4.
,
сумма коэффициентов привидения –
минимальная оценка потерь
,
пока. Она может еще возрасти.
Рисуем граф, в который входят только ребра, обнуленные в результате привидения, рис.1.8:
Рисунок 1.8 – Граф из нулевых ребер, получившихся после первого
привидения
Очевидно, что на графе с этими 6 ребрами невозможно решить задачу о максимальном паросочетании. У нас проблемы со 2-м столбцом (там есть ненулевые коэффициенты 2 и 3) и с со строкой С (там коэффициенты 6, 2, 3). Выбираем минимум – это 2, именно для этой ячейки и применяем венгерский алгоритм (операцию Егервари).
,
в матрице появился отрицательный
элемент, проводим восстановление нулей
в 4-м столбце:
,
теперь имеется возможность провести
горизонтальное приведение в строке Ф,
выносится коэффициент 1. Минимальная
оценка задачи теперь 16+1 = 17.
.
Строим граф по нулевым ребрам, рис.1.9:
Рисунок 1.9 – Граф из нулевых ребер, получившихся после преобразования Егервари, решение задачи
В решении задействованы ребра весами 3+2+7+5 = 17, что соответствует нижней оценке потерь, полученных аналитически. Задача решена верно.
