匈牙利算法指派问题的python程序实现

本文介绍了如何使用Python实现匈牙利算法,该算法旨在解决指派问题,寻找矩阵中最小和。虽然已有第三方库可用,但作者通过编写150行代码的程序作为练习。文章略过算法详细步骤,直接展示代码,并指出矩阵输入是通过读取txt文件,文件中数字由英文逗号分隔。
摘要由CSDN通过智能技术生成

最近同样在备战数模,在算法相关的书籍中了解到匈牙利算法,心血来潮用python写了一个程序实现,固然有重复造轮子之嫌(已经有第三方库可以很方便地解决问题),但作为练手之作,姑且聊博大家一笑吧。也希望能给同样借用这个算法练手的其他人一个启发。
关于匈牙利算法,相信会点进这篇文章的各位都有所了解,但是以防万一,还是做一次赘述。
例如,对于一个n行n列的矩阵,
![如这个5行5列的矩阵,这张图是在另一篇文章中嫖的](https://img-blog.csdnimg.cn/2021020711090024.png#pic_center如这个5行5列的矩阵
这个算法是为了寻找方阵中不同行不同列的五个数最小和而诞生的,实现过程为行归约-列规约-试指派-画盖零线-更新矩阵-循环直至找到最优解。每一步的具体操作叙述过于繁琐,且我讲的也大概率不如其他文章清晰,就不献丑了。直接上代码,除去注释约有150行,我会分步说明。因为直接在python中输入矩阵过于繁琐,矩阵的输入依靠的是读取txt等文件,文件中数字必须用英文下,隔开,如:
1,4,5
6,8,7
3,9,2
这就是一个三维矩阵。文件路径在末尾主进程中。

import numpy as np
def cag(list):
    '''将一个只含字符串数字的列表转化成只含浮点数的列表'''
    a = 0
    for i in list:
        list[a] = float(i)
        a += 1
    return list

def matrix(file):
    '''读取文件中的系数矩阵并生成一个相同的n维矩阵'''
    f = open(file,'r',encoding='utf8')
    n = 0
    for i in f.readlines():
        data1 = i.replace('\n','')
        data2 = data1.split(',')
        data = cag(data2)
        if n == 0:
            mat = np.array(data)
        else:
            mat = np.vstack((mat,data))
        n += 1
        if n == len(data):
            break
    f.close()
    return mat
# 到这一步就可以读取到一个n阶方阵
def row_reduction(ndarray):
    '''进行行归约'''
    n = 0
    for i in ndarray:
        num = i[0]
        for x in i:
            
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值