%本程序输入为每个星期各种病的挂号的人数
%本程序输出为每个星期安排住院的方案
clear;
a=input('输入星期i第k种病的人数矩阵(7*5):');%代表星期i第k种病的人数
[m,n]=size(a);%size函数的目的是为了获得矩阵a的行数和列数
k=input('输入统计空床(7*1):');%k代表每周的空床数
b=zeros(7,5);%用来计数,储存数据,zeros的目的是返回一个7*5的零矩阵
for i=1:m % i代表的是星期,m是矩阵a的行向量,也就是7,那么这一句的意思,就是遍历星期一到星期日
%下面有switch和case,应该就是针对每天接纳的病人做的优先级权重
switch i
case {1}
if k(1)>a(1,5)%这句的意思是 将周一的空床数和与周一第五种病的人数比较
%1白内障(单);2白内障(双);3青光眼;4视网膜疾病;5急症,在符号表中,我们可以知道,五代表的是
%绝症
b(1,5)=a(1,5) ;%在周一有空床位的情况下,疾症患者当天就要入住,周二就展开手术
b(1,1)=k(1)-a(1,5);%周一的白内障(单)在满足了周一的急症患者后,应尽量满足白内 % 障 (单)
else
b(1,5)=k(1);%如果周一的床位不够,那就全力满足急救患者
end
case {2}
if k(2)>a(2,5)
b(2,5)=a(2,5);%周二的急诊人数
if b(1,1)>=12 %如果满足白单大于等于12
b(2,3)=k(2)-b(2,5);%全赋值给青光眼
elseif (k(2)-b(2,5))>(12-b(1,1));%这种情况对应的是周一的白内障人数没有达到12个, %这样的话,周二就要先满足白内障的人数,再满足青光眼
b(2,1)=12-b(1,1);
b(2,3)= (k(2)-b(2,5))-b(2,1) ;%全赋值给
else b(2,3)=k(2)-b(2,5);%这句的意思是排除急症病人和白内障单病人的影响,将剩余
%的床位全部分配给青光眼病人
end
else b(2,5)=k(2);
end
case {3}
if k(3)>a(3,5)
b(3,5) = a(3,5);
if sum(a(1:3,3))>=12
b(3,4)=k(3)-b(3,5);
elseif (k(3)-b(3,5)) >= (11-sum(b(1:3,3)))
b(3,3)=(11-sum(b(1:3,3)));
b(3,4)= (k(3)-b(3,5))-b(3,3);
else
b(3,4)=k(3)-b(3,5);
end
else b(3,5)=k(3);
end
case {4}
if k(4)>a(4,5)
b(4,5) = a(4,5);
b(4,4) = k(4)-b(4,5);
else b(4,5)=k(4);
end
case {5}
if k(5)>a(5,5)
b(5,5) = a(5,5);
if sum(b(1:4,4))>=21
b(5,3)=k(5)-b(5,5);
elseif (k(5)-b(5,5))>=(21-sum(b(1:4,4)))
b(5,4)=21-sum(b(1:4,4));
b(5,3)=(k(5)-b(5,5))-(21-sum(b(1:4,4)));
else
b(5,4)=k(5)-b(5,5);
end
else b(5,5)=k(5);
end
case {6}
if k(6)>a(6,5)
b(6,5) = a(6,5);
b(6,2) = k(6)-b(6,5);
else b(6,5)=k(6);
end
case {7}
if k(7)>a(7,5)
b(7,5) = a(7,5);
if sum(b(1:6,2))<=16
if (k(7)-b(7,5))>(16-sum(b(1:6,2)))
b(7,2)=16-sum(b(1:6,2));
else
b(7,2)=k(7)-b(7,5)
end
if (k(7)-b(7,5)-b(7,2))>(21-sum(b(1:6,4)))
b(7,4)=(21-sum(b(1:6,4)));
else b(7,4)=k(7)-b(7,5)-b(7,2);
end
else
if (k(7)-b(7,5))>(21-sum(b(1:6,4)))
b(7,4)=(21-sum(b(1:6,4)));
else b(7,4)=k(7)-b(7,5);
end
b(7,2)=k(7)-b(7,5)-b(7,4);
end
else b(7,5)=k(7);
end
otherwise
disp('False!!')
end
end