资源简介
若能在系数矩阵(bij)中找出n个独立的0元素;则令解矩阵(xij)中对应这n个独立的0元素取值为1,其它元素取值为0。将其代入目标函数中得到zk=0,它一定是最小。这就是以(bij)为系数矩阵的指派问题的最优解。也就得到了问题的最优解。
代码片段和文件信息
function [zans]=success(marix)
count=0;
%//////////////////////////////////////////////////
%输入效率矩阵 marix 为方阵;
%若效率矩阵中有 M则用一充分大的数代替;
%输出z为最优解,ans为 最优分配矩阵;
%//////////////////////////////////////////////////
[hl]=size(marix);
aamarix=marix;
if h>l
marix=zeros(h);
for i=1:h
for j=1:l
marix(ij)=aamarix(ij);
end
end
elseif l>h
marix=zeros(l);
for i=1:h
for j=1:l
marix(ij)=aamarix(ij);
end
end
end
a=marix;
b=a;
%确定矩阵维数
s=length(a);
%确定矩阵行最小值,进行行减
ml=min(a‘);
for i=1:s
a(i:)=a(i:)-ml(i);
end
%确定矩阵列最小值,进行列减
mr=min(a);
for j=1:s
a(:j)=a(:j)-mr(j);
end
% start working
num=0;
me=a;
while(num~=s) %终止条件是“(0)”的个数与矩阵的维数相同
%index用以标记矩阵中的零元素,若a(ij)=0,则index(ij)=1否则index(ij)=0
index=ones(s);
% sum(sum(index))
% sum(sum(a))
me=a;
% index=a&index;
index=me&index;
% sum( sum(index))
index=~index;
% sum(sum(index))
%flag用以标记划线位,flag=0 表示未被划线,
%flag=1 表示有划线过,flag=2 表示为两直线交点
%ans用以记录 a 中“(0)”的位置
%循环后重新初始化flagans
flag = zeros(s);
ans0 = zeros(s);
%一次循环划线全过程,终止条件是所有的零元素均被直线覆盖,
%即在flag>0位index=0
while(sum(sum(index)))
%按行找出“(0)”所在位置,并对“(0)”所在列划线,
%即设置flag同时修改index将结果填入ans
k =0;
p = 0;
for i=1:s
t=0;
l=0;
for j=1:s
if(flag(ij)==0&&index(ij)==1)
l=l+1;
t=j;
end
end
if(l==1)
k = 1;
flag(:t)=flag(:t)+1;
index(:t)=0;
ans0(it)=1;
else
k=0;
end
end
%按列找出“(0)”所在位置,并对“(0)”所在行划线,
%即设置flag同时修改index将结果填入ans
for j=1:s
t=0;
r=0;
for i=1:s
if(flag(ij)==0&&index(ij)==1)
r=r+1;
t=i;
end
end
if(r==1)
p = 1;
flag(t:)=flag(t:)+1;
index(t:)=0;
ans0(tj)=1;
else
p=0;
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if (0 ==p && k ==0) %44
sto1 = s+1;
pos = 1;
for numb = 1:s;%55
sto =0;
评论
共有 条评论