【数学建模集训系列】眼科病床安排问题——FCFS

%function sec_problem
%*********************************************************
% ※第二问代码:FCFS
% ※时间:2011/8/31
%*********************************************************
clear,clc
%**************根据术后恢复满足的正态分布随机产生术后恢复时间*****************
miu=[2.90 4.96 10.16 8.07 6.03];%各个正态分布均值
sigm=[0.69 0.59 1.56 2.36 1.82];%方差
num_type=[7 22 9 33 8];%各类病人数
for i=1:1:5
shuhou{i,1}=(fix(normrnd(miu(i),sigm(i),num_type(i),1)))';%产生随机数,5*1单元阵列
shuhou{i,1};
end
%**************计算可以入院病人的优先级,安排入院****************************
cha=693960;%matlab和excel日期之差
out1_time_num = xlsread('筛选_数据', 'FCFS', 'M2:N28');%前一组出院时间
in_order_type_time=xlsread('筛选_数据', 'FCFS', 'A2:C103');%门诊时间
%------------------计算优先级矩阵------------------------------
% 说明:值越小表示优先级越高,第二项为手术
% 白内障(单眼) 白内障(双眼) 青光眼 视网膜疾病 外伤
% 周日 3,1 2,1 4,2 4,2 1,1
% 周一 2,2 4,2 3,3 3,3 1,1
% 周二 2,1 4,1 3,2 3,2 1,1
% 周三 4,5 3,5 2,2 2,2 1,1
% 周四 4,4 3,4 2,2 2,2 1,1
% 周五 4,3 3,3 2,2 2,2 1,1
% 周六 3,2 2,2 4,3 4,3 1,1
%-------------------------------------------------------------
prio_mat=[3 2 4 4 1;2 4 3 3 1;2 4 3 3 1;4 3 2 2 1;4 3 2 2 1;4 3 2 2 1;3 2 4 4 1];
ssjg= [1 1 2 2 1;2 2 3 3 1;1 1 2 2 1;5 5 2 2 1;4 4 2 2 1;3 3 2 2 1;2 2 3 3 1];
flag_visited=zeros(102,1);
in_order_type_time_flag=[in_order_type_time flag_visited];
ruyuan_mat=nan(102,1);
shoushu1_mat=nan(102,1);
shoushu2_mat=nan(102,1);
chuyuan_mat=nan(102,1);
tic
for i=1:size(out1_time_num,1)
% for i=1:3
to_day=out1_time_num(i,1);%当天excel时间
m=find(in_order_type_time_flag(:,3)<to_day&in_order_type_time_flag(:,4)==0);
if isempty(m)
continue;
else
temp_in=in_order_type_time(m,:);%当天有机会入院的病人
%判断当天星期几y=weekday(x),返回值y:周日-周六分别为1-7
to_week=weekday(to_day+cha);
%附加优先级:序号+类型+门诊时间+优先级
for j=1:size(temp_in,1)
if temp_in(j,2)==5
prio(j,1)=0;
else
prio(j,1)= temp_in(j,1);
end
prio(j+1:end)=[];
end
temp_in=[temp_in prio];
%按优先级选取与病床相同数量的病人:按优先级排序,优先级相同的按门诊顺序时间排
temp_in_sort=sortrows(temp_in,4);
if size(out1_time_num,1)<=size(temp_in_sort,1)
num_2=out1_time_num(i,2);
else
num_2=size(temp_in_sort,1);
end
temp_write=temp_in_sort(1:num_2,:);
%计算excel表格写入范围,逐个入院
for j=1:num_2%out1_time_num(i,2)
ruyuan_mat(temp_write(j,1))=to_day;
%write_str=['D' num2str(temp_write(j,1)+1)];
%xlswrite('筛选_数据',to_day,'FCFS',write_str); %入院
%------------------------------------------------
%安排手术时间
shoushu1_mat(temp_write(j,1))=to_day+ssjg(to_week,temp_write(j,2));
if temp_write(j,2)==2
shoushu2_mat(temp_write(j,1))=to_day+ssjg(to_week,temp_write(j,2))+2;
end
%随机产生出院时间
chuyuan_mat(temp_write(j,1))=to_day+ssjg(to_week,temp_write(j,2))+...
fix(normrnd(miu(temp_write(j,2)),sigm(temp_write(j,2)),1));
%更新病床数
index=find(out1_time_num(:,1)==chuyuan_mat(temp_write(j,1)));
out1_time_num(index,2)=out1_time_num(index,2)+1;
%------------------------------------------------
end
%标记已经入院的数据
in_order_type_time_flag(temp_write(:,1),:)=1;
end
end
%write_str='D2:D103';
%xlswrite('筛选_数据',ruyuan_mat,'FCFS',write_str); %入院
disp('安排完成')
toc
write_mat=[ruyuan_mat shoushu1_mat shoushu2_mat chuyuan_mat]
write_str='D2:G103';
xlswrite('筛选_数据',write_mat,'FCFS',write_str);
out1_time_num


你可能感兴趣的:(问题)