数学建模(四)整数规划—匈牙利算法

目录

一、0-1型整数规划问题

1.1 案例

1.2 指派问题的标准形式

2.2 非标准形式的指派问题

二、指派问题的匈牙利解法 

2.1 匈牙利解法的一般步骤

2.2 匈牙利解法的实例

2.3 代码实现


一、0-1型整数规划问题

1.1 案例

投资问题:

有600万元投资5个项目,收益如表,求利润最大的方案?

设置决策变量:

模型:

指派问题:

甲乙丙丁四个人,ABCD四项工作,要求每人只能做一项工作,每项工作只由一人完成,问如何指派总时间最短?

设置决策变量:

模型:

约束条件:

1.2 指派问题的标准形式

标准的指派问题

有n个人和n项工作,已知第i个人做第j项工作的代价为cj(i,j=1,…..,n),要求每项工作只能交与其中一人完成,每个人只能完成其中一项工作,问如何分配可使总代价最少?

指派问题标准求解形式

(1) 指派问题的系数矩阵

(2)决策变量的设置

(3)指派问题的解矩阵

 指派问题的可行解中,每行每列有且仅有一个1。

(4)标准模型

2.2 非标准形式的指派问题

(1)最大化指派问题

例如:求利润,只需找出最大元素,令最大元素减去所有元素,构建一个新的系数矩阵即可。

C=(c_{ij})_{n \times n} 中最大元素为m,令 B=(b_{ij})_{n \times n}=(m-c_{ij})_{n \times n}

(2)人数和工作数不等

人少工作多:添加虚拟的 “人”,代价都为0

人多工作少:添加虚拟的工作,代价都为0

(3)一个人可做多件工作
该人可化为几个相同的 “人”。

(4)某工作一定不能由某人做
该人做该工作的相应代价取足够大M。例如,将某人做某工作代价设为负值。

二、指派问题的匈牙利解法 

匈牙利法是一种求解指派问题的简便解法,它利用了矩阵中0元素的定理。若从系数矩阵的一行(列)各元素中分别减去该行(列)的最小元素,得到新矩阵。以新矩阵为系数矩阵求得的最优解和用原矩阵求得的最优解相同

2.1 匈牙利解法的一般步骤

第一步变换指派问题的系数(也称效率)矩阵(c_{ij})为(b_{ij}),使在(b_{ij})的各行各列中都出现0元素,即

  • (1) 从矩阵(c_{ij})的每行元素都减去该行的最小元素
  • (2) 再从所得新系数矩阵的每列元素中减去该列的最小元素

第二步:进行试指派,以寻求最优解。

在(b_{ij})中找尽可能多的独立0元素(即行和列中只有这一个0元素),若能找出n个独立0元素,就以这n个独立0元素对应解矩阵(x_{ij})中的元素为1,其余为0,这就得到最优解。找独立0元素,常用的步骤为:

  • (1) 从只有一个0元素的行开始,给这个0元素加圈,记作\circledcirc,然后划去\circledcirc所在列的其它0元素,记作。这表示这列所代表的任务已指派完,不必再考虑别人了。
  • (2) 给只有一个0元素的列中的0元素加圈,记作\circledcirc,然后划去\circledcirc所在行的0元素,记作
  • (3) 反复进行(1),(2)两步,直到尽可能多的0元素都被圈出和划掉为止。
  • (4) 若仍有没有划圈的0元素,且同行(列)的0元素至少有两个,则从剩有0元素最少的行(列)开始,比较这行各0元素所在列中0元素的数目,选择0元素少的那列的这个0元素加圈。然后划掉同行同列的其它0元素。可反复进行,直到所有0元素都已圈出和划掉为止
  • (5) 若\circledcirc元素的数目m等于矩阵的阶数n,那么这指派问题的最优解已得到。若m<n,则转入下一步。

第三步:作最少的直线覆盖所有0元素。

  • (1) 对没有\circledcirc打√号;
  • (2) 对已打√号的行中所有含元素的打√号。
  • (3) 再对打有√号的列中含\circledcirc元素的打√号。
  • (4) 重复(2),(3)直到得不出新的打√号的行、列为止。
  • (5) 对没有打√号的行画横线,有打√号的列画纵线,这就得到覆盖所有0元素的最少直线数 ll 应等于m,转第四步。若不相等,说明试指派过程有误,回到第二步(4)。

第四步:变换矩阵(b_{ij})以增加0元素。

在没有被直线覆盖的所有元素中找出最小元素,然后打√各行都减去这最小元素。打√各列都加上这最小元素(以保证系数矩阵中不出现负元素)。新系数矩阵的最优解和原问题仍相同。转回第二步,直到找出最优解。

2.2 匈牙利解法的实例

 甲乙丙丁四人要完成四项工作A、B、C、D,每人只能完成一项工作,要求完成总时间最短。

匈牙利解法

第一步:减去最小值。

第二步:加圈和划掉,比较圈数是否等于矩阵的阶数。

等于,则输出最优值, 否则,转到第三步重整矩阵。

2.3 代码实现

c=[3 8 2 10 3;8 7 2 9 7;6 4 2 7 5; 8 4 2 3 5;9 10 6 9 10];%系数矩阵c=c(:);    %把矩阵c转化为向量 a=zeros(10,25);for i=1:5   % 实现循环运算
a(i,(i-1)*5+1:5*i)=1; 
a(5+i,i:5:25)=1;
end         % 此循环把指派问题转换为线性规划问题b=ones(10,1); [x,y]=linprog(c,[],[],a,b,zeros(25,1),ones(25,1));X=reshape(x,5,5)opt=y

输出

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/88447.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Matlab(变量与文本读取)

目录 1.变量&#xff08;数据&#xff09;类型转换 1.1 字符 1.2 字符串 1.3 逻辑操作与赋值 2.Struct结构体数组 2.1函数的详细介绍&#xff1a; 2.1.1 cell2struct 2.1.1.1 垂直维度转换 2.1.1.2 水平维度转换 2.1.1.3 部分进行转换 2.1.2 rmfield 2.1.3 fieldnames(查…

智能设计师的崛起:探寻智元兔AI设计师的神奇之旅

AI绘图是指利用人工智能技术来生成或改善绘图作品的方法和工具。通过使用深度学习和生成对抗网络等算法&#xff0c;人工智能可以学习和模仿艺术家的创作风格&#xff0c;生成逼真的艺术作品。 智元兔-AI设计师是一款基于人工智能设计工具&#xff0c;利用机器学习和深度学习技…

20 MySQL(下)

文章目录 视图视图是什么定义视图查看视图删除视图视图的作用 事务事务的使用 索引查询索引创建索引删除索引聚集索引和非聚集索引影响 账户管理&#xff08;了解非DBA&#xff09;授予权限 与 账户的相关操作 MySQL的主从配置 视图 视图是什么 通俗的讲&#xff0c;视图就是…

Mac Flutter web环境搭建

获取 Flutter SDK 下载以下安装包来获取最新的 stable Flutter SDK将文件解压到目标路径, 比如: cd ~/development $ unzip ~/Downloads/flutter_macos_3.13.0-stable.zip 配置 flutter 的 PATH 环境变量&#xff1a; export PATH"$PATH:pwd/flutter/bin" // 这个命…

【桌面小屏幕项目】ESP32开发环境搭建

视频教程链接&#xff1a; 【【有手就行系列】嵌入式单片机教程-桌面小屏幕实战教学 从设计、硬件、焊接到代码编写、调试 ESP32 持续更新2022】 https://www.bilibili.com/video/BV1wV4y1G7Vk/?share_sourcecopy_web&vd_source4fa5fad39452b08a8f4aa46532e890a7 一、esp…

Linux内核学习(十二)—— 页高速缓存和页回写(基于Linux 2.6内核)

目录 一、缓存手段 二、Linux 页高速缓存 三、flusher 线程 Linux 内核实现了一个被叫做页高速缓存&#xff08;page cache&#xff09;的磁盘缓存&#xff0c;它主要用来减少对磁盘的 I/O 操作。它是通过把磁盘中的数据缓存到内存中&#xff0c;把对磁盘的访问变为对物理内…

Tomcat和Servlet基础知识的讲解(JavaEE初阶系列16)

目录 前言&#xff1a; 1.Tomcat 1.1Tomcat是什么 1.2下载安装 2.Servlet 2.1什么是Servlet 2.2使用Servlet来编写一个“hello world” 1.2.1创建项目&#xff08;Maven&#xff09; 1.2.2引入依赖&#xff08;Servlet&#xff09; 1.2.3创建目录&#xff08;webapp&a…

openGauss学习笔记-47 openGauss 高级数据管理-权限

文章目录 openGauss学习笔记-47 openGauss 高级数据管理-权限47.1 语法格式47.2 参数说明47.3 示例 openGauss学习笔记-47 openGauss 高级数据管理-权限 数据库对象创建后&#xff0c;进行对象创建的用户就是该对象的所有者。数据库安装后的默认情况下&#xff0c;未开启三权分…

mysql基础——认识索引

一、介绍 “索引”是为了能够更快地查询数据。比如一本书的目录&#xff0c;就是这本书的内容的索引&#xff0c;读者可以通过在目录中快速查找自己想要的内容&#xff0c;然后根据页码去找到具体的章节。 二、优缺点 优势&#xff1a;以快速检索&#xff0c;减少I/O次数&am…

Kafka3.0.0版本——Follower故障处理细节原理

目录 一、服务器信息二、服务器基本信息及相关概念2.1、服务器基本信息2.2、LEO的概念2.3、HW的概念 三、Follower故障处理细节 一、服务器信息 三台服务器 原始服务器名称原始服务器ip节点centos7虚拟机1192.168.136.27broker0centos7虚拟机2192.168.136.28broker1centos7虚拟…

ORA-00604 ORA-00069报错

在测试环境上删除用户&#xff0c;报错如下 rop user "USR_EOS" cascade; * ERROR at line 1: ORA-00604: error occurred at recursive SQL level 1 ORA-00069: cannot acquire lock -- table locks disabled for T_EMPLOYEE 解决方法 alter table USR_EOS.T_EMPL…

基于微信小程序的餐厅预订系统的设计与实现(论文+源码)_kaic

摘 要 随着消费升级&#xff0c;越来越多的年轻人已经开始不再看重餐饮等行业的服务&#xff0c;而是追求一种轻松自在的用餐、购物环境。因此&#xff0c;无人餐厅、无人便利店、无人超市等一些科技消费场所应势而生。餐饮企业用工荒已成为不争的事实。服务员行业的低保障、低…