- •Формальное описание алгоритма 1 задачи “Ближайшая пара”
- •Лекция 2 Задача о битоническом пути
- •Битонический путь
- •Лекция 3 Динамическое программирование и оптимизационная задача перемножения матриц.
- •2. Алгоритмизация описанного процесса на основе (2) и (3).
- •Лекция 4 Оптимальная триангуляция треугольника.
- •Лекция 5
- •Циркуляция.
- •Алгоритм гомори—ху
- •Лекция 6 Многополюсные максимальные потоки
- •Лекция 7 Задача распределения капитала
- •1. Случай запрета коротких позиций.
- •2. Случай разрешения коротких позиций.
- •Случай наличия безрискового актива.
- •Лекция 8 Потоковые алгоритмы.
- •Лекция 9. Алгоритм Гомори.
- •Лекция 10 Многополюсные минимальные потоки.
- •Лекция 11 доминирующие множества и абсолютный центр.
- •Доминирующие множества.
- •Нахождение абсолютного p-центра
- •Ленкция 12 простой (классический) генетический алгоритм.
- •Лекция 13 Стохастическая задача размещения-распределения объектов.
2. Алгоритмизация описанного процесса на основе (2) и (3).
Алгоритм, основанный на формулах (2)-(3), может быть реализован:
а) Схема «сверху вниз». Построение рекурсивного алгоритма.
б) Схема «снизу вверх». Построение безрекурсивного алгоритма.
Алгоритм а)
Вход: n, p[0..n]
Выход: матрица S и оптимальное значение mopt.
1. m:=∞
mopt:=RP(1,n)
RP(i,j) – рекурсивное перемножение матриц. Процедура возвращает значение m[i, j].
if m[i,j]<∞ then Return m[i, j]
if i=j then m[i,j]=0
else for k:=1 to j-1do
q:=RP(i,k)+RP(k+1,j)+p[i-1]*p[k]*p[j]
if m[i,j]>q then
m[i,j]:=q; s[i,k]:=k
return m[i,j].
Алгоритм б)
Заполняет элементы матрицы М последовательно: сначала диагональные элементы, затем наддиагональные и так далее выше. Таким образом, последним будет заполнен элемент m[1,n].
Вход: n, p[0..n]
Выход: матрица S и оптимальное значение mopt.
for i:=1 to n do m[i,j]=0
for l:=2 to n do
for i:=1 to n-l+1 do
j:=i+l-1
m[i,j]:=∞
for k:=1 to j-1 do
q:=m[i,k]+m[k+1,j]+c(i-1,k,j)
if q<m[i,j]
then m[i,j]:=q; s[i,j]:=k;
OPT:=m[1,n]
Сложность алгоритма Т(А) = О(n3).
Пример:
n=5, p=(4, 6, 5, 8, 3, 5)
Матрица М:
|
1 |
2 |
3 |
4 |
5 |
1 |
0 |
120 |
280 |
282 |
342 |
2 |
|
0 |
240 |
210 |
300 |
3 |
|
|
0 |
120 |
195 |
4 |
|
|
|
0 |
120 |
5 |
|
|
|
|
0 |
Матрица S:
|
1 |
2 |
3 |
4 |
5 |
1 |
0 |
1 |
2 |
1 |
4 |
2 |
|
0 |
2 |
2 |
4 |
3 |
|
|
0 |
3 |
4 |
4 |
|
|
|
0 |
4 |
5 |
|
|
|
|
0 |
m[1,2]=120, s[1,2]=1
m[2,3]=240, s[2,3]=2
m[3,4]=120, s[3,4]=3
m[4,5]=120, s[4,5]=4
m[1,3]
= min
= min{432, 280}=280
m[2,4]
= min
=
min{210, 384}=210
m[3,5]
= min
= min{320, 195}=195
и так далее, вычислив все элементы, получаем, что m[1,5] = 342
=>
mopt=342.
A1..5 = (A1..4*A5) = ( (A1*A2..4)*A5) = ( (A1*(A2*A3..4))*A5) = ( (A1*(A2*(A3*A4)))*A5).
Лекция 4 Оптимальная триангуляция треугольника.
Пусть задан выпуклый многоугольник со своими вершинами, перечисленными в порядке против часовой стрелки.
Определение: Триангуляцией такого многоугольника называется множество диагоналей, не имеющих общих точек, кроме вершин, разбивающих многоугольник на треугольники.
Для каждого треугольника:
T={<i, j>}i<j={<i, j, k>}i<j<k
{<i, j>}i<j – множество диагоналей. Причем, мощность этого множества (то есть количество диагоналей) |{<i, j>}i<j | = n-3.
{<i, j, k>}i<j<k – множество всевозможных треугольников. Причем, мощность этого множества (то есть количество треугольников) |{<i, j, k>}i<j<k | = n-2.
На множестве всех треугольников задана весовая функция C:
C : {<i, j, k>}R+
p : {1..n} R+
Приведем несколько способов задания весовой функции:
a) c(i, j, k) = |pi-pj|+|pi-pk|+|pk-pj|
b) c(i, j, k) = pi* pj* pk
Задача: Найти триангуляцию, сумма весов треугольников которых будет минимальна.
Будем решать, используя динамическое программирование.
Теорема. («Структура оптимального решения»).
Пусть Т* - оптимальная триангуляция n-угольника. T*={<i, j, k>}. Пусть в этой триангуляции сторона (1,n) принадлежит треугольнику <1, k*,n> ==>
==>
1) Если k*=2, то часть исходной триангуляции T*\{< 1, 2, n>} является оптимальной для многоугольника с вершинами {2, 3,…, n}.
2) Если k*=n-1, то часть исходной триангуляции T*\{< 1, n-1, n>} является оптимальной для многоугольника с вершинами {1, 2,…, n-1}.
3) Если 2< k*<n-1, то исходная триангуляция состоит из оптимальных триангуляций
Т
:
1..k*
и Т
:
k*..n.
Т
Т
= T*\{<
1, k*,
n>}.
Доказательство.
Докажем свойство 3), так как свойства 1) и 2) являются частными случаями.
3)Доказывать будем методом от противного.
с(Т*) = с(Т ) + с(Т ) + с(< 1, k*, n>)
Если
предположить, что Т
-не оптимальна, то можем найти лучшую
триангуляцию Т
=> первое слагаемое уменьшается, то есть получится противоречие, что Т* - оптимальна.
Теорема доказана. ●
Убедимся, что число различных подзадач, которые возникают в ходе указанного разбиения, полиномиально зависит от размерности n (числа вершин).
T*1..n – триангуляция исходного многоугольника.
Надо
находить оптимальные решения таких
подзадач: Т*1..k
и T*k..n
, где k
=
T*1..n
Т*1..k T*k..n
…
T*1..l T*l..k
Можем посчитать число таких подзадач.
1 < l <n-2
l1
<
k
n
Скорость роста – квадратичная О(n2).
Вывод рекуррентного соотношения. Уравнение Беллмана.
Целевая функция – вес триангуляции. Подзадача на номере k..l.
m[k,l] – минимальное нахождение критерия на такой подзадаче. (k<l).
m[1,n] – оптимальное значение исходной задачи.
Из теоремы вытекает, что:
m[i,
j]
=
(*)
Вводим матрицу S:
s[i,j]
=
Используя (*), запишем две схемы алгоритма («сверху вниз» - рекурсивная, «снизу вверх» - безрекурсивная).
Алгоритм по схеме «Сверху вниз».
Вход: n - число вершин, с(i,j,k) –весовая функция.
Выход: матрица S, OPT.
1.m:=∞
2.OPT:=RP(1,n)
RP(i,j)
if m[i,j]<∞ then Return m[i,j]
if i=j-1 then Return 0
if i=j-2 then m[i,j]:=c(i, i+1, i+2)
else for k:=i+1 to j-1 do
q:=RP(i,k)+RP(k,j)+c(i,k,j)
if q<m[i,j]
then m[i,j]:=q
s[i,j]:=k
Return m[i,j]
Алгоритм по схеме «Снизу вверх».
Вход: n - число вершин, с(i,j,k) –весовая функция.
Выход: матрица S, OPT.
1. for i:=1 to n-1 do m[i,i+1]=0
2. for l:=2 to n-1 do
3. for i:=1 to n-l do
4. j:=i+l
5. m[i,j]:=∞
6. for k:=i+1 to j-1 do
7. q:=m[i,k]+m[k,j]+c(i,k,j)
8. if q<m[i,j]
9. then m[i,j]:=q; s[i,j]:=k;
10. OPT:=m[1,n]
Рассмотрим пример:
c(i,j,k) = |pi-pj|+|pi-pk|+|pk-pj|
Массив p[1..n] – веса вершин 1..n соответственно.
n=6
p=(3, 2, 4, 1, 5, 4)
Матрица М:
|
2 |
3 |
4 |
5 |
6 |
1 |
0 |
4 |
10 |
16 |
16 |
2 |
|
0 |
6 |
14 |
14 |
3 |
|
|
0 |
8 |
10 |
4 |
|
|
|
0 |
8 |
5 |
|
|
|
|
0 |
Матрица S:
|
2 |
3 |
4 |
5 |
6 |
1 |
0 |
2 |
2 |
3 |
3 |
2 |
|
0 |
3 |
3 |
3 |
3 |
|
|
0 |
4 |
5 |
4 |
|
|
|
0 |
5 |
5 |
|
|
|
|
0 |
m[i,i+2]=c(i,i+1,i+2)
s[i,i+2]:=i+1
m[1,3]=4, s[1,3]=2
m[2,4]=6, s[2,4]=3
m[3,5]=8, s[3,5]=4
m[4,6]=8, s[4,6]=5
m[1,4]
= min
=
min{10,11}=10
m[2,5]
= min
= min{14,14}=14
m[3,6]
= min
=
min{14,10}=10
m[1,5]
= min
= min{20,16,18}=16
m[2,6]
= min
= min{14,22,20}=14
m[1,6]
= min
=
min{18,16,24,20}=16
OPT:=m[1,6]=16.
Алгоритм, который выдает на печать оптимальную триангуляцию.
Рассмотрим представление триангуляции треугольника.
Чтобы напечатать все треугольники поступим следующим образом: рассмотрим многоугольник i..j и его оптимальную триангуляцию Ti..j. Она состоит из треугольников
и оптимальных триангуляций:
<i, s[i,j], j>
T*i..s[i,j] T*s[i,j]..j ,
но только в том случае, если i+1 < s[i,j] < j-1.
Если s[i,j]=i+1 , то оптимальная триангуляция распадается на треугольник <i, i+1, j> и оптимальную триангуляцию T*i+1..j.
Если s[i,j]=j-1 , то оптимальная триангуляция распадается на треугольник <i, j-11, j> и оптимальную триангуляцию T*i..j-1. (i j-2)
Выдача на печать.
Вход: n, s[1..n,1..n]
Выход: на печать.
1. Рекурсивная процедура печать RPP(1,n).
RPP(i,j)
if i<j-1
then print(i,s[i,j],j)
if s[i,j]<j-1
then RPP(i,s[i,j])
if s[i,j]>i+1
then RPP(s[i,j],i)
Второй способ печати оптимального решения – с помощью списка диагоналей.
Рассмотрим многоугольник i..j и его оптимальную триангуляцию Ti..j.
Во
всех случаях, когда
и
,
i..j
- дает диагональ.
Вход: n, s[1..n,1..n]
Выход: на печать.
1. Рекурсивная процедура печать RPP1(1,n).
RPP1(i,j)
if i j-2 then
if i
1
j
nthen print(i,j)
RPP1(i, s[i,j])
RPP1(s[i,j],j)
Т*1..6
T*1..3 T*3..6
T*1..2 T*2..3 T*3..5 T*5..6
-- -- --
T*3..4 T*4..5
-- --
То есть на печать будут выданы диагонали: <1,3>, <3,6>, <3,5>.
О связи оптимальной триангуляции с задачей перемножения матриц.
Задача о перемножении матриц – частный случай задачи оптимальной триангуляции.
Рассмотрим перемножение n-матриц A1..n.
Поставим в соответствие всем этим матрицам многоугольник с (n+1)-вершиной, приписав каждой вершине вес.
p0
A1..n
pn
A1 An
p1 pn-1
A2 An-1
p2 … … pn-2
Весовая функция c(i, j, k) = pi-1* pj-1* pk-1. Покажем, что оптимальная триангуляция решает задачу перемножения матриц. Сопоставим ребру (i, i+1) матрицу Аi, а ребру (n, n+1) –результат A1..n.
Любой диагонали (i,j) (где i<j-1) сопоставим в соответствие матрицу Ai..j-1.
Ai
Ai..j-1
pi pj-1
m[i,j]=m[i, k*]+m[k*,j]+c(i, k*,j)
В обозначениях матрицы имеем:
m’[i, j-1]=m’[i, k*-1]+m’[k*,j-1]+ pi-1* pj-1* pk-1.
Но pi-1* pj-1* pk-1 – это формула для перемножения матриц, то есть связь найдена.
