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

%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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值