Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
2 / 2 / 1
Регистрация: 23.11.2011
Сообщений: 87

параллельное вычисление гамильтонова цикла в графе заданном генератором

23.11.2011, 22:18. Показов 2555. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.

Собственно вопрос ясен из названия темы, учусь в Праге, дали задание, в нашем вузе я не сталкивался с подобным (не успел наверное).

При помощи openMP в несколько потоков найти гамильтов цикл в графе, который генерируется генератором. В качестве системы предложен сервер SUN STAR(blade).

в кате задание с гуглотранслятора, может что то из него понадобится.

задание
Вычисления типа Master-Slave

Разработайте параллельный алгоритм Master-Slave технология, который использует технологии MPI и OpenMP. В начале расчета MPI созданы в общей сложности р процессах, где один из мастер-процесса контроля и другие процессы будут вычислительной раб. Мастера будут искаться пространстве состояний разделены между другими вычислительными процессами. Чтобы сделать это возможным, стандартный последовательный алгоритм начинает искать пространство состояний в ширину, и генерирует достаточно большой набор начальной конфигурации хранилища для вычислительных процессов раб. Создание начальной конфигурации используя ширину заканчивается, когда количество листов пространства состояний в первый раз более чем Zp , где р -число процессоров и Z> = 10 это предварительно постоянную (постоянная из экспериментально определить, в зависимости от типа работы - вам нужно для достижения оптимального детализации, раб вычислительных процессов работы достаточно долго, и число конфигураций достаточно большим, чем количество процессоров). Затем начинается начальной главной конфигурации готова распространять рабом вычислительных процессов. Мастер всегда выбирает одну конфигурацию из своей очереди и отправляет его на выбранный раб процесса.

Каждый ведомый всегда принято конфигурации хранятся в его локальной очереди, а затем генерирует достаточное количество конфигураций прохождения ширины, что вы сохранили в локальной очереди. Эти конфигурации будет иметь проблемы своего проходящего в глубину. Использование OpenMP будут обрабатываться параллельно несколько конфигураций, то есть каждый поток генерируется с использованием OpenMP обрабатываются последовательно глубина сканирования всегда одна конфигурация выбирается из очереди (количество потоков выбрать делится на 4, так как каждый узел имеет четыре вычислительных ядер). Раб никогда не вернулся в состояние выше их начальной конфигурации (то есть, первое дополнение к Master). Когда волокно проходит через присвоен государственный пространстве, определенном назначена начальная конфигурация имеет следующую свободную конфигурацию стека. Если подчиненный очереди больше нет свободных начальной конфигурации, сообщают, что мастер, он пошлет еще один свободный počátační конфигурации вашей очереди. Если мастер не имеет свободных конфигурация не сообщает об этом запрашивающей раб процесс посылает его локальное решение мастером, а затем останавливается. Если подчиненный решение с лучшей возможной цене, сообщите об этом хозяину, что использует связи, чтобы все операции с одним конце расчета. Они должны быть обработаны с ситуациями, когда решение одновременно обнаруживает несколько рабов (например, через параллельным сокращением).

Расчет Master-Slave используется в качестве библиотеки MPI для связи через распределенной памятью и OpenMP для обмена данными через общую память. При измерении применение план всегда один MPI процесс на "лезвие бритвы" (Blade объема STAR) и уровень OpenMP всегда создает несколько потоков в 4 (каждая бритва имеет 4 ядра процессора).



Роль HG: гамильтонова графа

Входные данные:

G (V, E) = не оценено простым неориентированый на регулярный граф на п вершинах и м краям, я = целое число, представляющее число узлов графа G , п> = 5 = целое число, представляющее порядок узел степень графа G , п> = к > = 3, я и то же время как нечетные


Рекомендации для G алгоритм генерации:

Использование генератора при графе графике " т-АД ".

Задача:

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

Выходной алгоритму:

Ответ ли заданный граф содержит гамильтонов путь. В случае положительного ответа на один такой список путей.

Последовательный алгоритм:

Последовательный алгоритм типа СО-DFS с глубиной состояние дерева ограничена н . Mezistav определяется список узлов, на построенной еще возможных маршрутов. Допустимая конечных состояниях всех перестановок N чисел, представляющих гамильтонов путь. Возврат осуществляется в государстве, где нет возможности продолжать строительство гамильтонов путь. Расчет заканчивается, когда первые находки гамильтонов путь и пройти или не все пространство государства.

Параллельный алгоритм:

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


собственно генератор

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

Первая строка содержит информацию о количестве узлов n в графе.

Остальные строки описывают матрицу смежности M [n, n], которая хранится в файле построчно. Ряд u показывает, с какими узлами соединен или не соединен узел u. Другими словами, узел u связаны c узлом v , если M [U, V] = 1 Если M [U, V] = 0, между узлами u и v нет связи. Не сложно заметить, что матрица M симметрична, то есть M [U, V] = M [V, U].
Например:

4
0110
1001
1000
0100
Этот файл описывает граф с 4 узлов, где грань между узлами 0 и 1, 0 и 2, 1 и 3

Генератор

Этот генератор (двоичный файл, скомпилированный для STAR = 64-разрядная SUSE Linux) генерирует случайные графы, которые являются k-регулярными (то есть, каждый узел имеет степень к) графов, где узлы имеют в уровени к степень, и графики c полностью случайными параметрами являются:

-t typ : тип генерируемого графа, где параметр типа может занимать от 3 ​​до следующие строковые значения:
REG : k-регулярный граф
AD : график со средней степенью к узла k
НАХ : случайный граф,

-t число: количество узлов
-k число : степень узлов,
-О файл : имя файла, где вы храните сгенерированный граф.

Пример:

generator -t AD -n 200 -k 13 -o test.txt

генерирует график на 200 узлов, где средняя степень узла 13, и сохранит эту таблицу в файл test.txt.

Графики этого генератора не обязательно должны быть непрерывными.





Я нашел следующий код

программа нахождения гамильтонова цикла
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
#define n 10
 
int c[n] ;   // номер хода, на котором посещается вершина
int path[n]; // номера посещаемых вершин
int v0=2;    // начальная вершина
 
//Матрица смежности
int a[n][n]=
{
    0,0,0,0,0,1,0,0,0,0,
    0,0,1,0,0,0,1,0,0,0,
    0,1,0,1,0,0,0,1,0,0,
    0,0,1,0,1,0,0,0,1,0,
    1,0,0,1,0,0,0,0,0,1,
    0,0,0,0,0,0,1,0,0,1,
    0,0,0,1,0,0,0,1,0,0,
    0,0,0,0,1,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,1,
    0,0,0,0,0,0,0,0,0,0
};
 
void prnt(void)
{
int p;
        for ( p = 0 ; p<n ; p++)
         printf("%d ", path[p] ) ;
    printf("%d ", path[0] ) ;
    printf("\n") ;
}
 
//подпрограмма нахождения гамильтонова цикла
int gamilton ( int k)
{
int v,q1=0;
    for(v=0; v<n && !q1; v++)
    {
      if(a[v][path[k-1]]||a[path[k-1]][v])
      {
    if (k==n &&  v==v0 ) q1=1;
    else if (c[v]==-1) 
            {
          c[v] = k ; path[k]=v; 
          q1=gamilton (k+1) ;
          if (!q1) c[v]=-1;  
        } else continue;
    } 
    }   return q1;
}
 
main()
{
int j;
    clrscr() ;
    printf("Гамильтонов цикл:\n");
        for(j=0;j<n;j++) c[j]=-1;
        path[0]=v0 ;
          c[v0]=v0;
    if(gamilton (1)) prnt(); else printf("Нет решений\n");
}


на сайте http://dmtsoft.ru/

также в универе дали примеры использования параллельного вычисления:

пример для параллельного вычисления
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#define CHECK_MSG_AMOUNT  100
 
#define MSG_WORK_REQUEST 1000
#define MSG_WORK_SENT    1001
#define MSG_WORK_NOWORK  1002
#define MSG_TOKEN        1003
#define MSG_FINISH       1004
 
 .....
 
 
while стек_не_пуст()
{
  счетчик++;
  if ((счетчик % CHECK_MSG_AMOUNT)==0)
  {
    MPI_Iprobe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &flag, &status);
    if (flag)
    {
      //prisla zprava, je treba ji obslouzit
      //v promenne status je tag (status.MPI_TAG), cislo odesilatele (status.MPI_SOURCE)
      //a pripadne cislo chyby (status.MPI_ERROR)
      swith (status.MPI_TAG)
      {
         case MSG_WORK_REQUEST : // zadost o praci, prijmout a dopovedet
                                 // zaslat rozdeleny zasobnik a nebo odmitnuti MSG_WORK_NOWORK
                                 break;
         case MSG_WORK_SENT : // prisel rozdeleny zasobnik, prijmout
                              // deserializovat a spustit vypocet
                              break;
         case MSG_WORK_NOWORK : // odmitnuti zadosti o praci
                                // zkusit jiny proces
                                // a nebo se prepnout do pasivniho stavu a cekat na token
                                break
         case MSG_TOKEN : //ukoncovaci token, prijmout a nasledne preposlat
                          // - bily nebo cerny v zavislosti na stavu procesu
                          break;
         case MSG_FINISH : //konec vypoctu - proces 0 pomoci tokenu zjistil, ze jiz nikdo nema praci
                           //a rozeslal zpravu ukoncujici vypocet
                           //mam-li reseni, odeslu procesu 0
                           //nasledne ukoncim spoji cinnost
                           //jestlize se meri cas, nezapomen zavolat koncovou barieru MPI_Barrier (MPI_COMM_WORLD)
                           MPI_Finalize();
                           exit (0);
                           break;
         default : chyba("neznamy typ zpravy"); break;
      }
    }
  }
  расширение_следующих_уровней ();
}


Может я ошибаюсь, но думаю, что для опытных людей потребуются считанные минуты чтобы переделать программу поиска цикла гамильтона таким образом:

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

Для людей которые этот материал знают изменение программы займет совсем немного времени, просто я совсем не знаком с параллельным вычислением и язык спустя пол года учебы ещё хромает, а сдавать скоро надо, максимум что я могу успеть до вторника это понять как работает программа и быть готовым её защитить.

Заранее благодарю.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.11.2011, 22:18
Ответы с готовыми решениями:

Поиск гамильтонова цикла в графе
Написать программу гамильтонова цикла в графе для PascalABC Помогите пожалуйста Добавлено через 1 час 45 минут Есть программа для...

Поиск гамильтонова цикла в графе
ПОмогите плиииз!!! Написать программу поиска гамильтонова цикла в графе

Поиск гамильтонова цикла в графе
Написать программу поиска гамильтонова цикла в графе.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.11.2011, 22:18
Помогаю со студенческими работами здесь

Нахождение гамильтонова цикла в графе
Как заставить код работать? По условию задачи нужно найти гамильтонов цикл в графе. Если такового нет - решение не найдено. unit...

Поиск гамильтонова цикла в ориентированном графе
Честно пытался искать по форуму и не только, но так толком ничего и не нашел :\ Необходимо узнать, есть ли в орграфе гамильтонов цикл или...

Алгебраический алгоритм поиска гамильтонова цикла в графе.
ребята, может кто-нибудь помочь?очень надо сдаю курсовую работу по теме ПОИСК ГАМИЛЬТОНОВА ЦИКЛА В ГРАФЕ кто может объяснить...

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

Исправить программу нахождения эйлерова цикла в графе заданном матрицой смежности
помогите исправить программу нахождения эйлерова цикла в графе заданном матрицой смежности вот что сам написал : namespace Рекурсия { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru