Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
0 / 0 / 0
Регистрация: 25.02.2013
Сообщений: 46

Решение матрицы 6х6 венгерским методом. (Эвристический способ)

23.10.2016, 23:29. Показов 3567. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Необходимо написать программу, реализующую венгерский алгоритм решения задачи о назначениях.
Как известно, задача может быть решена как эвристически, так и с помощью Алгоритма Куна.

Для матрицы 6х6 работает и первый метод, для матриц же большей размерности он уже не подойдет.
Если второй метод найти в интернетах особого труда не составляет, то как запрограммировать эвристику?
Подскажите, пожалуйста)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.10.2016, 23:29
Ответы с готовыми решениями:

Из заданной квадратной матрицы B(6х6) получить матрицу B(6х4) удалением из матрицы B(6х6) 0-го и 2-го столбцов
Из заданной квадратной матрицы B(6х6) получить матрицу B(6х4) удалением из матрицы B(6х6) 0-го и 2-го столбцов.

Задача о назначениях Венгерским методом
Разработать приложение для решения задачи о назначениях Венгерским методом. Я сделал первый и второй шаги, пожалуйста, помогите мне...

Даны две квадратные матрицы 5х5 и 6х6 в текстовых файлах. Трансформировать их в другие матрицы
Уважаемые участники форума. Напишите, пожалуйста, программу. Даны две квадратные матрицы 5х5 и 6х6 в текстовых файлах....

7
1498 / 1213 / 821
Регистрация: 29.02.2016
Сообщений: 3,631
24.10.2016, 08:31
http://acm.mipt.ru/twiki/bin/v... gorithmCPP
1
0 / 0 / 0
Регистрация: 25.02.2013
Сообщений: 46
25.10.2016, 21:14  [ТС]
Цитата Сообщение от afront Посмотреть сообщение
http://acm.mipt.ru/twiki/bin/view/Al...anAlgorithmCPP
Если создавать проект, как консольное приложение, он ругается.

fatal error LNK1120: 1 неразрешенных внешних элементов

Видимо, потому что нет main, а каким-то другим способом реализовано. Не могу разобраться.
0
1498 / 1213 / 821
Регистрация: 29.02.2016
Сообщений: 3,631
25.10.2016, 21:30
здесь с майном
https://habrahabr.ru/post/63982/

Добавлено через 3 минуты
https://github.com/saebyn/munkres-cpp
0
0 / 0 / 0
Регистрация: 25.02.2013
Сообщений: 46
07.11.2016, 12:35  [ТС]
Итак наконец, начал писать сам

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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <fstream>
#include <iostream>
#include "windows.h"
#include <conio.h>
#include <cstdlib>
#include <random>
#include "time.h"
 
 
int main() {
 
    using namespace std;
setlocale (LC_ALL, "Russian");
const int n = 6;
srand(time(0));
    
int arr[n][n];
int cross0[n][n];
int str0[n],col0[n];
    int min_line[100], i, j;
 
    int S=0; int k=0;
    
    
// Ввод матрицы  рандомно в диапазоне от 1 до 20
for(i=0; i<n; i++)  {
    for(j=0; j<n; j++)  {
        arr[i][j] = rand() % 20 +1;
                        }
                    }
        /*          
// Ввод матрицы  вручную
for(i=0; i<n; i++)  {
    for(j=0; j<n; j++)  {
        cout<<"a["<<i+1<<"]["<< j+1<<"]->";
        cin>>arr[i][j];
                        }
                    }
*/
 
//Вывод матрицы:
cout<<"Исходная матрица:"<<endl;
       for (int i=0;i<n;i++){
        for (int j=0;j<n;j++)   {
            cout<<arr[i][j]<<"\t";
                                }   
                        cout<<"\n";
                            }
    
// Поиск alpha - минимального элемента в каждой строке
 int alpha=arr[0][0];
  for(int i=0;i<n;i++){
      int alpha=arr[i][0];
      for(int j=0;j<n;j++){
          if(arr[i][j]<alpha)
              alpha=arr[i][j];}
          min_line[i]=alpha;}
  
  cout<<endl<<endl;
  for(int i=0;i<n;i++)
       cout<<"Alpha "<<i+1<<" строки: "<<min_line[i]<<" "<<endl;
   cout<<endl;
// Проверка: поиск S
     for(int i=0;i<n;i++){
        S=S+min_line[i];
                        }
     cout<<"S: "<<S<<endl;
 
 
//Вычитание alpha из каждого элемента строки
     for(int i=0;i<n;i++){
         for(int j=0;j<n;j++)
         {
             arr[i][j]-=min_line[i];
         }
     }
 
     //Вывод матрицы:
cout<<"Матрица с вычтенными значениями alpha:"<<endl;
       for (int i=0;i<n;i++){
        for (int j=0;j<n;j++)   {
            cout<<arr[i][j]<<"\t";
                                }   
                        cout<<"\n";
                            }
 
 
     // Поиск beta - минимального элемента в каждой строке
 int beta=arr[0][0];
  for(int j=0;j<n;j++){
      int beta=arr[0][j];
      for(int i=0;i<n;i++){
          if(arr[i][j]<beta)
              beta=arr[i][j];}
          min_line[j]=beta;}
  
  cout<<endl<<endl;
  for(int j=0;j<n;j++)
       cout<<"Beta "<<j<<" столбца: "<<min_line[j]<<" "<<endl;
   cout<<endl;
 
// Проверка: поиск S
     for(int j=0;j<n;j++){
        S=S+min_line[j];
                        }
     cout<<"S: "<<S<<endl;
 
 
//Вычитание beta из каждого элемента столбца
     for(int i=0;i<n;i++){
         for(int j=0;j<n;j++)
         {
             arr[i][j]-=min_line[j];
         }
     }
 
     //Вывод матрицы:
cout<<"Матрица с вычтенными значениями beta:"<<endl;
       for (int i=0;i<n;i++){
        for (int j=0;j<n;j++)   {
            cout<<arr[i][j]<<"\t";
                                }   
                        cout<<"\n";
                            }
 
 
 
// Отмечаем нули
for(i=0; i<n; i++)
   for(j=0; j<n; j++)
      cross0[i][j]=1;
for(i=0; i<n; i++)
   str0[i]=col0[i]=0;
for(i=0; i<n; i++)
   for(j=0; j<n; j++)
      if(arr[i][j]==0)
         if(str0[i]==0 && col0[j]==0){
            cross0[i][j]=0;
            str0[i]=col0[j]=1;
            }
         else
            cross0[i][j]=0;
 
     //Вывод матрицы:
cout<<"Матрица :"<<endl;
       for (int i=0;i<n;i++){
        for (int j=0;j<n;j++)   {
            cout<<cross0[i][j]<<"\t";
                                }   
                        cout<<"\n";
                            }
                            
  _getch();
return 0;
}
Дошел до момента, когда надо найти максимальное число независимых нулей равное МИНИМАЛЬНОМУ суммарному числу горизонтальных и вертикальных линий, которыми можно зачеркнуть все нулевые элементы приведенной матрицы. Бьюсь над этим уже несколько часов, ничего не приходит в голову.

Добавлено через 12 часов 29 минут
Я вроде придумал алгоритм, но не знаю, как его теперь аккуратно закодить.

Если cross0[i][j]== 0, бежим по столбцам.
Выбираем строку и столбец, содержащие этот элемент. (***если в этой строке уже были, вычеркиваем столбец сразу***)
Сравниваем.
Если сумма элементов столбца меньше(или равна) суммы элементов строки:
вычеркиваем столбец, но ***помечаем строку, что в ней уже были***.
Иначе вычеркиваем строку.
k=k+1; //увеличиваем количество вычеркиваний на единицу.

В итоге получаем k - количество вычеркиваний и новую матрицу, где на элементах, которые не вычеркнуты, стоит -1, которые вычеркнуты по разу стоит 0, на тех, которые вычеркнуты дважды +1.


Ну а дальше уже буду думать над функцией, проверяющей число независимых нулей.
0
0 / 0 / 0
Регистрация: 25.02.2013
Сообщений: 46
18.11.2016, 19:40  [ТС]
Жду помощи, последнее действие немного дописал...

Цитата Сообщение от Noob1875 Посмотреть сообщение
Я вроде придумал алгоритм, но не знаю, как его теперь аккуратно закодить.
Если cross0[i][j]== 0, бежим по столбцам.
Выбираем строку и столбец, содержащие этот элемент. (***если в этой строке уже были, вычеркиваем столбец сразу***)
Сравниваем.
Если сумма элементов столбца меньше(или равна) суммы элементов строки:
вычеркиваем столбец, но ***помечаем строку, что в ней уже были***.
Иначе вычеркиваем строку.
k=k+1; //увеличиваем количество вычеркиваний на единицу.
В итоге получаем k - количество вычеркиваний и новую матрицу, где на элементах, которые не вычеркнуты, стоит -1, которые вычеркнуты по разу стоит 0, на тех, которые вычеркнуты дважды +1.
Ну а дальше уже буду думать над функцией, проверяющей число независимых нулей.

Кликните здесь для просмотра всего текста
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <fstream>
#include <iostream>
#include "windows.h"
#include <conio.h>
#include <cstdlib>
#include <random>
#include "time.h"
 
 
int main() {
 
    using namespace std;
setlocale (LC_ALL, "Russian");
const int n = 6;
srand(time(0));
    
int arr[n][n];
int cross0[n][n];
int str0[n],col0[n];
    int min_line[100], i, j;
 
    int S=0; int k=0;
    int sum_stlb=0;
    
    
// Ввод матрицы рандомно в диапазоне от 1 до 20
for(i=0; i<n; i++)  {
    for(j=0; j<n; j++)  {
        arr[i][j] = rand() % 20 +1;
                        }
                    }
        /*          
// Ввод матрицы вручную
for(i=0; i<n; i++)  {
    for(j=0; j<n; j++)  {
        cout<<"a["<<i+1<<"]["<< j+1<<"]->";
        cin>>arr[i][j];
                        }
                    }
*/
 
//Вывод матрицы:
cout<<"Исходная матрица:"<<endl;
       for (int i=0;i<n;i++){
        for (int j=0;j<n;j++)   {
            cout<<arr[i][j]<<"\t";
                                }   
                        cout<<"\n";
                            }
    
// Поиск alpha - минимального элемента в каждой строке
 int alpha=arr[0][0];
  for(int i=0;i<n;i++){
      int alpha=arr[i][0];
      for(int j=0;j<n;j++){
          if(arr[i][j]<alpha)
              alpha=arr[i][j];}
          min_line[i]=alpha;}
  
  cout<<endl<<endl;
  for(int i=0;i<n;i++)
       cout<<"Alpha "<<i+1<<" строки: "<<min_line[i]<<" "<<endl;
   cout<<endl;
// Проверка: поиск S
     for(int i=0;i<n;i++){
        S=S+min_line[i];
                        }
     cout<<"S: "<<S<<endl;
 
 
//Вычитание alpha из каждого элемента строки
     for(int i=0;i<n;i++){
         for(int j=0;j<n;j++)
         {
             arr[i][j]-=min_line[i];
         }
     }
 
     //Вывод матрицы:
cout<<"Матрица с вычтенными значениями alpha:"<<endl;
       for (int i=0;i<n;i++){
        for (int j=0;j<n;j++)   {
            cout<<arr[i][j]<<"\t";
                                }   
                        cout<<"\n";
                            }
 
 
     // Поиск beta - минимального элемента в каждой строке
 int beta=arr[0][0];
  for(int j=0;j<n;j++){
      int beta=arr[0][j];
      for(int i=0;i<n;i++){
          if(arr[i][j]<beta)
              beta=arr[i][j];}
          min_line[j]=beta;}
  
  cout<<endl<<endl;
  for(int j=0;j<n;j++)
       cout<<"Beta "<<j<<" столбца: "<<min_line[j]<<" "<<endl;
   cout<<endl;
 
// Проверка: поиск S
     for(int j=0;j<n;j++){
        S=S+min_line[j];
                        }
     cout<<"S: "<<S<<endl;
 
 
//Вычитание beta из каждого элемента столбца
     for(int i=0;i<n;i++){
         for(int j=0;j<n;j++)
         {
             arr[i][j]-=min_line[j];
         }
     }
 
     //Вывод матрицы:
cout<<"Матрица с вычтенными значениями beta:"<<endl;
       for (int i=0;i<n;i++){
        for (int j=0;j<n;j++)   {
            cout<<arr[i][j]<<"\t";
                                }   
                        cout<<"\n";
                            }
 
 
 
// Отмечаем нули
for(i=0; i<n; i++)
   for(j=0; j<n; j++)
      cross0[i][j]=1;
for(i=0; i<n; i++)
   str0[i]=col0[i]=0;
for(i=0; i<n; i++)
   for(j=0; j<n; j++)
      if(arr[i][j]==0)
         if(str0[i]==0 && col0[j]==0){
            cross0[i][j]=0;
            str0[i]=col0[j]=1;
            }
         else
            cross0[i][j]=0;
 
     //Вывод матрицы:
cout<<"Матрица :"<<endl;
       for (int i=0;i<n;i++){
        for (int j=0;j<n;j++)   {
            cout<<cross0[i][j]<<"\t";
                                }   
                        cout<<"\n";
                            }
                   
        //Нахождение суммы рядов:
        for(int i = 0; i<n; ++i){
        int total = 0;
        for(int j = 0; j<n; ++j){
            total += cross0[i][j];
        }
        cout << "Сумма ряда" << i+1 << ":" << total << endl;
        }
 
        cout << endl<< endl;
         //Нахождение суммы колонок:
        for(int j = 0; j<n; ++j){
        int total_ = 0;
        for(int i = 0; i<n; ++i){
            total_ += cross0[i][j];
        }
        cout << "Сумма колонки " << j+1 << ":" << total_ << endl;
    }
 
 
        for (int i=0;i<n;i++){
            for (int j=0;j<n;j++)   {
 
                if (cross0[i][j]=0){
                            if a[i]=0 // если в этой строке матрицы мы не были
                {
                    if (total_(содержащей элемент столбца)<=total(содержащей элемент строки))
                        элементы всего столбца=0
                        a[i]=1 // помечаем строку новой матрицы, что мы в ней уже были
                    }
                            else элементы всего столбца=0;
                
                }
                else элементы строки=0;
                k=k+1;
            }
        }
            
        
 
 
  _getch();
return 0;
}
0
0 / 0 / 0
Регистрация: 25.02.2013
Сообщений: 46
04.12.2016, 22:04  [ТС]
Цитата Сообщение от Noob1875 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
for (int i=0;i<n;i++){
    for (int j=0;j<n;j++)   {
 
        if (cross0[i][j]=0){
                    if a[i]=0 // если в этой строке матрицы мы не были
        {
            if (total_(содержащей элемент столбца)<=total(содержащей элемент строки))
                элементы всего столбца=0
                a[i]=1 // помечаем строку новой матрицы, что мы в ней уже были
            }
                    else элементы всего столбца=0;
        
        }
        else элементы строки=0;
        k=k+1;
    }
}
Помогите привести в нормальный вид
0
0 / 0 / 0
Регистрация: 25.02.2013
Сообщений: 46
14.01.2017, 12:19  [ТС]
Сдача в понедельник... Help. please
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.01.2017, 12:19
Помогаю со студенческими работами здесь

Определитель матрицы 6х6
Как найти определитель трехдиагональной матрицы 6х6,обратную матрицу и определитель обратной матрицы?

Решение матрицы методом Зейделя
программа рабочая, но пишет что идёт переобогощение типа...т.е. якобы его не хватает...выдаёт ошибку ...метод этот - Зейдель, алгоритм...

Решение матрицы методом Гаусса
Мне нужно написать программу для решения матрицы с помощью метода Гаусса. Программу написала. Ответы получились боле-менее нормальные....

Решение матрицы методом Крамера
доброго времени суток. Задали написать программу для решения матрицы методом крамера. Нашел уже готовый код тут на форуме но у него нету...

Решение матрицы методом секущих
Ух, ребятки, проблема назрела. Мне нужно решить матрицу методом секущих. Как я понимаю, для этого ее нужно привести к уравнению. Как это...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru