Построение множества, заданного рекурсивным определением - на примере программы расстановки ферзей на шахматной доске
А.И. Адамович, А.В. Митин, Р.В. Позлевич
- Введение
- Задача расстановки ферзей на шахматной доске
- Реализация Т-программы построения множества
- Список литературы
Пусть P, D-некоторые множества, pP. Рассмотрим задачу построение множества (решений некоторой проблемы) М(p)D , заданного следующим рекурсивным определением:
где:
- s(p) -предикат s : P {true, false}-"параметр p соответствует решению проблемы";
- d(p) -d : P 2D-построение по параметру p (который соответствует решению проблемы) множества решений, отвечающих p: d(p)D;
- develop(p) - develop : P 2P -шаг рекурсии в поиске параметров, соответствующих решению проблемы: переход от параметра p к множеству новых (более близких к решениям) параметров develop(p)P.
Подобное описание допускают многие задачи из класса "построение множества решений проблемы". В том числе и задачи, связанные с поиском решений на (рекурсивно определяемом) дереве решений:
- P-вершины дерева;
- s(p)-вершина p терминальная (лист);
- develop(p)-множество вершин-сыновей вершины p;
- d(p)-построение по вершине-листу множества решений.
Данная работа посвящена изучению эффективности реализации задач задач построения множества, заданного рекурсивным определением, в Т-системе [1]-в среде программирования, поддерживающей автоматическое динамическое распараллеливание программ, разработанной в ИЦМС ИПС РАН. Общая проблема в последующем тексте рассматривается на примере реализации программы построения множества всех бесконфликтных) расстановок n ферзей на шахматной доске заданного размера nn.
Задача расстановки ферзей на шахматной доске
Пусть
n
>1 некоторое число. Рассмотрим бесконфликтную расстановку kn ферзей на шахматной доске размераnn
. Из условия бесконфликтности очевидно, что на каждой горизонтали этой доски стоит ровно один ферзь. Занумеруем горизонтали и вертикали доски числами0..(n-1)
. Тогда, любая бесконфликтная расстановка может быть записана как массив целых чиселboard={v0, v1,... vn-1}
, гдеvh
-равно:
-1
-если в горизонтальh
пустая (в ней нет ферзей);- номеру вертикали, в которой на горизонтали
h
стоит единственный ферзь.Хорошо известная идея решения задачи расстановки ферзей на шахматной доске состоит в следующем: рассмотрим пустую доску
{-1, -1,... -1}
(она бесконфликтная). Начиная с пустой доски будем последовательно рассматривать все горизонталиh=0,...,n-1
не полностью заполненных бесконфликтных досок и для них рассматривать все варианты бесконфликтного добавления одного ферзя в первую (младшую) из незаполненных горизонталей в них.Формально это можно записать в виде следующего определения:
- в качестве параметра рекурсии выберем тройку
p = (n, h, board)
, где:
n
-размер доски;board
массив целых чисел, определяющий такую бесконфликтную расстановкуhn
ферзей на доске размеромnn
, в которой на горизонталях0..(h-1)
расположено по одному ферзю, а горизонталиh..(n-1)
-свободные;h
-либоh<n
иh
-номер первой свободной горизонтали в расстановкеboard
; либоh=n
, если все горизонтали вboard
заполнены;- P=(N, N, N n), D=N n;
s(p) = s((n, h, v))
;(h==n)
d(p) = d((n, h, v))
;v
develop(p) = develop((n, h, v))
{![]()
(n,h+1,v')
|v'
-бесконфликтная и(v'i == vi
дляi=0 h-1,h+1 n)
} -по сути,develop(p)=develop((n, h, v))
описывает все варианты расстановки в не полностью заполненной бесконфликтной расстановке одного ферзя (в первой свободной горизонталиh
);- M(
p0
)-множество всех бесконфликтных расстановок n ферзей на шахматной доске размера nn, где:
p0 = (n,0,{-1,-1, ,-1})
;.
Замечание. Так как в параметры
(n, h, v)
входит номер первой свободной горизонтали в расстановкеv
можно не требовать, что быvi==-1
для свободных горизонталейi
.Ниже (Рисунок 1) приведен рекурсивный алгоритм (используется очевидный псевдокод) построения множества всех бесконфликтных расстановок n ферзей на шахматной доске размера nn, адекватный приведенному выше определению множества M(
p0
).При разработке Т-программы на базе рассмотренного алгоритма (Рисунок 1) необходимо принять несколько технических решений:
- о представлении множеств и реализации операции () их объединения (заметим, что в данной задаче нам требуется объединять заведомо непересекающиеся множества);
main(int n)
{ set Results; int board[n]; Results = M(n,0,board); } func M(n,h,board) -> (boards) // результат -- множество полных бесконфликтных int v; // расстановок, получаемых дозаполнением board *int board1; set Sum; // Sum -- "сумматор" для результата //********************************************* // Eсли board - полная расстановка, то if (n==h) return board; // результат--множество из одного элемента -- // board //********************************************* // Eсли board - не полная расстановка, то Sum = ; // h<n - очередная пустая горизонталь. for (v=0; v<n; v++) // Перебираем все вертикали v такие, что if (no_conflict(board,h,v) { // в позиция (h,v) расстановки board можно // бесконфликтно поставить ферзя. Для них: board1 = new_copy(desc,n); // создаем board1 - копию board board1[h] = v; // ставим ферзя в (h,v) на board1
Sum = SumM(n,h+1,board1); // добавляем к Sum все дозаполнения board1
} // В конце перебора всех вертикалей, Sum и
return Sum; // есть множество всех полных бескон- // фликтных расстановок, получаемых дозапол- // нением board } func no_conflict (board,hq, vq) (boolean) // Предикат: можно ли в расстановке board, в первую пустуя горизонталь hq (все // ферзи выше hq) бесконфликтно поставить одного ферзя в позиции (hq,vq) int h, v; for(h = 0; h < hq; h++) { // Перебираем все позиция (h,q) уже расставлен- v = board[h]; // ных ферзей. Если ферзь (h,q) бьет (hq,vq): if ( vq == v // по вертикали || (vq-hq) == (v-h) // или диагонали +45 град; || (vq+hq) == (v+h) // или диагонали -45 град ) // то предикат ложен. return (FALSE); // } // Если перебрали всех расставленных ферзей и return (TRUE); // ни один из них не бил (hq,vq), то предикат } // истиненРисунок 1. Алгоритм построения множества всех бесконфликтных расстановок n ферзей на шахматной доске заданного размера nn
- о поддержки свойств достаточно больших значений вычислительной сложности гранул параллелизма и цикла байта.
В сети Интернет по адресу:
ftp://ftp.botik.ru/pub/local/Sergei.Abramov/T-system/
доступен полный текст t2cp-программы
q7_fl_gc
построения множества всех бесконфликтных расстановок n ферзей на шахматной доске размера nn, в которой:
- параметрами командной строки являются два целых числа:
N>2
(размер доски) иN0
(0<N0<N
)-параметр управления размером гранулы параллелизма и данных (см. ниже);- для поддержки достаточной вычислительной сложности гранул параллелизм рекурсия функции
М
алгоритма (Рисунок 1) отображена:
- рекурсией Т-функций
queens
(то есть, с порождениям новых процессовqueens
) для глубины рекурсии доN0`int
(дляh
от0
доN0`int-1
);- рекурсией Си-функции
complete_desk_b_and_add_results_to_bs
вызываемой из (на фоне) Т-функцийqueens
(то есть, с порождениям новых процессовqueens
) для глубины рекурсии сN0`int
(дляh
отN0`int-1
доN`int
);- для представления расстановок используется Си-массивы из
n=N`int
байтовых целых (char
) и T-структуры, содержащие такие Си-массивы (держатели упакованного Си-массива изn=N`int
байтовых целых-b
,bnew
; лисп-списки держателей упакованного Си-массива изn=N`int
байтовых целых-bs
; L-пакетыpbs
с несколькими Си-массивами изn=N`int
байтовых целых).Опишем состав Т-программы:
- Т-функция
mflatten(tree) -> (leavs) stream
Данная функция преобразует произвольное дерево данных в поток (лисп-список) листьев данного дерева. При этом, порядок листьев в потоке, зависит от порядка построения (порядка готовности) фрагментов дереваtree
и может меняться от запуска к запуску. Тем самым, можно говорить, что потокleavs
представляет множество листьев дереваtree
. Типы листьев дерева не имеют значения для функцииmflatten
-функция является хорошим претендентом для включения в библиотеку стандартных функций обработки Т-структур.- Т-функция
queens(b,h,N,N0) -> (pboards_tree)
. Аргументами функции являются:
- размер доски-
n=N`int
-и параметр управления размером гранулы параллелизма-n0=N0`int
;- не полностью заполненную расстановку
b
(держатель упакованного Си-массива изn=N`int
байтовых целых);- номер первой свободной горизонтали в
b
-hq=h`int
.
- Набор вспомогательных Си-функций, работающих в составе (на фоне-on scope) Т-функции
queens
:
void make_copy_bnew_of_b(int n)
-построение новой области упакованных Си-данных и ее держателяbnew
, копирование в эту удерживаемую область расстановки, удерживаемойb
;void complete_desk_b_and_add_results_to_bs(int hq, int n)
-
рекурсивная Си-функция, строит лисп-списокbs
(вначале пустой) всех возможных полных бесконфликтных расстановок, полученных дозаполнением расстановкиb
;void pack_bs(int n)
-лисп-списокbs
преобразует в L-пакетpbs
;- Т-функция
tmain(arg) -> (rc)
-принимает параметры командной строки; строит дерево L-пакетов решений-[bs] = queens(b,zerro,N,N0)
; преобразует его в лисп-список L-пакетов решений-[bs] = mflatten(bs)
; выводит решения в файл.- Вспомогательные Си-функции:
void print_board (char * board, int n)
-выводит расстановку в файл.int no_conflict (char * board, int hq, int vq)
-предикатno_conflict
(сравни с вышеописанным алгоритмом, Рисунок 1)check_arg
и_ut_app_init_step
-реализуют проверку корректности параметров командной строки.Ниже (Таблица 1, Рисунок 2) приведены сведения о результатах исполнения Т-программы q7_fl_gc под управлением Т-системы:
- Программа выполнялась для следующих значений параметров командной строки:
N=14
(размер доски) иN0=2
-параметр управления размером гранулы параллелизма и данных.- Усредненные характеристики гранул параллелизма: вычислительная сложность-C170106 операций, объем передач-V33103 байт; цикл байта-C/V: 5.2103 операций на байт.
- Построенный поток результата содержал 156 пакетов решений, всего 365,596 бесконфликтных расстановок 14 ферзей на шахматной доске размера 1414.
- Вычисления проводились на ЭВМ ALR 6x6. За счет конфигурирования Т-системы для решения задачи использовалось различное число процессоров установки (от 1 до 6) и различные способы организации взаимодействия отдельных соисполнителей-протокол IP (далее обозначается как LAN) и общая память (SMP).. При каждом запуске (на разном числе процессоров) использовался один и тот же исполняемый код задачи и одни и те же параметры входной строки.
Видно, что Т-система поддерживает удовлетворительную эффективность автоматического распараллеливания Т-программы q7_fl_gc в случае взаимодействия соисполнителей по протоколу IP и высокую-в случае SMP. Значительное превосходство варианта SMP над вариантом LAN связано с тем, что по природе задачи мы имеем дело с большим объемом генерируемых данных (по сравнению с объемом вычислений). Таким образом, в общее реальное (астрономическое) время выполнения задачи складывается из (а) собственно времени счета и (б) времени сборки и вывода достаточно объемного результата (365,596145 Мбайт-объем внутреннего представления, 17 Мбайт-объем вывода в текстовый файл). Если первое слагаемое (а) можно уменьшать за счет параллельного исполнения, то второе (б) остается практически постоянным. Использование вариантом LAN для передач данных сетевого протокола IP приводит к высоким затратам на эти передачи и, как следствие-к снижению утилизации вычислительной мощности.
Таблица 1. Результаты исполнения Т-программы q7_fl_gc под управлением Т-системы
число про- время счета
(сек)время счета
(%)коэффициент ускорения утилизация вычислительной мощности цессо-ров LAN SMP LAN SMP LAN SMP LAN SMP 1 194 193 100,00% 100,00% 1,00 1,00 100,00% 100,00% 2 113 99 58,42% 51,07% 1,71 1,96 85,58% 97,90% 3 82 67 42,27% 34,62% 2,37 2,89 78,87% 96,29% 4 66 51 34,04% 26,27% 2,94 3,81 73,45% 95,16% 5 56 41 28,88% 21,38% 3,46 4,68 69,26% 93,54% 6 53 35 27,41% 18,04% 3,65 5,54 60,81% 92,38%
Время счета (%) Коэффициент
ускоренияУтилизация
вычислительной
мощности
![]()
Рисунок 2. Результаты исполнения Т-программы q7_fl_gc под управлением Т-системы
- С.М. Абрамов, А.И. Адамович. Т-система-среда программирования с поддержкой автоматического динамического распараллеливания программ//Принято к печати в: Юбилейный сборник трудов Института программных систем. Под ред. проф. В.И. Гурмана, Переславль-Залесский, ИПС РАН, 1999 г.
1999 © T-System | © ИЦМС ИПС РАН |