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

УДК 519.2

О НУМЕРАЦИИ ПЕРЕСТАНОВОК И СОЧЕТАНИЙ ДЛЯ ОРГАНИЗАЦИИ ПАРАЛЛЕЛЬНЫХ ВЫЧИСЛЕНИЙ В ЗАДАЧАХ ПРОЕКТИРОВАНИЯ УПРАВЛЯЮЩИХ СИСТЕМ

Н.Е. Тимошевская

Томский государственный университет E-mail: timnat@mail.isc.tsu.ru

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

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

Генерация перестановок

Рассматриваются перестановки (а1,.,ап) из элементов множества #={1,2,...,«}, т.е. перестановки степени п. Известен алгоритм генерации (перечисления) всех перестановок в лексикографическом порядке [1], т.е. так, что перестановка (а1,.,ап) предшествует перестановке (ЬьЬ2,...,Ьп), если для некоторого г, 1<г<п, имеет место а1=Ь1, а2=Ь2,...,а;=Ь; и а;+1<Ь;+1. Генерация выполняется путем преобразования текущей перестановки к следующей. Например, перестановки степени 3 перечисляются в следующем порядке: 123, 132, 213, 231, 312, 321.

Назовем индексом перестановки ее порядковый номер I в последовательности всех перестановок степени п, расположенных в лексикографическом порядке, 1<1<«!. Рассматриваются задача вычисления индекса заданной перестановки и обратная ей -задача построения перестановки по ее индексу. Первую можно решить путем перечисления и последовательной нумерации перестановок до тех пор, пока не будет получена заданная перестановка, что крайне неэффективно. Предлагается вычислять индекс I перестановки (а1,.,ап) по следующей формуле

I = (§ (а'- 1)(п - 0!) + (- (п - 2)),

где а/=а;+к и к - есть количество элементов а таких, что а,>а; и ]< г.

Пример. Пусть п=4, (а1,.,а4)=(2,3,1,4). Тогда: (а[ ,а2' ,а3',а4' )=(2,3,3,4), 1=(2-1)3!+(3-2)2!+(3-2)=9.

Покажем каким образом перестановку можно построить по ее индексу. Пусть 0<<п и А=(а1, ..., а) есть префикс перестановки с индексом I. Обозначим I, число перестановок, предшествующих всем перестановкам с префиксом А, и положим М,=1-1 . Назовем М1 кратностью префикса А. По определению М0=1 и М1 есть число перестановок с префиксом А, индексы которых не превосходят I. Пусть }={У1,...,Уп-,+1}=ЛЧа1,...,ан} и У1<...<Уп-,+1. Тогда по свойству перестановки а,е У Допустим, что а=ук, 1<к<п-,+1. Тогда А=(а1,...,а, 1,ук) и 1+(к-1)(п-1)!, поэтому МгЫг-^-кАХпАУ^М^-к-Щп-,)!. Таким образом, зная индекс перестановки и любой ее префикс, можно вычислить кратность последнего.

Теорема 1. Пусть 1<,<п-1, (а1,...,а,-1) - префикс перестановки с индексом I и М-1 - его кратность. Пусть также {yl,...,yn-t+l}=N-{al,...,at-l} и У1<...<Уп-ц. Тогда ,-й элемент а, в перестановке с индексом I есть ук для

k =

Mt-1 + (n -1)!-1

(n -1)!

Доказательство. Пусть Ск для 1<к<п-,+ 1 есть множество всех перестановок с префиксом А=(а1,...,а-1,ук). Число перестановок в нем |Ск|=(п—,)!. Ввиду ук<ук+1 все перестановки в Ск предшествуют всем перестановкам в Ск+1. Множества С1,С2, ...,Сп-,+1 образуют разбиение множества всех перестановок с префиксом (а1,...,а,-1), и перестановка с индексом I входит в одно из них. Пусть / обозначает число всех перестановок, предшествующих перестановкам с этим префиксом. Тогда М^^, и индексы всех перестановок в Ск суть /+(к-1)(п-,)!+1, /+(к-1)х х(п-/)!+2,...,/+к(п-0!+1. При (к-1)(п-0!+1< <M—1<k(n-t)! перестановка с индексом Iвходит в Ск и а=ук. Прибавив ко всем частям последнего неравенства величину (п-,)!-1, получим (к-1)(п-,)!+ +(n-t)!<M—1+(n-t)\-1<k(n-t)!+(n-t)!-1, или к(п-,)!< <M—1+(n-t)!-1<(k-1)(n-t)l, откуда

, М,, + (п - Л!-1 , ,

к < ,-1 К--— < к +1.

(п -,)!

i=i

Естественные науки

Следовательно, к =

M, _ + (n -t )!-1 (n -1 )!

Теорема 1 доказана.

При известном префиксе (а1,...,а„_1) перестановки с индексом I ее последний член находится как единственный элемент множества N-{a1,...,an-1}.

Пример. Пусть и=4. Построим перестановку (аь a2, а3, a4) по индексу I=9. !=1: М0=9, Г={1, 2, 3, 4}, к=2; следовательно, a1=2. t=2: М1=М0-{к-1)(и-1)!=3; 7={1, 3, 4}, к=2; следовательно, a2=3. !=3: М2=М-(к-1)(и-2)!=1; 7={1, 4}, k=1; следовательно, а3=1. t=4: Г={4}; следовательно, a4=4.

В результате получаем перестановку (2, 3, 1, 4).

Данный метод вычисления перестановки (a1,...,an) по ее индексу I можно выразить следующим алгоритмом.

Алгоритм 1

1. !=1; (л у2...у}= (1 2...и). ^

I + (п - /)!-1

2. Если t=n, то п. 5; иначе к =

(n _ t )!

3. at=yk; (yi-y„-t)=(yi-yk-1yk+i-y„-t+i);

4. I=I-(k-1)(n-t)!; t=t+1 перейти к п. 2.

5. аn=yi.

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

Пусть требуется построить все перестановки степени n на однородной многопроцессорной вычислительной системе, состоящей из p одинаковых процессоров с общей или распределенной памятью. Максимальную загруженность процессоров можно обеспечить, разделив последовательность всех перестановок на блоки по s=[n!/p] элементов в каждом. Блок с номером m начинается с перестановки, соответствующей индексу I=s(m-1)+1, и генерация перестановок в нем возлагается на m-й процессор. Если число всех перестановок не кратно p, то процессор, генерирующий перестановки последнего блока, строит также (n! mod p) оставшихся перестановок, число которых меньше p. При выполнении этого алгоритма отсутствует взаимодействие между процессорами, и все процессоры одинаково загружены, что позволяет добиться ускорения (величина, показывающая, во сколько раз параллельный алгоритм работает быстрее последовательного) близкого к p.

Описанный параллельный алгоритм обладает высокой эффективностью благодаря пропорциональному распределению вычислений и отсутствию обменов данными между процессорами.

Предложенный алгоритм был реализован с помощью технологии параллельного программирования MPI (Message Passing Interface), предназначенной для организации параллельных вычислений в системах с распределенной памятью, и исследован в эксперименте на однородной многопроцессорной системе кластерного типа. На рис. 1 представлены результаты вычислительного эксперимента, из которых следует, что средняя эффективность использования системы алгоритмом равна 0,94.

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 число процессоров

Рис. 1. Ускорение для алгоритма параллельной генерации перестановок степени п, достигаемое при использовании 2, 3,..., 16 процессоров

Генерация сочетаний

Здесь под сочетанием понимается всякое упорядоченное по возрастанию к-элементное подмножество и-элементного множества N={1, 2, ..., и}, т.е. любой такой вектор (Ъ1, Ъ2, ..., Ьк) длины к<и с компонентами в N называемый также сочетанием из и по к, в котором Ъ<<Ъ++1 для г=1, ..., к-1. В [2] описан алгоритм генерации сочетаний, в котором сочетания порождаются в лексикографическом порядке, т.е. так, что сочетание (Ъь Ъ2, ..., Ък) предшествует сочетанию (а;, а2, ..., ак), если для некоторого г, 1<г<к, имеет место Ъ1=а1, Ъ2=а2, ..., Ъ=а1 и Ъ;+1<а;+1. Например, все сочетания из 5 по 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).

Индексом сочетания назовем порядковый номер I этого сочетания в последовательности всех сочетаний, расположенных в лексикографическом порядке, ККСк. Индекс Iсочетания (Ъь Ъ2, ..., Ък) из и по к может быть вычислен по следующей формуле:

I = 1+i i en

где Ъ0 = 0 и C0_j = 1.

1=1 j =Ъм+1

Пример. Вычислим индекс сочетания (2, 4, 5) из 5 по 3.

I = 1+ § с2 + § С1 + § С0 = 1+ 6+ 2+ 0= 9.

;=0+1 ]= 2+1 ]= 4+1

Рассмотрим теперь, как сочетание (Ъ1,Ъ2,.,Ък) строится по его номеру I. Пусть1<!<к и 0=Ъ0<Ъ1<Ъ2<...<Ън. Для любого ] в {Ъя+1,Ъя+2,..., п-к+!}, через з! обозначим число всех сочетаний с

16

14

8

2

0

префиксами (Ь1,Ь2,...,Ь-1,г), где г£{Ьt-1+1,Ьt-1+4,...j-i}. В каждом из этих сочетаний недостающие к- элементов берутся из п-г элементов г+1,...,п, поэтому

5/= ^ С^'г. Положим также 5= ^. Это есть чис-

г=Ь1-1 + 1 1=1

ло всех сочетаний с префиксами (Ь1,Ь2,...,Ь-1,а) для ¡<¡-1 и а;<Ь;, то есть всех сочетаний, предшествующих сочетаниям с префиксом (ЬЬЬ2,...,ЬН).

Теорема 2. Пусть 1<,<к и (ЬьЬ2,...,Ьн) есть префикс сочетания с индексом /; тогда ,-й элемент Ь, этого сочетания равен наименьшему из таких /', что Ь-1</<п-к+, и /<5+5/+1, если такие ' существуют, и Ь=п-к+, в противном случае.

Доказательство. Для любого /', где Ь-1</<п-к+,, введем 1=5+5/. По определению 5 и я- есть число всех сочетаний, предшествующих сочетаниям с префиксом (Ь1,Ь2,...,Ь,-1^), т.е. I является индексом последнего сочетания с префиксом (Ь1,Ь2,...,Ь,-1,/-1), а - индексом последнего сочетания с префиксом (ЬЬЬ2,...,ЬН/). Рассмотрим возможные случаи, имея в виду, что Ь-1<Ь <п-к+,.

1. Не существует такого /', что Ь-1</<п-к+,. Тогда Ь=п-к+,.

2. Для всех/', где Ь-1<'<п-к+,, имеет место / >1Ч. В этом случае Ь,>'' для всякого ' в границах Ь!А<)<п-к+, и потому Ь=п-к+,.

3. Существуют ' с ограничениями Ь-1<)<п-к+, и /<!+1. Для любого из них Ь^. Возьмем наименьшее '' из такихТогда и Ь^''. Следовательно, Ь=''. Теорема 2 доказана.

Пример. Построим сочетание из 5 по 3 с индексом 1=9.

,=1: 5=0; '=1, ^+=1=6, 5+5]+1=6<7; '=2, ^=9,

5+5]+1=9>/; следовательно, Ь1=2. ,=2: 5=52=6; '=3, 5]+1=542=2, 5 +5]+1=8<7; ]=4=п-к+,; следовательно, Ь2=4.

,=3: не существует ' для 4=Ь(-1<у'<п-к+,=5, поэтому Ь3=п-к+¡=5.

В результате получаем сочетание (2, 4, 5). Данный метод вычисления сочетания из п по к по его индексу I можно выразить следующим алгоритмом.

Алгоритм 2

1. Ь0=0, 5=0, ¡=1.

2. 3.

4

5 6.

Если ,<к, то п. 3, иначе п. 8. ]=Ь,-1+1.

Если'<п-к+, и 5+ С-<1, то п. 5, иначе п. 6. з=и+С-;'='+1; п. 4.

ь=;

¡=,+ 1; п. 2.

Параллельная генерация сочетаний осуществляется так же, как и перестановок, а именно: все множество сочетаний делится на блоки, мощности которых отвечают производительности процессоров в системе; в каждом блоке по алгоритму 2 с помощью индекса вычисляется первое сочетание, начиная с которого один из процессоров системы генерирует сочетания всего блока. Как и в случае перестановок, благодаря пропорциональному распределению вычислений и отсутствию обменов данными между процессорами, параллельный алгоритм обладает высокой эффективностью.

Результаты эксперимента представлены на рис. 2, где изображен график усредненного значения ускорения, полученного в примерах со следующими параметрами: п=30, к=15; п=40, к=10; п=40, к=15; п=40, к=30; п=50, к=10; п=50, к=40; п=100, к=6; п=100, к=94. Средняя эффективность использования системы (отношение ускорения к числу процессов) равна 0,87.

2 3 4 5

6 7 8 9 10 11 12 13 14 15 16 число процессоров

8. (Ь1, ..., Ьк) - искомое сочетание.

Рис. 2. Среднее ускорение для алгоритма параллельной генерации сочетаний, достигаемое при использовании 2, 3,.., 16 процессоров

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

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

СПИСОК ЛИТЕРАТУРЫ

1. Дейкстра Э. Дисциплина программирования. - М.: Мир, 1978. -280 с.

Липский В. Комбинаторика для программистов. - М.: Мир, 1988. -200 с.

16

14

12

о 10

л 8

6

4

2

0