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

【数学建模集训系列】眼科病床安排问题——优先级调度

2011-09-01 17:14 573 查看
%function sec_problem
%*********************************************************
% ※第二问代码:高优先级优先调度(HPF)算法
% ※时间:2011/8/31
% ※算法实现步骤:
%   1.判断病床数量(根据第一组数据恢复天数的分布)
%   2.计算优先级
%   3.安排病人,分配手术时间,计算出院时间,当天排满为止
%   4.重复1-3直到第三组病人安排完
% ※说明:
%   疾病类型:白内障(单眼),白内障(双眼),青光眼,视网膜疾病,外伤
%           外伤:急症,立即住院,第二天手术
%           白内障:周一、周三手术,术前准备1-2天
%           其他:住院后2-3天接受手术
% ※优先级函数:Q=病类优先因子*已排队天数*每日安排优先因子
%   △病类的优先因子:急症为inf,其它病类的优先因子为1
%   △每日安排优先因子:(按时间,一星期为周期)
%     白内障单眼:周六,周日,周一,周二的优先因子为2,在其他日期均定为1
%     白内障双眼:周六,周日的优先因子为2,其他日期定为1
%     其他病种:考虑公平性,定为1.5
%*********************************************************
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('筛选_数据', '仿真入院', 'M2:N28');%前一组出院时间
in_order_type_time=xlsread('筛选_数据', '仿真入院', '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)
prio(j,1)= prio_mat(to_week,temp_in(j,2));
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,'仿真入院',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,'仿真入院',write_str);    %入院
disp('安排完成')
toc
write_mat=[ruyuan_mat shoushu1_mat shoushu2_mat chuyuan_mat]
write_str='D2:G103';
xlswrite('筛选_数据',write_mat,'仿真入院',write_str);
out1_time_num
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  excel matlab 算法 function n2 c
相关文章推荐