数学建模:整数规划—指派模型与匈牙利算法

Posted 贺二公子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数学建模:整数规划—指派模型与匈牙利算法相关的知识,希望对你有一定的参考价值。

原文地址:https://blog.csdn.net/qq_55851911/article/details/124515574?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166175015616782391887664%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=166175015616782391887664&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~pc_rank_34-7-124515574-null-null.142v42pc_rank_34_1,185v2control&utm_term=%E5%8C%88%E7%89%99%E5%88%A9%E7%AE%97%E6%B3%95%E6%8C%87%E6%B4%BE%E5%8E%9F%E7%90%86&spm=1018.2226.3001.4187


文章目录


对于限制全部或部分决策变量取离散非负整数值的线性规划, 称之整数线性规划, 简称整数规划. 整数规划的一种特殊情形是 0 − 1 0-10−1 整数规划, 它的决策变量仅限于 0 或 1, 简称 0 − 1 0-10−1 规划.

指派模型是一种重要的 0 − 1 0-10−1 规划模型,指派模型又叫分配模型,指有各种不同的资源将分派给各种不同的用途,以寻求一种最优的分配方案。要求使有限的资源达到最经济的运用,取得最大的经济效果。这里的资源可以是人力,材料、工件、设备等; 用途可以是待用设备、待完成工作、待加工的工件等。资源与用途之间是一一对应的,即当某种资源分配给某种用途之后,这种资源就不能再分配给别的用途了,同样,这种用途也不能再占用别的资源了。

标准指派模型

标准指派问题的一般提法是:拟分派n个人 A1, A2,⋯,An去完成n项工作B1,B2,⋯,Bn,要求每项工作需且仅需一个人去完成,每个人需完成且仅需完成一项工作。已知人Ai完成工作Bj的时间或费用等成本型指标值为cij,则应如何指派才能使总的工作效率最高?

引入 0 − 1 决策变量

x i j = 1 , 指派 A i 去完成工作 B j 0 , 否则 i , j = 1 , 2 , . . . , n x_ij= \\begincases 1,\\quad 指派A_i去完成工作B_j\\\\ 0, \\quad 否则 \\endcases \\quad i,j = 1, 2, ..., n xij=1,指派Ai去完成工作Bj0,否则i,j=1,2,...,n
则标准指派问题的数学模型为
m i n z = ∑ i = 1 n ∑ i = 1 n c i j x i j , min\\quad z = \\sum_i = 1^n\\sum_i = 1^nc_ijx_ij, minz=i=1ni=1ncijxij,
s . t . ∑ j = 1 n x i j = 1 , i = 1 , 2 , . . . n , ∑ i = 1 n x i j = 1 , j = 1 , 2 , . . . n , x i j = 0 或 1 , i , j = 1 , 2 , . . . n s.t. \\begincases \\sum_j = 1^nx_ij= 1,\\quad i=1,2,...n,\\\\ \\sum_i = 1^nx_ij= 1,\\quad j=1,2,...n,\\\\ x_ij= 0或1,\\quad i,j=1,2,...n \\endcases s.t. j=1nxij=1,i=1,2,...n,i=1nxij=1,j=1,2,...n,xij=01,i,j=1,2,...n
称 C = (cij)n×n 为效率矩阵,模型的最优解也可以用n阶方阵 X 的形式来表示,称之指派问题的最优解方阵。最优解方阵一定是一个置换矩阵,即矩阵的每一行、每一列都恰好有一个“1”,其余元素均为0。

匈牙利算法

基本原理

  • 定理1
    设效率矩阵 C = (cij)n×n 中任何一行(列)的各元素都减去一个常数k(可正可负)后得到的新矩阵为 B = (bij)n×n,则以 B = (bij)n×n 为效率矩阵的指派问题与原问题有相同的最优解,但其最优值比原问题的最优值小k
  • 定理2(独立零元素定理)
    若一方阵中的一部分元素为0,一部分元素为非0,则覆盖方阵内所有0元素的最少直线数恰好等于那些位于不同行、不同列的0元素的最多个数。

匈牙利算法步骤

  • 第一步 变换指派问题的系数矩阵 (cij) 为 (bij),使在 (bij) 的各行各列中都出现0元素

    • 从 (cij) 的每行元素都减去该行的最小元素
    • 再从所得新系数矩阵的每列元素中减去该列的最小元素

    e.g.
    ( C i j ) = [ 12 7 9 7 9 8 9 6 6 6 7 17 12 14 9 15 14 6 6 10 4 10 7 10 9 ] (C_ij) = \\left[ \\beginmatrix 12&7&9&7&9\\\\ 8&9&6&6&6\\\\ 7&17&12&14&9\\\\ 15&14&6&6&10\\\\ 4&10&7&10&9 \\endmatrix \\right] (Cij)= 1287154791714109612677614610969109
    每行分别 −7, −6, −7, −6, −4 ⟶
    [ 5 0 2 0 2 2 3 0 0 0 0 10 5 7 2 9 8 0 0 4 0 6 3 6 5 ] \\left[ \\beginmatrix 5&0&2&0&2\\\\ 2&3&0&0&0\\\\ 0&10&5&7&2\\\\ 9&8&0&0&4\\\\ 0&6&3&6&5 \\endmatrix \\right] 52090031086205030070620245
    每列都 −0 ⟶
    [ 5 0 2 0 2 2 3 0 0 0 0 10 5 7 2 9 8 0 0 4 0 6 3 6 5 ] \\left[ \\beginmatrix 5&0&2&0&2\\\\ 2&3&0&0&0\\\\ 0&10&5&7&2\\\\ 9&8&0&0&4\\\\ 0&6&3&6&5 \\endmatrix \\right] 52090031086205030070620245

  • 第二步 进行试指派,以寻求最优解
    在 (bij) 中找尽可能多的独立0元素,若能找出n个独立0元素,就以这n个独立0元素对应解矩阵 (xij) 中的元素为1,其余为0,这就得到最优解

    找独立0元素:

    • 从只有一个0元素的行(列)开始,给这个0元素加圈,记作⌾。然后划去⌾所在列(行)的其它0元素,记作⌽;这表示这列所代表的任务已指派完,不必再考虑别人了
    • 给只有一个0元素的列(行)中的0元素加圈,记作⌾;然后划去⌾所在行的0元素,记作⌽
    • 反复进行以上两步,直到尽可能多的0元素都被圈出和划掉为止

    e.g.

    以上是关于数学建模:整数规划—指派模型与匈牙利算法的主要内容,如果未能解决你的问题,请参考以下文章

    数学建模 匈牙利算法求解整数规划基本原理与编程实现

    备战数学建模19-数学规划问题

    运筹学整数规划 ( 整数规划求解方法 | 指派问题 )

    基于匈牙利算法的指派问题优化分析matlab优化算法十二

    用matlab求解整数规划双角标问题

    matlab求解指派问题