Example #1
0
void Munkres::step4() {
	/* find an uncovered zero and prime it
	 * if now starred zeros in row goto step 5
	 * else cover row and uncover colum of starred zero
	 *
	 * once no uncovered exist goto step 6.
	 */
	bool done = false;
	int i = 0;
	int j = 0;
	int a;
	while (!done) {
		if (find_zero(&i, &j)) {
			if (!is_covered(i, j)) {
				prime(i, j);
				a = starred_in_row(i);
				if (a == -1) // if no starred zeros
				{
					done = true;
					step5(i, j);
				} else {
					uncover_col(a);
					cover_row(i);
				}

			}
		} else {
			done = true;
			step6( min_uncovered());
		}
	}
}
Example #2
0
void Munkres::solve(double* icost, int* answer, int m, int n) {
	rows = m;
	cols = n;
	cost = new double*[rows];
	starred = new bool*[rows];

	primed = new bool*[rows];
	covered_rows = new bool[rows];
	covered_cols = new bool[cols];

	for (int i = 0; i < rows; i++) {
		covered_rows[i] = false;
	}
	for (int i = 0; i < cols; i++) {
		covered_cols[i] = false;
	}

	for (int i = 0; i < rows; i++) {
		cost[i] = new double[cols];
		starred[i] = new bool[cols];
		primed[i] = new bool[cols];

		for (int j = 0; j < cols; j++) {
			cost[i][j] = icost[(i * cols) + j];
			starred[i][j] = 0;
			primed[i][j] = 0;
		}
	}

	smallest = std::min(rows, cols);
	largest = std::max(rows, cols);

	if (rows > cols) {
		step0();
	} else {
		k = min_uncovered();

		step1();
	}

	int index = 0;
	for (int i = 0; i < rows; i++) {
		for (int j = 0; j < cols; j++) {
			answer[index] = starred[i][j];
			index++;
		}
	}

	for (int i = 0; i < rows; i++) {
		delete cost[i];
		delete primed[i];
		delete starred[i];
	}
	delete cost;
	delete primed;
	delete starred;
	delete covered_rows;
	delete covered_cols;

}
Example #3
0
std::vector<std::vector<bool> > Munkres::solve(std::vector< std::vector<double> > icost) {
	for(int i=0;i<icost.size();i++) {
		cost.push_back(std::vector<double>());
		starred.push_back(std::vector<bool>());
		primed.push_back(std::vector<bool>());
		covered_rows.push_back(0);
		covered_cols.push_back(0);

		for(int j=0;j<icost[i].size();j++){
			cost[i].push_back(icost[i][j]);
			starred[i].push_back(0);
			primed[i].push_back(0);
		}
	}
	size = icost.size();

	k = min_uncovered();

	step1();
//	for(int i=0;i<icost.size();i++) {
//		for(int j=0;j<icost[i].size();j++){
//			std::cout << starred[i][j] << ' ';
//		}
//		std::cout << std::endl;
//	}
	return starred;
}
Example #4
0
void Munkres::step0() {
	int minimum;
	for (int j = 0; j < cols; j++) {
		minimum = cost[0][j];
		for (int i = 0; i < rows; i++) {
			if (minimum > cost[i][j]) {
				minimum = cost[i][j];
			}
		}
		for (int i = 0; i < rows; i++) {
			cost[i][j] = cost[i][j] - minimum;
		}
	}
	k = min_uncovered();
	step2();
}