指派问题的匈牙利解法

本文深入探讨了匈牙利解法在处理指派问题中的应用,特别是针对一个商业公司如何选择5家建筑公司进行5家新商店建设的案例。通过展示系数矩阵的变化过程和最优指派方案,解释了如何找到总建造费用最小的解决方案。
摘要由CSDN通过智能技术生成
  1. 理解指派问题的匈牙利解法的原理。
  2. 编写程序求解如下问题:
    某商业公司计划开办5家新商店,公司决定由5家建筑公司分别承建。已知建筑公司Ai 对新商店Bj 的建造费用报价如下表所示。问:商业公司应对5家建筑公司如何分配建造任务,使得总建造费用最小?

    建筑公司Ai 对新商店Bj 的建造费用报价

  3. 源代码:

//指派问题的匈牙利解法:
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;
        
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值