Научная статья на тему 'Оптимизация невыпуклых функций ускоренным методом секущих углов'

Оптимизация невыпуклых функций ускоренным методом секущих углов Текст научной статьи по специальности «Математика»

CC BY
111
32
i Надоели баннеры? Вы всегда можете отключить рекламу.

Аннотация научной статьи по математике, автор научной работы — Андрамонов М. Ю.

Предлагаются модифицикации метода секущих углов для решения задач нелинейного программи­рования. Алгоритмы применимы к задачам с нелинейными липшицевыми функциями и используют симплициальные разбиения допустимого множества. Алгоритмы позволяют решать задачи невыпук­лого программирования более эффективно. Библиогр. 9 назв.

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Optimizing non-convex functions by the accelerated cutting angle method

The algorithms are constructed to solve problems of nonlinear programming with Lipschitz functions, which use abstract convexity and simplicial division of the feasible set. The algorithms lead to the more efficient solution of non-convex programming problems.

Текст научной работы на тему «Оптимизация невыпуклых функций ускоренным методом секущих углов»

УДК 519.6 Вестник СПбГУ. Сер. 10, 2006, вып. 4

М. Ю. Андрамонов

ОПТИМИЗАЦИЯ НЕВЫПУКЛЫХ ФУНКЦИЙ УСКОРЕННЫМ МЕТОДОМ СЕКУЩИХ УГЛОВ •>

В данной статье изучается ряд методов глобальной оптимизации невыпуклых функций. Такие задачи широко распространены в экономике и инженерии. Предлагается обобщение алгоритма, являющееся по существу методом ветвления и отсечения (см. [1]). Реально предложенные методы использованы для решения сложных инженерных задач и доказали свои преимущества по отношению к известным алгоритмам глобальной оптимизации.

Рассмотрим следующую задачу глобальной оптимизации:

max f(x),x G X,

в которой X - нормальное множество из IR+ и / - возрастающая непрерывная функция. Напомним, что функция / называется возрастающей, если

/(*) Z f(y),

когда х ^ у, где ж, у € IR+, т. е. ж; ^ yi для всех г от 1 до п. Множество Q С IR" называется нормальным, если из х € Q, у ^ х следует у € Q. Обозначим

п г= 1

единичный симплекс в IR". Алгоритм, который опишем ниже, использует разбиения единичного симплекса. Если

S = Si U S2 U ... U Sm,

где Si = со {v{, vl2, ■ ■ ■, vln} и uj G IR" для всех i = 1, m и всех j = 1, n, будем говорить, что Р = {Si, S2,. • ■, Sm} есть разбиение S. Если также Si П Sj = 0 при i ф j, будем говорить, что Р есть правильное разбиение S.

Пусть Si - произвольный симплекс на S. Обозначим m(Sj) его центр (сумму вершин, деленную на п). Для произвольного симплекса V примем

K(V) = cone (V) П1 = {а;б1: х — Ху, у £ У, А ^ 0}.

Для каждых х, у G X

тах(ж,у) = {z £ : Z{ = max (Xi,yi) Mi = 1 ,n}.

Здесь используем те же обозначения, если в скобках более двух векторов (так, ma x(x,y,z) — тах(тах(ж,у),^)).

Преобразование допустимого множества задачи липшицева программирования. Напомним метод секущих углов из [2, 3].

Работа выполнена при финансовой поддержке Российского фонда фундаментальных исследований (проект № 06-01-00276). © М. Ю. Андрамонов, 2006

Рассмотрим следующую задачу математического программирования:

min f{x), д(х) < 0, х ^ О,

в которой /, д - липшицевы функции на Ш™. Есть по крайней мере две возможности преобразования задачи липшицева программирования. Предположим, что задача оптимизации имеет вид

min f(x),

д(х) ^ 0, (1)

О ^ х ^ С,

здесь С > 0 - верхняя оценка для переменных. Тогда, введя дополнительные переменные Xi _

2/1 = 77-7— Vi = l,n, Сп + q

где q > 0, и добавив новую переменную yn+i, можно переписать (1):

min f({Cn + q)y), д({Сп + q)y) ^ О,

О ^ Уг < 7Т~Г~ Vz = М, (2)

Сп + q

п+1

^Уг = 1,

¿=1 Уп+1 > 0.

Допустимое множество задачи (2) принадлежит единичному симплексу й1. Значение q подбирается экпериментально, можно выбрать q = С.

Схема метода секущих углов для минимизации липшицевых функций. Рассмотрим задачу липшицева программирования в таком виде:

(/ \ \ п+1 п+1

М + / —Ь— уг)р,д(у) < 0, у, = 1, у > 0.

Уг) ) ¿=1 г=1

Метод секущих углов для липшицевых функций.

Шаг 0. Полагаем к := 0. Выбираем произвольно допустимую точку уо £ Б и параметры М > 0, р > 0.

Шаг 1. Вычисляем вектор 4 с координатами 4^

р{[{ук) + М)

4г =-, если ук1 ф 0; 4г = о, если уы = 0,

Уы

где у кг - ¿-я координата вектора у к ■ Шаг 2. Определяем функцию Кк

М2/) = (4,2/} + (1-р)(/(г/) + М).

Шаг 3. Находим глобальный оптимум задачи

шах НЛу) min,

yes, д(у) ^ о.

Это задача минимизации максимума кусочно-линейных функций. Пусть у* - ее решение.

Шаг 4- Полагаем к к + 1, yk '■— у* и возвращаемся к шагу 1.

В данной работе мы развиваем метод секущих углов и улучшаем его благодаря ветвлению и отсечению неоптимальных точек. При достаточно больших М,р метод сходится. Константа М выбирается таким образом, чтобы целевая функция стала положительной; параметр р - из соотношения р > 2L/M (где L - константа Липшица функции), полученного в [2].

Предположим, что можно определить, является ли целевая функция выпуклой или вогнутой на симплексе. Оказалось, что во многих случаях это возможно, используя явное выражение функции или константу Липшица для вторых производных по направлениям. Такая задача решается также методами квазидифференциального исчисления Демьянова-Рубинова [1]. Для простоты положим X = S. Пусть целевая функция минимизируется.

Симплициальный метод ветвления и отсечения.

Шаг 1. Полагаем к := 0. Выбираем начальную точку хо 6 S и начальное разбиение Ро. Вычисляем D(S) как верхнюю оценку числа стационарных точек на S. Полагаем D :— 0, где D - количество найденных стационарных точек.

Шаг 2. Полагаем xr := хо, fr f(xо).

Шаг 3. Разбиение Рк может быть представлено как

Pk = {Vk\V¿,...,V¿>°}. Для каждого симплекса V¿ определяем

/та ^ fix) Мхе K{V¿),

/та - дтта),

/та^/(х) Мх G K(V¿).

Шаг Вычисляем f(V¿) = max/(V¿), г =

Шаг 5. Если fr ^ f(Yk), СТОП, хг - оптимальная точка. Иначе переходим к шагу 6.

Шаг 6. Если / выпукла на , то находим ее минимум х* на V¿ (методом выпуклого программирования). Полагаем у := х*. Если f(x*) > fr, то fr :— f(x*),xr := х*. Удаляем V¿ из Pk и переходим к шагу 9.

Шаг 7. Если / вогнута на V¿, находим ее минимум х* на (методом выпуклого программирования). Полагаем у := х*. Если f(x*) > fr, то fr := f(x*),xr :— ж*. Удаляем V¿ из Pk и переходим к шагу 9.

Шаг 8. Находим стационарную точку у € V¿. Если /(у) > /г, то /г := f(y),xr у.

Шаг 9. Для каждого симплекса V¿ проводим сравнение /(Vfcl) ^ /г. Если неравенство выполняется, удаляем V¿ из Рк.

Шаг 10. Если Р% = 0, СТОП, так как хг - оптимальное решение. Если Vj1 было удалено из Pk, то вернуться к шагу 3 с Pk+i Pk\W, к := к + 1, где W - множество удаленных симплексов. Иначе разбиваем множество Vj!. Полагаем

vi = vx* и у; и... и v;.

Тогда

Pk+i '■=

i= 1

Полагаем к := к + 1 и переходим к шагу 3.

Критерием останова является пустота набора симплексов или достаточно малая разность между верхними и нижними оценками целевой функции.

Данный алгоритм имеет ряд преимуществ. Прежде всего он обеспечивает сокращение числа симплексов в разбиении (это стандартная процедура в методах ветвления и отсечения). Далее, возможно вставить методы локальной оптимизации в поиск глобального максимума (шаги 6, 7), так как вблизи глобального максимума они более эффективны. Более того, верхние оценки позволяют узнать точность наилучшего найденного решения.

Вычисление нижних оценок, вообще говоря, трудное.

1. Если X = S, можно положить f(Sj) — f(max(wi,w2,... ,wn)), где Wi - вершины симплекса Sj.

2. Пусть / - ii-выпуклая функция (см. [3-5]), т. е.

/(&) =

где h(x) - некоторые простые функции; Н - замкнутое множество. Тогда положим

Hs(x) = max{/ii(x),/i2(x),... ,hs(x)},

где / абстрактно выпукла по отношению к каждой hi. Теперь, чтобы найти нижнюю оценку, достаточно определить минимум Hs{x) на множестве K{Sf) для каждого г. Это означает, что следует применить метод секущих углов.

Очевидно, можно использовать методы локального поиска для всех симплексов разбиения (не только Vj}, а всех Vfcl). Установим сходимость алгоритма. Теорема. Пусть выполняются следующие предположения:

1) глобальный оптимум х* единствен, разбиение Pk - правильное разбиение для каждого к;

2) целевая функция / локально выпукла или локально вогнута в окрестности х*;

3) на шаге 10 имеем

diam (V*) ^ 7diam (V}fc), i = T^q, 7 < 1.

Тогда решение х* будет найдено за конечное число итераций.

Доказательство. По условиям теоремы диаметр Vf стремится к нулю. Покажем вначале, что множества V^fc будут содержать х* бесконечно много раз. Пусть Pk - текущее разбиение и W - множество симплексов в нем, содержащих х*. Обозначим

р = (Г - sup /(*))/2. xex\K(W)

Это значение положительно, так как / непрерывна и по предположению 1. Пусть Ук £ Ш - другой симплекс из РБез ограничения общности можно считать, что сНат Ук ^ 6, где 5 > 0 может быть произвольно мало. Тогда имеем

+ УжеУД \fw.ew

для <5 = 5\{&). Следовательно, симплекс из 1V дает наибольшую верхнюю оценку, и он будет выбран как Ук для некоторого к.

По предположению 2 множество Ук будет принадлежать окрестности Ве точки ж*, где / выпукла или вогнута, для некоторого к = к*. Но это означает, что оптимальное решение будет найдено на шаге 6 или 7 на итерации к*. Теорема доказана. Алгоритм лучшей оценки.

Шаг 0. Выбираем начальное разбиение Ро допустимого множества X = 5. Полагаем к :— 0.

Шаг 1. Пусть Р^ = , 5|, • • ■, }, где X Э Ц^Д Бк. Для каждого множества Ягк выбираем конечное множество точек Хк С Бк.

Шаг 2. Для каждого множества Хк вычисляем элементы кк(у), т. е. миноранты из метода секущих углов, где у принимает всевозможные значения в Хк. Полагаем

Ц = ша хЛ?(у). у ех?

Шаг 3. Минимизируем каждую функцию Кк на множестве Бк. Полагаем

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

Ьи = пип ^(ж).

Шаг 4- Вычисляем = тт; }гк. Шаг 5. Разбиваем множество Бк. Пусть

Бк = §ки§к.

Тогда

рк+1 :=рк\{3}}и§ки§к.

Шаг 6. Для каждого множества Хк и всех у 6 Хк вычисляем /(у). Полагаем / = пппу /(у), т. е. / - значение целевой функции в наилучшей найденной точке. Шаг 7. Удаляем из разбиения все множества Бк, для которых Кк ^ /. Шаг 8. Полагаем к := к + 1 и возвращаемся к шагу 1.

Есть по крайней мере две возможности разбиения множества Бк. Предположим, что допустимое множество выпукло.

а. Пусть - произвольное выпуклое множество. Рассмотрим задачу

Л —> тах, х ± € Бк, г — 1 , п, хеБк.

Пусть (ж, А) - решение этой задачи. Определим гиперплоскость {х : (а,х) = (а, ж)}, где а е Ш^, ||а|| = 1. Тогда разбиение определяется следующим образом:

§к — Бк П {х : (а, х) «С (а, ж)},

§к = П {х : (а, ж) ^ (а, ж)}, в. Пусть - многогранник, т. е. := со^г^. Вычислим

1К - и« II = пгах ||г>,- - г^Ц.

Пусть но = (иг + у8)/2. Выберем вектор 6, ||Ь|| = 1. Положим

5* = 5^П{х:(Ь,х) ^ (6,и;)},

= ^П{ж: (6, ж) ^ (Ь,и>)}.

Допустим, что выполняются следующие условия:

1) на каждой итерации к

(Пат (Бк) <: 71 (Пат (5^), (3)

Нат(5/г) < 72с11ат(5|) (4)

для 0 < 71,72 < 1;

2) все абстрактные субградиенты непрерывны.

Тогда сНат ^ е для некоторого к. Минимальное значение максимума абстрактных субградиентов на не превосходит /*. Поэтому, в силу непрерывности и абстрактной выпуклости /, можно найти глобальный минимум с любой заранее заданной точностью. Действительно, для некоторой точки у е получаем

/(У) = Л}(уКЛ}(Х) + ^/* + *,

где х - точка из 5*, в которой достигается минимум . Мы имеем 6 > 0, и 6 может стать сколь угодно малым при уменьшении е.

Для повышения эффективности (число множеств в Рк может стать очень большим) полезно использовать гибридные методы, сочетая ветвление с локальной оптимизацией. Метод ветвей и границ с локальной оптимизацией. Шаг 0. Полагаем к := 0. Выбираем начальное разбиение Ро. Шаг 1. Пусть Рк = ..., }.

Шаг 2. Для каждой точки хк вычисляем /(ж^) и элементы £ М{х\). Шаг 3. Для каждого г рассчитываем

у\ = Агё ттхе3,кк(х).

Шаг 4■ Пусть ^ ^(у1-) для всех г. Разбиваем множество = и §!■.

Полагаем Рк+1 := Рк\} и {§} } и {§}}.

Шаг 5. Полагаем к := к + 1 и возвращаемся к шагу 1.

Если значение (у¿) больше, чем /(хк) или /(у^) для некоторого I ф г, множество может быть удалено из разбиения, так как оно не содержит глобальный минимум. Также, если /(ж) выпукла на Б? (или - симплекс, и /(ж) вогнута на нем), можно найти х\ как глобальный минимум /(ж) на 5* и удалить из разбиения.

Предположим, что существует окрестность глобального оптимума такая, что метод локального поиска находит глобальный оптимум, стартуя из любой точки жо €

Пусть также выполнены неравенства (3), (4). Тогда, если диаметры симплексов становятся достаточно малы, точка из As, следовательно, и глобальный оптимум будут определены за конечное число итераций. Различные структурированные задачи глобальной оптимизации были решены эффективно этой техникой (см. [6]).

Подзадача в методе секущих углов сложна для решения. Предлагается подход к решению подзадачи, основанный на дизъюнктивном программировании (см. [6-9]).

Задача с функциями типа минимума. Пусть р, q - векторы из И" + = {л 6 1R" : Xi > 0 Vi = 1, п}. Пусть также

(p,q) = min piqi.

г

Рассматривается задача вида

min max {(Ii ,х) + bi},

i=l, Jfe

Ax ^ d, 0 ^ x ^ m,

где A - матрица размерности mxn; G IR.++; b G Hfc; m G IRn; d G lRm. Она возникает, в частности, в методе секущих углов (см. [2, 3]). Представим задачу в следующем виде:

mini,

(k,x) + bi^t, i = l,k, (5)

Ax ^ d, 0 ^ x ^ m.

Можно решать задачу (5) непосредственно или применяя дихотомию по отношению к t. Пусть N = {1,2,..., N}. Задачу(5) можно записать так:

max(-t), (6)

VjGAr (hjXj - t) ^ -bi, i = l,k,

Ax ^ d, 0 ^ x ^ m,

где V - логическое ИЛИ.

Алгоритм дизъюнктивного программирования. Улучшим алгоритм из [7] для

задач дизъюнктивного программирования рассмотренных подзадач. Пусть решается задача

max 53 CjXj, jeN

53 aijxj ^ bi, i G M, (7)

jeN

0 ^ xj ^ rrij, j G N,

Мгео, ^ а1зх0 Ог, I € Ь.

Обозначим щ = ^2jeNrnjafj - Ьг для всех г. Здесь — тах{ау,0}.

Релаксация задачи (7), которая получается заменой каждой дизъюнкции ее суррогатом, имеет вид

тах ^

^а^ж/Ог, г е М,

jeN

О ^ Xj тп^ ] € N,

(8)

и,

¿6А 1 jeN

г<ЕА

здесь ¿1 = - число элементов I)/. Последнее ограничение называется суррогатом дизъюнкции, соответствующей множеству индексов I)/. Двойственная задача к (8) следующая:

тт

ш £ № + ^ + !, - 1 + £

г€М

jeN

1еь

¿е£>/

(9)

]Г а^Уг + + ^ (—)ау ^ с^ ie^v,Ie ь. гем ¿€£>1

Здесь <3г - двойственные оценки для дизъюнкции с множеством индексов Д.

Пусть матрицы имеют п общих членов, соответствующих верхним границам т^, и одно произвольное ограничение. Каждый член дизъюнкции тогда предстанет в виде

Х1 ^ тз > С А^,

YljeN аг]х] ^

где г Е И. Квадратная скобка означает, что хотя бы одно ограничение должно выполняться. Пусть

Фг = ^-—г--

¿^'еЛГ aijrnj °г Если знаменатель отрицателен, вместо этого вычисляем

1

Фг =

Положим

Пусть также

а,- = тах(а^фг), ] € Ж

- а,- - а^фг, ] е ЛГ, % е £>,

¡3 — тах( > + фф{).

Суррогатное ограничение в этом случае ах ^ (3. Таких ограничений вначале I.

Алгоритм решения задач дизъюнктивного программирования.

Шаг 0. Строится релаксация исходной задачи заменой каждой дизъюнкции ее суррогатом. Множество U нерешенных задач вначале состоит из одной этой задачи. Полагается BEST = — оо.

Выполняются предписания шагов 1-3, пока U не станет пусто.

Шаг 1. Выбирается задача Р из U, удаляется из U и решается как задача линейного программирования. Обозначим ее оптимальное значение z (z = —оо, если задача недопустима).

Шаг 2. Если z > BEST и получено решение исходной задачи, полагается BEST = z, и решение запоминается.

Шаг 3. Если г > BEST, но решение не является решением исходной задачи, выбираем дизъюнкцию и ее члены и добавляем к U задачи, полученные заменой этой дизъюнкции одним из ее членов.

Шаг 4■ Оптимальное решение - последнее из запомненных на шаге 2.

В алгоритме две основные проблемы. Первая из них - выбор задачи Р (см. ниже), вторая - выбор дизъюнкции на шаге 3. Предлагалось вычислять недопустимость дизъюнкций по формуле

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

и выбирать дизъюнкцию с наибольшей недопустимостью.

Другие подходы - выбор дизъюнкции с наибольшим абсолютным значением двойственной оценки ф1 или с наименьшей невязкой суррогатного ограничения. В одной из модификаций метода член дизъюнкции с минимальным значением ^ а^х — Ъ^ заме-

jeN

няет суррогатное ограничение.

По нашему мнению, необходимы некоторые уточнения и видоизменения алгоритма, описанного выше. Отметим, что такая необходимость подтверждена результатами численных экспериментов.

Пусть П - множество решенных линейных задач. Каждая задача характеризуется вектором

где к - число итераций. Существуют следующие возможности для каждого Уг:

1) Уг = 5, что означает, что суррогатное ограничение заменяет дизъюнкцию г;

2)Уг = т, что означает, что т-й член дизъюнкции г заменяет ее. Определение. Множество задач называется полным, если, заменяя буквы 5

в каждой задаче всевозможными номерами членов соответствующих дизъюнкций, определяем все задачи, которые можно получить заменой некоторых дизъюнкций их членами.

В методе будем поддерживать полные множества задач. Каждая задача имеет такие свойства и значения:

1) допустима/недопустима;

2) оптимальное значение Zj■,

3) невязки суррогатных ограничений;

4) невязки ограничений, являющихся членами дизъюнкций;

5) двойственные оценки.

Пусть оптимальное дизъюнктивное решение неизвестно, множество и полное, и необходимо выбрать новую задачу для решения.

Первая возможность - выбрать решенную задачу с наибольшим Zj (на первой итерации можно решить любую задачу). Затем выбираются дизъюнкция с наибольшей недопустимостью и член дизъюнкции с минимальной невязкой. Если полученная задача уже в ft, выбирается член со второй в порядке возрастания невязкой из той же дизъюнкции, и т. д. Если рассмотрены все члены и все полученные задачи уже в ft, выбирается дизъюнкция со второй в порядке убывания недопустимостью, и т. д.

Желательно ограничить число шагов, на котором рассматривается задача с наибольшим Zj. Если, решив К > О задач, где К - параметр, не получаем дизъюнктивное решение с z > BEST, берем задачу со вторым по убыванию оптимальным значением. Все задачи в (Л могут быть недопустимы. Тогда предлагается рассматривать задачу с минимальной из максимальных невязок ограничений.

Другая возможность - выбирать задачу с наименьшим числом суррогатных ограничений. Если для двух и более задач такие числа равны, выбирается задача с наибольшим Zj из них. Это упорядочивает задачи из ft некоторым образом. Есть следующие случаи:

1) получена задача с Y\ ф S для всех г. Запоминаем ее оптимальное решение и больше ее не рассматриваем;

2) после М > 0 итераций, на каждой из которых число суррогатных ограничений сокращалось, мы не получили дизъюнктивное решение с z > BEST. Тогда выбираем новую задачу из списка, согласно нашему упорядочению. Если в дальнейшем критерий выбора дизъюнкции или ее члена дает задачу из fl, выбирается следующая по значению критерия дизъюнкция или член;

3) после некоторого числа итераций обнаруживается, что полученная линейная задача недопустима. Тогда поступаем, как во втором случае. Однако, если все задачи из Q недопустимы, выбирается задача с наименьшей из наибольших невязок ограничений.

Изучим, какие суррогатные ограничения получаются для задач (5) и (6) при применении двух описанных выше подходов. Пусть тп+\ - верхняя граница для t (предположим, что она известна).

В первом подходе (см. задачу (8)), как легко видеть, для задачи (5) получаем суррогатное ограничение вида

В результате оценки для целевой функции вычисляются достаточно несложно.

Andramonov M. Yu. Optimizing non-convex functions by the accelerated cutting angle method.

The algorithms are constructed to solve problems of nonlinear programming with Lipschitz functions, which use abstract convexity and simplicial division of the feasible set. The algorithms lead to the more efficient solution of non-convex programming problems.

где Бк = и щ- ггц1кг + к + тп+1.

Для задачи (6) имеем следующее суррогатное ограничение:

Summary

Литература

1. Demyanov V. F., Rubinov A. M. Constructive non-smooth analysis. Frankfurt: Peter Lang, 1995. 500 p.

2. Rubinov A.M., Andramonov M. Yu. Lipschitz programming via increasing convex-along-rays functions // Optimization Methods and Software. 1999. Vol. 10. P. 763-791.

3. Pallaschke D., Rolewicz S. Foundations of mathematical optimization. Dordrecht: Kluwer Academic Publ., 1997. 582 p.

4. Rubinov A.M. Abstract convexity and global optimization. Dordrecht: Kluwer Academic Publ., 2000. 400 p.

5. Кутателадзе С. С., Рубинов А. М. 'Двойственность Минковского и ее приложения. Новосибирск: Наука, 1976. 254 с.

6. Андрамонов М. Ю. Методы глобальной оптимизации для некоторых классов обобщенно выпуклых функций. Казань: ДАС, 2001. 198 с.

7. Beaumont F. Algorithm for disjunctive programming problems // Europ. J. of Operational Research. 1990. Vol. 48, N 3. P. 363-371.

8. В alas E., Tama J., Tind J. Sequential convexification in reverse convex and disjunctive programming // Mathematical Programming. 1989. Vol. 44, N 3. P. 337-350.

9. Balas E. Disjunctive programming // Annals of Discrete Mathematics. 1979. N 5. P. 3-51.

Статья представлена к публикации членом редколлегии В. Ф. Демьяновым.

Статья поступила в редакцию 7 июня 2006 г.

i Надоели баннеры? Вы всегда можете отключить рекламу.