Разработка программы для нахождения критического пути в ориентированном ациклическом графе
Основы теории графов, понятие и функции мультиграфа. Ввод размерности и матрицы весов графа из файла. Алгоритм нахождения критического пути в орграфе. Функциональное назначение и описание логической структуры программы. Ациклический ориентированный граф.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 27.03.2011 |
Размер файла | 417,1 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www. аllbest.ru/
Размещено на http://www. аllbest.ru/
Содержание
- Введение
- 1. Основы теории графов
- 2. Алгоритмическая часть
- 2.1 Применение поставленнай задачи
- 2.2 Алгоритм нахождения критического пути в орграфе
- 3. Описание программы
- 3.1 Общие сведения
- 3.2 Функциональное назначение
- 3.3 Описание логической структуры программы
- 3.4 Описание данных
- 3.5 Руководство пользователю
- 3.6 Контрольный пример
- Заключение
- Список использованной литературы
- Приложение. Листинг программы
- алгоритм матрица ациклический граф
Введение
Целью курсовой работы является разработка программы для нахождения критического пути в ориентированном ациклическом графе. Программа должна позволять производить расчеты для любых графов с последующим выводом результатов на экран монитора.
Развитие теории графов в основном обязано большому числу всевозможных приложений. Из всех математических объектов графы занимают одно из первых мест в качестве моделей реальных систем. Графы нашли применение практически во всех отраслях научных знаний: физике, биологии, химии, математике, истории, лингвистике, социальных науках, технике и т.п. Наибольшей популярностью теоретико-графовые модели используются при исследовании коммуникационных сетей, систем информатики, химических и генетических структур, электрических цепей и других систем сетевой структуры.
Ввиду сложности и трудоемкости вычислений при решении задач на графах стандартные способы решения оказываются малоэффективными. Наиболее удобно решать задачи такого класса с использованием соответствующего программного обеспечения.
1. Основы теории графов
Во многих прикладных задачах изучаются системы связей между различными объектами. Объекты называются вершина-ми и отмечаются точками, а связи между вершинами называются дугами и отмечаются стрелками между соответствующими точками (рисунок 1.1).
Рисунок 1.1
Такие системы и образуют графы. Граф может изображать сеть улиц в городе: вершины гра-фа - перекрестки, а дуги - ули-цы с разрешенным направлени-ем движения (улицы могут быть с односторонним и двусторонним движением). В виде графов можно представить блок - схемы про-грамм (вершины - блоки, а дуги - разрешенные переходы от одного блока к другому), электри-ческие цепи, географические карты и молекулы химических со-единений, связи между людьми и группами людей. Перейдем к точным определениям.
Графом называется алгебраическая система G = (М, R), где R - двухместный предикатный символ. Элементы носителя М называются вершинами графа G, а элементы бинарного отноше-ния R М2 - дугами. Таким образом, дугами являются пары вершин (a, b) R. При этом дуга (a, b) называется исходящей из вершины а и заходящей в вершину b.
Изображение графа G = (М, R) получается путем расположения различных точек на плоскости для каждой вершины a М, причем если (а, b) R, то проводится стрелка (дуга) из вершины а к вершине b.
Пример: Изображение графа G с множеством вершин М
{1,2,3,4} и множеством дуг R = {(1,1), (1,2), (2,3),(3, 4), (4,3), (4,1)} представлено на рисунке 1.1.
При задании графа для нас не имеет значе-ния природа связи между вершинами а и b, важ-но только то, что связь существует и информация о связях содержится во множестве дуг R. Однако часто возникают ситуации, при которых такой информации оказывается недостаточно, например, в случаях, когда имеется несколько дуг, исходящих из вершины а и заходящих в вершину b, такие дуги называются кратными (рисунок 1.2). Тогда используется понятие мультиграфа.
Рисунок 1.2.
Мулътиграфом G называется тройка (М, U, P), в которой М - множество вершин, U - множество дуг, а Р МUМ - трехместный предикат, называемый инцидентором и представляемый следующим образом: (a, u, b) P тогда и только тогда, когда дуга и исходит из вершины а и заходит в вершину b. Отметим, что любой граф можно представить в виде мультиграфа.
Граф G = (M, R) называется ориентированным (орграфом), если найдется дуга (а, b) R такая, что (b, а) R. Если же отношение R симметрично, т. е. из (а, b) R следует (b, а) R, то граф G называется неориентированным (неорграфом). Если одновременно пары (а, b) и (b, а) принадлежат R (рисунок 1.3, а), то информацию об этих дугах можно представить множеством [а, b] = {(а, b), (b, а)}, называемым ребром, которое соединяет вершины а и b. При этом вершины а и b называются концами ребра [а, b]. Ребра изображаются линиями (без стрелок), соединяющими вершины (рисунок 1.3, б).
Рисунок 1.3.
Если в мультиграфе вместо дуг рассматриваются ребра, то мультиграф также называется неориентированным. Отметим, что если в орграфе G = (М, R) к каждой дуге (а, b) R добавить пару (b, а), то в результате образуется неорграф, который будем называть соответствующим данному орграфу G и обозначать через F(G).
Пример: Орграфу G, изображенному на рисунке 1.1, соответствует неорграф F(G), изображенный на рисунке 1.4.
Рисунок. 1.4.
Информация о структуре графа может быть задана матрицей бинарного отношения. Пусть G = (М, R) - граф, в котором множество вершин имеет n элементов: М = {a1, a1, …, an}. Матрицей смежности АG = (Aij) графа G называется матрица порядка n, определенная следующим образом:
Если Аij = 1, то вершина аj называется последователем вершины аi, а аi - предшественником аj. Вершины аi и аj называются смежными, если Aij = 1 или Aji = 1.
Если G - мультиграф, то в матрице смежности AG элемент Аij по определению равен числу дуг, исходящих из вершины аi и заходящих в вершину аj (i, j {1, ..., n}).
Рисунок 1.5.
Граф G, изображенный на рисунке 1.1.5, имеет матрицу смежности
Отметим, что если G - неорграф, то матрица смежности AG симметрична, т. е. не меняется при транспонировании: .
Петлей в графе G называется дуга, соединяющая вершину саму с собой. Если G - граф без петель, то в матрице смежности AG по главной диагонали стоят нулевые элементы:
Теорема 1. Графы изоморфны тогда и только тогда, когда их матрицы смежности получаются друг из друга одно-временными перестановками строк и столбцов (т.е. одновременно с перестановкой i - й и j - й строк переставляются i - й и j - е столбцы).
Согласно этой теореме по матрице смежности граф восста-навливается однозначно с точностью до изоморфизма.
В графе G = (М, U, Р) дуга u U называется инци-дентной вершине а М, если (а, u, b) Р или (b, u, а) Р для некоторого b М. Если М = {a1, ..., am}, U = {u1, ..., un}, то матрицей инцидентности BG = (Вij) мультиграфа G на-зывается матрица размера m*n, определяемая по следующему правилу:
Рисунок. 1.6.
Пример: Мультиграф G, изображенный на рисунке 1.6, имеет матрицу инцидентности
Мультиграфы G = (M, U, P) и G' = (M', U', P') называ-ются изоморфными, если существуют биекции : М М' и : U U' такие, что (a, u, b) Р тогда и только тогда, когда ((a), (u), (b)) P'.
Аналогично теореме 1 справедлива
Теорема 2. Мультиграфы G и G' изоморфны тогда и только тогда, когда их матрицы инцидентности получаются друг из друга некоторыми перестановками строк и столбцов.
Пути и маршруты
Путем (или ориентированным маршрутом) ориентированного графа называется последовательность дуг, в которой конечная вершина всякой дуги, отличной от последней, является началь-ной вершиной следующей.
Так, на рис. 1.6 последовательности дуг
а6 а5 а9 a8 а4 (1.1)
а1 а6 а5 а9 (1.2)
а1 а6 а5 а9 а10 а6 а4 (1 3)
являются путями.
Рисунок 1.6
Дуги а = (хi , xj), xi ? xj , имеющие общие концевые вершины, называются смежными. Две вершины xi и xj называются смежными, если какая-нибудь из двух дуг (xi, xj) и (хj), xi) или обе одно-временно присутствуют в графе. Так, например, на рис. 1.6 дуги а1, а10, а3 и а6, как и вершины х5 и х3, являются смежными, в то время как дуги а1 и а5 или вершины х5 и x3 не являются смежными.
Ориентированной цепью (или, короче, орцепъю) называется такой путь, в котором каждая дуга используется не больше одного раза. Так, например, приведенные выше пути (1.1) и (1.2) являют-ся орцепями, а путь (1.3) не является таким, поскольку дуга ав в нем используется дважды.
Простой орцепъю называется такой путь, в котором каждая вершина используется не более одного раза. Например, путь (1.2) является простой орцепью, а пути (1.1) и (1.3) -- нет. Очевидно, что простая орцепь является также орцепью, но обратное утвер-ждение неверно. Например, путь (1.1) является орцепью, но не простой орцепью, путь (1.2) является орцепью и простой орцепью, а путь (1.3) не является ни орцепью, ни простой орцепью. Маршрут есть неориентированный «двойник» пути, и это понятие рассматривается в тех случаях, когда можно пренебречь направ- ленностью дуг в графе. Таким образом, маршрут есть последова-тельность ребер а1, а2,...,aq , в которой каждое ребро ai, за исключением, возможно, первого и последнего ребер, связано с ребрами аi-1 и ai+1 своими двумя концевыми вершинами. После-довательности дуг
а2, a4, a8, a10, (1.4)
a2, a7, а8, а4, а3 (1.5)
a10, a7, а4, а8, а7, а2 (1.6)
в графе, изображенном на рис. 1.2, являются маршрутами; черта над символом дуги означает, что ее ориентацией пренебрегают, т. е. дуга рассматривается как неориентированное ребро.
Точно так же, как мы определили орцепи и простые орцепи, можно определить цепи и простые цепи. Так, например, маршрут (1.4) есть цепь и простая цепь, маршрут (1.5) -- цепь, но не простая цепь, а маршрут (1.6) не является ни цепью, ни простой цепью.
Путь или маршрут можно изображать также последователь-ностью вершин, что мы и будем использовать. Путь (1.1) можно представить также последовательностью вершин х2, х5, xk, х3, х5, х6 и такое представление часто оказывается более полезным в тех случаях, когда осуществляется поиск простых орцепей пли простых цепей.
Веса и длина пути
Иногда дугам графа G сопоставляются (приписываются) чис-ла -- дуге (xt, xj) ставится в соответствие некоторое число с,;-, называемое весом, или длиной, или стоимостью (ценой) дуги. Тогда граф G называется графом со взвешенными дугами. Иногда веса (числа у,) приписываются вершинам xt графа, и тогда полу-чается граф со взвешенными вершинами. Если в графе веса при-писаны и дугам, и вершинам, то он называется просто взвешен-ным.
При рассмотрении пути м, представленного последовательно-стью дуг (ах, а2, . . ., aq), за его вес (или длину, или стоимость) принимается число I(м), равное сумме весов всех дуг, входящих в м, т. е.
Таким образом, когда слова «длина», «стоимость», «цена» и «вес» применяются к дугам, то они эквивалентны по содержанию, и в каждом конкретном случае выбирается такое слово, которое
Рисунок 1.3
ближе подходит по смыслу и совпадает с принятым в литературе. Длиной (или мощностью) пути и. называется число дуг, входя-щих в него.
Петли, ориентированные циклы и циклы
Петлей называется дуга, начальная и конечная вершины кото-рой совпадают. На рис. 1.7, например, дуги а2 и а5 являются пет-лями.
Путь а1, а2, ... , aq называется замкнутым, если в нем начальная вершина дуги а1 совпадает с конечной вершиной дуги аq. Так, например, в графе, приведенном на рис. 1.7, последова-тельности дуг
а3 ,а6, а11, (1.7)
а11 , а3, а4, а7, аi, а12, а9, (1.8)
а3, а4, а7, а10, а9, а11, (1.9)
являются замкнутыми путями.
Пути (1.7) и (1.9) являются замкнутыми простыми орцепями (контурами, или простыми орциклами), поскольку в них одна и та же вершина используется только один раз (за исключением начальной и конечной вершин, которые совпадают), а путь (1.8) не является контуром, так как вершина х1 используется в нем дважды. Контур, проходящий через все вершины графа, имеет особое значение и называется гамилътоновым контуром. Конеч-но, не все графы обладают гамильтоновыми контурами. Так, например, контур (1.9) является гамильтоновым контуром графа, приведенного на рис. 1.7, а граф на рис. 1.6 не имеет гамильтоно-вых контуров, поскольку не существует такой дуги, для которой х1 была бы конечной вершиной.
Замкнутый маршрут является неориентированным двойником замкнутого пути. Таким образом, замкнутый маршрут является маршрутом х1, х2, ... , xq, в котором совпадают начальная и конечная вершины, т. е. в котором хх = xq.
На рис. 1.7 маршруты
a1, а12, а10, (1.10)
а10, а1, а3, а4, а7, а1, а12 (1.11)
являются замкнутыми маршрутами.
2. Алгоритмическая часть
2.1 Применение поставленной задачи
На практике задачу кратчайшего пути часто требуется решать для класса ориентированных ациклических графов.
Допустим, что нужно реализовать некий большой проект, и этот проект состоит из большого числа этапов. Мы можем изобра-зить каждый этап вершиной некоторого графа и построить дугу от вершины xi к вершине xj, чтобы показать, что этап i должен предшествовать этапу j. Каждой дуге приписывается некоторый вес cij, равный минимальной задержке во времени между началом этапа i и началом этапа j. Пусть, например, проект представляет собой процесс строительства здания. Этап i может состоять в строительстве стен, этап j - вставка окон, этап к - прокладка про-водов в стенах и т. д. Очевидно, что в этом случае нужно провести дуги от хi- к xj и от xj к хк. Но минимальный срок между началом строительства стен и вставкой окон может быть отличным от срока между строительством стен и прокладкой проводов. Если, напри-мер, оконные рамы деревянные и стены должны сначала высох-нуть, а для прокладки проводов это не важно,
то cij > cik.
Совершенно очевидно, что рассматриваемый граф будет ориентированным и ациклическим. Действительно, предположение о существовании некоторого цикла, содержащего вершину xt, приводит к (нелепому для нашей задачи) выводу о возможности повторения этапа г.
В задаче требуется найти минимальное время, необходимое для реализации проекта. Иными словами, нужно найти в графе самый длинный путь между вершиной s, изображающей начало, и вершиной t, изображающей завершение всех необходимых для реали-зации проекта работ. Самый длинный путь называется критическим путем, так как этапы, относящиеся к этому пути, определяют полное время реализации проекта и всякая задержка с началом выполнения любого из этих этапов приведет к задержке выполнения проекта в целом.
Сходство этой задачи с задачей о кратчайшем пути между s и t совершенно очевидно и ее можно решить, используя алгоритм приведённый ниже.
2.2 Алгоритм нахождения критического пути в ациклическом орграфе
Пусть вершины пронумерованы так, что дуга (xi, хj) всегда ориентирована от вершины xt к вершине хj, имеющей больший номер. Для ациклического графа такая нумерация всегда воз-можна и производится очень легко. При этом начальная вершина получает номер 1, а конечная -- номер n.
Присвоим вершине xj пометку l(xj),-- равную длине самого длинного пути от 1 до xj, используя для этого соотношения
l(xj) = max [l(xi) + cij]; (*)
Затем присвоим пометку вершине (xj+ 1), применив снова формулу (8.7), и так далее до тех пор, пока последняя вершина п не получит пометку l(п). В соотношении (*) l(1) полагается равным нулю. Если вершина хj помечена, то пометки I(xt) извест-ны для всех вершин xt Г-1 (xj), так как в соответствии со спо-собом нумерации это означает, что xi < xj и, следовательно, вер-шины xi уже помечены в процессе применения алгоритма.
Пометка l(n) равна длине самого длинного пути от 1 до n. Сами дуги, образующие путь, могут быть найдены обычным спо-собом последовательного возвращения. А именно дуга (xi, xj) принадлежит пути тогда и только тогда, когда l(xj) = I (xi) + cij. Начиная с вершины xj равной n, полагаем на каждом шаге xj равной такой вершине xt (скажем, хi*), для которой выполняется это последнее равенство, и так продолжаем до тех пор, пока не бу-дет достигнута начальная вершина (т. е. пока не будет хi* = 1).
Совершенно очевидно, что пометка l (xj) вершины xj дает длиннейший путь от 1 до хj, т. е. самое раннее возможное начало выполнения этапа, изображаемого вершиной xj. Таким образом, если (хi, xj) -- дуга в графе, то I(xi ) -- I(xj) -- cij (неотрицатель-ная величина, как это видно из (*)) дает самое большое возмож-ное время задержки начала этапа i, не оказывающее влияния на время начала этапа j. Из вышесказанного видно, что если i и j -- два последовательные этапа в самом длинном пути, то I (хi) - I (xj) - cij = 0.
3 Описание программы
3.1 Общие сведения
Программа написана на языке Turbo Pascal версии 7.0 Отладка производилась в операционной системе MS Windows ХР с процессором Athlon.
3.2 Функциональное назначение
Программа предназначена для определения критического пути в ациклическом ориентированном графе. Максимальное число вершин обрабатываемого графа может быть не более 30.
Ввод матрицы смежности графа целесообразно задавать в отдельном файле.
3.3 Описание логической структуры программы
Программа состоит из следующих программных файлов:
kurs.exe - главный файл проекта;
graf.txt - текстовый файл, содержащий входные данные (количество вершин графа и матрицу смежности).
Константы:
n0 = 30 - максимальное число вершин обрабатываемого графа.
Переменные:
n - количество вершин в заданном графе;
n - количество вершин в заданном графе;
ves - матрица весов заданного графа;
l - матрица рабочих меток заданного графа;
m - массив для записи пути;
q - вспомогательная переменная;
fl - вспомогательная переменная;
k - количество сильных компонент;
i, j, k, - счетчики.
Процедуры:
Procedure krit - отыскание критического пути в графе.
3.4 Описание входных данных
Входные данные программы:
На первой строке файла с входными данными задано количество вершин графа (n: integer). На последующих строках задана матрица весов графа с соответствующим количеством элементов (n*n), расположенных через разделитель (пробел или конец строки).
3.5 Руководство пользователю
Перед запуском программы kurs.exe необходимо убедиться в том, что файл с корректно введенными исходными данными существует, в противном случае его нужно создать.
После запуска программы появится окно матрицей весов введённой из файла. Если на этом этапе будет обнаружена ошибка (файла не существует на диске или путь к файлу указан не верно), выполнение программы прекратиться. Если же ошибок обнаружено не будет, то пользователь увидит результат работы алгоритма.
3.6 Контрольный пример
Задан ацикличекий ориентированный граф - G(рис. 2.1). Найти критичечкий путь .
Рисунок 2.1
Результат работы программы:
Результат прогона программы нетрудно проверить, построив критический путь по рассмотренному выше алгоритму вручную:
Рисунок 2.2
Заключение
В результате выполнения курсовой работы была разработана программа нахождения критического пути в ориентированным ациклическом графе в соответствии с поставленной задачей. Программа позволяет:
ввод размерности и матрицы весов графа из файла, который может быть подготовлен как человеком, так и другой программой.
интегрирование модуля программы в другие более сложные.
Программа может работать на компьютере не хуже Pentium с операционной системой Windows 9x или с ней совместимой.
Кроме практических результатов при выполнении курсовой работы был изучен теоретический материал по основам теории графов.
Список использованной литературы
1. Белецкая С.Ю. Комбинаторика. Графы. Алгоритмы. Учебное пособие. Воронеж. гос. тех. ун-т, 2003.103с.
2. Кристофидес Н. Теория графов. Алгоритмический подход. - М.: Мир, 1978, -432 с.
3. Марченко А.И., Марченко Л.А. Программирование в среде Turbo Pascal 7.0 - М.:ВЕК+, 2000, - 464 с.:ил.
Листинг программы:
program prog;
uses
SysUtils;
const
n0 = 30;
var
ves : array [1..n0, 1..n0] of integer;
L : array [1..n0, 1..n0] of integer;
M : array [1..n0] of integer;
i,j,fl,n,q, max: integer;
f:text;
Procedure krit;
var k:integer;
begin Max:=0;
for k:=1 to n do
begin
if l[k,i] <> 0 then
begin fl:=fl+1;
if MAX < l[k,i] then
begin
MAX:=l[k,i];
m[i]:=k;
end;
end;
end;
End;
begin
assign(f,'graf.txt');
reset(f);
readln(f,n);
for i:=1 to n do
for j:=1 to n do read(f, ves[i,j]);
close(f);
writeln;
writeln('Matrica vesov zadannogo grafa');
for i:=1 to n do
begin
for j:=1 to n do write (ves[i,j],' ');
writeln;
end;
writeln;
for i:= 1 to n do
begin
for j:= 1 to n do
l[i,j]:=0;
M[i]:= 0;
end;
fl:=0;
for j:= 1 to n do begin
for i:= 1 to n do
begin krit;
if ves[i,j]<>0 then l[i,j]:= ves[i,j] + max;
fl:=0; end
end;
Writeln;
writeln('L');
for i:=1 to n do begin
for j:=1 to n do write(l[i,j],' ');
writeln;
end;
q:=0;
writeln;
writeln ('Kriticheskii put v zadannom grafe:');
write (n,' ');
i:=n;
repeat
write (m[i],' ');
i:=m[i];
until m[i]=0;
writeln;
q:=0;
for j:=1 to n do begin
if q < l[j,n] then q:= l[j,n];
end;
writeln;
Writeln('Dlina kriticheskogo puti = ',q,'.');
readln;
end.
Размещено на аllbest.ru
Подобные документы
История и термины теории графов. Описание алгоритма Дейкстры. Математическое решение проблемы определения кратчайшего расстояния от одной из вершин графа до всех остальных. Разработка программы на объектно-ориентированном языке программирования Delphi 7.
контрольная работа [646,9 K], добавлен 19.01.2016Математические графы, области их применения. Способы раскраски вершин и ребер графов, задачи на их применение. Разработка алгоритма, работающего на основе операций с матрицей смежности. Описание логической структуры программы. Пример зарисовки графа.
курсовая работа [145,5 K], добавлен 27.01.2013Алгоритмы, использующие решение дополнительных подзадач. Основные определения теории графов. Поиск пути между парой вершин невзвешенного графа. Пути минимальной длины во взвешенном графе. Понятие кратчайшего пути для графов с помощью алгоритма Флойда.
реферат [39,6 K], добавлен 06.03.2010Теоретическое обоснование теории графов. Методы нахождения медиан графа. Задача оптимального размещения насосной станции для полива полей. Алгоритм Флойда, поиск суммарного расстояния до вершин. Функция нахождения индекса минимального значения в массиве.
курсовая работа [336,8 K], добавлен 28.05.2016Этапы нахождения хроматического числа произвольного графа. Анализ примеров раскраски графа. Характеристика трудоемкости алгоритма раскраски вершин графа Мейниеля. Особенности графов, удовлетворяющих структуру графов Мейниеля, основные классы графов.
курсовая работа [1,1 M], добавлен 26.06.2012Алгоритм поиска по первому наилучшему совпадению на графе. Основные классы для поиска пути в лабиринте. Тестирование нахождения кратчайшего пути в лабиринте. Порядок обхода вершин. Тестирование поведения программы при отсутствии пути в лабиринте.
курсовая работа [888,7 K], добавлен 19.12.2013Разработка алгоритма реализации на ЭВМ процесса поиска кратчайшего пути в графе методом Дейкстры. Программная реализация алгоритма поиска кратчайшего пути между двумя любыми вершинами графа. Проверка работоспособности программы на тестовых примерах.
реферат [929,8 K], добавлен 23.09.2013Разработка программного продукта для поиска максимально удалённых вершин в графе. Характеристика ориентированного, смешанного и изоморфного графов. Обзор способов представления графа в информатике. Алгоритм поиска пути. Графический интерфейс программы.
курсовая работа [384,0 K], добавлен 10.01.2015Разработка граф-схемы алгоритма раскраски на языке Object Pascal. Формат файла для хранения графов. Выбор удобочитаемых идентификаторов. Переменные, константы, типы, компоненты, процедуры и функции модулей uMain, uInputk, uFiling, uColoring, uHelp.
курсовая работа [1,3 M], добавлен 22.11.2013Изучение основных понятий и определений теории графов. Рассмотрение методов нахождения кратчайших путей между фиксированными вершинами. Представление математического и программного обоснования алгоритма Флойда. Приведение примеров применения программы.
контрольная работа [1,4 M], добавлен 04.07.2011