Решение задачи поиска кратчайшего пути в обыкновенном графе с учетом веса рёбер (Захаров) (Лабораторная работа 2), страница 3
Описание файла
Файл "Решение задачи поиска кратчайшего пути в обыкновенном графе с учетом веса рёбер (Захаров)" внутри архива находится в папке "Лабораторная работа 2". Документ из архива "Лабораторная работа 2", который расположен в категории "". Всё это находится в предмете "параллельные системы и параллельные вычисления" из 9 семестр (1 семестр магистратуры), которые можно найти в файловом архиве НИУ «МЭИ» . Не смотря на прямую связь этого архива с НИУ «МЭИ» , его также можно найти и в других разделах. Архив можно найти в разделе "лабораторные работы", в предмете "параллельные системы и параллельные вычисления" в общих файлах.
Онлайн просмотр документа "Решение задачи поиска кратчайшего пути в обыкновенном графе с учетом веса рёбер (Захаров)"
Текст 3 страницы из документа "Решение задачи поиска кратчайшего пути в обыкновенном графе с учетом веса рёбер (Захаров)"
{
fprintf(Rstream, "Искомый путь (длина %d):\n", M[Vstart*n + Vend]);
while(i >= 0)
{
if(i)
fprintf(Rstream, "%d => ", path[i] + 1);
else
fprintf(Rstream, "%d", path[i] + 1);
i--;
}
}
fclose(Rstream);
}
// Освобождаем память
free(M);
free(P);
// Записываем время работы главного процесса в лог
if(procRank == MAIN_PROC)
{
results[h] = MPI_Wtime() - startTime;
print_log("Время (%d): %f сек\n", h + 1, results[h]);
}
}
MPI_Finalize();
if(procRank == MAIN_PROC)
{
results[0] = results[0] / TEST_COUNT;
for(i = 1; i < TEST_COUNT; i++)
results[0] += results[i] / TEST_COUNT;
print_log("Среднее : %f сек\n", results[0]);
free(results);
}
return 0;
}
// Генерирует псевдо-случайное число из интервала [a;b]
vsize gen_random(vsize a, vsize b)
{
return (vsize) (a + (b - a) * ((float) rand() / RAND_MAX));
}
// Генерирует псевдо-случайное число из интервала [a;b], возвращая inf с вероятностью (1 - p)
weight get_random(weight a, weight b, float p, weight inf)
{
return (weight) ( (((double) rand() / RAND_MAX) >= p) ? inf : (a + (b - a) * ((double) rand() / RAND_MAX)) );
}
// Записывает сообщения message в лог
void print_log(const char *message, ...)
{
va_list ptr;
va_start(ptr, message);
// Открываем файл логов
FILE *stream = fopen(LOG_PATH, "a");
if(stream == NULL)
return;
// Записываем сообщение в лог
vfprintf(stream, message, ptr);
fclose(stream);
va_end(ptr);
}
// Выводит сообщение по коду ошибки errno
void print_err(const char *message)
{
char *msg = (char *)"[ERROR] ";
if(message != NULL)
msg = strcat(msg, message);
switch(errno)
{
case E2BIG : msg = strcat(msg, "Список аргументов слишком длинный"); break;
case EACCES : msg = strcat(msg, "Отказ в доступе"); break;
case EADDRINUSE : msg = strcat(msg, "Адрес используется"); break;
case EADDRNOTAVAIL : msg = strcat(msg, "Адрес недоступен"); break;
case EAFNOSUPPORT : msg = strcat(msg, "Семейство адресов не поддерживается"); break;
case EALREADY : msg = strcat(msg, "Соединение уже устанавливается"); break;
case EBADF : msg = strcat(msg, "Неправильный дескриптор файла"); break;
case EBADMSG : msg = strcat(msg, "Неправильное сообщение"); break;
case EBUSY : msg = strcat(msg, "Ресурс занят"); break;
case ECANCELED : msg = strcat(msg, "Операция отменена"); break;
case ECHILD : msg = strcat(msg, "Нет дочернего процесса"); break;
case ECONNABORTED : msg = strcat(msg, "Соединение прервано"); break;
case EDEADLK : msg = strcat(msg, "Обход тупика ресурсов"); break;
case EDESTADDRREQ : msg = strcat(msg, "Требуется адрес назначения"); break;
case EDOM : msg = strcat(msg, "Ошибка области определения"); break;
case EEXIST : msg = strcat(msg, "Файл существует"); break;
case EFAULT : msg = strcat(msg, "Неправильный адрес"); break;
case EFBIG : msg = strcat(msg, "Файл слишком велик"); break;
case EHOSTUNREACH : msg = strcat(msg, "Хост недоступен"); break;
case EIDRM : msg = strcat(msg, "Идентификатор удален"); break;
case EILSEQ : msg = strcat(msg, "Ошибочная последовательность байтов"); break;
case EINPROGRESS : msg = strcat(msg, "Операция в процессе выполнения"); break;
case EINTR : msg = strcat(msg, "Прерванный вызов функции"); break;
case EINVAL : msg = strcat(msg, "Неправильный аргумент"); break;
case EIO : msg = strcat(msg, "Ошибка ввода-вывода"); break;
case EISCONN : msg = strcat(msg, "Сокет (уже) соединен"); break;
case EISDIR : msg = strcat(msg, "Это каталог"); break;
case ELOOP : msg = strcat(msg, "Слишком много уровней символических ссылок"); break;
case EMFILE : msg = strcat(msg, "Слишком много открытых файлов"); break;
case EMLINK : msg = strcat(msg, "Слишком много связей"); break;
case EMSGSIZE : msg = strcat(msg, "Неопределённая длина буфера сообщения"); break;
case ENAMETOOLONG : msg = strcat(msg, "Имя файла слишком длинное"); break;
case ENETDOWN : msg = strcat(msg, "Сеть не работает"); break;
case ENETRESET : msg = strcat(msg, "Соединение прервано сетью"); break;
case ENETUNREACH : msg = strcat(msg, "Сеть недоступна"); break;
case ENFILE : msg = strcat(msg, "Слишком много открытых файлов в системе"); break;
case ENOBUFS : msg = strcat(msg, "Буферное пространство недоступно"); break;
case ENODEV : msg = strcat(msg, "Нет такого устройства"); break;
case ENOENT : msg = strcat(msg, "Нет такого файла в каталоге"); break;
case ENOEXEC : msg = strcat(msg, "Ошибка формата исполняемого файла"); break;
case ENOLCK : msg = strcat(msg, "Блокировка недоступна"); break;
case ENOLINK : msg = strcat(msg, "Зарезервировано"); break;
case ENOMEM : msg = strcat(msg, "Недостаточно памяти"); break;
case ENOMSG : msg = strcat(msg, "Сообщение нужного типа отсутствует"); break;
case ENOPROTOOPT : msg = strcat(msg, "Протокол недоступен"); break;
case ENOSPC : msg = strcat(msg, "Памяти на устройстве не осталось"); break;
case ENOSYS : msg = strcat(msg, "Функция не реализована"); break;
case ENOTCONN : msg = strcat(msg, "Сокет не соединен"); break;
case ENOTDIR : msg = strcat(msg, "Это не каталог"); break;
case ENOTEMPTY : msg = strcat(msg, "Каталог непустой"); break;
case ENOTSOCK : msg = strcat(msg, "Это не сокет"); break;
case ENOTTY : msg = strcat(msg, "Неопределённая операция управления вводом-выводом"); break;
case ENXIO : msg = strcat(msg, "Нет такого устройства или адреса"); break;
case EOPNOTSUPP : msg = strcat(msg, "Операция сокета не поддерживается"); break;
case EOVERFLOW : msg = strcat(msg, "Слишком большое значение для типа данных"); break;
case EPERM : msg = strcat(msg, "Операция не разрешена"); break;
case EPIPE : msg = strcat(msg, "Разрушенный канал"); break;
case EPROTO : msg = strcat(msg, "Ошибка протокола"); break;
case EPROTONOSUPPORT: msg = strcat(msg, "Протокол не поддерживается"); break;
case EPROTOTYPE : msg = strcat(msg, "Ошибочный тип протокола для сокета"); break;
case ERANGE : msg = strcat(msg, "Результат слишком велик"); break;
case EROFS : msg = strcat(msg, "Файловая система только на чтение"); break;
case ESPIPE : msg = strcat(msg, "Неправильное позиционирование"); break;
case ESRCH : msg = strcat(msg, "Нет такого процесса"); break;
case ETIMEDOUT : msg = strcat(msg, "Операция задержана"); break;
case ETXTBSY : msg = strcat(msg, "Текстовый файл занят"); break;
case EWOULDBLOCK : msg = strcat(msg, "Блокирующая операция"); break;
case EXDEV : msg = strcat(msg, "Неопределённая связь"); break;
default : msg = strcat(msg, "Неизвестная ошибка");
}
print_log(msg);
}
1 Среднее арифметическое по результатам 5 измерений
Москва, 2012