Задача о 5 ферзях
Создание программы с использованием последовательного и параллельного алгоритмов реализующей задачу о расстановке 5 ферзей на шахматной доске, при которой каждое поле будет находиться под ударом одного из них. Определение ускорения и эффективности.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | контрольная работа |
Язык | русский |
Дата добавления | 03.06.2014 |
Размер файла | 21,1 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования «Кемеровский государственный университет»
Математический факультет
Кафедра ЮНЕСКО по новым информационным технологиям
ОТЧЕТ ПО СЕМЕСТРОВОЙ РАБОТЕ ПО ДИСЦИПЛИНЕ
“Технологии параллельного программирования”
«Задача о 5 ферзях»
студентки 2 курса
Ладан Людмилы Эдуардовны
Направление 010500.62 - Математическое обеспечение и администрирование информационных систем
Кемерово 2013
Содержание
- Введение
- 1. Постановка задачи
- 2. Последовательный алгоритм
- 3. Параллельный алгоритм
- Заключение
- Литература
- Введение
- Реализовано две версии алгоритма: параллельная и последовательная.
- Основной принцип каждого из алгоритмов следующий: методом перебора на шахматной доске расставляются пять ферзей, таким образом, чтобы все поля были биты, причем второй ферзь всегда стоит после первого, третий всегда после второго и т.д.. За позицию ферзя отвечает соответствующий ему цикл. Программа останавливается, когда ферзи становятся в конечное положение, а именно последние пять полей на доске. В начале и в конце программы ставятся временные метки, считается их разность; полученное значение обозначает время, потраченное на выполнение алгоритма. Запуская параллельную программу на разном количестве процессоров, мы найдем время для каждого из случаев. На основе этих результатов можно будет говорить об ускорении и эффективности.
- 1. Постановка задачи
- Запрограммируйте параллельную программу, реализующую задачу о расстановке пяти ферзей на шахматной доске, при которой каждое поле будет находиться под ударом одного из них.
- 2. Последовательный алгоритм
- 1. Решение задачи находится полным перебором всех возможных расстановок ферзей на поле.
- 2. Выполняется 5 циклов по i1, i2, i3, i4, i5 (каждый для своего ферзя).
- 3. На каждом шаге цикла ферзи расставляются на поле. Это делается следующим образом:
- · Массив a из 64 элементов сначала обнуляется (для того чтобы подготовить его к новой расстановке ферзей)
- · В массив расставляются ферзи: первый ставится в начало массива, остальные выстраиваются относительно первого. Начальная позиция: заняты первые пять позиций, конечная: заняты последние пять позиций. Элемент массива, куда поставлен ферзь, обозначается за 2. Получаем пять элементов, равных 2, и шестьдесят один элемент, равных 0.
- · Заносим значения массива a[] в матрицу f[][]. В результате получается расстановка ферзей на шахматной доске.
- 4. После расстановки ферзей, помечаем клетки, которые находятся под ударом ферзя. В матрице f «подударные» элементы обозначаем за единицу. Делаем перебор матрицы, если элемент равен 2 (т.е. это ферзь), то заполняем для него подударные элементы (клетки). Это делается в 6 циклах: один для горизонтали, один для вертикали и 4 для диагоналей (вниз и вправо, вверх и влево, вверх и вправо, вниз и влево относительно позиции ферзя).
- 5. После расстановки ферзей и заполнения подударных клеток делаем проверку расстановки. Если есть в матрице нули, то расстановка не верная, т.е. под ударом находятся не все поля, переходим к следующему шагу цикла. Если нет нулей, то к счетчику количества найденных решений qs прибавляем единицу и переходим к следующему шагу цикла.
- Реализация последовательного алгоритма
- #include <stdio.h>
- #include <conio.h>
- #include <stdlib.h>
- #include <time.h>
- int main () {
- const int LBOX=9; ///длина стороны доски + 1
- const int QCELL=65; ///кол-во клеток на шахматной доске + 1
- const int LD=8; ///длина стороны доски
- const int CH=64; ///кол-во клеток на шахматной доске
- int f[LBOX][LBOX]; ///2х-мерный массив, шахматная доска
- int a[QCELL]; ///одномерный массив
- int i1=1, i2=1, i3=1, i4=1, i5=1; ///счетчики для каждого ферзя
- int i, j, k, l, m; ///счетчики
- int qzero=0, qs=0; ///кол-во нулей в матрице f и кол-во найденных решений
- double t1, t2; /// начальное и конечное время
- t1 = clock();
- for ( i1=1; i1<=CH-4; i1++ )
- {
- for ( i2=i1+1; i2<=CH-3; i2++ )
- {
- for ( i3=i2+1; i3<=CH-2; i3++ )
- {
- for ( i4=i3+1; i4<=CH-1; i4++ )
- {
- for ( i5=i4+1; i5<=CH; i5++ )
- {
- for ( l=1; l<=CH; l++ )
- {
- a[l]=0; ///обнуляем массив (0 - не размеченная клетка)
- }
- ///ферзи ставятся один за другим
- a[i1] = 2; ///клетка с 1-ым ферзем
- a[i2] = 2; ///клетка со 2-ым ферзем
- a[i3] = 2; ///клетка с 3-им ферзем
- a[i4] = 2; ///клетка с 4-ым ферзем
- a[i5] = 2; ///клетка с 5-ым ферзем
- k = 1;
- ///сохраняем значение из a[] в f[][] ("переносим" порядок ферзей на шахматную доску)
- for ( i=1; i<=LD; i++ )
- for ( j=1; j<=LD; j++ )
- {
- f[i][j] = a[k];
- k++;
- }
- for ( i=1; i<=LD; i++ )
- {
- for ( j=1; j<=LD; j++ )
- {
- if ( f[i][j]==2 ) ///если в клетке стоит ферзь
- {
- for ( m=1; m<=LD; m++ )
- if ( f[i][m]!=2 )
- f[i][m] = 1; ///заполняем горизонталь единицами (это строка находится под ударом ферзя)
- for ( m=1; m<=LD; m++ )
- if ( f[m][j]!=2 )
- f[m][j] = 1; ///заполняем вертикаль единицами (этот столбец находится под ударом ферзя)
- for ( m=1; m<=LD; m++ )
- if ( f[i+m][j+m]!=2 )
- if ( (i+m<=LD) && (j+m<=LD) )
- f[i+m][j+m] = 1; ///заполняем диагональ вниз-вправо единицами
- for ( m=1; m<=LD; m++ )
- if ( f[i-m][j-m]!=2 )
- if ( (i-m>=1) && (j-m>=1) )
- f[i-m][j-m] = 1; ///заполняем диагональ вверх-влево единицами
- for ( m=1; m<=LD; m++ )
- if ( f[i-m][j+m]!=2 )
- if ( (i-m>=1) && (j+m<=LD) )
- f[i-m][j+m] = 1; ///заполняем диагональ вверх-вправо единицами
- for ( m=1; m<=LD; m++ )
- if ( f[i+m][j-m]!=2 )
- if ( (i+m<=LD) && (j-m>=1) )
- f[i+m][j-m] = 1; ///заполняем диагональ вниз-влево единицами
- }
- }
- }
- qzero = 0;
- ///теперь ищем нули (т.е. клетки, непопавшие под удар ни одного из ферзей)
- for ( i=1; i<=LD; i++ )
- for ( j=1; j<=LD; j++ )
- {
- if ( f[i][j]==0 )
- qzero++;
- }
- if ( qzero==0 )
- {
- qs++;
- printf("%d\n",qs);
- }
- }
- }
- }
- }
- }
- t2 = clock();
- printf("\nQuantity of solutions = %d",qs);
- double t0;
- t0 = (t2-t1)/CLOCKS_PER_SEC;;
- printf("\n Time: %f", t0);
- getch();
- return 1;
- }
Результат работы последовательной программы
По завершению работы программа выводит количество найденных решений и время, потраченное на выполнения программы. Всего найдено 4860 решений, потраченное на нахождение время - 2,36 секунды.
3. Параллельный алгоритм
Распараллеливаем нахождение расстановок только для первого ферзя, т.е. решаем на разных процессорах только для внешнего цикла нахождения решения. Задаем изменение для первого ферзя, т.е. i1 , так чтобы
Для 2 процессоров:
1. будут искаться расстановки, когда 1 ферзь стоит на местах [1,1], [1,3], [1,5], [1,7] и т.д. Т.е каждая 2 клетка, начиная с первой.
2. Будут искаться расстановки, когда 1 ферзь стоит на местах [1,2], [1,4], [1,6] и т.д. Т.е каждая 2 клетка.
Причем, расстановки [1,1], [1,3], [1,5], [1,7] и т.д. для первого ферзя обсчитывает первый процессор, а расстановки [1,2], [1,4], [1,6] и т.д. - второй.
Реализация параллельного алгоритма
#include <mpi.h>
#include <stdio.h>
#include <stdlib.h>
int main (int argc,char *argv[])
{
const int LBOX=9; ///длина стороны доски + 1
const int QCELL=65; ///кол-во клеток на шахматной доске + 1
const int LD=8; ///длина стороны доски
const int CH=64; ///кол-во клеток на шахматной доске
int f[LBOX][LBOX]; ///2х-мерный массив = шахматной доске 8х8
int a[QCELL]; ///одномерный массив, нужно для расчета
int rank, size;
int i1=1,i2=1,i3=1,i4=1,i5=1;
int i, j, k, m, l, n0=0, qs=0, qzero=0, n1=0;
double t1,t2;
MPI_Status s;
MPI_Comm COMM;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&size);
for ( j=1; j<=64; j++ )
{
a[j]=0;
}
if ( rank==0 )
{
t1=MPI_Wtime();
}
for ( i1=rank+1; i1<=CH-4; i1=i1+size )
{
for ( i2=i1+1; i2<=CH-3; i2++ )
{
for ( i3=i2+1; i3<=CH-2; i3++ )
{
for ( i4=i3+1; i4<=CH-1; i4++ )
{
for ( i5=i4+1; i5<=CH; i5++ )
{
for ( l=1; l<=CH; l++ )
{
a[l] = 0;
}
a[i1] = 2;
a[i2] = 2;
a[i3] = 2;
a[i4] = 2;
a[i5] = 2;
k = 1;
for ( i=1; i<=LD; i++ )
for ( j=1; j<=LD; j++ )
{
f[i][j] = a[k];
k++;
}
for ( i=1; i<=LD; i++ )
{
for ( j=1; j<=LD; j++ )
{
if ( f[i][j]==2 )
{
for ( m=1; m<=LD; m++ )
if ( f[i][m]!=2 )
f[i][m] = 1; ///заполняем горизонталь единицами
for ( m=1; m<=LD; m++ )
if ( f[m][j]!=2 )
f[m][j] = 1; ///заполняем вертикаль единицами
for ( m=1; m<=LD; m++ )
if ( f[i+m][j+m]!=2 )
if ( (i+m<=LD) && (j+m<=LD) )
f[i+m][j+m] = 1; ///диагональ вниз-вправо
for ( m=1; m<=LD; m++ )
if ( f[i-m][j-m]!=2 )
if ( (i-m>=1) && (j-m>=1) )
f[i-m][j-m] = 1; ///диагональ вверх-влево
for ( m=1; m<=LD; m++ )
if ( f[i-m][j+m]!=2 )
if ( (i-m>=1) && (j+m<=LD) )
f[i-m][j+m] = 1; ///диагональ вверх-вправо
for ( m=1; m<=LD; m++ )
if ( f[i+m][j-m]!=2 )
if ( (i+m<=LD) && (j-m>=1) )
f[i+m][j-m] = 1; ///диагональ вниз-влево
}
}
}
qzero = 0;
for ( i=1; i<=LD; i++ )
for ( j=1; j<=LD; j++ )
{
if ( f[i][j]==0 )
qzero = qzero + 1;
}
if ( qzero==0 )
{
qs++;
// printf("%d\n",qs);
}
}
}
}
}
}
MPI_Reduce(&qs,&n0,1,MPI_INT,MPI_SUM,0,MPI_COMM_WORLD);
printf("%d\n",qs);
if ( rank==0 )
{
t2 = MPI_Wtime();
printf("\nTime: %e result=%d\n",t2-t1, n0);
}
MPI_Finalize();
return 1;
}
Итоговые результаты:
1. Для 1 процессора время, потребовавшееся на выполнение программы: 2,36
2. Для 2 процессоров время, потребовавшееся на выполнение программы: 1,22
3. Для 4 процессоров время, потребовавшееся на выполнение программы: 6,65
4. Для 6 процессоров время, потребовавшееся на выполнение программы: 4,76
Найдем ускорения и эффективности для 2х процессоров:
1. Для 2 процессоров: Sp=T1 / Tp
T1 = 2,36
T2 = 1,22
Ускорение:
Sp= T1 / T2
S2= 1.93
Эффективность:
Ep=(Sp/p)*100%
E2=(1.93/2)*100=0.965
2. Для 4 процессоров: Sp=T1 / Tp
T1 = 2,36
T4 = 6,65
Ускорение:
Sp= T1 / T4
S4=0.354
Эффективность:
Ep=(Sp/p)*100%
E4=(0.354/4)*100=0.0885
3. Для 6 процессоров: Sp=T1 / Tp
T1 = 2,36
T6 = 4,76
Ускорение:
Sp= T1 / T2
S6=0.495
Эффективность:
Ep=(Sp/p)*100%
E6=(0.495/6)*100=0.0825
Теоретическая оценка:
Т1 =64^5 * 131* 3*10^(-9) =0.0128
131 - это кол-во циклов после 5-ти форов. Пересчитать. -
Т2 =(64^5 * 131* 3*10^(-9))/2 +(131* 10^5 * 3*10^(-9)) =
Таблица 1
Кол-во процессоров |
1 |
2 |
4 |
6 |
|
Tp |
2,36 |
1,22 |
6,65 |
4,76 |
|
Sp=T1 / Tp |
- |
1.93 |
0.354 |
0.495 |
|
Ep=(Sp/p)*100% |
- |
0.965 |
0.0885 |
0.0825 |
программа параллельный алгоритм
Заключение
Реализованы последовательный и параллельный алгоритмы решения задачи о пяти ферзях. Было замерено время выполнения программы на каждом из алгоритмов, найдены ускорение и эффективность.
Литература
1. Многопроцессорные вычислительные системы и параллельное программирование: Учебное пособие / Афанасьев К.Е., Стуколов С.В., Демидов А.В., Малышенко В.В.; Кемеровский госуниверситет. - Кемерово: Кузбассвузиздат, 2003. - 182 с.
Размещено на Allbest.ru
...Подобные документы
Задача о восьми ферзях как широко известная задача по расстановке фигур на шахматной доске. Характеристика алгоритмов решения задачи для доски 8х8. Рассмотрение особенностей программы, использующей алгоритм Лас-Вегаса, проведения статистического анализа.
контрольная работа [382,3 K], добавлен 06.08.2013Методика и основные этапы разработки программы, которая бы наглядно продемонстрировала варианты размещения ферзей на шахматной доске, удовлетворяя правилам задачи. Исследование свойств расстановок мирных ферзей. Написание текста программы и ее листинг.
контрольная работа [81,1 K], добавлен 29.04.2011Разработка программы для оценки шахматной ситуации на доске с использованием графического интерфейса. Способы вывода результатов. Библиотека визуальных компонентов. Модульная структура приложения, его внешний вид. Последовательность работы с приложением.
контрольная работа [132,2 K], добавлен 07.10.2010Разработка программы в среде Pascal ABC.NET, которая обеспечит расстановку ферзей таким образом, что будут пробиваться все свободные позиции. Составление листинга реализации программы. Тестирование разработанного продукта и устранение его погрешностей.
контрольная работа [19,2 K], добавлен 09.12.2013Определение понятия алгоритмов, принципы их решения людьми и всевозможными техническими устройствами. Применение компьютера для решения задач. Особенности использования метода последовательного укрупнения при создании шахматной доски по алгоритму.
презентация [1,1 M], добавлен 06.02.2012Создание программы движения коня по шахматной доске, ее функциональное и эксплуатационное назначение, требования пользователя к программному изделию. Виды скриншотов, информационная совместимость, программные ограничения и требования к документации.
курсовая работа [1,4 M], добавлен 17.02.2010Разработка программы, реализующей расчёт двойного интеграла с применением средств параллельного программирования. Использование для решения задачи узла, содержащего два четырехядерных процессора и двух потоков, уменьшающих время ее выполнения в два раза.
лабораторная работа [2,1 M], добавлен 21.07.2012Описание принципа развивающей игры в слова "Виселица". Разработка программы, реализующей задачу данной игры на языке Delphi. Обоснование выбора среды программирования, листинг файла, результаты отладки и тестирования, руководство для пользователя.
курсовая работа [572,7 K], добавлен 14.07.2012Основные определения поиска подстроки в строке. Простейшие алгоритмы поиска подстроки в строке. Алгоритмы последовательного поиска и Рабина-Карпа, создание и описание программы, реализующей их. Порядок работы с приложением. Тестирование алгоритмов.
курсовая работа [2,7 M], добавлен 24.05.2012Создание программы для вычисления значения функции на основе определённой формулы. Уточнение структуры входных и выходных данных и определение ассемблерного формата их представления. Разработка алгоритмов для реализации работы программного обеспечения.
курсовая работа [240,6 K], добавлен 17.06.2013Задача оптимизации с точки зрения математики как задача нахождения экстремума вещественной функции в некоторой области. Классификация и типы методов оптимизации, условия их практического использования. Создание программы, ее листинг, описание алгоритмов.
курсовая работа [181,7 K], добавлен 22.06.2012Разработка программы в среде Delphi, показывающей на экране возможные варианты выбранной шахматной фигуры для хода. Спецификация исходных данных и функций программы, тексты разработанных классов приложения и их ключевые методы, тестирование программы.
курсовая работа [69,4 K], добавлен 19.10.2010Оценка временной сложности алгоритма. Механизм сортировки пузырьком и вставками. Основные положения технологии параллельного программирования Ореn MР. Оценка временной сложности некоторых классов алгоритма с помощью параллельного программирования.
дипломная работа [1,7 M], добавлен 27.10.2017Разработка программы для решения задачи о синих и красных точках, суть которой заключается в построении отрезков на плоскости, на которой расположены точки, являющиеся концами этих отрезков. Структурная схемы и блок-схема разрабатываемого алгоритма.
курсовая работа [416,2 K], добавлен 19.03.2015Создание игровой программы, реализующей игру в бильярд на компьютере. Математическое описание законов физики, определяющих траекторию движения шаров по бильярдному столу. Существующие аналоги разрабатываемого продукта. Алгоритмы игровой программы.
контрольная работа [31,3 K], добавлен 25.07.2012Нормальный алгоритм Маркова. Тезис Маркова и машина Тьюринга. Гипотеза теории алгоритмов. Алгоритмически неразрешимые проблемы. Задача эквивалентности двух слов в ассоциативном исчислении. Задача распознавания выводимости. Линейная оценка сложности.
методичка [57,0 K], добавлен 06.07.2009Описание методов нахождения и построения эйлеровых циклов в графах при раскрытии содержания цикломатических чисел и фундаментальных циклов. Изучение алгоритма решения задачи "Китайского почтальона" и разработка программы, решающей задачу на языке Си.
курсовая работа [924,3 K], добавлен 09.01.2011Разработка и программная реализация математической модели симметричного шифра "Пирамида". Проектирование программы, реализующей демонстрацию возможностей разработанного алгоритма и предоставляющей полноценный интерфейс пользователя по работе с ним.
дипломная работа [519,0 K], добавлен 19.06.2015Основные особенности эволюционных алгоритмов. Описание алгоритмов селекции, мутации, скрещивания, применяемых для реализации генетических алгоритмов. Вычисление функции приспособленности. Программная реализация. Тестирование и руководство пользователя.
курсовая работа [1,3 M], добавлен 11.03.2014Составление программы для зашифровки текста (не более 255 символов), с использованием одного перемешанного алфавита, полученного случайной перестановкой всех букв исходного алфавита. Создание меню-интерфейса для навигации пользователя по программе.
курсовая работа [496,2 K], добавлен 17.05.2015