数学建模指派问题论文
最优化指派问题小论文

最优化小论文某企业拟生产A 和B 两种产品,其生产投资费用分别为2100元/t 和4800元/t 。
A 、B 两种产品的利润分别为3600元/t 和6500元/t 。
A 、B 产品每月的最大生产能力分别为5t 和8t ;市场对这两种产品总量的需求每月不少于9t 。
试问该企业应该如何安排生产计划,才能既能满足市场需求,又节约投资,而且使生产利润达到最大?分析:该问题是一个线性多目标规划问题。
如果计划决策变量用x 1 和x 2表示,它们分别代表A 、B 产品每月的 生产量(单位:t );f 1(x 1,x 2)表示生产A 、B 两种产品的总投资费用(单位:元); f 2(x 1,x 2)表示生产A 、B 两种产品获得的总利润(单位:元)。
那么,该多目标规划问题就是:求x 1 和x 2,使:而且满足:对于上述多目标规划问题,如果决策者提出的期望目标是: (1)每个月的总投资不超30000元; (2)每个月的总利润达到或超过45000元; (3)两个目标同等重要。
解:⎪⎪⎩⎪⎪⎨⎧≥≥+≤≤0,985212121x x x x x x 2121148002100),(min x x x x f +=2121265003600),(max x x x x f +=指派问题现实生活中中经常会遇到类似这样的问题,比如有n 项不同的任务,需要n 个人分别完成其中的一项,但由于任务的性质和各人的专长不同,因此各人去完成不同的任务的效率(或花费的时间或费用)也就不同。
于是产生了一个问题,应指派哪个人去完成哪项任务,使完成n 项任务的总效率最高(或所需时间最少),这类问题称为指派问题或分派问题。
1.指派问题的数学模型:设n 个人被分配去做n 件工作,规定每个人只做一件工作,每件工作只有一个人去做。
已知第i 个人去做第j 件工作的的效率(时间或费用)为Cij(i=1.2…n;j=1.2…n)并假设Cij ≥0。
问应如何分配才能使总效率(时间或费用)最高?设决策变量1 分配第i 个人去做第j 件工作x ij =0 相反( i, j =1.2. …n )其数学模型为:⎪⎪⎪⎪⎩⎪⎪⎪⎪⎨⎧=======∑∑∑∑====)..2.1,1(或0)..2.1( 1)..2.1( 1min 1111n j i x n j x n i x x c Z ij n i ij nj ij ni njij ij解题步骤:第一步:变换指派问题的系数(也称效率)矩阵(c ij)为(b ij),使在(b ij)的各行各列中都出现0元素,即(1)从(c ij )的每行元素都减去该行的最小元素(若求什么时候效率最低时,则所有行行列都先乘以-1,然后再加上所有数中绝对值最大的数,再每行元素都减去该行的最小元素); (2) 再从所得新系数矩阵的每列元素中减去该列的最小元素。
数学建模,获奖论文设计,工作指派问题

河南理工大学2014年数学建模竞赛论文答卷编号(竞赛组委会填写):题目编号:( F )论文题目:工作的安排参赛队员信息(必填):答卷编号(竞赛组委会填写):评阅情况(学校评阅专家填写):评阅1.评阅2.评阅3.工作的安排摘要:工作指派问题是日常生活中常见的一类问题。
本文所要研究就是在效率与成本的背景下,如何安排每个人员的工作分别达到以下三个要求:1、使得总的工作效率最大。
2、使得总的成本最低。
3、兼顾工作效率和成本,优化工作安排方案。
对于问题一,该问题属于工作指派问题,要求使工作效率最大。
为了得到最优的安排方案,我们采用0-1规划模型,引入0-1变量,即其中一人负责某一项工作记作1,否则为0,然后与之对应的效率相乘,然后把所有的工作安排情况这样处理后,再求和作为目标函数。
此外我们对该问题进行了如下约束:因为六个人刚好六份工作,所以每个人只能被安排一份工作,而且每份工作只允许一人来完成。
最后在模型求解中我们应用lingo软件编程使目标函数值最大化,根据此时对应的0-1变量的所有值,最终得到最优安排方案。
对于问题二,要求的方案使工作成本最低。
该问题与问题一相似,只是求解的是目标函数的最小值,为此我们建立了成本最小化模型,该模型同样应用了0-1规划方法,然后用与问题一中相似的方法建立目标函数,然后应用lingo软件编程使目标函数值最小,最终得到使成本最小的相应安排方案。
对于问题三,该问题兼顾效率与成本,属于多目标规划。
首先,数据标准化处理。
给出的效率成本数据属于两个不同性质的指标,两个指标之间存在着不可公度性,而且两项的数值整体大小水平不一样,会有大数起主导作用的影响,如果不对两个指标的数据进行标准化,就会得到错误的结果,为此我们首先采用极值差方法,用matlab编程对两项指标数据进行标准化。
经过极差变换后,两项指标值均在0和1之间。
对于此问题的多目标规划解决,我们采用理想点方法将多目标规划转化为单目标规划,建立了偏离理想点距离模型。
数学建模大赛论文范文

数学建模大赛论文范文一、问题重述在约10,000米高空的某边长160公里的正方形区域内,经常有若干架飞机作水平飞行。
区域内每架飞机的位置和速度向量均由计算机记录其数据,以便进行飞行管理。
当一架欲进入该区域的飞机到达区域边缘时,记录其数据后,要立即计算并判断是否会与区域内的其它飞机发生相撞。
如果发生相撞,则应计算如何调整各架(包括新进入的)飞机的飞行方向角,以避免碰撞。
现假设条件如下:(1) 不相撞的标准为任意两架飞机的距离大于8公里; (2) 飞机飞行方向角调整的幅度不应超过30度; (3) 所有飞机的飞行速度均为每小时800公里;(4) 进入该区域的飞机在到达区域边缘时,与区域内飞机的距离应在60公里以上;(5) 最多需考虑6架飞机;(6) 不必考虑飞机离开此区域后的情况。
请你对这个避免碰撞的飞行管理问题建立数学模型,列出计算步骤,对以下数据进行计算(方向角误差不超过0.01度),要求飞机飞行方向角调整的幅度尽量小。
设该区域4个顶点的坐标为(0,0),(160,0),(160,160),(0,160)。
记录数据为:注:方向角指飞行方向与x轴正向的夹角。
二、问题分析此问题很容易想到以飞机调整的飞行角度平方和作为目标函数,而以每两架飞机之间的最小距离不超过8km,各飞机飞行角度调整的值不超过30°为约束条件。
如此得出的是一个非线性模型,在计算上可能会复杂些,但一目了然。
三、符号说明t表示表示时间;; xi,yi分别表示第i架飞机的横纵坐标(问题中已给出);i表示第i架飞机的飞行方向角(问题中已给出)dij(t)表示t时刻第i架飞机与第j架飞机间的距离;。
v表示飞机的飞行高度(v800)四、模型的建立由题意可知,目标函数是6f i2i1约束条件为Dij mindij264 和it06,i,j1,2,,6,i j其中dij(t)(xi xj vt(cos(i i)cos(j j))) 22(yi yj vt(sin(i i)sin(j j)))2利用微积分的知识可求出Dij,由2d(dij)dt这里a0tba(xi xj)(cos(i i)cos(j j))(yi yj)(sin(i i)sin(j j))b v[(cos(i i)cos(j j))2(sin i(i2))])s in(jj将t代入即可求出Dij。
数学建模经典论文五篇

1、 血样的分组检验在一个很大的人群中通过血样检验普查某种疾病,假定血样为阳性的先验概率为p(通常p 很小).为减少检验次数,将人群分组,一组人的血样混合在一起化验.当某组的混合血样呈阴性时,即可不经检验就判定该组每个人的血样都为阴性;而当某组的混合血样呈阳性时,则可判定该组至少有一人血样为阳性,于是需要对这组的每个人再作检验.(1)、当p 固定时(如0.01%,…,0.1%,…,1%)如何分组,即多少人一组,可使平均总检验次数最少,与不分组的情况比较. (2)、当p 多大时不应分组检验.(3)、当p 固定时如何进行二次分组(即把混合血样呈阳性的组再分成小组检验,重复一次分组时的程序).模型假设与符号约定1 血样检查到为阳性的则患有某种疾病,血样呈阴性时的情况为正常2 血样检验时仅会出现阴性、阳性两种情况,除此之外无其它情况出现,检验血样的药剂灵敏度很高,不会因为血样组数的增大而受影响. 3 阳性血样与阳性血样混合也为阳性 4 阳性血样与阴性血样混合也为阳性 5 阴性血样与阴性血样混合为阴性 n 人群总数 p 先验概率血样阴性的概率q=1-p血样检验为阳性(患有某种疾病)的人数为:z=np 发生概率:x i P i ,,2,1, = 检查次数:x i R i ,,2,1, = 平均总检验次数:∑==xi i i R P N 1解1设分x 组,每组k 人(n 很大,x 能整除n,k=n/x ),混合血样检验x 次.阳性组的概率为k q p -=11,分组时是随机的,而且每个组的血样为阳性的机率是均等的,阳性组数的平均值为1xp ,这些组的成员需逐一检验,平均次数为1kxp ,所以平均检验次数1kxp x N +=,一个人的平均检验次数为N/n,记作:k k p kq k k E )1(1111)(--+=-+=(1) 问题是给定p 求k 使E(k)最小. p 很小时利用kp p k -≈-1)1(可得kp kk E +=1)( (2) 显然2/1-=p k 时E(k)最小.因为K 需为整数,所以应取][2/1-=p k 和1][2/1+=-p k ,2当E (k )>1时,不应分组,即:1)1(11>--+k p k,用数学软件求解得k k p /11-->检查k=2,3,可知当p>0.307不应分组.3将第1次检验的每个阳性组再分y 小组,每小组m 人(y 整除k,m=k/y ).因为第1次阳性组的平均值为1xp ,所以第2次需分小组平均检验1yxp 次,而阳性小组的概率为m q p -=12(为计算2p 简单起见,将第1次所有阳性组合在一起分小组),阳性小组总数的平均值为21yp xp ,这些小组需每人检验,平均检验次数为21yp mxp ,所以平均总检验次数211yp mxp yxp x N ++=,一个人的平均检验次数为N/n,记作(注意:n=kx=myx)p q q q mk p p m p k m k E m k -=-+-+=++=1),1()1(111),(211 (3) 问题是给定p 求k,m 使E (k,m )最小.P 很小时(3)式可简化为21),(kmp mkpk m k E ++≈ (4)对(4)分别对k,m 求导并令其等于零,得方程组:⎪⎪⎩⎪⎪⎨⎧=+-=++-0012222kp m kp mp mp k 舍去负数解可得:2/14/3,21--==p m p k (5)且要求k,m,k/m 均为整数.经在(5)的结果附近计算,比较E(k,m),得到k,m 的最与表1比较可知,二次分组的效果E(k,m)比一次分组的效果E(k)更好.2、铅球掷远问题铅球掷远比赛要求运动员在直径2.135m 的圆内将重7.257kg 的铅球投掷在 45的扇形区域内,建立模型讨论以下问题1.以出手速度、出手角度、出手高度 为参数,建立铅球掷远的数学模型;2.考虑运动员推铅球时用力展臂的动 作,改进以上模型.3.在此基础上,给定出手高度,对于 不同的出手速度,确定最佳出手角度 问题1模型的假设与符号约定1 忽略空气阻力对铅球运动的影响.2 出手速度与出手角度是相互独立的.3 不考虑铅球脱手前的整个阶段的运动状态. v 铅球的出手速度 θ 铅球的出手角度 h 铅球的出手高度 t 铅球的运动时间 L 铅球投掷的距离g 地球的重力加速度(2/8.9s m g=)铅球出手后,由于是在一个竖直平面上运动.我们,以铅球出手点的铅垂方向为y 轴,以y 轴与地面的交点到铅球落地点方向为x 轴构造平面直角坐标系.这样,铅球脱手后的运动路径可用平面直角坐标系表示,如图.因为,铅球出手后,只受重力作用(假设中忽略空气阻力的影响),所以,在x 轴上的加速度0=,在y 轴上的加速度g a y -=.如此,从解析几何角度上,以时间 t 为参数,易求得铅球的运动方程:⎪⎩⎪⎨⎧+-==h gt t v y t v x 221sin cos θθ 对方程组消去参数t ,得h x x v gy ++-=)(tan cos 2222θθ……………………………………………(1) 当铅球落地时,即是0=y ,代入方程(1)解出x 的值v ggh gh v g v x θθθθθ2222sin 22cos sin cos sin 2-++=对以上式子化简后得到铅球的掷远模型θθθ22222cos 22sin 222sin g v h g v g v L +⎪⎪⎭⎫ ⎝⎛+=………………………………(2) 问题2我们观察以上两个阶段,铅球从A 点运动到B 点,其运动状态是匀加速直线运动的,加速距离是2L 段.且出手高度与手臂长及出手角度是有一定的联系,进而合理地细化各个因素对掷远成绩的约束,改进模型Ⅰ.在投掷角度为上进行受力分析,如图(3)由牛顿第二定 律可得,ma mg F =-θsin 再由上式可得,θsin g mFa -=………………………………………(3) 又,22022aL v v =-,即22022aL v v += (4)将(3)代入(4)可得,θsin 2222202g L m FL v v -⎪⎭⎫⎝⎛+= ………………………(5) (5)式进一步说明了,出手速度v 与出手角度θ有关,随着θ的增加而减小.模型Ⅰ假设出手速度与出手角度相互独立是不合理的. 又根据图(2),有θsin 1'L h h += (6)由模型Ⅰ,同理可以得到铅球脱手后运动的距离θθθ22222cos 22sin 222sin g v h g v g v L +⎪⎪⎭⎫ ⎝⎛+= 将 (4)、(5)、(6)式代入上式整理,得到铅球运动的距离()⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡⎥⎦⎤⎢⎣⎡-⎪⎭⎫⎝⎛++++-⎪⎭⎫ ⎝⎛+=θθθθθ22220'2220sin sin 22sin 2112sin 2sin 22g L m FL v h g g g L m FL v L 对上式进行化简:将m=7.257kg,2/8.9s m g = 代入上式,再令m h 60.1'= (我国铅球运动员的平均肩高),代入上式进一步化简得,()⎪⎪⎭⎫ ⎝⎛-++-++⨯θθθθθ2222232222sin sin 6.192756.06.19sin 6.19sin 2756.0sin 1L FL v L FL v ………………(7) 所以,运动员投掷的总成绩θcos 1L L S +=问题3给定出手高度,对于不同的出手速度,要确定最佳的出手角度.显然,是求极值的问题,根据微积分的知识,我们要先求出驻点,首先,模型一中L 对θ求导得,g hv g v g hv v g v d dL θθθθθθθθ22224242cos 82sin sin cos 42cos 2sin 2cos +-+=令0=θd dL,化简后为, 0sin cos 42cos 2sin cos 82sin 2cos 2422242=-++θθθθθθθhgv v hgv v v根据倍角与半角的三角关系,将以上方程转化成关于θ2cos 的方程,然后得,hv g g vgh gh222cos +=+=θ (3)()θθ2sin sin 6.192756.051.0222L FL v L -+=从(3)式可以看出,给定铅球的出手高度h ,出手速度v 变大,相应的最佳出手角度θ也随之变大.对(3)式进行分析,由于0,0>>θh ,所以02cos >θ,则40πθ≤<.所以,最佳出手角度为)arccos(212vgh gh +=θ θ是以π2为周期变化的,当且仅当N k k ∈⎪⎭⎫⎝⎛∈±,4,02ππθ时,πθk 2±为最佳出手角度.特别地,当h=0时(即出手点与落地点在同一高度),最佳出手角度︒=45α3、零件的参数设计粒子分离器某参数(记作y )由7个零件的参数(记作x x 12,,…x 7)决定,经验公式为:y x x x x x x x x x x x =⎛⎝ ⎫⎭⎪-⎛⎝ ⎫⎭⎪⨯--⎛⎝ ⎫⎭⎪⎡⎣⎢⎢⎤⎦⎥⎥⎛⎝ ⎫⎭⎪-17442126210361532108542056324211667......y 的目标值(记作y 0)为1.50。
大学生数学建模论文(专业推荐范文10篇)

大学生数学建模是一项基础性得学科竞赛,可以交流更多得经验,学习更多得知识,所以大学生数学建模很受学者们得欢迎,本篇文章就向大家介绍一些大学生数学建模论文,供给大家作为一个参考。
大学生数学建模论文专业推荐范文10篇之第一篇:数学建模对大学生综合素质影响得调查研究---------------------------------------------------------------------------------------------------------------------感谢使用本套资料,希望本套资料能带给您一些思维上的灵感和帮助,个人建议您可根据实际情况对内容做适当修改和调整,以符合您自己的风格,不太建议完全照抄照搬哦。
---------------------------------------------------------------------------------------------------------------------摘要:文章通过问卷网以调查问卷得形式和线下访谈得方法 ,对笔者所在学校参加过数学建模竞赛得同学和未参加过数学建模竞赛得同学对数学建模对自身综合素质得影响进行了调查研究。
调查表明,大部分学生都能认识到数学建模学习和竞赛对其自身综合素质得提升是有帮助得,但是大多数学生对数学建模得意义认识还不到位。
文章对调查结果进行分析,结合笔者得切身体会对地方高校数学建模课程教学及学生参加竞赛提出某些建议。
关键词:数学建模; 大学生; 综合素质; 研究;一、前言随着社会得不断进步和发展,大学生想要在激烈得人才竞争中脱颖而出,就必须要不断提高自己得综合素质,而良好得综合素质不仅应具有坚实得理论基础,扎实得专业知识,还应该具有较强得创新能力、与他人合作得能力、较强得语言表达能力、以及稳定得心理状态。
许多科学家断言未来科学技术得竞争是数学技术得竞争,这无疑对数学能力提出了更高得要求,不可否认数学建模课程教学及建模竞赛是提升大学生数学能力得有效途径。
数学建模模版之指派问题

j 1
n
xij 1, j 1,2, , n
i 1
xij 0 或 1
指派问题是特殊的0 – 1规划,但它有更简便的解法
匈牙利法。
1955年由库恩(W.W. Kuhn)提出,但他引用了匈牙利
数学家康尼格(D. Konig)关于矩阵中零元素定理:
确定或反映指派问题的唯一因素或数据是效益矩阵:
c11 c12 c1n
2. 最优解定理
如果效益矩阵 B (bij )nn中有n个独立0元素bij ((i, j) J ), 则
1, (i, j) J xij
0, (i, j) J
为指派问题的最优指派决策.
二、匈牙利法的步骤
Step 1. 将C零元素化,得到矩阵B,使B中每行每列中均有 零元素 ① C中的各行减该行最小元素; ② C中的各列减该列最小元素;
选第3行标 0
选第5行标 0
选第1行标 0
选第2行标 0
选第4行标 0 ,标 0 有
5个元素. 最优解
0 1 0 0 0 0 0 1 0 0 x (xij ) 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1
三. 求最大化指派问题 (max cx) 1. 可以将之最小化 min - cx . 2. 为方便起见,可令
z* 5 4 9 11 29
Step 3. 如有0 的元素个数小于n,则当前方案不是最优的, 需调整,先选最少直线覆盖所有0元素。
①对没有 0 的行打√号; ②对已打√号的行中有 0 元素的列打√号; ③对打√号的列中含有 0元素的行打√号; ④重复②和③,直至得不出新的打√号的行列为止;
⑤ 对于没有√的行画横线,所有打√号的列画竖线, 产生覆盖所有零元素的最少直线,直线数目应等于
数学建模作业_动态规划求解指派问题

3 问题的伪代码实现
1 设 k 的初始值为 1; 2 写出 X k ,即第 k 阶段决策变量可能的取值,特别地, X 1 ={1,2, 。 。 。 ,n}。 3 对每一个 sk ,计算 sk g1 (sk 1 , xk 1 ) sk 1 {xk 1. j} ,及 d ( sk , xk ) ; 4 计算 f k ( sk ) ; 5 若 X k 为空,转到第 6 步,否则,k++,转回执行第 2 步。 6 最优指派决策为 f k ( sk ) ,根据 f k ( sk ) 写出最优指派方案{ xkj }。 7 程序算法复杂度:是 O(V*E*E)
其中“ - ”表示集合的差运算。 (4)指派问题指标递归方程:
f k (sk ) min{ f k (sk , xk ) | xk X k } , f k (sk , xk ) d k (sk , d k ) f k 1 ( g1 (sk 1 , xk 1 )) , f 0 (s0 ) 0, k 1,2,..., n.
float costforout[101][101]; int matrixsize; int personnumber; int jobnumber; }matrix; matrix sb; int result[501][2]; void twozero(matrix &sb); void judge(matrix &sb,int result[501][2]); void refresh(matrix &sb); void circlezero(matrix &sb); matrix input(); void output(int result[501][2],matrix sb); void zeroout(matrix &sb); matrix input() { matrix sb; int m; int pnumber,jnumber; int i,j; float k; char w; printf("指派问题的动态规划解法:\n\n"); printf("按最大价值分配请输入 1;最小价值分配请输入 0:\n"); scanf("%d",&m); while (m!=1&&m!=0) { printf("请输入 1 或 0:\n"); scanf("%d",&m); } printf("请输入可分配总人数(介于 1 和 100 之间):\n"); scanf("%d",&pnumber); while(pnumber<1 || pnumber>100) { printf("请输入合法数据:\n"); scanf("%d",&pnumber); } printf("请输入工作数(介于 1 和 100 之间):\n"); scanf("%d",&jnumber); while(jnumber<1 || jnumber>100) { printf("请输入合法数据:\n");
关于指派问题的数学建模及求解方法

但 是 , 用 匈 牙 利 法 虽 然 简 单 ,但 其 计 算 量 大 ,
特 别 对 于 人 数 和 工 作 数 都 比较 多 的 指 派 问 题 , 用 此 法 就 显 得 非 常 繁 琐 。 如 果 通 过 数 学 建 模 思 想 , 并 利 用 数 学 软 件 来 求 解 , 就 可 以 提 高 计 算 的速度和精确度 。 下 面 针对 不 同 的指 派 问题 建 立 相 应 的数 学 模 型,并利用 L i n g o软 件 编 程 求 解 ,其 方 法 对 求 解 指派 问题 有 一定 的借 鉴作 用和 指 导意义 。
设 { 1 0 , 当 不 指 去 伽, 工 作 1 1 当指 当 指 沂 去 惭 R 工作 ] 二 作, i = 1 , 2 , 人 , ; = 1 , 2 , A , ’ ’ ’ 一 ’
、
,
收 稿 日期 : 2 0 1 3 — 0 9 — 0 1 作者简介 :冯超玲 ( 1 9 7 0 - ),女 ,广西岑溪人 ,在职研 究生,讲师 ,研 究方向:数 学建模和矩 阵分析 。
中图分 类号 :0 1 4 1 . 4 文 献标 识码 :A 文 章编 号 :1 6 7 4 m3 0 8 3( 2 0 1 3) 0 4 一O 0 2 5 —O 4
1前 言
标 准 形 式 的 指 派 问题 一 般 可 以通 过 人 工 计 算 的 方 法 进 行 求 解 ,常 用 的 方 法 有 匈 牙 利 法 , 则 该 指派 问题 的数 学模 型为 :
m i n Z = ∑∑c
i = 1 j = l
∑ = 1 ,i = l , 2 , A, , z
j = l
∑ = 1 , i =1 , 2 , K, , J= 1 , 2 , 人, F /
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录一问题重述 (2)二模型假设 (2)三匈牙利法陈述 (2)四问题分析 (3)五问题实现 (5)1问题重述 (5)2 问题求解 (5)2.1由匈牙利法构造目标函数 (5)2.2模型建立 (6)3 模型解析 (6)4 程序实现 (7)六结果显示及min求解 (17)七模型深入 (17)1 模型建立 (18)2 进行求解 (18)3程序分析 (20)八模型检验 (20)九整体总结 (20)十参考文献 (21)一问题重述指派问题亦称平衡指派问题仅研究人数与事数相等、一人一事及一事一人的情形。
现有的不平衡指派问题将研究范围扩大到人数与事数可以不等、一人一事或一人多事及一事一人的情形。
日常活动中也不乏人数与事数可以不等、一人多事及一事多人的情形,这类事务呈现了广义指派问题的实际背景。
平衡指派问题是特殊形式的平衡运输问题,可运用匈亚利法、削高排除法和缩阵分析法等特殊方法求解。
另一方面,正是平衡指派问题的这种特殊性,使得不平衡指派问题不能按常规技术转化为平衡指派问题。
因此,各种不平衡指派问题需要确立相应的有效解法1问题的提出及其数学模型广义指派问题并非奇特和抽象的构想,相反,该问题可以从司空见惯的日常事务中引出。
现在我们就运用匈牙利法,去实现n个人,n件工作的指派问题。
二模型假设1 假设一共有n个人,n件工作,即人数与工作数相等。
2 假设每个人的都能从事某项工作,但是付出的代价不同。
3 假设求解代价最小的解。
4甲乙丙丁四个人,ABCD四项工作,要求每人只能做一项工作,每项工作只由一人完成,问如何指派总时间最短?三匈牙利法陈述第一步:找出矩阵每行的最小元素,分别从每行中减去这个最小元素;第二步:再找去矩阵每列的最小元素,分别从各列减去这个最小元素;第三步:经过这两步变换后,矩阵的每行每列至少都有了一个零元素,接着根据以下准则进行试指派,找出覆盖上面矩阵中所有零元素至少需要多少条直线;(1)从第一行开始,若该行只有一个零元素打上()号。
对打()号零元素所在列划一条直线。
若该行没有零元素或有两个以上零元素(已划去的不计在内),则转下一行,一直到最后一行为止;(2)从第一列开始,若该列只有一个零元素就对这个零元素打上()号(同样不考虑已划去的零元素),对打()号零元素所在行划一条直线。
若该列没有零元素或 还有两个以上零元素,则转下一列,并进行到最后一列; (3)重复(1)、(2)两个步骤,可能出现三种情况:① 矩阵每行都有一个打()号零元素,很显然,按照上述步骤得到的打()的零元素都位于不同行不同列,因此就找到了问题的答案;② 有多于两行或两列存在两个以上零元素,即出现了零元素的闭回路,这个时候可顺着闭回路的走向,对每个间隔的零元素打上()号,然后对所有打()号零元素或所有列或所在行划一条直线。
③ 矩阵中所有零元素或打上()号,或被划去,但打()号零元素个数小于m 。
第四步:为了设法使每行都有一个打()的零元素,就要继续对矩阵进行变换;(1)从矩阵未被直线覆盖的元素找出最小元素k ;(2)对矩阵的每行,当该行有直线覆盖时,令i u =0,无直线覆盖的,令i u =k ; (3)对矩阵的每列,当该列有直线覆盖时,令j v =-k ,无直线覆盖的,令j v =0; (4)得列一个变换后的矩阵,其中每个元素ij b =ij a -i u -j v 。
第五步:回到第三步,反复进行,一直到矩阵中每一行都有一个打()的零元素为止,即找到最优分配方案为止。
四 问题分析指派问题的标准形式(以人和事为例)如下。
有n 个人和n 项任务,已知第i 个人做第j 件事的费用为ijc ,要求确定人和事之间的一一对应的指派方案,使完成这n 项任务的费用最少。
一般把目标函数的系数写为矩阵形式,称矩阵⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡==⨯nn n n n n nn ij c c c c c c c c c c C ..................)(212222111211为系数矩阵(Coefficient Matrix ),也称为效益矩阵或价值矩阵。
矩阵的元素ijc (i,j=1,2,…n )表示分配第i 个人去完成第j 项任务时的效益。
一般地,以ijx 表示给定的资源分配用于给定活动时的有关效益(时间,费用,价值等),且nj x ij ,...,2,1i,j i ,1j i ,0=⎩⎨⎧=,项活动单位资源用于第分配第项活动单位资源用于第不分配第然后我们求解最小(最大(这里不再讨论))代价和模型,1111min max (1)..1,1,2,...,(2)1,1,2,...,(3)01,,1,2,...,(4)nnij iji j nijj n iji ij z c x s txi n xj n x i j n===========∑∑∑∑()或当然,作为可行解,矩阵的每列元素中都有且只有一个1,以满足约束条件式(3)。
每行元素中也有且只有一个1,以满足约束条件(2)。
指派问题n!个可行解。
如果要求解最大值11maxnnij ij i j z c x ===∑∑时,我们将构造一个新的矩阵()ijc ',使ijij c M c '=-,其中M 是一个足够大的常数。
一般取ij c 中最大的元素作为M ,求解()11min n nij ij i j z M c x =='=-∑∑,所得的解()ij x 就是原问题的解。
事实上,由()1111111111M Mn n n n nij ijijij i j i j nnnnijij iji j i j nn ij iji j c x M c xx c xc x =========='=-=-=-∑∑∑∑∑∑∑∑∑∑可的此结论。
五 问题实现1问题重述已知问题甲乙丙丁四个人,ABCD 四项工作,要求每人只能做一项工作,每项工作只由一人完成,问如何指派总时间最短? 每个人的对每项工作的代价如下:2 问题求解开始求解2.1由匈牙利法构造目标函数xd ijiji j *min 921201∑∑===引入0-1变量x ij ,x ij =1:第i 人做第j 项工作 x ij =0:第i 人不做第j 项工作约束条件: {个工作j 个工作从事第第1个工作不能被从事第0i i j i x =(i=1,2,...,92 j=1,2, (20)2.2模型建立即一项任务只由一个人完成一人只能完成一项任务求出目标函数3 模型解析根据指派问题的最优性定理,求最优解的问题可以转换为求效益矩阵的 大1元素组的问题。
匈牙利法的一般计算步骤为:步骤1:对效益矩阵进行初等变换,使每行每列都出现0元素。
1. 从效益矩阵A 中每一行减去该行的最小元素;2. 再在所得矩阵中每一列减去该列的最小元素,得矩阵D ;步骤2:将矩阵D 中0元素置为1元素,非0元素置为0元素,得矩阵E 。
112131411222324213233343142434441111x x x x x x x x x x x x x x x x +++=+++=+++=+++= 111213142122232431323334414243441111x x x x x x x x x x x x x x x x +++=+++=+++=+++= 11121314212223243132333441424344min 3584685425859252Z x x x x x x x x x x x x x x x x =+++++++++++++++步骤3:确定独立1元素组。
1.在矩阵E中含有1元素的各行中选择1元素最少的行,比较该行中各1元素所在的列中1元素的个数,选择1元素的个数最少的那一列中的1元素;2.将所选的1元素所在的行和列的元素置为0;3.重复第2步和第3步,直到没有1元素为止,即得到一个独立1元素组。
步骤4:判断是否为最大独立1元素组。
1.如果所得独立1元素组为原效益矩阵的最大独立1元素组(即1元素的个数等于矩阵的阶数),则已得到最优解,停止计算;2.如果所得独立1元素组还不是原效益矩阵的最大独立1元素组,那么继续寻找可扩路的方法对其进行扩张,进行下一步;步骤5:利用寻找可扩路方法确定最大独立1元素组。
1.做最少的直线覆盖矩阵D的所有0元素;2.在没有被直线覆盖的部分找出最小元素,在没有被直线覆盖的各行减去此最小元素,在没有被直线覆盖的各列上加上此最小元素,得到一个新的矩阵,返回第二步。
4 程序实现这里我们运用c++语言进行编程进行求解/******************************************************************** ****//* zhipai2.cppAuthor: 路遥Date:2012-12-1Description:需要在同样的目录下建立一个input.txt的文件夹在里面写入每个人从事不同的工作代价,首行要写入几阶方程,然后是每个人的不同工作代价,用空格隔开。
每人一行,见下面数字形式。
用匈牙利法,实现n个人,n件工作的指派问题。
Input:input.txt 格式为代价矩阵维度n,和矩阵内容,例如:43 5 8 46 8 5 42 5 8 59 2 5 2Output:控制台输出指派矩阵,例如0 0 0 10 0 1 01 0 0 00 1 0 0*//******************************************************************** ****/#include <iostream>#include <fstream>using namespace std;#define MAX_N 100int nn;//输入矩阵的维度nnvoid printMatrix(int a[MAX_N][MAX_N]){int i,j;for(i=0;i<nn;i++){for(j=0;j<nn;j++)cout<<a[i][j]<<" ";cout<<endl;}}int main(){int c[MAX_N][MAX_N],b[MAX_N][MAX_N];int quan[MAX_N][MAX_N],cha[MAX_N][MAX_N];int rowZero[MAX_N],colZero[MAX_N];int rowCheck[MAX_N],colCheck[MAX_N];int i,j,k;ifstream input("input.txt");if(!input){cout<<"Open input file failed."<<endl;system("pause");exit(1);}//读取输入文件input>>nn;for(i=0;i<nn;i++){for(j=0;j<nn;j++){input>>c[i][j];b[i][j]=c[i][j];}}input.close();//每行减去该行最小for(i=0;i<nn;i++){int min=b[i][0];for(j=1;j<nn;j++){if(b[i][j]<min)min=b[i][j];}for(j=0;j<nn;j++)b[i][j] -= min; }//每列减去该列最小for(j=0;j<nn;j++){int min=b[0][j];for(i=1;i<nn;i++){if(b[i][j]<min)min=b[i][j];}for(i=0;i<nn;i++)b[i][j] -= min; }//开始尝试进行试指派assign://初始化标记数组和计数数组for(i=0;i<nn;i++){rowZero[i]=colZero[i]=0;rowCheck[i]=colCheck[i]=0;for(j=0;j<nn;j++)quan[i][j]=cha[i][j]=0;}//计算每行每列0元素个数for(i=0;i<nn;i++)for(j=0;j<nn;j++)if(b[i][j]==0){rowZero[i]++;colZero[j]++;}bool flag;//直到尽可能多的0元素都被圈出和划掉为止do{flag=false;//寻找只有一个0元素的行,加圈划叉for(i=0;i<nn;i++){if(rowZero[i]==1)//该行只有一个0元素{//cout<<"rowZero found: "<<i<<endl;flag=true;//找到0元素,加圈划叉for(j=0;j<nn;j++){if(b[i][j]==0 && quan[i][j]==0 && cha[i][j]==0){quan[i][j]=1;rowZero[i]--;colZero[j]--;for(k=0;k<nn;k++){if(b[k][j]==0 && quan[k][j]==0 &&cha[k][j]==0){cha[k][j]=1;rowZero[k]--;colZero[j]--;}}break;}}//break;}}//寻找只有一个0元素的列,加圈划叉for(j=0;j<nn;j++){if(colZero[j]==1)//该列只有一个0元素{flag=true;//找到0元素,加圈划叉for(i=0;i<nn;i++){if(b[i][j]==0 && quan[i][j]==0 && cha[i][j]==0){quan[i][j]=1;rowZero[i]--;colZero[j]--;for(k=0;k<nn;k++){if(b[i][k]==0 && quan[i][k]==0 && cha[i][k]==0){cha[i][k]=1;rowZero[i]--;colZero[k]--;}}break;}}//break;}}} while (flag);//判断是否还有0元素未被标记int zeroNotMarked = 0;for(i=0;i<nn;i++)zeroNotMarked += rowZero[i];while(zeroNotMarked != 0){/*从剩有0元素最少的行(列)开始,比较这行各0元素所在列中0元素的数目,选择0元素少的那列的这个0元素加圈(表示选择性多的要“礼让”选择性少的)。