数学建模笔记——整数规划类问题之我见(匈牙利算法)

这篇具有很好参考价值的文章主要介绍了数学建模笔记——整数规划类问题之我见(匈牙利算法)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

浅浅叙述匈牙利算法

目录

浅浅叙述匈牙利算法

基本思路

计算步骤

来一道简单例题

1.1 符号规定

1.2目标函数​编辑

      1.3约束条件

​编辑

1.4代码

题目复述

基本假设

问题分析

符号说明

 模型的建立与求解

模型建立思路

模型建立的过程

建立0-1整数规划模型

 运用匈牙利方法:

代码实现


 文章来源地址https://www.toymoban.com/news/detail-410687.html

基本思路

        匈牙利法的基本思路:对费用矩阵C的行和列减去某个常数,将C化为有n个位于不同行不同列的零元素,令这些零元素对应的变量取1,其余变量取0,即得到指派问题的最优解。
        匈牙利法是基于指派问题的标准型的,标准型需满足以下3个条件:
        (1)目标函数求min;
        (2)效率矩阵为n阶方阵;
        (3)效率矩阵中所有元素Cij20,且为常数。

计算步骤

匈牙利法的计算步骤:
(1)变换效率矩阵C,使每行每列至少有一个0,变换后的矩阵记为B
●行变换:找出每行min值,该行各元素减去它;
●列变换:找出每列min值,该列各元素减去它;
●若某行列已有0元素,则不用减。

来一道简单例题

如何安排工作使得成本最低?(注:①每个人只能做一项工作;②每项工作只能分配给一个人做;③所有工作都要安排完。)

表1 不同人对每一项工作收费表

 

第一件

第二件

第三件

第四件

第五件

12

7

9

7

9

8

9

6

6

6

7

17

12

14

9

15

14

6

6

10

4

10

10

10

9

1.1 符号规定

对上述问题进行抽象,首先进行如下符号定义
符号                                        含义
   C                                        工人的成本矩阵
   Cij                                      工人 i对  j工作的收费.
   Wij ​                                    是否将工作 j 配给工作 i ,若是则为 1 ,若否则为 0
   m                                       工人的数量
   n                                        工作的数量

1.2目标函数数学建模笔记——整数规划类问题之我见(匈牙利算法)

      1.3约束条件

数学建模笔记——整数规划类问题之我见(匈牙利算法)

 

 

1.4代码

from scipy.optimize import linear_sum_assignment
#由于python有scipy库的支持,已经有了现成的匈牙利方法,可以直接调用就行。
import numpy as np
#在使用的过程中,也需要调用numpy库使矩阵的建立更简单
cost_mat = np.array([[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]])
work_idx_ls, pokeman_idx_ls = linear_sum_assignment(cost_mat)
cost = 0
work = ['第一件', '第二件', '第三件', '第四件', "第五件"]
pokeman = ["甲", "乙", "丙", '丁', "戊"]
for work_idx, poken_idx in zip(work_idx_ls, pokeman_idx_ls):
    print(f"工作 {work[work_idx]} 指派给 工人 {pokeman[poken_idx]}")
    cost += cost_mat[work_idx][poken_idx]
print(f"最后消耗  {cost}元!")
#匈牙利法具体的python求解过程放在了文章末尾的py代码段里,可以自行查看
#实际中可以直接使用scipy库进行求解

那么现在,让我们来点真家伙吧!

废话不多说,直接上题

2013年国赛b题第二问

题目复述

对于重大突发事件,需要调度全区20个交巡警服务平台的警力资源,对进出该区的13条交通要道实现快速全封锁。实际中一个平台的警力最多封锁一个路口,请给出该区交巡警服务平台警力合理的调度方案。

————————————此处应该有数据表格,原题数据放文章结尾——————————

基本假设

1、假设每个突发事件需要处理的时间相同。
2、假设在出警过程中匀速行驶。
3、 假设嫌疑犯逃亡时匀速行驶。
4、假设嫌疑犯逃离的速度不会大于警察迫捕速度。

问题分析

        第二小问要求制定A区交巡警服务平台警力合理的调度方案,调度全区20个交巡警服务平台的警力资源,对进出该区的13条交通要道实现快速封锁。考虑实际中一个平台的警,力至多能够封锁一个路口,对每个路口分配-一个平台警力进行围堵。
        当突发事件发生时, 全区各个服务点对于交通要道的封锁是同步进行的。由于距离原因,每个服务点对要封锁的交通要道所需时间是不同的,最后一个交通要道完成封锁才算对全区的封锁完成。本文考虑按最后完成对交通要道封锁的时间作为标准,选择最快完成全区封锁的调度方案。考虑对20个平台与13个交通要道进行遍历,计算出每种组合中平台到达交通要道的最大时间,将每种组合的最大时间进行比较,选取值最小的组合作为交巡警服务平台警力的调度方案。
        本文考虑采用 0-1整数规划的方法,对20个平台分配13个交通要道以获得最合理的调度方案。对每个平台分配一个交通要道,并在分配完这些任务后,使完成全部任务的总时间为最小。

符号说明

数学建模笔记——整数规划类问题之我见(匈牙利算法)

 模型的建立与求解

模型建立思路

        制定合理的调度方案,使全区20个交巡警服务平台的警力快速封锁该区的13条交通要道,建立0-1整数规划中的不平衡的指派类型模型求解此问。通过建立目标函数和约束条件,利用匈牙利算法寻找最优解,即选取完成时间最少的调度方案。
考虑一个平台的警力最多封锁一个路口,调度A区20各个交巡警服务平台的警力资源对13条
交通要道进行全封锁。全封锁是参与道路封锁的各交巡警服务平台同时进行的以完成封锁自标为标准结果。但由于各平台与所要封锁道路的距离的不同,在警车时速相同的情况下,各平台的出勤时间是不同的,到达所要封锁自的地的时间不同,即结束封锁时间不同。计算茁每个方案的结束时间,选取完成时间最少的方案作为最佳方案。

模型建立的过程

        建立目标函数本文根据0-1整数规划中不平衡的指派类型求解此问,将A区20个交巡警服务平台的警力资源分配13条交通要道以实现快速封锁,设第i个服务点完成第j条交通要道的封锁,给每条交通要道分配一个服务点进行封锁管理,并要求封锁完成,以使完成全部任务的总时间为最小,以此建立目标函数minZ=max T  式中T表示时间。
        

建立0-1整数规划模型

①每个服务点的警力最多封锁一个交通要道,即>xy = 1,j=1,2.... ,
②每个交通要道为避免警力资源浪费而只需一个服务点的平台警力,
即x, =1,i=1,2...n
③对每个交通要道有无服务点的警力封锁判断,即x, = 0,1,其中0为
该交通要道没有警力封锁,1为该交通要道有警力封锁。

数学建模笔记——整数规划类问题之我见(匈牙利算法)

 对目标函数进行整合,最后最终的函数为:

数学建模笔记——整数规划类问题之我见(匈牙利算法)

 运用匈牙利方法:

这个时候我们再来使用刚刚提到的匈牙利法来进行求解

这个时候遇到一个问题:
20个巡警和13个交通路口无法构成nx n的矩阵,无法构成方阵,则无法进行匈牙利法的求解

解决问题的方法:我们补7列0向量,让其满足20x 20的方阵,由于补足的列为0,则相当于无用工作,不影响最后的结果。
这个题中
1,要求最小值
2,所有值都是正数
3,补完以后是方阵

所以可以用匈牙利法来做

针对0- 1整数规划中不平衡的指派问题利用匈牙利法求解,步骤如下:
(1)将系数矩阵标准化,并变换系数矩阵,使其各行各列中都出现0元素。将20个交巡警服务平台分别与13个交通要道的最短距离列为系数矩阵Cij,i=1,2...2.0.j=1.2..13.将Cj化为标准型,增加7列虚拟工作0,矩阵的阶数为20。
(2)然后再将Cij系数矩阵带入python的程序进行求解即可

代码实现

from json.encoder import INFINITY

import numpy as np
import xlrd
data = xlrd.open_workbook('2011B.xls')
#print("sheets:" + str(data.sheet_names()))  #打印sheets名

table1 = data.sheet_by_name('全市交通路口节点数据')
loc = [] 
 #节点位置列表
w = [] 
 #发案率列表           
 
loc.append([0, 0]) 
w.append(0.0)   # 为使索引值和节点编号对应,填入一个数据

#读入A区各节点的坐标数据
for k in range(1, 93):
    x = table1.cell(k, 1).value  #注意,excel里的计数是从0开始的,和图像化界面里显示的不同
    y = table1.cell(k, 2).value
    loc.append([x, y])
    w.append(table1.cell(k, 4).value)

table2 = data.sheet_by_name('全市交通路口的路线')
distance = np.zeros((93, 93), dtype=np.float)

 
for i in range(1, 93):
    for j in range(1, 93):
        if i == j:
            distance[i, j] = 0.0
        else:
            distance[i, j] = INFINITY
 #路程矩阵
for k in range(1, table2.nrows):
    i = int(table2.cell(k, 0).value)
    j = int(table2.cell(k, 1).value)
    #print(i, j)
    if i <= 92 and j <= 92:
        distance[i, j] = np.sqrt((loc[i][0]-loc[j][0])**2 + (loc[i][1]-loc[j][1])**2)
        distance[j, i] = np.sqrt((loc[i][0]-loc[j][0])**2 + (loc[i][1]-loc[j][1])**2)

 #最短距离
for k in range(1, 93):
    for i in range(1, 93):
        for j in range(1, 93):
            if distance[i, k] + distance[k, j] < distance[i, j]:
                distance[i, j] = distance[i, k] + distance[k, j]

time = np.zeros((93, 93), dtype=np.float)
for i in range(1, 93):
    for j in range(1, 93):
        time[i, j] = distance[i, j]/10


filename = 'rask2.txt'
pingtai = range(1, 21)

table3 = data.sheet_by_name('全市区出入口的位置')
chukou = []
for k in range(1, 14):
    #print(int(table3.cell(k, 2).value))
    chukou.append(int(table3.cell(k, 2).value))
#创建文档写入数据
with open(filename, 'w') as f: 
    for i in pingtai:
        for j in chukou:
            f.write('%.4f' % time[i, j] +",")
        f.write("\n")

from scipy.optimize import linear_sum_assignment
import numpy as np
cost_mat = np.array([[22.2362,16.0285,9.2868,19.2934,21.0962,22.5018,22.8932,19.0012,19.5158,12.0834,5.8809,11.8501,4.8852,0,0,0,0,0,0,0],
[20.4639,14.1297,7.3881,17.3947,19.1975,20.6030,21.1210,17.2289,17.7436,10.3112,3.9822,10.3095,6.0351,0,0,0,0,0,0,0],
[18.3523,12.7672,6.0256,16.0322,17.8350,19.2405,19.0093,15.1173,15.6319,8.1996,6.0938,8.1979,4.3934,0,0,0,0,0,0,0],
[21.9974,15.0085,8.2669,18.2735,20.0763,21.4818,22.6544,16.2269,15.5353,8.1030,4.8610,7.3959,0.3500,0,0,0,0,0,0,0],
[17.6282,12.9696,6.2280,16.2346,17.7495,19.1551,18.2852,11.3069,10.6153,3.1829,9.4211,2.4758,5.2551,0,0,0,0,0,0,0],
[17.6588,13.0002,6.2586,16.2652,17.7801,19.1856,18.3158,11.3375,10.6459,3.2135,9.4517,2.5064,5.3373,0,0,0,0,0,0,0],
[14.9149,10.9012,4.1596,14.1662,15.0363,16.4418,15.5720,8.5702,8.0155,0.5831,7.3527,1.2902,7.9917,0,0,0,0,0,0,0],
[14.0925,9.4339,2.6923,12.6989,14.2138,15.6194,14.7496,10.2280,10.4932,3.0608,5.8854,3.0995,8.6773,0,0,0,0,0,0,0],
[13.0107,8.2742,1.5325,11.5392,13.1320,14.5376,13.6678,9.7757,10.7244,3.4923,4.7257,4.1994,9.3367,0,0,0,0,0,0,0],
[7.5866,12.7757,6.9567,9.5107,7.7079,9.1135,8.2436,14.1949,15.1435,7.9114,10.1498,8.6186,14.7608,0,0,0,0,0,0,0],
[3.7914,8.3373,11.3950,5.0723,3.2696,4.6751,3.8053,18.6332,19.5819,12.3498,14.5882,13.0569,19.1992,0,0,0,0,0,0,0],
[0.0000,11.9503,14.5433,8.6853,6.8825,6.4770,3.5916,21.7814,22.7301,15.4980,17.7364,16.2051,22.3474,0,0,0,0,0,0,0],
[5.9770,5.9733,12.7149,2.7083,0.9055,0.5000,2.3854,22.8083,23.7570,16.5249,16.1208,17.2320,21.3318,0,0,0,0,0,0,0],
[11.9503,0.0000,6.7417,3.2650,5.0677,6.4733,8.3587,18.0499,18.9167,11.4843,10.1475,12.1914,15.3585,0,0,0,0,0,0,0],
[17.0296,13.2981,6.5564,16.5630,17.1509,18.5565,17.6867,4.7518,5.7005,4.4015,9.7496,5.1086,11.8101,0,0,0,0,0,0,0],
[14.5433,6.7417,0.0000,10.0066,11.8094,13.2149,15.1003,11.3083,12.1750,4.7427,3.4059,5.4498,8.6169,0,0,0,0,0,0,0],
[21.8921,14.9032,8.1616,18.1682,19.9710,21.3765,22.5492,18.6571,19.5239,12.0915,4.7557,12.7986,7.8205,0,0,0,0,0,0,0],
[24.2472,18.5145,11.7728,21.7795,23.5822,24.9878,24.9042,21.0122,21.5268,14.0945,8.3669,13.6993,6.7344,0,0,0,0,0,0,0],
[22.5465,16.9615,10.2198,20.2264,22.0292,23.4348,23.2036,19.3115,19.8262,12.3938,7.6393,11.9986,5.0337,0,0,0,0,0,0,0],
[26.9458,21.2131,14.4714,24.4781,26.2809,27.6864,27.6029,23.0108,22.3192,14.8869,11.0656,14.1798,6.4489,0,0,0,0,0,0,0]])
work_idx_ls, pokeman_idx_ls = linear_sum_assignment(cost_mat)
cost = 0
work = ['a1', 'a2', 'a3', 'a4', "a5",'a6','a7','a8','a9','a10','a11','a12','a13']
pokeman = ["1", "2", "3", '4', "5",'6','7','8','9','10','11','12','13','14','15','16','17','18','19','20']
filename = '最后的结果.txt'

for work_idx, poken_idx in zip(work_idx_ls, pokeman_idx_ls):
    print(f"交通 {work[work_idx]} 指派给 警察 {pokeman[poken_idx]}")
    cost += cost_mat[work_idx][poken_idx]
print(f"最后消耗  {cost}时间!")

2011年数学建模国赛b题附件数据

https://download.csdn.net/download/aichi_shaqima/86438453

 

到了这里,关于数学建模笔记——整数规划类问题之我见(匈牙利算法)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 二、数学建模之整数规划篇

    1.定义 2.例题 3.使用软件及解题 1.整数规划 (Integer Programming,简称IP):是一种数学优化问题,它是线性规划(Linear Programming,简称LP)的一个扩展形式。在线性规划中,优化目标和约束条件都是线性的,而在整数规划中,除了这些线性约束外,变量还被限制为整数值。在整

    2024年02月11日
    浏览(31)
  • 数学建模整理-线性规划、整数规划、非线性规划

    在人们的生产实践中,经常会遇到如何利用现有资源来安排生产,以取得最大经济 效益的问题。若目标函数及约束条件均为线性函数,则称为线性规划(Linear Programming 简记 LP)。 可行解 :满足约束条件的解。 可行预 :所有可行解构成的集合称为问题的可行域,记为R。 图解法

    2024年02月06日
    浏览(30)
  • 数学建模(四)整数规划—匈牙利算法

    目录 一、0-1型整数规划问题 1.1 案例 1.2 指派问题的标准形式 2.2 非标准形式的指派问题 二、指派问题的匈牙利解法  2.1 匈牙利解法的一般步骤 2.2 匈牙利解法的实例 2.3 代码实现 投资问题: 有600万元投资5个项目,收益如表,求利润最大的方案? 设置决策变量: 模型: 指派

    2024年02月11日
    浏览(28)
  • 数学建模--非整数规划求解的Python实现

    目录 1.算法流程简介 2.算法核心代码 3.算法效果展示

    2024年02月10日
    浏览(24)
  • 数学建模十大算法03—线性规划、整数规划、非线性规划、多目标规划

    一、线性规划(Linear Programming,LP) 1.1 引例 在人们的生产实践中,经常会遇到 如何利用现有资源来安排生产,以取得最大经济效益的问题。 此类问题构成了运筹学的一个重要分支一数学规划,而 线性规划(Linear Programming, LP) 则是数学规划的一个重要分支。 简而言之,线

    2024年02月13日
    浏览(31)
  • 【数学建模】混合整数规划MIP(Python+Gurobi代码实现)

    目录 1 概述 2 入门算例 2.1 算例 2.2 求解 ——Pulp库和cvxpy 3 进阶算例 3.1 算例 3.2 Python+Gurobi代码实现 3.3 运行结果 混合整数规划 (MIP) 是 NP-hard 问题中的一类,它的目标是在线性约束下将线性目标最小化,同时使部分或全部变量均为整数值,在容量规划、资源分配与装箱等等现

    2024年02月07日
    浏览(44)
  • 数学建模基础算法Chapter2.1 -- 整数规划(ILP): 分支定界+割平面

    By 进栈需检票 当题目要求的最优解是整数,例如物件的数量,参与人员的数量等时,就不能继续使用之前的线性规划了(当出现小数的情况),这个时候需考虑整数规划这样的一种建模形式 但是目前所流行的求整数规划的方法,只适用于整数线性规划,不能解决一切的整数

    2024年02月12日
    浏览(34)
  • Matlab数学建模算法详解之混合整数线性规划 (MILP) 算法(附完整实现代码)

    🔗 运行环境:Matlab 🚩 撰写作者:左手の明天 🥇 精选专栏:《python》 🔥  推荐专栏:《算法研究》 ####  防伪水印—— 左手の明天 #### 💗 大家好🤗🤗🤗,我是 左手の明天 !好久不见💗 💗今天分享matlab数学建模算法—— 混合整数线性规划 (MILP) 算法 💗

    2024年02月04日
    浏览(37)
  • 数学建模 优化问题——数学规划

    优化问题 :在一系列客观或主观限制条件下,寻求使所关注的某个或多个指标达到最大(或最小)的决策 结构设计、资源分配、生产计划、运输方案中经常可见 通常的解决手段: 经验积累、主观判断 做试验、比优劣 建立数学模型,求解最优策略 解决优化问题的数学方法: 数

    2024年02月06日
    浏览(32)
  • 数学建模——规划问题

     运筹学对于线性规划问题直接使用图解法,单纯形法利用求解。在python中可以直接使用scipy.optimize模块的linprog函数求解。   linprog 函数的调用方式: 常用参数解释 : (1)  c:价格向量 (2)  A_ub:不等式约束技术系数矩阵 (3)  b_ub:不等式约束资源向量 (4)  A_eq:等式约束技

    2024年02月13日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包