#include
#include
#include
#include
#include
using namespace std;
class HungarianAlgorithm
{
public:
HungarianAlgorithm();
double Solve(vector >& Main_matrix, vector& Assignment);
private:
void Optimal_assignment(int *assignment, double *cost, double *Main_matrix, int number_of_rows, int number_of_columns);
void Make_assignment(int *assignment, bool *Simplified_matrix, int number_of_rows, int number_of_columns);
void Find_assignment_cost(int *assignment, double *cost, double *Main_matrix, int number_of_rows);
void Column_coverer(int *assignment, double *Main_matrix, bool *Simplified_matrix, bool *newSimplified_matrix, bool *primeMatrix, bool *covered_columns, bool *covered_rows, int number_of_rows, int number_of_columns, int minDim);
void Column_counter(int *assignment, double *Main_matrix, bool *Simplified_matrix, bool *newSimplified_matrix, bool *primeMatrix, bool *covered_columns, bool *covered_rows, int number_of_rows, int number_of_columns, int minDim);
void Column_star_zeros_count(int *assignment, double *Main_matrix, bool *Simplified_matrix, bool *newSimplified_matrix, bool *primeMatrix, bool *covered_columns, bool *covered_rows, int number_of_rows, int number_of_columns, int minDim);
void Row_star_zeros_count(int *assignment, double *Main_matrix, bool *Simplified_matrix, bool *newSimplified_matrix, bool *primeMatrix, bool *covered_columns, bool *covered_rows, int number_of_rows, int number_of_columns, int minDim, int row, int column);
void Fresh_assignment(int *assignment, double *Main_matrix, bool *Simplified_matrix, bool *newSimplified_matrix, bool *primeMatrix, bool *covered_columns, bool *covered_rows, int number_of_rows, int number_of_columns, int minDim);
};
HungarianAlgorithm::HungarianAlgorithm(){}
double HungarianAlgorithm::Solve(vector >& Main_matrix, vector& Assignment)
{
unsigned int Num_Rows = Main_matrix.size();
unsigned int Num_Columns = Main_matrix[0].size();
double *Main_matrixIn = new double[Num_Rows * Num_Columns];
int *assignment = new int[Num_Rows];
double cost = 0.0;
for (unsigned int i = 0; i < Num_Rows; i++)
for (unsigned int j = 0; j < Num_Columns; j++)
Main_matrixIn[i + Num_Rows * j] = Main_matrix[i][j];
Optimal_assignment(assignment, &cost, Main_matrixIn, Num_Rows, Num_Columns);
Assignment.clear();
for (unsigned int r = 0; r < Num_Rows; r++)
Assignment.push_back(assignment[r]);
delete[] Main_matrixIn;
delete[] assignment;
return cost;
}
void HungarianAlgorithm::Optimal_assignment(int *assignment, double *cost, double *Main_matrixIn, int number_of_rows, int number_of_columns)
{
double *Main_matrix, *Main_matrixTemp, *Main_matrixEnd, *columnEnd, value, minValue;
bool *covered_columns, *covered_rows, *Simplified_matrix, *newSimplified_matrix, *primeMatrix;
int Number_of_elements, minDim, row, column;
*cost = 0;
for (row = 0; row= 0)
*cost += Main_matrix[row + number_of_rows*column];
}
}
void HungarianAlgorithm::Column_coverer(int *assignment, double *Main_matrix, bool *Simplified_matrix, bool *newSimplified_matrix, bool *primeMatrix, bool *covered_columns, bool *covered_rows, int number_of_rows, int number_of_columns, int minDim)
{
bool *Simplified_matrixTemp, *columnEnd;
int column;
/* cover every column containing a starred zero */
for (column = 0; column > Cost_matrix = {
{82, 77, 51},
{83, 37, 69},
{69, 49, 5}
};
HungarianAlgorithm HungAlgo;
vector assignment;
double cost = HungAlgo.Solve(Cost_matrix, assignment);
for (unsigned int x = 0; x < Cost_matrix.size(); x++)
cout <<"Row - "<< x+1 << ", Element - " << assignment[x]+1 << "\n";
return 0;
}