Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.06.2016, 14:08   #1
surrexi
 
Регистрация: 02.06.2016
Сообщений: 7
По умолчанию Приближенный алгоритм поиска p-медиан

Здравствуйте уважаемые форумчане. Нужна помощь в написании приближенного алгоритма поиска p-медиан.
Я описал ввод графа через файл (описание списков смежности), занесение его в матрицу смежности и с помощью алгоритма Флойда расчет матрицы расстояний.
Алгоритм поиска p-медиан таков нашел на вики: https://ru.wikipedia.org/wiki/Алгоритм_поиска_p_медиан
Реализовал первый шаг, случайный выбор медиан (в условии указано две вершины)
Полученный код на C++
Код:
const int INF = 100000;
int _tmain() {
  int i, j, k; // индексы
  std::fstream file("graph.txt"); // открытие файла
	
  // Проверка открытия файла
  if (!file.is_open()) { 
    cout << "Unable to open file";
    getchar();
    exit(1);
  }

  int N; // количество вершин
  file >> N; // считывание с файла количества вершин

  // Создание матрицы весов и заполнение ее начальными значениями
  int **weights_matrix = new int *[N];
  weights_matrix++;
  for (i = 1; i <= N; i++) {
    weights_matrix[i] = new int[N];
    weights_matrix[i]++;
    for (j = 1; j <= N; j++)
      if (i == j) 
        weights_matrix[i][j] = 0;
      else 
        weights_matrix[i][j] = INF;
      }

  // Запись координат ребер с их весами в матрицу весов
  int ves;
  while (!file.eof()) {
    file >> i >> j >> ves;
    weights_matrix[i][j] = ves;
  }

  // Вывод матрицы весов
  printf("\nOutput weights matrix:\n\n");
  for (i = 1; i <= N; i++) {
    for (j = 1; j <= N; j++) {
      if (weights_matrix[i][j] == INF)
        printf("  inf");
      else
        printf("%5d", weights_matrix[i][j]);
    }
    printf("\n");
  }

  // Создание матрицы расстояний
  int **distance_matrix = new int *[N];
  distance_matrix++;
  for (i = 1; i <= N; i++) {
    distance_matrix[i] = new int[N];
    distance_matrix[i]++;
  }

  // заполнение матрицы расстояний значениями матрицы весов
  for (i = 1; i <= N; i++)
    for (j = 1; j <= N; j++)
      distance_matrix[i][j] = weights_matrix[i][j];

  // Формирование матрицы расстояний алгоритмом Флойда 
  for (k = 1; k <= N; k++) 
    for (i = 1; i <= N; i++) 
      for (j = 1; j <= N; j++) 
	if (distance_matrix[i][k] < INF && distance_matrix[k][j] < INF)
	  if (distance_matrix[i][k] + distance_matrix[k][j] < distance_matrix[i][j])
	    distance_matrix[i][j] = distance_matrix[i][k] + distance_matrix[k][j];

  // Вывод матрицы расстояний
  printf("\nOutput distance matrix:\n\n");
  for (i = 1; i <= N; i++) {
    for (j = 1; j <= N; j++) {
      printf("%4d", distance_matrix[i][j]);
    }
    printf("\n");
  }

  // Подготовительный этап для приближенного алгоритма поиска медиан
  int p = 2; // количество медиан
  int *Sol = new int [p]; // массив медиан
  Sol++;
  bool *Dop = new bool [N]; // логический массив проверки вершин на допустимость
  Dop++;
  for (i = 1; i <= p; i++)
    Sol[i] = 0; // инициализация решения, склады не выбраны
  for (i = 1; i <= N; i++)
    Dop[i] = true; //все вершины допустимы

  // Шаг 1. Рандомный выбор p-вершин
  bool stop;
  srand(time(0));
  for (i = 1; i <= p; i++) {
    stop = true;
    while (stop) {
      k = 1 + rand() % N;
      if (Dop[i]) {
        Sol[i] = k;
        Dop[k] = false;
        stop = false;
      }
    }
  }
  getchar();
  return 0;
}
Помогите с дальнейшей реализацией данного алгоритма, можно на любом языке, главное реализация.
Ссылки на подобные источники как вики и книга Кристофера не кидайте, уже все пролистал.
Нужно просто реализовать выполнение шагов.
surrexi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгоритм поиска Sylar9 Общие вопросы C/C++ 0 03.04.2012 12:38
алгоритм поиска незнайка_на_земле Помощь студентам 4 08.03.2011 10:46
Алгоритм поиска!!!! vit1990 Помощь студентам 14 29.01.2011 21:18
Приближенный алгоритм для задач о покрытиях множествами @Міша@ Паскаль, Turbo Pascal, PascalABC.NET 0 29.04.2009 16:25
Алгоритм поиска... Johnson Общие вопросы Delphi 1 26.10.2008 08:35