指派问题1

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

问题模型
A : a ij 表示第 i 个人做第
n
j 件事所用的时间 j 件事,只取
n
X : x ij 表示第 i 个人是否做第
0 ,1
min( 或 max ) z =
n
∑∑
i =1
j =1
a ij x(工时) ij
) ∑ x ij = 1 ( 每人做一件事 = jn 1 s .t . ∑ x ij = 1 ( 每事由一人做 ) i =1 1 x ij 只取 0 或者 ( i , j = 1 L n )
• [X,FVAL,EXITFLAG,OUTPUT,LAMBDA] = LINPROG(f,A,b,Aeq,beq,LB,UB) • min f‘*x such that • Aeq*x = beq • A*x <= b , x >= 0. • LB <= X <= UB • 用一个分支定界法的代码来说明一下 • 可以求全整型或混合的 • Y=min f*x subject to :G*x<=h Geq*x=heq
(V的列为特征向量) 求秩:rank(A) 迹(特征值之和)trace(A)
解多项式方程
3x −7x +5x +2x −18= 0
5 4 2
P=[3,-7,0,5,2,-18]; A=compan(p); X1=eig(A) X2=roots(p) %求零点,与上面的结果是一样的。
整数规划matlab指令
二、对给定矩阵找到最大数目的独立零元素组 1 ) 用红圈标出一些某行或某列仅有的零元素,再 用红圈标出一些某行或某列仅有的零元素, 通过行列交换把这些零换到左上角(后者非必须) 通过行列交换把这些零换到左上角(后者非必须)
0 0 0 0 0 3 0 11 8 0 7 1 7 7 3 2 3 2 1 →3 5 0 5 0 4 2 3 4 0 列 3 交 换 11 8 0 3 0 5 7 3 0 1 2 1 0 2 →3 7 0 4 0 0 4 0 0 2 行 3 交 换 11 8 0 3 0 4 0 0 4 0 0 2 7 3 0 1 2 1 0 2
aij自然是非负的,如果有这种情况:每件事都有 一个人来做 的时候所需的时间是0,且所有的事分配,可 以找到这样不冲 突的人,这样,总时间 就是0,自然就是最优的。
由此,每行每列减去最小数,总可以得到每行每列至少有一个0
第二个定理
• 覆盖0元的最小直线(行或列)数k,等于 位于不同行且不同列的0元的最大个数l。
• return;
end; if max(abs(x.*ID-round(x.*ID)))<0.00005 %得到最优解(如果没错的话),因为用 %linpro 的时候已经吧实数得到最优了,这里判断整数的就好了

4 7 C = 6 6 6
8 7 15 12 9 17 14 10 9 12 8 7 7 14 6 10 9 12 10 6
一、顺序对每行每列减去最小值产生零元素
0 0 0 0 0 4 3 11 8 0 2 10 7 3 0 3 6 2 1 →0 1 8 0 4 0 3 6 4 0 0 3 0 11 8 1 7 7 3 2 3 2 1 = C′ 0 5 0 4 2 3 4 0
第四章 4.3 指派问题(分配问题)
一. 什么是指派问题 二. 两个定理 三. 指派问题的求解
lp-norm support vector machine with CCCP
一 . 什么是指派问题
• • • • • 指派问题就是分配问题: 比如有n个人去做n件事,规定: 每件事只能有且仅有一个人来做 事与人决定时间 求最高的效率的情况
• 证明:我借的那本书上,是给出了证明,不过我读得好像我的想法不太符合它的思想《运筹学。中 国人民出版社》。所以就不用了。另一种方法就是用数学归纳法,不过一层又一层,挺麻烦的。再 有就是用下面要说的构造直线的过程说明。还有就是利用对换了行或列号是不会改变k,l的值,然 后就变成一个左上角一个矩形中每行每列都有0元,所以最大不同行列的0元个数l和覆盖0元的最小 直线数k都等于这个矩形的行列最小的数目。
• Function [x,y]=IntLp(f,G,h,Geq,heq,lb,ub,x,id,options) • %eq表示等式,否则为小于等于 • %为了解决混合的问题,必须用id指明x中那 个是整型(1),哪些是实型(0) • global upper opt c x0 A Aeq beq ID options; • %这一句不用管,我也看不懂,可能引入变量 • %为了不改原变量
end if nargin<4,
• Geq=[];
end upper=inf;c=f;x0=x;A=G;b=h;Aeq=Geq;beq=heq;ID=id; %变量处理,不用管
• ftemp=ILP(lb(:),ub(:));
• x=opt;y=upper;
• • • • • • • •
%下面是子函数 function ftemp=ILP(vlb,vub) global upper opt c x0 A b Aeq beq ID options; [x,ftemp,how]=linprog(c,A,b,Aeq,beq,vlb,vub,x0,options); if how <=0 return; end;%标志<=0 ,则不收敛或达到迭代次数,结束 则不收敛或达到迭代次数, if ftemp-upper>0.00005 %in order to avoid error %得到的解比想象的大

If nargin<10,
• • • options=optimset({}); options.Display='off'; options.LargeScale='off'; end id=ones(size(f));
• • • • • • • • • • • • •
if nargin<9,
指派问题的解法
先得出0元: 每行每列减去各自最小数 (1). 将系数矩阵C={Cij}的各行减去本行中的最小元素形成矩阵Cr (2). 将系数矩阵Cr的各列减去本列中的最小元素形成矩阵Cc
• 第一步:试指派
Cc ( ) , , 在Cc 中如果有某行(或列)上只有一个没有标记的零元素, 在这零元素上做圈标记, 同 时把零元素所在的列(或行)上的零元素做删除标记. 如此反复进行, 直到所有的零元素 都被做上标记或划去为止. 如果在以上过程中的所有行和列中没有标记的零元素都不止一个时,可选0元最少的行 (列)开始,且所在列(行)上的0元最少的一个0元做圈标记, 同时对同行同列中的 其他零元素做删除标记. •如果做上圈标记的零元素个数达到 n 个, 则每行每列有且仅有一个画圈的零元素 (显然的). 令(分配)矩阵中的加圈的零元素换为一,其余的元素换为零, 就是指派 问题的最优解矩阵. 如不然, 转下步
第二步:做最少覆盖0元的直线
(1) 对无圈的行打勾 (下面横线无圈)直线就覆盖了所有加圈 的0元所在的行) (2) 在已打勾的行中对有删除标记所在的列打勾;(未被行线覆盖 的作竖线) (3) 在已打勾的列中对有圈标记所在的行打勾;(用列线覆盖过的 就吧要行线了)
(4) 重复 (2), (3), 直到无勾可打为止. (5) 对没有打勾的行画一横线, 对打勾的列画 一竖线. • 这样剩下没有画线的元素中没有零元素. • • •
0 5 3 7 3
11 8 0 3 0 4 0 0 4 0 0 2 7 3 0 0 2 1 0 2

0 5 3 7 3
11 8 0 3 0 4 0 0 4 0 0 2 7 3 0 0 2 1 0 2
2 ) 在没有红圈的右下角如果有 0 5 零,一定是新的独立零元素 3 7 3 3 ) 用直线覆盖红圈所在行
0 5 3 7 3
11 8 0 3 0 4 0 0 4 0 0 2 7 3 0 1 2 1 0 2
11 8 0 3 0 4 0 0 4 0 0 2 7 3 0 1 2 1 0 2
第三步:加0元
• 求出其中的最小元素. 各行都减去这个最小 元素(同一个数), 这时在已被划横线的元 素中的零元素变成负元素, 在它们所在的列 中加上这个最小元素. 还不够所需0元,转 步骤2.
• 在求最优值时,还要回到原来的矩阵去, 除非你每次都记录下了所做的加减的总数。 • 第三步中有点麻烦,可以改为:划去后的 矩阵中全部减去最小数,这样就不麻烦了, 不过就必须回原效率矩阵,对于全矩阵来 说加减已经乱了。为什么可以这么做呢? 因为剩下的部分的最优已经无关于划线部 分了,(自己的想法而已,可不理会)
二. 定理
1.从效率矩阵(aij)×n每一行(或列)加一个常数ui (v j ), n 所得的新的矩阵(bij)×n的最优指派与原矩阵的最优指 n 派相同。 证明:略(只要证∑∑ bij xij =∑∑ aij xij + ∑ ui + ∑ v j)
因为:比如第一列加一个u,就是说每个人做第一件事的时间都增加u, 而又因为有且仅有一个人来做这件事,不管谁来做,总时间都要增加u,所以 保持原来的分配不变,总效率增加了。 对于行也是一样的,改为有一个人无论做什么事都比原来多u的时间……
wk.baidu.com
x a a a a x a a D= a a x a a a a x
只要输入:
syms x a; %申明x,a为代量 A=[x,a,a,a; a,x,a,a; a,a,x,a; a,a,ax] ; det(A)
Ans= x^4-6*x^2+8*x*a^3-3*a^4
常用matlab矩阵运算
• • • • • 加减乘除、数乘等 求逆 inv(A) 行列式值 det(A) 最简形 R=rref(A) 特征值,特征向量:[V,D]=eig(A)

end if nargin<8,
• x=[];
end if nargin<7 |isempty(ub),
• ub=inf*ones(size(f));
end if nargin<6 |isempty(lb),
• lb=zeros(size(f));
end if nargin<5,
• heq=[];
情况一
情况二
两 种 情 况 的 处 理 方 法
0 5 3 7 3
11 8 0 3 0 4 0 0 4 0 0 2 7 3 0 1 2 1 0 2

0 5 3 7 3
11 8 0 3 0 4 0 0 4 0 0 2 7 3 0 1 2 1 0 2
两个简便的方法
• 1.先列后行 • 2.max-min(不是很严谨) • 只是对匈牙利方法不能直接给出解答的带 来方便。 • (1)行最小 • (2)最小元中的最大先指派,划去行列 • (3)重复
• 关于指派问题还有很多内容,限于水平、 时间等就不多掰了
Matlab 线性规划的解法
• 在用矩阵求解方程组时,不一定要确切的数值代入, Matlab中可以用字母来表示。 • 比如:计算行列式:
4 ) 在直线未覆盖处找零,如果没有零停止,否则 在直线未覆盖处找零,如果没有零停止, 会出现以下两种情况, 会出现以下两种情况,其中黑实圈圈住的是新零
0 5 3 7 3 11 8 0 3 0 4 0 0 4 0 0 2 7 3 0 1 2 1 0 2 0 5 3 7 3 11 8 0 3 0 4 0 0 4 0 0 2 7 3 0 0 2 1 0 2
相关文档
最新文档