УДК 658.512.011:681.326:519.713
С.В. ЧУМА ЧЕНКО, В.И. ХАХАНОВ, МУРАД АЛИ АББАС, О.А. ГОРОБЕЦ
ГЕНЕРИРОВАНИЕ БУЛЕАНА ДЛЯ СИНТЕЗА КВАНТОВОГО ПРОЦЕССОРА
Предлагаются кубитные (квантовые) структуры данных и вычислительных процессов для существенного повышения быстродействия при решении задач дискретной оптимизации. Анализируются работы по генерированию булеана, как существенного компонента при решении комбинаторных задач. Описываются аппаратно-ориентированные модели параллельного (за один цикл) вычисления булеана (множества всех подмножеств) на универсуме из п примитивов для решения задач покрытия, минимизации булевых функций, сжатия данных, синтеза и анализа цифровых систем за счет реализации процессорной структуры в форме диаграммы Хассе.
1. Актуальность
Задача генерирования булеана как множества всех подмножеств часто встречается на практике [1-20]. В связи с этим представляют интерес порождающие алгоритмы, к которым предъявляются следующие требования: 1. Полнота - порождение алгоритмом всего множества элементов. 2. Непротиворечивость - порождение алгоритмом только тех элементов, которые относятся к множеству. 3. Неповторимость - порождение алгоритмом элементов только один раз. Последнее свойство вызвано возможностью ухудшения временных характеристик и усложнением проверки условий остановки алгоритма. Задача порождения множества всех подмножеств может быть реализована с использованием кодов принадлежности [3] и алгоритмов генерации к-элементных подмножеств (сочетаний) [10, 12, 14-16]. 4. Практическая направленность. Квантовые вычисления в последние годы становятся интересными для анализа кибернетического пространства, создания новых Интернет-технологий, благодаря их некоторой альтернативности существующим моделям вычислительных процессов. Кроме того, рыночная привлекательность квантовых или ку-битных моделей основывается на высоком параллелизме решения практически всех задач дискретной оптимизации, факторизации, минимизации булевых функций, эффективном сжатии, компактном представлении и телепортации данных, отказоустойчивом проектировании за счет существенного повышения аппаратных затрат. Но такая плата в настоящее время вполне допустима, поскольку существуют проблемы заполнения площадей силиконового кристалла, который содержит до 1 миллиарда вентилей.
2. Линейный код и код Грея
Код принадлежности. Пусть дано множество X = {х!,х2,...,х^,...,хп} . Код принадлежности для подмножества асX определяется как набор К =<к!,к2,...,к^,...,кп >, где
Линейный код. Алгоритм порождает подмножества следующим образом: на 0-м ярусе - код пустого множества; на 1-м ярусе - коды всех подмножеств, состоящих из одного элемента; на 2-м ярусе - коды всех двухэлементных подмножеств; далее - аналогично, на k-м ярусе - коды всех k-элементных подмножеств; на n-м ярусе - код n-элементного подмножества, т.е. самого множества как несобственного подмножества самого себя. Ярусы связаны дугами с номерами, которые соответствуют порождающим операциям
N = 20,2^,22,...,2n, выполняемым по следующим правилам.
1. Для N имеется Kiev+1 = Kiev v N2, где Kiev - порождающий код принадлежности к ярусу с номером lev (level - уровень), Kjev+1 - порожденный код, N - натуральное число, N 2 - двоичный код числа N .
Очевидно, что количество всех подмножеств
равно 2n.
2. Если К^у содержит 1, совпадающую с соответствующим разрядом N2 , порождение прекращается.
Алгоритм с такими правилами последовательно продвигается по ярусам, сначала порождая подмножества из одного элемента, затем - из двух, трех и далее аналогично (рис. 1).
Рис. 1. Алгоритм порождения булеана Коды Грея. Как и для линейного кода, каждый ярус содержит коды принадлежности булеану. Количество элементов каждого кода определяется номером яруса. В частности, ярус 3 содержит 23=8 кодов принадлежности всех подмножеств, построенных из трех элементов (рис. 2).
Рис. 2. Генерирования кода Грэя
Код принадлежности на ярусе lev+1 получается приписыванием слева к коду принадлежности lev числа X, которое попеременно принимает значения 0 или 1. Полученная на каждом ярусе последовательность кодов принадлежности называется n-элементным кодом Грея, где n - номер яруса. Код Грея обладает двумя следующими свойствами:
1. Два соседних набора в коде Грея отличаются на 1 в единственной позиции, наборы находятся на расстоянии по Хэммингу, равном единице. Расстояние по Хэммингу в общем случае определяется количеством позиций, по которым отличаются двоичные наборы.
2. Отдельные бинарные наборы кода являются вершинами n-мерного двоичного куба, а последовательность двоичных наборов есть гамильтонов цикл, по которому можно обойти вершины, включая каждую только один раз (рис. 3).
Рис. 3. Генерирование соседнего кода
3. Генерация к-элементных подмножеств (сочетаний)
В комбинаторике такие подмножества называют сочетаниями из п элементов по к и обозначают сП • Их количество вычисляется по формуле:
Ск =-П-,0 < к < п • (1)
п к!(п - к)!
Однако при программировании гораздо удобнее использовать следующие рекуррентные соотношения:
Ск = ск-1 ++сП-Р0 <к <п;
Ск = -Ск "1,0 < к < п. (2)
п к п-1
Поскольку в формуле (1) числитель и знаменатель растут очень быстро, не всегда возможно точно вычислить значение С^, даже когда последнее не превосходит максимально представимое целое число. При фиксированном значении п число сочетаний достигает максимального значения при к = п / 2 . Для четного п максимум к = п / 2 (индекс к соответствует номеру среднего члена разложения бинома Ньютона), а для нечетного - максимум достигается на двух соседних значениях к = [п / 2] и к = [п / 2] +1. Поэтому полезной оказывается следующая оценка для четных п (очевидно, что при нечетных п отличия будут минимальными), основанная на формуле Стирлинга [4]:
2 п
сп =-^=(1 + 0(1/п)). (3)
л/пп/2
Если допустить, что за время, отведенное для решения задачи, можно перебрать около
106 вариантов, то из формулы (3) следует, что генерацию всех сочетаний из п элементов для любого фиксированного к можно проводить для п < 24. Далее предлагается рассмотреть алгоритмические вопросы, связанные с порождением сочетаний. Для множества М = {1,2,..., п} порождение всех сочетаний (подмножеств) описывается несколькими алгоритмами [1, 2, 6, 8, 11, 13, 18].
3.1. Алгоритм «Сочетания»
1) Дано: множество М. Найти: последовательность подмножеств множества М. 2) Начало: пустое множество 0 . 3) Пусть порождено множество Тогда следующее множество 8 получается включением в 8 наименьшего не принадлежащего ему элемента и удалением из него всех элементов, меньших включенного. Если таких элементов нет, выполняется завершение алгоритма. Справедливость алгоритма доказывается индукцией по п: сначала алгоритм порождает все подмножества множества М' = {1,2,...,п -1} , затем повторяет эту последовательность, добавляя к каждому подмножеству элемент п. Последним членом в последовательности будет само множество М, и алгоритм автоматически остановится.
3.2. Алгоритм «Сочетания добавлением/исключением одного элемента»
Наряду с рассмотренным выше существует алгоритм, который порождает все подмножества множества М так, что каждое следующее отличается от предыдущего не более, чем на один элемент. Данный алгоритм определяется индуктивно.
1) Если п = 1, то результатом алгоритма есть последовательность 0,{1} .
2) Пусть для п -1 результатом алгоритма является последовательность Ьп-. Пусть Ьп- записанная в обратном порядке последовательность Ьп-. Тогда для п результа-
том алгоритма будет последовательность Ьп = Ьп-1,ЬпV {п}, где ЬпV {п} означает,
что к каждому члену последовательности Ьп- добавлен элемент п .
Пример 1. Ь2 = {0,{1},{1,2},{2}}; Ьз = {0,{1},{1,2},{2},{2,3},{1,2,3},{1,3},{3}}.
Справедливость алгоритма подтверждается индукцией по п, если учесть, что Ьп-заканчивается множеством {п -1} . Первая половина последовательности Ьп совпадает с Ьп-1 и по индукции удовлетворяет необходимым требованиям. Следующий элемент после Ьп-1 есть {п -1, п} , и затем проходится последовательность Ьп- в обратном порядке с добавлением элемента {п} , и требования также выполняются. Поскольку первый элемент в Ьпесть 0, то последний элемент в Ьп есть {п} . Если длина Ьп- есть 2п-1, то
т о 0п-1
длина Ьп есть 2 • 2 .
3.3. Алгоритм порождения сочетаний в лексикографическом порядке
Как правило, генерация всех к -элементных подмножеств выполняется в лексикографическом порядке, тем более что это не приводит к усложнению алгоритма или увеличению его вычислительной трудоемкости. Порядок подмножеств называется лексикографическим, если для любых двух подмножеств раньше должно быть сгенерировано то из них, из индексов элементов которого можно составить меньшее к-значное число в п-ричной системе счисления (в десятичной, для п<10). Например, при п=6 и к=3 сочетание из третьего, первого и пятого элементов должно быть сгенерировано раньше, чем из второго, третьего и четвертого, поскольку 135 < 234.
Рассмотрим рекурсивный алгоритм решения данной задачи. Идея ее сведения к задаче меньшей размерности заключается в следующем. Первым элементом подмножества может быть любой из них, начиная с первого и заканчивая (п-к+1)-м элементом. После того, как индекс первого элемента подмножества зафиксирован, остается выбрать к-1 элемент из множества с индексами большими, чем у первого. Далее - аналогично. Когда выбран последний элемент, то достигнут конечный уровень рекурсии, и выбранное подмножество можно использовать по назначению.
Ниже приведен алгоритм, который порождает все г -сочетания п -элементного множества М = {1,2,...,п} в лексикографическом порядке. Каждое г-сочетание представляется числами а^ <а2 <... <аг . 1) Начало алгоритма: а^ = 1,а2 = 2,...,аг = г . 2) Пусть порождено г -сочетание а^,а2,...,аг . Тогда определяется наибольшее а^ такое, что а^ +1 не входит в данное сочетание. Если таких а^ нет (это происходит только при а^ = п - г + 1,аг = п), то стоп. 3) Если такое а^ есть, то образуем новое сочетание а1,а 2,..., а 'г, полагая а1 = а^,...,а \- = а^,...,а ' = а^ + 1,а \+1 = а^ + 2,...,а г = а^ + г -1.
Пример 2. Алгоритм для п = 4, г = 2:
Шаги Сочетания ai
1 1,2 2
2 1,3 3
3 1,4 1
4 2,3 3
5 2,4 2
6 3,4 Стоп
В предлагаемом ниже листинге 1 массив a содержит значения элементов исходного множества и может быть заполнен произвольным образом. В массиве p формируется
очередное сочетание из k элементов. Листинг 1: const nmax = 24;
type list = array[1..nmax] of integer; var k, i, j, n, q: integer; a, p: list;
procedure print(k: integer);
var i: integer;
begin
for j := 1 to k do write(p[j]:4); writeln end; {print}
procedure cnk(n, k: integer); procedure gen(m, L: integer); var i: integer; begin
if m = 0 then print(k) else
for i := L to n - m + 1 do begin
p[k - m + 1] := a[i]; gen(m - 1, i + 1) end
end;{gen} begin {cnk} gen(k, 1) end;{cnk} begin {main} readln(n,k); for i := 1 to n do a[i] := i;
{заполнить массив можно и по-другому}
cnk(n,k)
end
Генерация сочетаний выполняется в рекурсивной подпрограмме gen со следующими параметрами: m - количество элементов, которые осталось выбрать из множества; L -элемент исходного множества, начиная с которого следует выбирать эти m элементов. Вложенная структура описания процедур cnk и gen позволяет не передавать при рекурсивных вызовах значения n и k, а из основной программы обращаться к процедуре cnk с параметрами, соответствующими постановке задачи.
4. Генерация всех подмножеств данного множества (булеана) 4.1. Перебор по возрастанию/убыванию числа элементов
При отыскании минимального/максимального подмножества, состоящего как можно из меньшего/большего числа элементов, эффективнее всего организовать перебор так, чтобы сначала проверялись все подмножества из одного элемента, затем - из двух, трех и далее элементов (для максимального подмножества — в обратном порядке). В этом случае первое подмножество, удовлетворяющее условию задачи, будет искомым, и дальнейший перебор следует прекратить. Для реализации такого перебора можно воспользоваться описанной выше процедурой cnk и ввести в нее еще один параметр - логическую переменную flag, которая будет идентифицировать соответствие текущего сочетания элементов условию задачи. При получении очередного сочетания необходимо обратиться к процедуре его проверки check, которая определяет значение флага. Тогда начало процедуры gen следует переписать следующим образом (листинг 2). Листинг 2:
procedure gen(m, L: integer);
var i: integer;
begin
if flag then exit; if m = 0 then
begin check(p,k,flag);
end
else ...
Далее процедура совпадает с предыдущей версией (см. листинг 1). В основной программе единственное обращение к данной процедуре следует заменить следующим фрагментом (листинг 3). Листинг 3:
k:=0;
flag:=false; repeat k:=k+1;
cnk(n,1,flag) until flag or (k=n);
if flag then print(k)
else writeln ('no solution');
Видно, что в основной программе запрос значения переменной k теперь не производится.
4.2. Перебор по двоичной системе (бинарному или двоичному коду)
Рассматривается альтернативный подход к перебору всех подмножеств заданного множества. Любое подмножество можно охарактеризовать, указав относительно каждого элемента исходного множества его принадлежность данному подмножеству и поставив в соответствие каждому элементу множества 0 или 1. Каждому подмножеству соответствует n-значное число в двоичной системе счисления. Поскольку числа могут начинаться с произвольного количества нулей, которые не являются значащими цифрами, в соответствие ставятся n или менее значные числа. Отсюда следует, что полный перебор всех подмножеств исходного множества соответствует перебору всех чисел в двоичной системе счисления от 0...01 до 1...1.
n-1 n
Теперь можно подсчитать количество различных подмножеств данного множества. Оно равно 2n — 1 или 2n с учетом пустого множества.
Таким образом, сопоставляя два способа перебора всех подмножеств данного множества, можно получить следующую формулу:
сП + СП +... + C£ = 2n, (4)
которая известна как сумма биномиальных коэффициентов [7].
Итак, в рамках сделанной выше оценки на количество допустимых вариантов перебора можно рассмотреть все подмножества исходного множества только при n < 20.
Применение программ, соответствующих второму способу перебора, целесообразно, когда: 1. Необходимо перебрать все подмножества данного множества, например, требуется найти все решения, удовлетворяющие заданному условию. 2. По условию задачи не имеет значения количество элементов, которое должно входить в искомое подмножество. На примере такой задачи далее приводится программа генерации всех подмножеств исходного множества в лексикографическом порядке [5].
Пример 3. Даны целочисленный массив a[1,...,N],N < 20 и число M. Найти подмножество элементов массива a[i1],a[i2],...,a[ik] такое, что 1 < i1 < i2 < ... < ik < N и a[i1] + a[i2] +... + a[ik] = M.
В качестве решения приводится процедура генерации всех подмножеств, которые можно составить из элементов массива, и функция проверки конкретного подмножества на соответствие условию задачи (листинг 4). Листинг 4:
function check(j: longint): boolean;
var k: integer; s: longint;
begin
s := 0;
for k := 1 to n do
{данное условие означает, что в k-й справа позиции числа j во 2-й системе стоит 1}
if ((j shr (k — 1)) and 1) = 1
then s := s + a[k];
if s = m then
begin
for k := 1 to n do
if ((j shr (k — 1)) and 1) = 1
then write(a[k]:4);
writeln
end
end;
procedure subsets(n: integer);
var q,,j: longint;
begin
{помещаем в q число 2An} q := 1 shl n;
{цикл по всем подмножествам} for j := 1 to q — 1 do if check(j) then exit end
Следует заметить, что если все элементы в массиве положительные, то решение приведенной выше задачи можно сделать более эффективным путем изменения порядка рассмотрения подмножеств, а именно: если сумма элементов какого-либо подмножества уже больше M, то рассматривать подмножества, включающие его в себя, уже не имеет смысла. Пересчет сумм может быть оптимизирован, если каждое следующее сгенерированное подмножество будет отличаться от предыдущего не более чем на один элемент [4]. Приведенная программа достаточно проста, но обладает одним недостатком: с ее помощью нельзя перебрать все подмножества множеств из более, чем 30 элементов, что обусловлено максимальным числом битов (32), отводимых на представление целых чисел. На самом деле перебор всех подмножеств множеств большей размерности вряд ли возможен за время, отведенное для решения той или иной задачи.
Пример 4. Для трехэлементного множества M = {1, 2, 3} все подмножества следующие: {},{1},{2},{3},{1, 2},{1, 3},{2, 3},{1, 2, 3}. Первым в списке идет пустое множество, которое является подмножеством любого множества, последним - исходное множество как несобственное подмножество самого себя. Рассматриваются числа в диапазоне от 0 до 2n — 1 в двоичной системе счисления с разрядностью n, которые можно увеличить при необходимости незначащими нулями: 0 (000); 1 (001); 2 (010); 3 (011); 4 (100); 5 (101); 6 (110); 7 (111).
Каждый из этих двоичных кодов можно использовать как маску подмножества, а именно: единица в i-м бите характеризует наличие i-го элемента множества в подмножестве, ноль - его отсутствие. Например: 101={1, 3}. Таким образом, для генерации подмножеств необходимо организовать цикл от 0 до 2n — 1, при этом на каждой итерации представить значение счетчика в виде бинарного кода и на его основе составить подмножество. Реализация на языке Си для четырехэлементного множества М={3,6,7,9} представлена ниже. Листинг 5: #include <stdio.h> #include <stdlib.h> //—для возведения в степень #include <math.h>
int main()
{
int M[4] = {3, 6, 7, 9}; //—множество int w = 4; //—кол-во элементов множества int i, j, n;
n = pow(2, w);
for ( i = 0; i < n; i++ ) //—перебор битовых масок {
printf("{");
for ( j = 0; j < w; j++ ) //—перебор битов в маске
if ( i & (1 << j) ) //—если j-й бит установлен
printf("%d ", M[j]); //—то выводим j-й элемент множества
printf("}\n"); }
return 0;
}
Результат представлен следующим набором подмножеств: {},{3},{6},{3, 6}, {7},{3, 7},{6, 7}, {3, 6, 7}, {9}, {3, 9}, {6, 9}, {3, 6, 9},{7, 9}, {3, 7, 9}, {6, 7, 9}, {3, 6, 7, 9}. Порядок в данном случае не имеет значения. Программная реализация вывода подмножеств достаточно проста. В процедуре if ( i & (1 << j) ) оператор << есть логический сдвиг влево. Чтобы узнать значение j-го бита числа i (биты отсчитываются слева направо, нумерация начинается с нуля), следует сначала сдвинуть единицу на j. Допустим, i=18 (10010), j=2. После логического сдвига влево единицы (00001) на 2 получается число 00100. Затем число i логически умножается на полученную после сдвига маску. Маска представляет совокупность нулей с установленным в единицу j-м битом благодаря сдвигу. При умножении, если j-й бит в числе i равен единице, получается некоторое число, равное маске; если j-й бит равен нулю, то результат умножения будет нулем: 10010, 00100. Побитовое умножение двух чисел - логическая операция and - дает число 00000. Это говорит о том, что 2-й бит числа 18 (согласно порядку нумерации битов) выставлен в ноль. Данный алгоритм позволяет довольно просто сгенерировать случайное подмножество множества. Для этого необходимо взять случайное число в диапазоне от 0 до 2 — 1, использовать его как битовую маску и сгенерировать на ее основе подмножество. 4.3. Процедура генерирования булеана
Задано множество из четырех компонентов: A, B, C, D. Необходимо выбрать подмножество, состоящее из нескольких примитивов, обладающее некоторым свойством. Способ решения задачи заключается в генерировании всех возможных подмножеств данного множества и для каждого из сгенерированных подмножеств выполняется проверка, удовлетворяет ли оно заданному свойству. Альтернативный вариант решения задачи - вычислить все подмножества данного множества, обладающие заданным свойством. Например, для множества из четырех символов A, B, C, D булеан включает следующие множества: пустое множество; одноэлементные множества: {A}, {B}, {C}, {D}; двухэлементные множества: {A, B}, {A, C}, {A, D}, {B, C}, {B, D}, {C, D}; трехэлементные множества: {A, B, C}, {A, B, D}, {A, C, D}, {B, C, D}; четырехэлементное множество: {A, B, C, D}.
В случае, когда порядок генерации подмножеств не имеет значения, алгоритм генерации множества всех подмножеств выглядит следующим образом [20]. Инициируется вектор B, состоящий из четырех разрядов, каждый из которых может принимать значение 0 или 1. Единица указывает на включение соответствующего по номеру компонента исходного множества в искомое. Значение 0 указывает на то, что элемент отсутствует. Пусть имеется последовательность двоичных чисел от 0 до 15 и соответствующие им подмножества:
{0000} - пустое множество;
{0001} - A, {0010} - B, {0100} - C, {1000} - D;
{0011} - AB, {0101} - AC, {0110} - BC, {1001} - AD, {1010} - BD, {1100} - CD; {0111} - ABC, {1011} - ABD, {1101} - ACD, {1110} - BCD; {1111} - ABCD.
Таким образом, имеется 16 различных подмножеств универсума из 4 элементов. В общем случае множество всех подмножеств множества из N элементов содержит 2N элементов. Алгоритм, обеспечивающий генерацию множества всех подмножеств из N элементов, может быть неформально описан следующим образом: формирование вектора,
состоящего из N нулей и соответствующего пустому множеству. Для получения следующего подмножества из текущего обрабатывается текущий вектор следующим образом: справа от первого элемента массива к последнему ищется первое число, равное 0. Если такое число не найдено, то текущее подмножество является решением - множеством, состоящим из всех элементов. Если же элемент, равный 0, найден, то он заменяется на 1, а все числа справа от него, если такие имеются, заменяются на нули. Данный алгоритм может быть записан следующим образом: Ввод (N)
Обнуление массива B из N+1 элемента Вывод (пустое множество) Пока B[N+1]=0 i=1
Пока B[i]=1 делать B[i]=0, i=i+1 B[i]=1
Вывод (множество, определяемое массивом B) Соответствующая программа имеет следующий вид (листинг 6). Листинг 6:
Программа генерации множества всех подмножеств const
alphabet : string[26] = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; var
b : array [1..100] of byte;
N,i : byte;
begin
readln(N);
for i:=1 to N+1 do b[i]:=0; writeln ('Пустое множество'); while (b[N+1]=0) do begin i:=1;
while B[i]=1 do
begin B[i]:=0; inc(i); end;
B[i]:=1;
for i:=1 to n do
if b[i]=1 then write(alphabet[i]);
writeln;
end;
end
5. Квантовый процессор оптимального покрытия
Цель создания кубит-процессора - существенное уменьшение времени при решении задач оптимизации путем параллельного вычисления векторных логических операций над множеством всех подмножеств от примитивных компонентов за счет увеличения памяти для хранения промежуточных данных.
Задачи: 1) Определение структур данных для взятия булеана при решении задачи
покрытия столбцов матрицы M = Mjj ,i = 1, m; j = 1,n единичными значениями строк. В
частности, при m = n = 8, необходимо выполнить параллельно-логическую операцию над 256 вариантами всех возможных сочетаний векторов (строк матрицы), составляющих булеан. 2) Система команд процессора должна включать следующие операции (and, or, xor) над векторами (словами), размерности m. 3) Разработка архитектуры кубит-процессора для параллельного вычисления 2n -1 вариантов сочетаний, направленных на оптимальное решение NP-полной задачи покрытия. 4) Реализация прототипа кубит-процессора на базе программируемой логики PLD и верификация (валидация) аппаратного решения на примерах минимизации булевых функций. 5) Приведение других практических задач дискретной оптимизации к форме задачи покрытия для последующего решения на кубит-процессоре.
В качестве примера предлагается решить задачи поиска оптимального единичного покрытия всех столбцов минимальным числом строк матрицы М, представленной ниже:
M 1 2 3 4 5 6 7 8
a 1 . . 1 . .
b . . 1 . 1 .
c 1 . . . 1 . 1 .
d . 1 . 1 . . . 1
e . 1 . . 1
f 1 . 1 1 1 .
g . 1 . 1 . . . 1
h . . 1 . 1
Для этого необходимо сделать перебор всех 255 сочетаний: из восьми по одной строке, по двум, трем, четырем, пяти, шести, семи и восьми. Минимальное количество примитивов (строк), формирующее покрытие, есть оптимальное решение. Таких решений может быть несколько. Диаграмма Хассе есть компромиссное предложение относительно времени и памяти, или такая стратегия решения задачи покрытия, когда ранее полученный результат впоследствии используется для создания более сложной суперпозиции. Поэтому для каждой таблицы покрытия, содержащей п примитивов (строк), необходимо генерировать собственную мультипроцессорную структуру в форме диаграммы Хассе, которая далее должна быть использована для почти параллельного решения КР-полной задачи. Например, для четырех строк таблицы покрытия диаграмма Хассе - структура мультипроцессора -будет иметь вид, представленный на рис. 4.
Рис. 4. Квантовая структура вычислительных процессов Оптимальные решения задачи покрытия для матрицы М, которая генерирует 255 вариантов возможных сочетаний, представлены строками в форме ДНФ: С = fgh V efg V cdf .
Автомат управления вычислительным процессом для квантовой структуры путем восходящего анализа вершин графа основан на последовательном выполнении следующих шагов:
1. Занесение информации о примитивах в регистры (матрицы) Ь1 = Р^ первого уровня с последующим анализом качества покрытия каждым примитивом в двоичном формате (1 -
т 1 =
есть покрытие, 0 - нет покрытия). Если один из примитивов организует покрытие Л Ц] = 1,
процесс анализа структуры Хассе заканчивается. Иначе - выполнение перехода (г = г + 1) на следующий уровень графа:
т
L1=р, v; l1.=i?:?n=n+1;
1 1 j=1 У 11 ^ end.
j=1
2. Инициирование команды обработки очередного (второго) уровня. Последовательное
m m
r r_1 r_1 r
выполнение векторных (матричных) операций (or L- = L- ; Lt- , and л L- = 1) в целях
1 1j j=1 tj j=1 1j анализа покрывающей способности сочетаний примитивных элементов r-уровня. Здесь
t = 1,m, i = 1,m, r = 1,n, n - число ярусов или количество строк в таблице покрытия, m -число столбцов в ней. Если существует сочетание на рассматриваемом уровне, создающее полное покрытие, которое формирует оценку, равную 1, то обработка всех последующих уровней процессора не выполняется. В противном случае выполняется переход для анализа следующего уровня процессорной структуры:
тr тr—1 Tr—1 . Л тr 10 ^ r = r +1;
L = L-- л L.• ^ л L-- = < л ч , i ij j=: tj j=: ij [1 ^ end.
Для поиска оптимального покрытия всегда достаточно двух элементов нижнего уровня, что означает - все операционные вершины имеют два регистровых (матричных входа), что существенно уменьшает стоимость аппаратурных затрат. Количество временных тактов для обработки структуры процессора в худшем случае равно n. Можно создать алгоритм поиска оптимального покрытия путем нисходящего анализа вершин графа. В этом случае при нахождении полного покрытия в одном из ярусов необходим еще один спуск по структуре, чтобы убедиться в отсутствии в нижнем соседнем ярусе полного покрытия. При положительном ответе на данный вопрос полученное решение является оптимальным. Иначе - необходимо выполнять спуск до такого уровня, когда, более нижний, соседний ярус не будет содержать полного покрытия.
Вершины процессорной структуры могут иметь более одной бинарной (унарной) регистровой логической операции. Тогда необходимо создавать простейший дешифратор команд для активизации, например, операций: and, or, xor, not.
Таким образом, достоинства кубитного Хассе процессора (Qubit Hasse Processor -QHP) заключаются в возможности использовать не более, чем двухвходовые схемы векторных логических операций (and, or, xor), а значит, в существенном уменьшении стоимости по Квайну реализации процессорных элементов (вершин) и памяти за счет применения последовательных вычислений и незначительного увеличения времени обработки всех вершин графа Хассе. Для каждой вершины используется критерий качества покрытия - наличие всех единиц в координатах вектора-результата. Если критерий качества выполняется, то все остальные вычисления можно не производить, поскольку диаграмма Хассе есть строго иерархическая структура по числу сочетаний в каждом ярусе. Это означает, что самое лучшее решение находится на более низком уровне иерархии. Варианты одного уровня равнозначны по реализации (стоимости), поэтому полученное
n
первое качественное покрытие (Q = 2qi = n) есть лучшее решение, предполагающее
остановку всех последующих вычистений по стратегии диаграммы Хассе. С учетом последовательно-параллельной стратегии анализа вершин графа, время (цикл) обработки всех примитивов QH-процессора определяется числом уровней иерархии, функционально зависящим от количества битов в кубитной переменной: T = log2 2n х t = t х n. При этом длина m строки таблицы покрытия не влияет на оценку быстродействия. Анализ вершины включает две команды: логическую (and, or, xor) и операцию вычисления критерия качества покрытия в форме скаляра путем применения функции and ко всем разрядам вектора-результата:
mir,j = My v Mr,j,(j = 1,n;{i * r} = 1,m;); mL = лmiг j = лШ; j v M
ir
ir,j ^(My v Mr,j) .
Аппаратные затраты на реализацию QH-процессора зависят от суммарного числа вершин графа Хассе и от количества битов (разрядов) в строке таблицы покрытия:
Н = 2п х к х т
?
где к - коэффициент аппаратной реализации (сложности) одного разряда бинарной векторной логической операции и последующей команды вычисления критерия качества покрытия.
Таким образом, высокое быстродействие решения задачи покрытия достигается существенным повышением аппаратурных затрат (в 2п хкхт/кхтхп = 2п/п раз по сравне-
нию с последовательной обработкой графовых вершин), которое обеспечивает компромиссный вариант между полностью параллельной структурой вычислительных процессов (здесь затраты аппаратуры определяются числом примитивов в каждой вершине H = kхmхnх2n, а увеличение аппаратуры составляет 2n раз) и последовательными вычислениями однопроцессорного компьютера (здесь быстродействие обработки графа Хассе равно T = t х 2n, а аппаратные затраты равны H* = k х m х n). Уменьшение аппаратуры по сравнению с параллельным вариантом обработки графа составляет
Qn = k хmхnх2 /kхmх2 = n. Как следствие существенной аппаратной избыточности, уменьшение времени анализа вершин графа по сравнению с последовательной обработкой структуры имеет следующую оценку:
QT = t*^ = 2*. t х n n
6. Практическая реализация кубит-процессора оптимального покрытия
Модель квантового устройства разработана на языке Verilog. Элементарная ячейка процессора состоит из двух регистровых вентилей. Регистровый элемент or выполняет логическую операцию над двумя векторами, формируя вектор результата. Регистровый вентиль and выполняет свертку всех битов вектора по операции and, формируя однобитовый элемент, идентифицирующий единичным значением оптимальное решение задачи покрытия. Представлено формирование значений для вершин диаграммы Хассе шести уровней ,где каждый элемент в схеме имеет на выходе примитив анализа качества покрытия в виде функции and. Реализация вычислительного устройства выполнена на основе кристалла FPGA фирмы Xilinx xc3s1600e-4-fg484, где основные параметры имеют следующий вид: Листинг 7: Map-report Logic Utilization:
Number of Slice Flip Flops: 2,286 out of 29,504 7% Number of 4 input LUTs: 2,715 out of 29,504 9% Logic Distribution:
Number of occupied Slices: 1,514 out of 14,752 10%
Number of Slices containing only related logic: 1,514 out of 1,514 100%
Number of Slices containing unrelated logic: 0 out of 1,514 0%
*See NOTES below for an explanation of the effects of unrelated logic.
Total Number of 4 input LUTs: 2,715 out of 29,504 9%
Number of bonded IOBs: 321 out of 376 85%
Number of BUFGMUXs: 1 out of 24 4%
Timing parameters of project:
Tclk_to_clk = 4.672 ns
Tclk_to_pad_max = 11.552 ns
Period = max{ Tclk_to_clk , Tclk_to_pad_max };
Period = 11.552 ns
Fclk = 86,5 МГц
Заключение
Представлен обзор и классификация моделей, структур данных и методов генерирования булеана для решения практических задач дискретной оптимизации.
Научная новизна - предложена модель данных и структура аппаратной реализации квантового компьютера, которая характеризуется использованием диаграммы Хассе, что дает возможность существенно (х100) повысить быстродействие решения комбинаторных задач дискретной оптимизации.
Практическая значимость - существенное повышение быстродействия при решении задач покрытия и других задач дискретной оптимизации за счет увеличения аппаратных затрат для параллельного выполнения векторных логических операций на Хассе-структуре квантового вычислительного устройства.
Список литературы: 1. Burris, Stanley N., Sankappanavar H.P. A Course 1n Universal Algebra. — SpringerVerlag, 1981. 332 р. 2. Peter Jipsen, Henry Rose. Varieties of Lattices - Lecture Notes m Mathematics 1533, Springer Verlag, 1992. 162 р. 3. НосовВ.А. Комбинаторика и теория графов. М.: Изд-во МГИЭМ, 1999. 112 с. 4. Стив Тейксейра, Ксавье Пачеко. Borland Delph1 6. Руководство разработчика (Steve Te1xe1ra, Xav1er Pacheco. Delph1 6 Developer's Gu1de F1rst Ed1t1on). М.: Издательский дом "Вильямс", 2002. 1120 с. 5. Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн. Алгоритмы: построение и анализ. М.: Издательский дом "Вильямс", 2012. 1296 с. 6. Комбинаторный анализ. Задачи и упражнения / Под ред. Рыбникова К.А. М.: Наука, 1982. 184 с. 7. Гаврилов Г.П., Сапоженко А.А. Сборник задач по дискретной математике. М.: Наука, 1977. 368 с. 8. Липский В. Комбинаторика для программистов: Пер. с польск. М.: Мир, 1988. 213 с. 9. Романовский И.В. Дискретный анализ. СПб: Невский Диалект; БХВ Петербург, 2003. 320 с. 10.АхоА.,ХопкрофтДж., УльманДж. Структуры данных и алгоритмы. М.: Издательский дом «Вильямс», 2000. 384 с. 1l. ВиртН. Алгоритмы и структуры данных / Пер. с англ. М.: Мир, 1989. 360 с. 12. Окулов С.М., Ашихмина Т.В., Бушмелева Н.А. и др. Задачи по программированию / Под ред. С.М. Окулова. М.: БИНОМ. Лаборатория знаний, 2006. 820 с. 13. Кормен Т., Лейзерсон Ч., Ривест Р. Алгоритмы: построение и анализ. М.: МЦНМО, 1999. 960с. 14. Кнут Д. Искусство программирования. Сортировка и поиск. Т. 3. М.: «Вильямс», 2007. 824 с. 15. Кнут Д. Искусство программирования. Генерация всех кортежей и перестановок. Т. 4, вып. 2. М.: «Вильямс», 2008. 160 с. 16. Кнут Д. Искусство программирования, том 4, выпуск 3. Генерация всех сочетаний и разбиений. М.: «Вильямс», 2007. 208 с. 17. Грэхем Р., Кнут Д., Паташник О. Конкретная математика. Основание информатики / Пер. с англ. М.: Мир, 1998. 703 с. 18. Липский В. Комбинаторика для программистов. М.: Мир, 1988. 77 с. 19. Рейнгольд Э., Нивергельт Ю., Део Н. Комбинаторные алгоритмы: теория и практика. М.: Мир, 1980. 476 с. 20. Долинский M.C. Алгоритмизация и программирование на Turbo Pascal: от простых до олимпиадных задач: Учебное пособие. Изд-во: Питер, 2006. 366 с. 21. Beth T. Quantum computing: an 1ntroduction // Proceed1ngs of the IEEE International Sympos1um on C1rcu1ts and Systems, ISCAS. 2000. Geneva. Vol. 1.P. 735 - 736. 22. Jonker P., Jie Han. On quantum and class1cal computing w1th arrays of superconducting pers1stent current qub1ts // Proceed1ngs of F1fth IEEE International Workshop on Computer Arch1tectures for Machrne Perception. 2000. P. 69 - 78. 23. Keyes R. W. Challenges for quantum computing w1th sol1d-state devices // Computer. Jan. 2005. Vol. 38, Issue 1.P. 65 - 69. 24. Инфраструктура мозгоподобных вычислительных процессов / М.Ф. Бондаренко, О. А. Гузь, В.И. Хаханов, Ю.П. Шабанов-Кушнаренко.Харьков: Новое Слово. 2010. 160 с. 25. Mark Gregory Whitney. Practical Fault Tolerance for Quantum C1rcu1ts. PhD D1ssertat1on 1n Computer Sc1ence. Berkeley: Un1vers1ty of Cahforma. 2009. 206p. 26. Хаханов В. И., Литвинова Е. И., Чумаченко С. В., Гузь О.А. Логический ассоциативный вычислитель // Электронное моделирование. 2011. № 1. С. 73-90. 27. Hahanov V., Wajeb Gharibi, Litvinova E., Chumachenko S. Information analys1s 1nfrastructure for d1agnos1s // Information. An mternational 1nterd1sc1pl1nary journal. 2011. Japan. Vol.14, No 7. Р. 2419-2433. 28.Хаханов В.И. Проектирование и тестирование цифровых систем на кристаллах / В.И. Хаханов, Е.И. Литвинова, О. А. Гузь. Харьков: ХНУРЭ, 2009. 484с.
Поступила в редколлегию 14.12.2011
Чумаченко Светлана Викторовна, д-р техн. наук, профессор кафедры АПВТ ХНУРЭ. Научные интересы: математическое моделирование, теория рядов, методы дискретной оптимизации. Увлечения: путешествия, любительское фото. Адрес: Украина, 61166, Харьков, пр. Ленина, 14, тел. 70-21-326. E-ma1l: [email protected].
Хаханов Владимир Иванович, декан факультета КИУ ХНУРЭ, д-р техн. наук, профессор кафедры АПВТ ХНУРЭ. Научные интересы: техническая диагностика цифровых систем, сетей и программных продуктов. Увлечения: баскетбол, футбол, горные лыжи. Адрес: Украина, 61166, Харьков, пр. Ленина, 14, тел. 70-21-326. E-ma1l: [email protected]. Мурад Али Аббас, аспирант кафедры АПВТ ХНУРЭ. Научные интересы: компьютерные системы и сети. Адрес: Украина, 61166, Харьков, пр. Ленина, 14, тел. 70-21-326.
Горобец Олег Александрович, магистрант Центра последипломного образования ХНУРЭ. Научные интересы: аналитика программного обеспечения, облачные вычисления и социальные сети. Адрес: Украина, 61166, Харьков, пр. Ленина, 14, e-maH: [email protected].