您的位置:首页 > 编程语言 > MATLAB

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

2011-09-01 17:18 459 查看
%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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  excel matlab function n2 c
相关文章推荐