Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Комбинаторные алгоритмы. Множества, графы, коды. Учебное пособие.pdf
X
- •ПРЕДИСЛОВИЕ
- •1.1. Основные понятия и обозначения
- •1.2. Битовая шкала множества
- •2.3. Бинарные коды Грея
- •2.4. Порядок выполнения задания
- •1.4. Отношения над множествами
- •1.5. Расстояние между множествами
- •1.6. Порядок выполнения задания
- •1.7. Варианты
- •2.1. Формулировка задачи
- •2.2. Счет в двоичной системе счисления
- •2.5. Варианты
- •3.1. Определение комбинаторных объектов
- •3.2. Генерация сочетаний
- •3.3. Генерация перестановок
- •3.4. Порядок выполнения задания
- •3.5. Варианты
- •ГЛАВА 2. АЛГОРИТМЫ НА ГРАФАХ
- •4.1. Основные понятия и обозначения
- •4.2. Отношения и операции
- •4.3. Родственные графам объекты
- •4.4. Способы машинного представления
- •4.5. Порядок выполнения задания
- •4.6. Варианты
- •5.1. Обход вершин графа в глубину или ширину
- •5.2. Базовые задачи на графах
- •5.3. Порядок выполнения задания
- •5.4. Варианты
- •6.1. Формулировка задачи
- •6.2. Алгоритм Краскала
- •6.3. Алгоритм Прима
- •6.4. Некоторые замечания
- •6.5. Порядок выполнения задания
- •6.6. Варианты
- •7.1. Формулировка задачи
- •7.5. Кратчайшие контуры и транзитивное замыкание
- •7.6. Порядок выполнения задания
- •7.7. Варианты
- •ГЛАВА 3. АЛФАВИТНОЕ КОДИРОВАНИЕ
- •8.1. Основные понятия и обозначения
- •8.2. Формулировка задачи
- •8.3. Критерии однозначного декодирования
- •8.4. Порядок выполнения задания
- •8.5. Варианты
- •9.1. Средняя длина элементарного кода
- •9.2. Формулировка задачи
- •9.3. Свойства оптимальных кодов
- •9.4. Алгоритм Хаффмена
- •9.5. Сжатие текстов
- •9.6. Порядок выполнения задания
- •9.7. Варианты
- •БИБЛИОГРАФИЧЕСКИЙ СПИСОК
- •АЛФАВИТНЫЙ УКАЗАТЕЛЬ
- •ОГЛАВЛЕНИЕ

2.5. Варианты
Согласно табл. 2.3 вариант задания определяет номер алгорит-
ма, генерирующего все
тимизационной задачи, которую требуется решить. Каждая из предлагаемых оптимизационных задач является NP-трудной и может быть
сформулирована как задача целочисленного линейного программирования с двоичными (или булевыми) переменными [10, 20]. Одним из
методов, возможно, не самым лучшим, решения NP-трудных задач
является метод исчерпывающего поиска − полный
можных наборов значений двоичных переменных и выбор среди них
тех, которые обладают требуемым свойством в наибольшей или наименьшей степени. Именно так следует решать задачу, указанную в
варианте задания. Для организации исчерпывающего поиска необходимо использовать разработанную процедуру генерации двоичных
векторов.
Номер варианта Номер алгоритма Название задачи
1 2.1 Задача размещения баз
2 2.2 Задача выбора проектов
3 2.3 Задача о доставке
n-разрядные двоичные вектора, и название оп-
перебор всех воз-
Таблица 2.3
4 2.1 Задача о доставке
5 2.3 Задача выбора проектов
6 2.2 Задача размещения баз
Задача размещения баз. Некоторая территория разделена на
n районов. Предполагается, что военная база, расположенная в каком-
то районе, может контролировать не только этот район, но и соседние,
граничащие с ним районы. Каждый район характеризуется определенными убытками, связанными с расположением в нем военной базы.
Требуется найти такие места размещения военных баз, чтобы суммарные убытки были минимальные и вся территория была под контролем.
21

Формализуем постановку задачи. Пусть ci – размер убытков,
связанных с размещением военной базы в районе i, и A = {aij} – матрица, отражающая отношение соседства между районами территории:
, районом с граничит район если,1
⎧
=
a
⎨
ji
⎩
=
ji
).,...,1,( случае противном в0
nji
Введем двоичные переменные:
, районе в размещена база военная если,1
⎧
=
x
⎨
j
⎩
=
nj
j
).,...,1( случае противном в0
Требуется найти значения переменных x1, …, xn, при которых
минимизируются суммарные убытки
∑
j
n
=
xc
jj
1
и выполняются условия
n
1
j
jj
n
∑∑
==
11
j
≥≥
xaxa
.1...,,1
jjn
Если c1 = c2 = … = cn = l, то рассматриваемая задача сводится
к отысканию наименьшего числа военных баз, способных контролировать всю территорию, и мест размещения этих баз.
Пример 2.4. Пусть некоторая территория разделена на районы,
которым присвоены номера 1, 2, ..., 9 (рис. 2.1). Тогда матрица А, отражающая отношение соседства между районами этой территории,
имеет вид, указанный на рис. 2.2.
Рис. 2.1
22

000001011
⎛
⎜
⎜
⎜
⎜
=
А
⎜
⎜
⎜
⎜
⎜
⎝
Рис. 2.2
При c1 = c2 = … = c9 = 1 военные базы можно разместить в районах с номерами {1, 6, 7}. Существуют и другие оптимальные решения.
Минимальное число баз, контролирующих всю территорию, неизменно
равно 3.
Задача выбора проектов. Имеются n проектов S = {s1, ..., sn} и
m ресурсов R = {r
во ресурсов Ri ⊆ R, необходимых для его реализации. Считается, что
всякий проект может быть реализован за один и тот же промежуток
времени. Если два различных проекта si, s
же ресурс rk ∈ Ri ∩ R
но. Требуется найти в S = {s1, ..., sn} максимальное (по включению)
множество независимых проектов, т. е. таких проектов, которые могут
выполняться одновременно.
Пусть матрица A = {aij} отражает отношение «проект-ресурс»:
, ..., rm}. Для каждого проекта s
1
∈ S используют один и тот
j
≠ ∅, то они не могут выполняться одновремен-
j
⎞
⎟
000010111
⎟
000100110
⎟
001011001
⎟
010111010
⎟
⎟
100110100
⎟
011001000
⎟
111010000
⎟
110100000
⎠
∈ S задано множест-
i
, ресурс использует проект если,1
Заметим, что строки этой матрицы являются битовыми шкалами для
R
⊆ R (i = l, ..., n), а R играет роль универсального множества.
i
Определим двоичные переменные:
⎧
=
a
⎨
ji
⎩
23
s
i
=
⎧
=
x
⎨
i
⎩
rs
ji
==
, проект выбран если,1
ni
).,...,1;,...,1( случае противном в0
mjni
).,...,1( случае противном в0

Тогда задачу выбора проектов можно выразить так: найти значе-
x
ния переменных
, …, xn, при которых достигается максимум суммы
1
n
x
∑
i
i
=
1
и выполняются условия
R
∩ Rk = ∅,
i
для любых 1 ≤
i < k ≤ n, при которых x
= xk = 1. Эти условия отража-
i
ют требования независимости выбранных проектов.
Пример 2.5. Пусть S = {s1, s2, s3, s4, s5}, R = {r1, r2, r3, r4}. Потребность проектов в ресурсах описывает матрица
рис. 2.3. Здесь максимальные множества независимых проектов: {
s
}, {s2, s3, s5}.
4
1111
⎛
⎜
⎜
=
А
⎜
⎜
⎜
⎝
⎞
⎟
0010
⎟
0100
⎟
1000
⎟
⎟
1001
⎠
A, приведенная на
s
, s3,
2
Рис. 2.3
Задача о доставке. Заданы
n клиентов и m маршрутов. Фирма
каждый день доставляет клиентам товары на грузовых машинах, которые передвигаются по заданным маршрутам. Любой маршрут требует
в течение дня одного транспортного средства и характеризуется определенными затратами, например, стоимостью расходуемого топлива. Для
каждого маршрута известны клиенты, которые могут быть обслужены
при движении транспортного средства по этому маршруту.
Цель состоит
в том, чтобы найти такое множество маршрутов, которое позволяет обслужить с минимальными затратами всех клиентов, причем каждого
клиента только один раз в день, т. е. с помощью одного маршрута.
Введем двоичные переменные:
⎧
=
x
⎨
j
⎩
j
=
,маршрут выбран если,1
mj
).,...,1( случае противном в0
24

Пусть стоимость затрат, связанных с маршрутом
матрица
a
A = {a
ji
} отражает отношение «клиент-маршрут»:
ij
⎧
=
⎨
⎩
j, равна c
, маршрутом тсяобслуживае клиент если,1
ji
==
).,...,1;,...,1( случае противном в0
mjni
, и
j
Необходимо найти значения двоичных переменных
x
, …, xm,
1
при которых достигается минимум суммарных затрат
∑
j
m
=
xc
jj
1
и выполняются условия
m
xaxa
∑∑
==
11
j
==
.1...,,1
jjn
Если
m
1
j
c
= c2 = ... = cm = l, то задача сводится к поиску наимень-
1
jj
шего числа маршрутов, позволяющих обслуживать каждого клиента
один раз в день.
Пример 2.6. Пусть число клиентов равно 5, а число маршрутов
равно 4. Матрица
A, описывающая отношение «клиент-маршрут»,
приведена на рис. 2.4.
0101
⎛
⎜
⎜
=
А
⎜
⎜
⎜
⎝
Рис. 2.4 Рис. 2.5
⎞
⎟
1110
⎟
0101
⎟
1010
⎟
⎟
0001
⎠
⎛
⎜
⎜
=
А
⎜
⎜
⎜
⎝
1111
⎞
⎟
1100
⎟
0011
⎟
1100
⎟
⎟
0011
⎠
Если с1 = 15, с2 = 15, с3 = 20, с4 = 10, то множество маршрутов
{1, 4} – оптимальное решение задачи о доставке. Поскольку в
A вто-
рой и четвертый столбцы совпадают, то существует и другое оптимальное решение {1, 2}. Однако если матрицу
указано на рис. 2.5, то задача о доставке не имеет решения.
А изменить так, как
25

ЗАДАНИЕ 3
=⋅−
=
−====
Пересчет и перечисление сочетаний
и перестановок
Цель задания: изучение формул пересчета и алгоритмов перечисления таких простейших комбинаторных объектов, как сочетания и
перестановки. Из большого числа известных алгоритмов взяты для
рассмотрения только те, которые генерируют комбинаторные объекты
в лексикографическом порядке.
3.1. Определение комбинаторных объектов
Пусть Х = {х1, ..., xn} − некоторое конечное множество.
Размещением элементов из Х по k (или из n по k) называется упо-
рядоченное подмножество из
A(n, k) различных размещений из n по k при 1 ≤ k ≤ n равно
Число
k элементов, принадлежащих Х (1 ≤ k ≤ n).
!
n
)1(...)1(),(
knnnknA
=+−−=
.
)!(
kn
−
Считают, что
Перестановка из n элементов – частный случай размещения при
k = n. Поэтому число P(n) различных перестановок из n элементов равно
Полагают, что
Сочетанием элементов из Х по k (или из n по k) называется не-
упорядоченное подмножество из
четание отличается от размещения тем, что в нем не учитывается порядок элементов. Поэтому каждому сочетанию соответствует
мещений. Отсюда следует формула для числа
n элементов по k (1 ≤ k ≤ n):
Из этой формулы вытекает справедливость равенств:
A(0, 0) = А(n, 0) = 1 и A(n, k) = 0, если k > n.
!12...)1()( nnnnP
P(0) = 0! = 1.
k элементов, принадлежащих Х. Со-
C(n, k) сочетаний из
),(
),(
knC
knA
!
k
26
!
n
==
.
)!(!
knk
−
).,(),(,1),()0,()0,0( knnCknCnnCnCC
k! раз-

C(n, k) = 0 при k > n.
A(n, k), P(n), P(n, k) называются комбинаторными
числами
Считают, что
Величины
. Формулы их вычисления позволяют пересчитать соответст-
вующие комбинаторные объекты.
3.2. Генерация сочетаний
Во многих практических задачах возникает необходимость перечислить все различные комбинаторные объекты и выбрать из них
те, которые удовлетворяют заданным условиям. Иногда требуется среди всех различных комбинаторных объектов найти такой, который
доставляет максимум (минимум) некоторой целевой функции. Решение подобных задач базируется на алгоритмах генерации комбинаторных объектов, которых известно достаточно много [5, 12, 17]. Выбранные для изучения и анализа алгоритмы конструируют сочетания и перестановки в лексикографическом порядке.
Без ограничения общности можно принять
каждому сочетанию из
жества
Х, взаимно однозначно соответствует вектор, состоящий из k
n по k, т. е. k-элементному подмножеству мно-
разрядов, упорядоченных в порядке возрастания. Например, подмножеству {4, 6, 1} соответствует вектор (1, 4, 6).
Наиболее естественным порядком перечисления таких векторов
является лексикографический порядок. Его называют лексикографическим потому, что он лежит в основе упорядочения слов в словаре. Например, слово
ском алфавите буква
словом
лето. Хотя первые две буквы этих слов совпадают, третья бук-
ва слова
лес в словаре стоит перед словом шалаш, так как в рус-
л стоит перед буквой ш. Слово лес стоит перед
лес стоит в алфавите перед третьей буквой слова лето. Точно
так же число 135 предшествует числу 145.
Рассмотрим два вектора с элементами из линейно упорядоченного множества
Х = {1, …, n}:
Х = {1, …, n}. Тогда
А = (а
В = (b
Считается, что вектор
A лексикографически предшествует вектору B,
если выполнено одно из условий:
, …, аm),
1
, …, bk).
1
27

a
< b1;
–
1
a
= b
–
–
для всех 1 ≤ i ≤ j и а
i
i
a
= bi для всех 1 ≤ i ≤ m и m < k.
i
j + 1
< b
j + 1
;
Пример 3.1. Для
Х = {1, 2, 3, 4, 5} и k = 3 существует
!5
)3,5( ==C
10
!2!3
сочетаний, которые образуют следующую лексикографическую последовательность векторов:
(1, 2, 3), (1, 2, 4), (1, 2, 5), (1, 3, 4), (1, 3, 5),
(1, 4, 5), (2, 3, 4), (2, 3, 5), (2, 4, 5), (3, 4, 5).
Алгоритм генерации всех
k-элементных подмножеств в лекси-
кографическом порядке основан на следующем наблюдении: за векто-
а
ром (
Надо отметить, что
векторе (
значение
множества
, …, аk) непосредственно следует вектор
1
(
а
, …, а
1
, ар + 1, ар + 2, …, ар + k – p + 1),
p − 1
р = max {i | a
< n – k + i}.
i
р – номер первого слева изменяемого разряда в
а
, …, аk), а величина (n – k + i) – максимально возможное
1
i-го разряда этого вектора (1 ≤ i ≤ k, 1 ≤ k ≤ n).
В алгоритме 3.1
k-элементные подмножества n-элементного
X = {1, …, n} формируются в одномерном массиве
A = (A[1], …, A[k]). Исходными данными являются величины n и k, где
k ≤ n.
1 ≤
Начинается генерация с вектора
A = (1, …, k). Каждый следую-
щий вектор получается из предыдущего изменением разрядов в «хвосте» вектора на идущие подряд целые числа, но так, чтобы последний
разряд не превосходил
n, а первый изменяемый разряд был на 1 боль-
ше, чем соответствующий разряд в предыдущем векторе.
Алгоритм 3.1. Генерация k-элементных подмножеств
n-элементного множества
1. В качестве начального взять вектор A = (1, …, k), т. е. для всякого i = 1, ..., k выполнить присваивание A[i]:= i.
28

2. Положить p:= k, где p – номер первого изменяемого разряда.
3. Вывести текущее значение А.
4. Если A[k] = n, то последний разряд увеличивать нельзя, поэтому
следует положить p:= p – 1. В противном случае p:= k.
5. Если p ≥ 1, то выполнить изменение разрядов в «хвосте» вектора для каждого i = k, k – 1, …, p следующим образом:
A[i]:= A[p] + i – p + 1
и вернуться к пункту 3. В противном случае останов.
Пример 3.2. Последовательность векторов, порожденных алго-
ритмом 3.1 для
n = 7 и k = 5, приведена в табл. 3.1. При записи этих
векторов скобки и разделяющие запятые опущены. Количество векторов равно
!7
)5,7( ==C
.21
!5!2
Таблица 3.1
№
п/п
1
2
3
4
5
6
7
8
9
10
Вектор
12345
12346
12347
12356
12357
12367
12456
12457
12467
12567
A Значение р
–
5
5
4
5
4
3
5
4
3
29
№
п/п
11
12
13
14
15
16
17
18
19
20
21
Вектор A Значение р
13456
13457
13467
13567
14567
23456
23457
23467
23567
24567
34567
2
5
4
3
2
1
5
4
3
2
1

3.3. Генерация перестановок
Рассмотрим теперь процесс генерации
новок множества
дать в лексикографическом порядке одну за другой с помощью следующего алгоритма.
Алгоритм 3.2. Генерация перестановок
1. Сначала взять перестановку A = (1, …, n).
2. Вывести текущее значение А.
3. Пусть A = (А[1], …, A[n]) – текущая перестановка.
Выполнить просмотр A справа налево в поисках самой правой
позиции i, в которой A[i] < A[i + 1].
Если такой позиции i нет, то текущая перестановка А является
последней. Процесс генерации завершить. Иначе идти дальше.
4. Выполнить просмотр A = (А[1], …, A[i], …, A[n]) слева направо
от A[i] в поисках наименьшего из таких элементов A[j], что i < j
и A[i] < A[j].
Переставить местами элементы A[i] и A[j], т. е. выполнить следующие присваивания:
5. Пусть A = (А[1], …, A[i], …, A[n]) – перестановка, полученная
на предыдущем шаге. Реверсировать (или изменить на обратный) порядок перечисления элементов A[i + 1], …, A[n] «хвоста» перестановки А. Заметим, что элементы обращаемого
«хвоста» всегда расположены в порядке убывания. Перейти к
пункту 2.
Пример 3.3. Рассмотрим для
Х = {1, …, n}. Все эти перестановки можно порож-
C:= A[i], A[i]:= A[j], A[j]:= C.
n = 8 текущую перестановку
n! различных переста-
А = (2, 6, 5, 8, 7, 4, 3, 1).
Для нее имеем
дает перестановку (2, 6, 7, 8, 5, 4, 3, 1). После реверсии отрезка этой
перестановки, начиная с четвертого по восьмой элемент, получаем
результирующую перестановку (2, 6, 7, 1, 3, 4, 5, 8), которая следует за
текущей перестановкой в лексикографическом порядке.
i = 3, j = 5. Транспозиция элементов A[3] = 5, A[5] = 7
30
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
