- 理解指派问题的匈牙利解法的原理。
编写程序求解如下问题:
某商业公司计划开办5家新商店,公司决定由5家建筑公司分别承建。已知建筑公司Ai 对新商店Bj 的建造费用报价如下表所示。问:商业公司应对5家建筑公司如何分配建造任务,使得总建造费用最小?源代码:
//指派问题的匈牙利解法:
package intGh;
public class zhipaiWT {
public static void assign(int[][] m) {
int N = m.length;
// 行规约
for (int i = 0; i < N; i++) {
int min = Integer.MAX_VALUE;
for (int j = 0; j < N; j++) {
if (m[i][j] < min)
min = m[i][j];
}
for (int j = 0; j < N; j++)
m[i][j] -= min;
}
// 列规约
for (int j = 0; j < N; j++) {
int min = Integer.MAX_VALUE;
for (int i = 0; i < N; i++) {
if (m[i][j] < min)
min = m[i][j];
}
if (min == 0)
continue;
for (int i = 0; i < N; i++)
m[i][j] -= min;
}
print_m(m);
// 进行试分配
while (true) {
boolean zeroExist = true;
while (zeroExist) {
zeroExist = false;
if (rAssign(m))
zeroExist = true;
if (cAssign(m))
zeroExist = true;
print_m(m);
}
// 判断是否达到最优分配
if (isOptimal(m))
break;
// 变换矩阵
updM(m);
// 将0元素恢复
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++)
if (m[i][j] < 0)
m[i][j] = 0;
}
print_m(m);
}
}
public static void updM(int[][] m) {
int N = m.length;