Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/68: Рейтинг темы: голосов - 68, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 27.02.2013
Сообщений: 20
1

Векторы. Венгерский алгоритм

14.10.2013, 11:40. Показов 13960. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Имеется следующий код для решения задачи о назначениях, отрытый на просторах интернета :
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
/* Венгерский алгоритм.
 * Даниил Швед, 2008. danshved [no-spam] gmail.com
 * Реализация навеяна псевдокодом А.С.Лопатина из книги
 * "Оптимизация на графах (алгоритмы и реализация)".
 */
#include <vector>
#include <limits>
using namespace std;
 
typedef pair<int, int> PInt;
typedef vector<int> VInt;
typedef vector<VInt> VVInt;
typedef vector<PInt> VPInt;
 
const int inf = numeric_limits<int>::max();
 
/*
 * Решает задачу о назначениях Венгерским методом.
 * matrix: прямоугольная матрица из целых чисел (не обязательно положительных).
 *         Высота матрицы должна быть не больше ширины.
 * Возвращает: Список выбранных элементов, по одному из каждой строки матрицы.
 */
VPInt hungarian(const VVInt &matrix) {
   
   // Размеры матрицы
   int height = matrix.size(), width = matrix[0].size();
   
   // Значения, вычитаемые из строк (u) и столбцов (v)
   VInt u(height, 0), v(width, 0);
   
   // Индекс помеченной клетки в каждом столбце
   VInt markIndices(width, -1);
   
   // Будем добавлять строки матрицы одну за другой
   for(int i = 0; i < height; i++) {
      VInt links(width, -1);
      VInt mins(width, inf);
      VInt visited(width, 0);
      
      // Разрешение коллизий (создание "чередующейся цепочки" из нулевых элементов)
      int markedI = i, markedJ = -1, j;
      while(markedI != -1) {
         // Обновим информацию о минимумах в посещенных строках непосещенных столбцов
         // Заодно поместим в j индекс непосещенного столбца с самым маленьким из них
         j = -1;
         for(int j1 = 0; j1 < width; j1++)
            if(!visited[j1]) {
               if(matrix[markedI][j1] - u[markedI] - v[j1] < mins[j1]) {
                  mins[j1] = matrix[markedI][j1] - u[markedI] - v[j1];
                  links[j1] = markedJ;
               }
               if(j==-1 || mins[j1] < mins[j])
                  j = j1;
            }
            
         // Теперь нас интересует элемент с индексами (markIndices[links[j]], j)
         // Произведем манипуляции со строками и столбцами так, чтобы он обнулился
         int delta = mins[j];
         for(int j1 = 0; j1 < width; j1++)
            if(visited[j1]) {
               u[markIndices[j1]] += delta;
               v[j1] -= delta;
            } else {
               mins[j1] -= delta;
            }
         u[i] += delta;
         
         // Если коллизия не разрешена - перейдем к следующей итерации
         visited[j] = 1;
         markedJ = j;
         markedI = markIndices[j];   
      }
      
      // Пройдем по найденной чередующейся цепочке клеток, снимем отметки с
      // отмеченных клеток и поставим отметки на неотмеченные
      for(; links[j] != -1; j = links[j])
         markIndices[j] = markIndices[links[j]];
      markIndices[j] = i;
   }
   
   // Вернем результат в естественной форме
   VPInt result;
   for(int j = 0; j < width; j++)
      if(markIndices[j] != -1)
         result.push_back(PInt(markIndices[j], j));
   return result;
}
А как пользоваться этим мне не понятно. Как передать таблицу значений этим векторам ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.10.2013, 11:40
Ответы с готовыми решениями:

Венгерский алгоритм
Ребята прошу Вашей помощи, нужен исходник Венгерского алгоритма на C#

Задача коммивояжера венгерский алгоритм
Составить программу решения “задачи коммивояжера”. Необходимо определить минимальную стоимость...

Не считает на минимум. Венгерский алгоритм
Венгерский алгоритм. Не считает на минимум. Он изначально вроде считает верно а потом делает ошибку...

Венгерский алгоритм, используя дерево
Есть такая задачка: Проблема назначения формулируется так: есть n людей, назначаемых на n работ....

3
511 / 196 / 26
Регистрация: 07.08.2013
Сообщений: 814
16.10.2013, 17:03 2
C++
1
typedef vector<VInt> VVInt;
Это вектор векторов из int. В цикле методом push_back заполняет вектор VInt. Не?
1
0 / 0 / 0
Регистрация: 27.02.2013
Сообщений: 20
17.10.2013, 11:37  [ТС] 3
Спасибо, Kulgar.
Вектора вообще впервые вижу, хз как с ними работать.
Решил написать свой код, без всяких заумностей и векторов. Если получится - выложу.
0
0 / 0 / 0
Регистрация: 25.02.2013
Сообщений: 46
06.11.2016, 21:05 4
Цитата Сообщение от Navovvol Посмотреть сообщение
Спасибо, Kulgar.
Вектора вообще впервые вижу, хз как с ними работать.
Решил написать свой код, без всяких заумностей и векторов. Если получится - выложу.
Ну что, получилось?) Мне тоже нужна эта задача.
Пока дошел до шага, на котором вычеркивания начинаются, если речь об эвристике.
0
06.11.2016, 21:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.11.2016, 21:05
Помогаю со студенческими работами здесь

Венгерский алгоритм (задача о назначениях)
Здравствуйте. Необходимо реализовать венгерский алгоритм. Поиски в интернете ни к чему не привели....

Даны векторы А(5), В(5), С(5). Проверить есть ли среди них ортогональные векторы
Даны векторы А(5), В(5), С(5). Проверить есть ли среди них ортогональные векторы. Применить...

Даны векторы А(5), В(5), С(5). Проверить есть ли среди них коллинеарные векторы
Даны векторы А(5), В(5), С(5). Проверить есть ли среди них коллинеарные векторы. Применить...

Дан файл, компонентами которого являются n-мерные векторы. Векторы с наибольшим модулем перенести в конец файла
Дан файл, компонентами которого являются n-мерные векторы. Векторы с наибольшим модулем перенести в...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru