指派问题的算法Word文档下载推荐.docx
- 文档编号:19163777
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:22
- 大小:106.02KB
指派问题的算法Word文档下载推荐.docx
《指派问题的算法Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《指派问题的算法Word文档下载推荐.docx(22页珍藏版)》请在冰豆网上搜索。
为系数矩阵(CoefficientMatrix),也称为效益矩阵或价值矩阵。
矩阵的元素
(i,j=1,2,…n)表示分配第i个人去完成第j项任务时的效益。
一般地,以
表示给定的资源分配用于给定活动时的有关效益(时间,费用,价值等),且
3.2问题的数学模型一般形式
在模型中,约束条件式
(2)表示每个人只能做一件事,约束条件式(3)表示每件事只能由一个人去做。
对于问题的每个可行解,可用解矩阵来表示:
当然,作为可行解,矩阵的每列元素中都有且只有一个1,以满足约束条件式(3)。
每行元素中也有且只有一个1,以满足约束条件
(2)。
指派问题n!
个可行解。
3.3目标函数极大化的指派问题
求解
时,我们将构造一个新的矩阵
,使
,其中
是一个足够大的常数。
一般取
中最大的元素作为
,求解
,所得的解
就是原问题的解。
事实上,由
可的此结论。
4.指派问题实现
4.1匈牙利算法
4.1.1匈牙利算法的理论基础
定理1如果从分配问题的效率矩阵[
]的每一行元素中分别减去(或加上)一个常数
,从每一列中分别减去(或加上)一个常数
,得到一个新的效率矩阵[
],则以[
]为效率矩阵的分配问题与以[
]为效率矩阵的分配问题具有相同的最优解。
定理2若矩阵A的元素可以分为‘0’与‘非0’的两部分,则覆盖‘0’元素最少直线数等于位于不同行不同列的‘0’元素的最大个数。
4.1.2匈牙利算法的实现步骤
第一步:
找出矩阵每行的最小元素,分别从每行中减去这个最小元素;
第二步:
再找去矩阵每列的最小元素,分别从各列减去这个最小元素;
第三步:
经过这两步变换后,矩阵的每行每列至少都有了一个零元素,接着根据以下准则进行试指派,找出覆盖上面矩阵中所有零元素至少需要多少条直线;
(1)从第一行开始,若该行只有一个零元素打上()号。
对打()号零元素所在列划一条直线。
若该行没有零元素或有两个以上零元素(已划去的不计在内),则转下一行,一直到最后一行为止;
(2)从第一列开始,若该列只有一个零元素就对这个零元素打上()号(同样不考虑已划去的零元素),对打()号零元素所在行划一条直线。
若该列没有零元素或还有两个以上零元素,则转下一列,并进行到最后一列;
(3)重复
(1)、
(2)两个步骤,可能出现三种情况:
1矩阵每行都有一个打()号零元素,很显然,按照上述步骤得到的打()的零元素都位于不同行不同列,因此就找到了问题的答案;
2有多于两行或两列存在两个以上零元素,即出现了零元素的闭回路,这个时候可顺着闭回路的走向,对每个间隔的零元素打上()号,然后对所有打()号零元素或所有列或所在行划一条直线。
3矩阵中所有零元素或打上()号,或被划去,但打()号零元素个数小于m。
第四步:
为了设法使每行都有一个打()的零元素,就要继续对矩阵进行变换;
(1)从矩阵未被直线覆盖的元素找出最小元素k;
(2)对矩阵的每行,当该行有直线覆盖时,令
=0,无直线覆盖的,令
=k;
(3)对矩阵的每列,当该列有直线覆盖时,令
=-k,无直线覆盖的,令
=0;
(4)得列一个变换后的矩阵,其中每个元素
=
-
。
第五步:
回到第三步,反复进行,一直到矩阵中每一行都有一个打()的零元素为止,即找到最优分配方案为止。
4.1.3匈牙利算法实现指派问题
为了便于对模型进行求解与分析,假设有4件事4个人去做,各变量对应的数据假设如表1。
表1每个人完成各项任务需要的时间
人
任务
A
B
C
D
甲
25
29
31
42
乙
39
38
26
20
丙
34
27
28
40
丁
24
36
23
用匈牙利算法求解过程如下:
Min
→
→
→
-1-1-1-4-4
→
-1-1
所以最优解为x11,x23,x32,x44,即甲负责任务A,乙负责任务C,丙负责任务B,丁负责任务D,可以使总花费时间最少。
代入求出目标函数值
Z=25+26+27+23=101。
4.20-1整数规划
0-1规划(0-1Programming)一种特殊形式的整数规划。
这种规划的决策变量仅取值0或1,故称为0-1变量或二进制变量,因为一个非负整数都可以用二进制记数法用若干个0-1变量表示。
0-1变量可以数量化地描述诸如开与关、取与弃、有与无等现象所反映的离散变量间的逻辑关系、顺序关系以及互斥的约束条件,因此0-1规划非常适合描述和解决如线路设计、工厂选址、生产计划安排、旅行购物、背包问题、人员安排、代码选取、可靠性等人们所关心的多种问题。
实际上,凡是有界变量的整数规划都可以转化为0-1规划来处理。
当然也包括运筹学中的指派问题。
4.2.1模型假设
表2变量假设
i
第i个人
j
第j项任务
第i个人分配第j项任务
=1
第i个人被分配去做第j项任务
=0
第i个人不被分配到第j项任务
4.2.2模型建立
根据前面的假设,因此,每个人只完成一项任务的约束条件为:
每项任务必有一个人负责的约束条件为:
由此,建立的数学模型为:
s.t.
或1,i,j=1,2,3,4
4.2.3模型求解
用matlab求解
根据上面建立的模型,代入相应的数据,利用matlab软件编程求解,具体程序如下:
function[y,fval]=minzp(C)%y为最佳匹配矩阵,fval为目标函数值,C为目标函数系数矩阵
C=C'
;
f=C(:
);
[m,n]=size(C);
Aeq=zeros(2*n,n*n);
%生成2*n行n*n列的等式约束0系数矩阵
fori=1:
n
Aeq(1:
n,1+(i-1)*n:
i*n)=eye(n,n);
%eye表示生成n阶单位阵
end
Aeq(n+i,1+(i-1)*n:
i*n)=ones(1,n);
%生成1行n列元素为1的向量
beq=ones(2*n,1);
%生成2*n行1列元素为1的等式约束右端项
lb=zeros(n*n,1);
%生成n*n行1列元素为0的不等式约束左端项
ub=ones(n*n,1);
%生成n*n行1列元素为1的不等式约束右端项
x=linprog(f,[],[],Aeq,beq,lb,ub);
%求目标函数达到极小值的x值
y=reshape(x,n,n);
%将上式求出的x值组成的向量变成n阶矩阵
y=y'
y=round(y);
%对y中的元素取整,生成匹配矩阵
sol=zeros(n,n);
forj=1:
ify(i,j)==1
sol(i,j)=C(j,i);
fval=sum(sol(:
));
%求出极小值的目标函数值
其中,
>
C=[25293142
39382620
34272840
24423623];
[y,fval]=minzp(C)
输出结果为:
Optimizationterminated.
y=
1000
0010
0100
0001
fval=101
用lingo软件求解
根据上面建立的模型,代入相应的数据,利用lingo软件编程求解,具体程序如下:
model:
sets:
ren/1..4/;
renwu/1..4/;
Assign(ren,renwu):
C,X;
!
X为最佳匹配矩阵,C为目标函数系数
endsets
data:
C=
25293142
24423623;
enddata
min=@sum(Assign:
C*X);
!
求目标函数极小值
@FOR(ren(i):
@sum(renwu(j):
X(i,j))=1);
行和为1约束
@FOR(renwu(j):
@sum(ren(i):
列和为1约束
@for(Assign:
@bin(x));
0-1约束
End
运行结果为:
Globaloptimalsolutionfound.
Objectivevalue:
101.0000
Extendedsolversteps:
0
Totalsolveriterations:
VariableValueReducedCost
C(1,1)25.000000.000000
C(1,2)29.000000.000000
C(1,3)31.000000.000000
C(1,4)42.000000.000000
C(2,1)39.000000.000000
C(2,2)38.000000.000000
C(2,3)26.000000.000000
C(2,4)20.000000.000000
C(3,1)34.000000.000000
C(3,2)27.000000.000000
C(3,3)28.000000.000000
C(3,4)40.000000.000000
C(4,1)24.000000.000000
C(4,2)42.000000.000000
C(4,3)36.000000.000000
C(4,4)23.000000.000000
X(1,1)0.00000025.00000
X(1,2)1.00000029.00000
X(1,3)0.00000031.00000
X(1,4)0.00000042.00000
X(2,1)0.00000039.00000
X(2,2)0.00000038.00000
X(2,3)0.00000026.00000
X(2,4)1.00000020.00000
X(3,1)0.00000034.00000
X(3,2)0.00000027.00000
X(3,3)1.00000028.00000
X(3,4)0.00000040.00000
X(4,1)1.00000024.00000
X(4,2)0.00000042.00000
X(4,3)0.00000036.00000
X(4,4)0.00000023.00000
RowSlackorSurplusDualPrice
1101.0000-1.000000
20.0000000.000000
30.0000000.000000
40.0000000.000000
50.0000000.000000
60.0000000.000000
70.0000000.000000
80.0000000.000000
90.0000000.000000
由以上两种方法求解的结果知:
甲负责任务A,乙负责任务C,丙负责任务B,丁负责任务D,可以使总花费时间最少。
代入求出目标函数值
5.问题的深入(0-1整数规划)
将约束条件由整数数据变为小数数据且目标函数由最小值化为最大值问题的求解。
假设有4件工作分派给4个人来做,每项工作只能由一人来做,每个人只能做一项工作。
下表为各人对各项工作所具有的工作效率。
表3每个人完成各项任务需要的时间
工人
0.6
0.2
0.3
0.1
0.7
0.4
0.8
1.0
0.5
5.1模型建立
设
表示第i个人被安排做第j项工作,则当第i个人被安排去做第j项工作时
=1;
当第i个人不被安排到第j项工作时
=0。
因此,每个人只完成一项工作的约束条件为
每项工作必有一个人负责的约束条件为
数学模型为
5.2模型求解
5.2.1用matlab求解问题
根据上面建立的模型,利用matlab进行求解,具体程序如下:
function[y,fval]=maxzp(M,C)%M为C中元素的最大值
C=M+zeros(n)-C;
%将求极小值的目标函数系数矩阵转换成求极大值的系
数矩阵
M=1.0;
fval=M*n-fval;
%求出极大值的目标函数值
C=[0.60.20.30.1
0.70.40.30.2
0.81.00.70.3
0.70.70.50.4];
[y,fval]=maxzp(M,C)
fval=2.4000
5.2.2用lingo求解问题
根据上面建立的模型,利用lingo进行求解,具体程序如下:
gongzuo/1..4/;
Assign(ren,gongzuo):
0.60.20.30.1
0.70.70.50.4;
max=@sum(Assign:
求目标函数极大值
@sum(gongzuo(j):
@FOR(gongzuo(j):
Objectivevalue:
2.400000
Extendedsolversteps:
Totalsolveriterations:
VariableValueReducedCost
C(1,1)0.60000000.000000
C(1,2)0.20000000.000000
C(1,3)0.30000000.000000
C(1,4)0.10000000.000000
C(2,1)0.70000000.000000
C(2,2)0.40000000.000000
C(2,3)0.30000000.000000
C(2,4)0.20000000.000000
C(3,1)0.80000000.000000
C(3,2)1.0000000.000000
C(3,3)0.70000000.000000
C(3,4)0.30000000.000000
C(4,1)0.70000000.000000
C(4,2)0.70000000.000000
C(4,3)0.50000000.000000
C(4,4)0.40000000.000000
X(1,1)0.000000-0.6000000
X(1,2)0.000000-0.2000000
X(1,3)1.000000-0.3000000
X(1,4)0.000000-0.1000000
X(2,1)1.000000-0.7000000
X(2,2)0.000000-0.4000000
X(2,3)0.000000-0.3000000
X(2,4)0.000000-0.2000000
X(3,1)0.000000-0.8000000
X(3,2)1.000000-1.000000
X(3,3)0.000000-0.7000000
X(3,4)0.000000-0.3000000
X(4,1)0.000000-0.7000000
X(4,2)0.000000-0.7000000
X(4,3)0.000000-0.5000000
X(4,4)1.000000-0.4000000
12.4000001.000000
由以上结果知:
甲负责工作C,乙负责工作A,丙负责工作B,丁负责工作D,可使总效率最大。
6.结论
6.1总结概论
用0-1整数规划可以给出运筹学中指派问题的最优解,对于求目标函数极大值与极小值的程序有略微的区别,原程序为求目标函数的极小值,而当求极大值时则可改变一下程序。
对于lingo程序只需将min改成max;
而对于matlab程序并不是直接给目标函数的系数矩阵加负号,而是要做一些简单的矩阵变换。
无论是matlab还是lingo,其求指派问题的最优解的方法都是简单易行的,方便求解,可以说是我们程序的一个优点。
7.参考文献
[1]胡运权.运筹学基础及应用[M].北京:
高等教育出版社,2009.107–132,167–169.
[2]薛毅、耿美英.运筹学与实验[M].北京:
北京电子工业出版社,2008.
[3]袁新生、邵大宏、郁时炼.lingo和excel在数学建模中的应用[M].北京:
科学出版社,2007.
[4]楼顺天、姚若玉、沈俊霞.Matlab7.x程序设计语言[M].西安:
西安电子科技大学,2007.
[5]彭静.分配问题中匈牙利算法分析[J/OL].online
read.asp?
ID=34322021&
SUID=EGBNBFDHDNC
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 指派 问题 算法