pdm_05
.pdf
Транспортная сеть
Определение Транспортная сеть S = (V, E, s, t, с) есть сеть S = (V, E, s, t), в
которой D-(s) = Ø (нет входящих ветвей в исток), D+(t) = Ø (нет исходящий ветвей
из стока) и для которой определена функция c: E → R+, где R+ есть множество неотрицательных вещественных чисел означающих пропускную способность ветвей. Транспортную сеть часто называют просто сетью.
Определение Поток в сети S = (V, E, s, t, с) есть функция f: E → R+, удовлетворяющая следующим условиям:
1.0 ≤ f(e) ≤ c(e) (поток меньше или равен пропускной способности);
2.для всякой внутренней вершины v сети S divf(v) = 0 (внутренние узлы не
порождают приращение (положительное либо отрицательное) трафика). Определение Величина потока f в сети S = (V, E, s, t, c, f) есть численная
величина Mf = divf(s) = Σ e D+(s) f(e) = divf(t) = Σ e D-(t) f(e);
Определение Сечение в сети S = (V, E, s, t) есть множество W E ветвей, при удалении которых получившаяся сеть S – W становится несвязной, причѐм полюсы s и t попадают в разные компоненты связности. Сечение W простое, если при возвращении в сеть S – W любой дуги e из W сеть (S – W) + e становится связной (по дуге e).
Анализ транспортных сетей позволяет решать широкий спектр задач, например, поиск оптимальных маршрутов доставки грузов, оптимизации распределения ресурсов на производствах, оптимизации структуры
электронновычислительных сетей и др. |
31 |
Бинарное дерево для реализации кода Фено
Вероятность использования и |
|
|
ABCDEFGHIJKLM |
|
|
|||||||||
бинарный код символов (букв) |
|
|
|
|
||||||||||
|
|
|
100% |
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
i |
|
Б. |
Вероятность |
Код |
l |
pl |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
p |
% |
|
i |
i |
|
|
|
|
BDFGHJKLM (50%) 1 |
||
|
|
|
|
|
|
|
ACEI (50%) 0 |
|
||||||
1 |
|
A |
0,150 |
15,0 |
000 |
3 |
0,45 |
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|||||||
2 |
|
B |
0,090 |
9,0 |
011 |
3 |
0,27 |
|
|
|
|
|
|
BDF |
3 |
|
C |
0,110 |
11,0 |
010 |
3 |
0,33 |
|
AI |
CE |
|
|
|
|
|
|
|
|
(24,5%) 1 |
||||||||||
|
|
(25%) 1 |
|
|||||||||||
4 |
|
D |
0,080 |
8,0 |
0111 |
4 |
0,32 |
(25%) 0 |
|
|
|
|||
|
|
|
|
|
|
|
|
|||||||
5 |
|
E |
0,140 |
14,0 |
110 |
3 |
0,42 |
|
|
|
|
|
B |
DF |
6 |
|
F |
0,075 |
7,5 |
1111 |
4 |
0,3 |
A |
I |
C |
E |
|
(9%) |
(15,5%) |
|
|
0 |
1 |
|||||||||||
7 |
|
G |
0,070 |
7,0 |
0001 |
4 |
0,28 |
(15%) |
(10%) |
(11%) |
(14%) |
|
||
|
|
|
|
|||||||||||
8 |
|
H |
0,055 |
5,5 |
1001 |
4 |
0,22 |
0 |
1 |
0 |
1 |
GHJKLM |
|
|
|
|
|
|
|
|
|
||||||||
9 |
|
I |
0,100 |
10,0 |
100 |
3 |
0,3 |
|
|
|
|
(25,5%) 0 |
D |
F |
|
|
|
|
|
|
(8%) |
(7,5%) |
|||||||
10 |
|
J |
0,035 |
3,5 |
00101 |
5 |
0,175 |
|
GH |
|
|
|
||
|
|
|
|
|
0 |
1 |
||||||||
|
|
(12,5%) 0 |
|
|
JKLM |
|||||||||
11 |
|
K |
0,045 |
4,5 |
01101 |
5 |
0,225 |
|
|
|
|
|
||
|
|
|
|
|
(13%) 1 |
|
|
|||||||
12 |
|
L |
0,035 |
3,5 |
10101 |
5 |
0,175 |
G |
|
H |
|
|
|
KM |
|
(7%) 0 |
|
|
|
||||||||||
13 M |
0,015 |
1,5 |
11101 |
5 |
0,075 |
(5,5%) 1 |
JL |
(6%) 1 |
||||||
|
|
|
|
|||||||||||
|
Σ |
1 |
100 |
- |
- |
3,54 |
|
|
|
|
(7%) 0 |
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
N
Lср = ∑( pili ),
i=1
pi – вероятност ь i - го символа , li – длина кода i - го символа, N – число символов.
В нашем случае Lср = 3,54
J |
L |
K |
M |
(3,5%) 0 |
(3,5%) 1 |
(4,5%) 0 |
(1,5%) 1 |
Двигаясь от листа к корню дерева получаем суффиксный код символа.
Код Фено относится к статистическим методам сжатия. В общем случае более оптимальный код, с точки зрения 32 компактности, позволяет – получить метод Хафманна.
Код Хаффмана
Формирование кода Хаффмана
Код |
1 |
|
|
|
|
2 |
3 |
|
4 |
|
|
|
|
5 |
|
6 |
|
|
|
7 |
|
|||||
Символ |
p |
|
Символ |
|
p |
|
Символ |
p |
Символ |
p |
|
Символ |
|
p |
Символ |
p |
|
Символ |
|
p |
|
|||||
|
|
|
|
|
|
|
|
|
||||||||||||||||||
100 |
A |
0,15 |
|
A |
|
0,15 |
|
A |
0,15 |
A |
0,15 |
|
|
A |
0,15 |
|
DKJ |
0,16 |
|
IB |
0,19 |
|
||||
110 |
E |
0,14 |
|
E |
|
0,14 |
|
E |
0,14 |
E |
0,14 |
|
|
FG |
0,145 |
|
A |
0,15 |
|
DKJ |
0,16 |
|
||||
001 |
C |
0,11 |
|
C |
|
0,11 |
|
C |
0,11 |
C |
0,11 |
|
|
E |
0,14 |
|
FG |
0,145 |
|
A |
0,15 |
|
||||
011 |
I |
0,1 |
|
I |
|
0,1 |
|
I |
0,1 |
HLM |
0,105 |
|
|
C |
0,11 |
|
E |
0,14 |
|
FG |
0,145 |
|
||||
111 |
B |
0,09 |
|
B |
|
0,09 |
|
B |
0,09 |
I |
0,1 |
|
HLM |
0,105 |
|
C |
0,11 |
|
E |
0,14 |
|
|||||
0000 |
D |
0,08 |
|
D |
|
0,08 |
|
D |
0,08 |
B |
0,09 |
|
|
I |
0,1 |
|
HLM |
0,105 |
|
C (0) |
|
0,11 |
|
|||
0010 |
F |
0,075 |
|
F |
|
0,075 |
|
KJ |
0,08 |
D |
0,08 |
|
|
B |
0,09 |
|
I (0) |
0,1 |
|
HLM (1) |
|
0,105 |
|
|||
1010 |
G |
0,07 |
|
G |
|
0,07 |
|
F |
0,075 |
KJ |
0,08 |
|
D (0) |
|
0,08 |
|
B (1) |
0,09 |
|
|
|
|
|
|||
0101 |
H |
0,055 |
|
H |
|
0,055 |
|
G |
0,07 |
F (0) |
0,075 |
|
KJ (1) |
|
0,08 |
|
|
|
|
|
|
|
|
|||
01000 |
K |
0,045 |
|
LM |
|
0,05 |
|
H (0) |
0,055 |
G (1) |
0,07 |
|
|
|
|
|
|
|
|
|
|
|
|
|
||
11000 |
J |
0,035 |
|
K (0) |
|
|
0,045 |
|
LM (1) |
0,05 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
01101 |
L (0) |
0,035 |
|
J (1) |
|
|
0,035 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
11101 |
M (1) |
0,015 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Σ |
1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
8 |
|
9 |
|
|
|
10 |
|
|
11 |
|
|
|
12 |
|
|
|
13 |
|
|
|
|||||
Символ |
p |
Символ |
|
|
p |
Символ |
p |
Символ |
|
p |
|
Символ |
|
p |
|
Символ |
|
p |
||||||||
CHLM |
0,215 |
FGE |
0,285 |
|
DKJA |
0,31 |
CHLMIB |
0,405 |
DKJAFGE (0) |
0,595 |
DKJAFGECHLMIB 1 |
|||||||||||||||
IB |
0,19 |
CHLM |
0,215 |
|
FGE |
0,285 |
DKJA (0) |
0,31 |
CHLMIB (1) |
|
0,405 |
|
|
|
|
|
|
|||||||||
DKJ |
0,16 |
|
IB |
|
0,19 |
CHLM (0) |
0,215 |
FGE (1) |
0,285 |
|
|
|
|
|
|
|
|
|
|
|
||||||
A |
0,15 |
DKJ (0) |
|
0,16 |
IB (1) |
0,19 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
FG (0) |
0,145 |
A |
(1) |
|
0,15 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
E (1) |
0,14 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Результирующий код является суффиксным. В рассмотренных |
|
|
|
N |
|
|
|
|
|
|
|
|
|
|
||||||||||||
Lср = ∑( pili ) = 3,54 ; |
Lср. Хаффм ана ≤ Lср.Фено |
|||||||||||||||||||||||||
примерах средняя длинна символа в кодах Фено и Хаффмана |
||||||||||||||||||||||||||
|
|
|
|
совпали. |
|
|
|
|
|
|
|
i=1 |
|
|
|
|
|
|
|
|
|
|
||||
Кодирование Хаффмана, так же как и код Фено осуществляется при помощи бинарного дерева, в данном случае дерево записано при помощи таблицы. На каждом шаге последние (выделены цветом) в столбце символы (и их объединения) образуют код и элементы дерева, причѐм ячейки где содержатся по одному символу будут листьями бинарного дерева, в скобках подписаны составляющие код (бинарные) элементы.
Наиболее эффективным методом статистического кодирования для сжатия является арифметическое |
33 |
|
кодирование. |
||
|
Проблема описания графов
Множество видов графов и множество возможных искомых характеристик этих графов, с учѐтом специфики практического применения для каждого конкретного случая, порождают комбинаторную проблему решения задач над графами. В каждом конкретном случае есть необходимость выбирать наиболее подходящий способ описания графа.
Наиболее распространены (в скобках подписаны примеры для графа G):
– матрица смежности (A); |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
|
– матрица инцидентности (B); |
||||||||
|
|
|
|
|
|
|
||
– списки смежности; |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
|
– список рѐбер (W). |
B = 0 |
1 |
0 |
1 |
0 |
1 |
0 |
1 2
0 |
|
|
|
|
|
3 |
4 |
0 |
p |
1 |
|
1 |
p |
0 |
|||
|
|
||||
Граф G |
|
2 |
p |
0 |
|
|
|
||||
|
|
3 |
p |
0 |
|
|
|
4 |
p |
2 |
p |
2 |
p |
3 |
null |
p |
2 |
p |
3 |
null |
p |
1 |
p |
4 |
null |
p |
1 |
p |
4 |
null |
p |
3 |
null |
|
|
Список смежности
0 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
|
|
|
|
|
|
|
||
0 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
2 |
|
|
|
|
|
|
|
||
|
|
0 |
1 |
1 |
1 |
0 |
0 |
3 |
|
|
|
|
|||||
|
|
1 |
0 |
1 |
1 |
0 |
W = 1 |
2 |
|
|
|
|
|||||
|
A = 1 |
1 |
0 |
0 |
1 |
1 |
3 |
|
|
|
|
||||||
|
|
1 |
1 |
0 |
0 |
1 |
2 |
4 |
|
|
|
|
|||||
|
|
0 |
0 |
1 |
1 |
0 |
3 |
4 |
|
|
|
|
|||||
Выбор способа описания графа во многом определяет эффективность работы алгоритма, нет |
34 |
|
универсального способа описания графа одинаково хорошо подходящего для всех задач. |
||
|
Алгоритм
Определение Алгоритм – это точный набор инструкций, описывающих последовательность действий некоторого исполнителя для достижения результата, решения некоторой задачи.
Свойства алгоритма детерминированность – определѐнность действий в каждый последующий
момент времени состоянием исполнителя алгоритма и данными (с учѐтом уже проделанной обработки); дискретность – каждый элемент алгоритма должен быть простым действием
(шагом) выполняемым за конечное время; завершаемость – при корректных данных алгоритм должен быть завершаем за конечное число шагов;
универсальность – алгоритм должен быть применим к различным наборам данным относящихся к классу задач решаемых алгоритмом; реализуемость – алгоритм должен быть практически реализуем, с учѐтом возможностей и ограничений исполнителя; результативность – исполнение алгоритма должно давать завершѐнный результат.
35
Графы для схематичного отображения алгоритмов
Начало
Исходные данные (граф)
Нет |
Граф |
Да |
|
|
|
|
связен |
|
Нет |
|
Граф |
|
|
|
|
|
чѐтен |
Вывод: граф не эйлеров
Краткая блок-схема алгоритма принятия решения: о существовании эйлерова цикла в графе (а значит принадлежности графа к классу эйлеровых графов). Реализацию алгоритма в виде программы на C++ возможно найти в примерах программ данной
Да лекции.
Вывод: граф эйлеров
Завершение
Подробное описание элементов построения блок схемы алгоритмов возможно найти в ГОСТ 19.701-90 (ИСО 5807-85) «Схемы алгоритмов,
программ, данных и систем условные обозначения и правила 36 выполнения».
Пример методов описания графа
// C++ листинг файла mi_adjlist.h
#include <vector> |
// |
подключение библиотеки |
using namespace std; |
// |
пространство имѐн std:: |
typedef unsigned int uint; // задание типа безнаковое целое
// класс матрицы смежности class mi_adjmatrix {
public: |
|
mi_adjmatrix(uint is) { |
// конструктор |
sm = is; |
|
Tbvector emptvec; |
|
emptvec.insert(emptvec.begin(), sm, false); matrix.insert(matrix.begin(), sm, emptvec); emptvec.clear();
}
~mi_adjmatrix() { // деструктор matrix.clear();
}
void insert(uint i, uint j) { // метод вставки ребра matrix.at(j).at(i) = matrix.at(i).at(j) = true;}
void remove(uint i, uint j) { // метод удаления ребра matrix.at(j).at(i) = matrix.at(i).at(j) = false;}
// метод проверки существования ребра
bool check(uint i, uint j) {return(matrix.at(j).at(i));}
int |
size() {return(sm);} |
// размер матрицы смежности |
private: |
|
|
int |
sm; |
|
typedef vector<bool> Tbvector; |
// задание типа вектор |
|
typedef vector<Tbvector> Tbmatrix; // задание типа матрица
Tbmatrix matrix; |
// объявление матрицы смежности |
}; |
|
//---------------------------------------------------------
//структура смежных вершин или ребро
struct stedge {
uint v, u; // вершины stedge(uint v1, uint u1) { // конструктор
v = v1; u = u1;
}
};
Впрограмме приведѐн пример возможной реализации матрицы смежности в отдельном классе. Конструктор, параметром является размер матрицы смежности, создаѐт пустую матрицу с указанным размером. Методы класса позволяют производить некоторые элементарные операции: добавлять ребро, удалять ребро, проверять существование ребра.
Влистинге так же приведен вариант реализации структуры описывающей смежные вершины.
Выбор оптимального способа описания графа может быть непростой задачей.
37
Класс реализации некоторых алгоритмов
// C++ листинг файла mi_adjlist.h (продолжение) |
|
||
// класс (наследник mi_adjmatrix) реализует методы |
В классе mi_algam наследнике от |
||
// некоторых алгоритмов обработки матрицы смежности |
|||
|
|||
class mi_algam : public mi_adjmatrix { |
mi_adjmatrix реализованы методы: |
||
public: |
|
||
mi_algam(uint ims) : mi_adjmatrix(ims) {} |
round – рекурсивного обхода графа, |
||
~mi_algam() {edge.clear(); visited.clear();} |
|||
void depth() { |
// вызов рекурсивного поиска в глубину |
вызывается из depth, результаты |
|
|
|||
edge.clear(); |
|
обхода содержатся в векторе рѐбер |
|
visited.clear(); |
|
||
|
|
||
visited.insert(visited.begin(), size(), false); |
(списке) edge, доступ к элементам |
||
round(0); |
|
||
} |
|
списка edge осуществляется при |
|
int szedge() {return (edge.size());} // размер списка смежности |
|||
stedge iedge(uint i) { |
// элементы списка смежности |
помощи метода iedge; |
|
if (i >= szedge()) return(stedge(0, 0)); |
|||
degree – вычисления степени |
|||
return(edge.at(i)); |
|
||
|
|
||
} |
|
вершины; |
|
uint degree(uint ivert) { |
// вычисляем степень вершины |
||
if (ivert >= size()) return (0); // вершина вне графа |
eulerpath – проверка на |
||
uint deg = 0; // начальное значение степени |
|||
for (uint j = 0; j < size(); j++) { |
существование эйлерова цикла. |
||
if (check(ivert, j)) deg++; |
|||
} |
|
|
|
return(deg); |
|
|
|
} |
|
|
|
bool eulerpath() { |
// проверка существования эйлерова цикла |
|
|
for (uint i = 0; i < size(); i++) { |
|
||
uint degi = degree(i); |
|
||
if (!degi || (degi & 1)) return (false); // граф не связен или не чѐтен |
|||
} |
|
|
|
return(true); |
|
|
|
} |
|
|
|
private: |
|
|
|
vector<stedge>edge; // вектор рѐбер - список смежности |
|
||
vector<bool>visited; // вектор содержащий признак посещения вершины |
|
||
void round(uint v) { // метод рекурсивного поиска в глубину |
|
||
visited.at(v) = true; |
|
|
|
for (uint i = v; i < size(); i++) { |
|
||
if (check(v, i)) edge.push_back(stedge(v, i)); |
|
||
if (!visited.at(i)) |
round(i); |
|
|
} |
|
|
|
} |
|
|
|
}; |
38 |
|
Пример использования
// C++ листинг файла main.cpp |
0 |
1 |
|
#include <iostream> |
|||
|
|
||
#include "mi_adjlist.h" |
|
|
|
#define LINE cout<<"--------------------------------"<<endl; |
|
|
|
int main(int argc, char* argv[]) { |
4 |
3 |
|
mi_algam *graph = new mi_algam(5); // объект класса mi_algam |
|||
|
|
||
graph->insert(0,1); // добавляем рѐбра |
|
|
|
graph->insert(0,3); |
|
|
|
graph->insert(0,4); |
2 |
|
|
graph->insert(1,2); |
|
||
|
|
||
graph->insert(2,3); |
|
|
|
graph->insert(2,4); |
Граф рассматриваемый в программе |
||
LINE |
|||
|
|
||
// вывод матрицы |
Вывод результатов работы программы |
||
for(int j = 0; j < graph->size(); j++) { |
-------------------------------- |
||
for(int i = 0; i < graph->size(); i++) { |
0 1 0 1 1 |
|
|
cout<<((graph->check(j,i))?1:0)<<" "; |
1 0 1 0 0 |
|
|
} |
0 1 0 1 1 |
|
|
cout<<endl; |
1 0 1 0 0 |
|
|
} |
1 0 1 0 0 |
|
|
LINE |
-------------------------------- |
||
// вывод степени графа |
deg(0) = 3 |
|
|
for(int i = 0; i < graph->size(); i++) |
deg(1) = 2 |
|
|
cout<<"deg("<<i<<") = "<<graph->degree(i)<<endl; |
deg(2) = 3 |
|
|
LINE |
deg(3) = 2 |
|
|
// проверка графа на существование эйлерова пути |
deg(4) = 2 |
|
|
if(graph->eulerpath()) |
-------------------------------- |
||
cout<<"Have an Euler path"<<endl; |
No euler path |
|
|
else |
-------------------------------- |
||
cout<<"No euler path"<<endl; |
0 -- 1 |
|
|
LINE |
1 -- 2 |
|
|
// обход графа в глубину и вывод результатов (найденных рѐбер) |
2 -- 3 |
|
|
graph->depth(); |
2 -- 4 |
|
|
for(int i = 0; i < graph->szedge(); i++) |
0 -- 3 |
|
|
cout<<graph->iedge(i).v<<" -- "<<graph->iedge(i).u<< endl; |
0 -- 4 |
|
|
LINE |
-------------------------------- |
||
delete graph; |
Press any key for continue . . . |
||
|
system("pause"); |
|
return(0); |
} |
39 |
Список литературы
1.Набенин А. А. Дискретная математика. – М.: Научный мир, 2010. 512 с.: ил.
2.Седжевик Р. Алгоритмы на C++.: Пер. с англ. – М.: ООО «И.Д. Вильямс», 2011. – 1056 с.: ил.
3.Новиков Ф.А. Дискретная математика для программистов: Учебник для вузов. 3-е изд.
–СПб.: Питер, 2009. – 384 с.: ил.
4.Демерчан К. С., Нейман Л. Р., Коровкин Н. В., Чечурин В. Л. Теоретические основы электротехники: В 3-х т. Учебник для вузов. Том 1. – 4-е изд. – СПб.: Питер, 2006. – 463 с.: ил.
5.Прата С. Язык программирования С++. Лекции и упражнения, 6-е изд.: Пер. с англ.
–М.: ООО «И.Д. Вильямс», 2013. – 1248 с.:
ил. – Парал. тит. англ.
6.Либерти Д., Бредли Д. Освой самостоятельно C++ за 21 день, 5-е издание. : Пер. с англ. – М.: Издательский дом «Вильямс», 2012. – 768 с.:ил.
Н. П. Богданов-Бельский Устный счѐт. В народной школе С. А. Рачинского, 1895.
Государственная Третьяковская галерея, Москва
Ученики Сергея Александровича Рачинского решают задачу:
вычислить
(102+112+122+132+142)/365
40
