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

来源:互联网 发布:数组和集合的区别 编辑:程序博客网 时间:2024/04/29 10:28
%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


原创粉丝点击