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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.03.2016, 17:23   #1
Sterben
Форумчанин
 
Аватар для Sterben
 
Регистрация: 01.03.2015
Сообщений: 118
По умолчанию Реализация венгерского алгоритма(C#)

Здравствуйте,возникли проблемы с реализацией венгерского метода
Код:
namespace Hungarian_Algorithm
{
    class Program
    {
        static void Output(int[,] matrix, int amount)
        {
            for (int index_i = 0; index_i < amount; index_i++)
                for (int index_j = 0; index_j < amount; index_j++)
                    Console.Write("matrix[" + index_i + "," + index_j + "] = " + matrix[index_i, index_j] + "  \t");
        }

        static void SubtractMin(ref int [,]matrix,int amount)
        {
            int[] minElement = new int[amount];
            for (int index_i = 0; index_i < amount; index_i++) {
                minElement[index_i] = int.MaxValue;
                for (int index_j = 0; index_j < amount; index_j++){
                    if (minElement[index_i] > matrix[index_i, index_j])
                        minElement[index_i] = matrix[index_i, index_j];
                }
            }
            for (int index_i = 0; index_i < amount; index_i++)
                for (int index_j = 0; index_j < amount; index_j++)
                    matrix[index_i, index_j] -= minElement[index_i];
            for(int index_j = 0;index_j < amount; index_j++){
                minElement[index_j] = int.MaxValue;
                for(int index_i = 0;index_i < amount; index_i++){
                    if (minElement[index_j] > matrix[index_i, index_j])
                        minElement[index_j] = matrix[index_i, index_j];
                }
            }
            for (int index_j = 0; index_j < amount; index_j++)
                for (int index_i = 0; index_i < amount; index_i++)
                    matrix[index_i, index_j] -= minElement[index_j];
        }

        static void CountZero(ref int[,] matrix, int amount)
        {

            for (int index_i = 0; index_i < amount - 1; index_i++){
                matrix[index_i, amount - 1] = 0;
                matrix[amount - 1, index_i] = 0;
                for (int index_j = 0; index_j < amount - 1; index_j++)
                    if (matrix[index_i, index_j] == 0){
                        matrix[index_i, amount - 1] += 1;
                        matrix[amount - 1, index_j] += 1;
                    }
                    else if (matrix[index_i, index_j] == -100 || matrix[index_i, index_j] == -101){
                        matrix[index_i, index_j] = 0;
                        matrix[index_i, amount - 1] += 1;
                        matrix[amount - 1, index_j] += 1;
                }
            }
        }
        static void SelectingZero(ref int[,] matrix,int amount,out int count)
        {
            count = 0;
            int counter = 0;
            do
            {
                counter = count;
                for (int index_i = 0; index_i < amount - 1; index_i++)
                    if (matrix[index_i, amount - 1] == 1)
                    {
                        for (int index_j = 0; index_j < amount - 1; index_j++)
                            if (matrix[index_i, index_j] == 0)
                            {
                                matrix[index_i, index_j] = -100;
                                matrix[index_i, amount - 1] = -1;
                                matrix[amount - 1, index_j] -= 1;
                                count++;
                                for (int index = 0; index < amount - 1; index++)
                                    if (matrix[index, index_j] == 0)
                                    {
                                        matrix[index, index_j] = -101;
                                        matrix[index, amount - 1] -= 1;
                                        matrix[amount - 1, index_j] -= 1;
                                    }
                            }
                    }
                for (int index_j = 0; index_j < amount - 1; index_j++)
                    if (matrix[amount - 1, index_j] == 1)
                    {
                        for (int index_i = 0; index_i < amount - 1; index_i++)
                            if (matrix[index_i, index_j] == 0)
                            {
                                matrix[index_i, index_j] = -100;
                                matrix[amount - 1, index_j] = -1;
                                matrix[index_i, amount - 1] -= 1;
                                count++;
                                for (int index = 0; index < amount - 1; index++)
                                    if (matrix[index_i, index] == 0)
                                    {
                                        matrix[index_i, index] = -101;
                                        matrix[index_i, amount - 1] -= 1;
                                        matrix[amount - 1, index] -= 1;
                                    }
                            }
                    }
            } while (count != counter);
        }

        static void Main()
        {
            int[,] matrix,
                    matrixMarker;
            int   amount,
                   amountMarker,
                   result = 0;
            /*
            Console.Write("Input amount of elements:_\b");
            amount = Convert.ToInt32(Console.ReadLine());
            matrix = new int[amount, amount];
            for (int index_i = 0; index_i < amount; index_i++) {
                for (int index_j = 0; index_j < amount; index_j++){
                    Console.Write("matrix[" + index_i + "," + index_j + "] = ");
                    matrix[index_i, index_j] = Convert.ToInt32(Console.ReadLine());

                }
            }*/
            //Test//
            amount = 4;
            matrix = new int[,]
            { { 68,72,75,83 },
              { 56,60,58,63 },
              { 38,40,35,45 },
              { 47,42,40,45 } };
            //Test END//
            Console.Clear();
            Console.WriteLine("Entered matrix looks like this: ");
            for(int index_i = 0;index_i < amount; index_i++){
                for(int index_j = 0;index_j < amount; index_j++){
                    Console.Write("matrix[" + index_i + "," + index_j + "] = " + matrix[index_i, index_j] + "\t");
                    if (index_j + 1 == amount)
                        Console.WriteLine();
                }
            }
            amountMarker = amount + 1;
            matrixMarker = new int[amountMarker, amountMarker];
            for (int index_i = 0; index_i < amount; index_i++)
                for (int index_j = 0; index_j < amount; index_j++)
                    matrixMarker[index_i, index_j] = matrix[index_i, index_j];
            Console.WriteLine("subtract minimum element in Row and Column: ");
            SubtractMin(ref matrixMarker, amount);
            Output(matrixMarker, amountMarker);
            do
            {
                int count,
                    zero = 0;
                Console.WriteLine("Counting all zero elements in the column and row: ");
                CountZero(ref matrixMarker, amountMarker);
                Output(matrixMarker, amountMarker);
                Console.WriteLine("Selecting zero that only one in a row or column: ");
                SelectingZero(ref matrixMarker, amountMarker, out count);
                Output(matrixMarker, amountMarker);
                if(count == amount){
                    for (int index_i = 0; index_i < amount; index_i++)
                        for (int index_j = 0; index_j < amount; index_j++)
                            if (matrixMarker[index_i, index_j] == -100)
                                result += matrix[index_i, index_j]; 
                }
               
                break;
            } while (result == 0);
            Console.WriteLine("Result = " + result);
            Console.ReadKey();
        }
    }
}
Sterben вне форума Ответить с цитированием
Старый 29.03.2016, 17:24   #2
Sterben
Форумчанин
 
Аватар для Sterben
 
Регистрация: 01.03.2015
Сообщений: 118
По умолчанию

Суть реализации такая,отнимаем минимальное от строки потом от столбца,подсчитываем количество нулей в строках и столбцах,выбираем только те нули которые одиночные в строке или в столбце,вычеркиваем остальные,если количество выбранных нулей (то есть в каждой строчке и столбце по 1 ) то подсчитываем суму и это минимальный результат.
Проблема:
есть такая штука как модификация матрицы представляет из себя:
{
1 Провести минимальное количество прямых через столбцы и строки матрицы таким образом, чтобы они проходили через все нули, содержащиеся в таблице
2 Найти наименьший из элементов, через которые не проходит ни одна прямая
3 Вычесть его из всех элементов, через которые не проходят прямые
4 Прибавить его ко всем элементам, лежащим на пересечении прямых
5 Элементы, через которые проходит только одна прямая, оставить неизменными
}
если после себя оно оставляет не задействованные нули то перебирать всевозможные комбинации и искать минимальное?
Sterben вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Реализация алгоритма масштабирования DENIS_POLOTSK C# (си шарп) 6 01.06.2012 20:01
реализация циклического алгоритма С++ tracer Помощь студентам 5 12.05.2011 20:15
Реализация цикличного алгоритма С++ zpMirtzp Помощь студентам 3 12.05.2011 13:34
реализация алгоритма find_if Progsenya Общие вопросы C/C++ 2 10.09.2010 23:58
реализация алгоритма дешифровки Valx Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 30.03.2010 08:18