1、1储药槽的设计一、 摘 要通过分析储药柜的设计和使用要求,本文对储药柜的结构以及储药槽的规格进行了设计,主要解决了以下几个问题:1.为避免推送药盒时出现并排重叠、侧翻和水平旋转的情况,分析出储药槽的宽度必须小于其中最小药盒宽度的 2 倍,也必须小于其中药盒的最小长宽对角线长度和最小高宽对角线长度;2.在考虑应留间隙的前提下,利用 matlab 程序逐步推导,设计出竖向隔板间距类型(即储药槽宽度类型)最少的方案:5 种类型分别为19mm,31mm,39mm,50mm,60mm;3.在类型最少方案的基础上,采用逐步分裂的迭代算法,将可获得大幅宽度冗余降低率的竖向隔板间距类型进行拆分,以增加间距类型
2、并减少总宽度冗余,计算出不同间距类型数量下的总宽度冗余值,并给出合理的竖向隔板间距类型数量为 12 种,其对应的宽度分别为19,22,24,25,28,31,35,39,45,50,55,60(单位 mm) 。此外,也给出了每种类型对应的药品编号;4.进一步考虑平面冗余,采用逐步分裂的迭代算法,将可获得大幅平面冗余降低率的横向隔板间距类型进行拆分,以增加间距类型并减少总平面冗余,计算出合理的横向隔板间距类型数量为 13 种,其对应的宽度分别为42,48,53,63,68,72,76,80,84,88,96,104,129(单位 mm) ;5.根据药品的需求量计算出每种药品所需的储药槽个数,并利
3、用 matlab 程序实现穷举,给出储药槽在储药柜中的摆放方案,计算出最少需要的储药柜数量为 2 个。此外,本文方法还能给出具体的摆放情况,即输出每个储药柜中每一排药品的编号及其储药槽数量。关键词:储药柜,宽度冗余,平面冗余,matlab2二、问题重述目前,自动发药系统正在我国医院推广使用,它主要用来解决现在西药房管理混乱问题,例如药房日处理处方量大,药师工作时间长、取药易出错等。其中,储药柜的作用十分重要,它必须将药品集中摆放,能顺利推送,便于取药和放药。同时,储药柜的体积和数量还不能过多,影响系统的运行和购置成本。基于上述要求,储药柜中的储药槽必须精心设计和使用:为保证药品分拣的准确率,防
4、止发药错误,一个储药槽内只能摆放同一种药品;为保证药品在储药槽内顺利出入,要求药盒与两侧竖向隔板之间、与上下两层横向隔板之间应留 2mm 的间隙;药盒在储药槽内推送过程中不会出现并排重叠、侧翻或水平旋转。为了设计出合理的储药柜,必须解决以下几个问题:1. 在忽略储药槽横向和竖向隔板厚度的前提下,根据所给的药盒规格,设计出竖向隔板间距类型最少的储药柜方案,给出相应类型的数量和每种类型所对应的药盒规格。2. 为有效地减少宽度冗余,需适当增加竖向隔板间距类型的数量,但这也会增加储药柜的加工成本,降低储药槽的适应能力。因此,需要设计出合理的竖向隔板间距类型的数量,使总宽度冗余尽可能小,同时类型数量也尽
5、可能少。3. 进一步考虑平面冗余的计算,根据前述问题的结果,确定合理的储药柜横向隔板间距的类型数量,使得储药柜的总平面冗余量尽可能地小,且横向隔板间距的类型数量也尽可能地少。4. 根据每一种药品编号对应的最大日需求量,计算出每一种药品所需要的储药槽个数,并将所有药品的储药槽摆放到储药柜中以满足药房储药的需求。同时,根据单个储药柜的规格,计算最少需要多少个储药柜。3三、 问题的分析本题的主要问题是设计储药柜的储药槽,使得槽内的药盒能够顺利推送并不会发生并排重叠、侧翻和水平旋转,这需要根据附件所给的药盒规格,设计出符合要求的储药槽宽度和高度。参考在互联网上收索到的自动送药机及其储药柜,如图 3.1
6、 和图 3.2 所示,可以得出药品在储药槽中一般是侧面摆放,将高和宽的一面朝外,使得所需储药槽的宽度最小。此外,图中所示没有竖向支撑板影响储药槽的放置,这点与题目所给的图不同,本文将参照图 3.1 和图3.2 的实际情况求解,忽略竖向支撑板,简化问题。图 3.1 自动送药机的储药柜图 3.2 自动送药机的储药柜对于问题 1,可采用 matlab 程序从最小宽度规格的药盒开始,分段设置储药槽宽度及其对应的药盒规格,使药槽能装最多的药盒并避免药盒的并排重叠、4侧翻和水平旋转。问题 2 引入了宽度冗余的概念,宽度冗余会随着储药槽宽度类型增加而降低,随着类型的减少而提高。为了在宽度冗余和类型数量之间寻
7、找合理点,需要计算每种类型数量下的宽度冗余值,并绘制变化曲线,通过曲线寻找合理的类型数量。问题 3 则进一步引入了平面冗余的概念,这需要利用问题 2 的结论,在确定所有药品储药槽宽度及其类型的基础上,计算出每种高度类型下的平面冗余值,并寻找合理的类型数量。问题 3 的优化目标虽然变为了平面冗余值,但其解题方法与问题 2 相似。在问题 4 中,需要根据储药柜的规格尺寸,将所有药品所需的储药槽放入储药柜,并确定储药柜的最小数量。由于问题 2 和 3 的目标是使得总平面冗余尽可能小,这与储药槽占储药柜空间尽可能小一致,也即所需储药柜数量少一致。因此,问题 4 必须根据药品的需求量计算出每种药品所需的
8、储药槽个数,然后利用问题 2 和 3 的结论得到每种药品的储药槽的规格(包括高度和宽度) ,最后在实用的前提下将储药槽摆放到储药柜中。四、模型的假设1.假设储药柜的横向和竖向隔板的厚度忽略不计;2.假设只考虑药槽的横向和竖向隔板,不考虑储药柜的竖向支撑板;3.假设储药柜的横向和竖向隔板不会影响药品的放入和取出;4.储药柜药槽的放置参考医院的实际情况,以方便实用为优先;5.假设药盒在药槽内移动时不会发生阻塞、挤扁和变形的情况;6.假设药盒都为符合长、高、宽描述的方形;7.假设药盒在药槽中露出的盒面不会影响药的取出和放入,即药盒在药槽中可以侧放、平放或竖向放置;5五、符号定义及说明符号 含 义 单
9、位K_min 药盒型号的最小宽度 mmK_max 药盒型号的最大宽度 mmC_K 药槽的竖向隔板间距类型数量 种C_G 药槽的横向隔板间距类型数量 种jS第 j 种储药槽中所有药品的宽度冗余之和 mmjW第 j 种储药槽的宽度 mmiD编号为 i 的药盒的宽度 mmjh宽度冗余降低率H 宽度冗余降低率门限值S0 所有竖向隔板间距类型中所有药盒的总宽度冗余 mmGj 第 j 种储药槽中所有药品的高度冗余之和 mmTj 第 j 种储药槽的宽度 mmDTi 编号为 i 的药盒的高度 mmA0 总平面冗余 mm2kj 平面冗余降低率P 平面冗余降低率的门限值in编号为 i 的药盒在一个储药槽中数量 个
10、L编号为 i 的药盒的长度 mmiNC_编号为 i 的药盒所需的储药槽个数 个um编号为 i 的药品的最大日需求量 盒6六、模型的建立与求解参考实际情况,由于药盒的侧面一般宽度较小,因此选择药盒侧放在储药槽中,露出其高和宽的一面,所需储药槽的宽度较小,可以在一定空间内放更多的药品。在忽略横向和竖向隔板厚度、忽略隔板对放药与取药的影响的前提下,药盒与两侧竖向隔板之间、与上下两层隔板之间应留 2mm 的间隙,则药盒在药槽中至少要比储药槽宽度(即竖向隔板类型)和高度要小 4mm 才能顺利出入。为了使药盒在储药槽内推送时不会出现并排重叠、侧翻和水平旋转的情况,储药槽宽度必须满足一定尺寸要求:1. 并排
11、重叠情况为防止并排重叠,储药槽宽度应小于 2 倍药盒宽度,具体原理如图 6.1 所示。假设药盒宽度为 D,储药槽宽度如果不小于 2D,则槽内药盒会发生并排重叠;当储药槽宽度为 2D-1 时,就能避免这种情况。 图 6.1 药盒的并排重叠2. 侧翻情况为防止侧翻情况,储药槽宽度(即竖向隔板类型)应大于药盒高和宽的对角线,具体原理如图 6.2 所示。当储药槽宽度大于药盒型号高和宽的对角线时,药盒就可能发生侧翻。图 6.2 药盒的侧翻3. 水平旋转情况与防止侧翻的原理相同,为防止水平旋转情况,储药槽宽度应大于药盒长和宽的对角线。6.1 问题 1分析附件 1 中药盒的规格数据,可得药盒规格的最小宽度为
12、 K_min=10mm,最大宽度为 K_max=56mm。为了避免并排重叠的情况,储药槽宽度应小于 2 倍其中药盒宽度。考虑到与两侧竖向隔板应留 2mm 的间隙,储药槽宽度应比其中7药盒宽度至少大 4mm。假设此储药槽中所放的药盒的最小宽度为 Dmin,最大宽度为 Dmax,则储药槽宽度 W 存在以下关系:(1)1*2minD(2)4ax为了使储药槽宽度(竖向隔板间距)类型最少,必须使储药槽在满足上述要求的情景下尽量放最多的药盒。因此,可以从最小宽度药盒开始推导,到最大宽度药盒结束,得出以下几种类型:1.类型 1: 2*10-1=19mm,所放药盒宽度最大为 -4=15mm,即所放W1W药盒宽
13、度的规格为 10mm15mm;2.类型 2:参考类型 1,所放药盒宽度最小应为 16mm,则 2*16-21=31mm,所放药盒宽度最大为 -4=27mm,则所放药盒宽度规格为216mm27mm;3.类型 3:参考类型 2,所放药盒宽度最小应为 28mm,则 2*28-3W1=55mm,所放药盒宽度最大为 -4=51mm,则所放药盒宽度规格为3W28mm51mm;4.类型 4:参考类型 3,所放药盒宽度最小应为 52mm,则 2*52-41=103mm,但药盒 K_max=56mm,即所放药盒宽度最大为 56mm,因此=56+4=60,所放药盒宽度规格为 52mm56mm;4W在上述推导过程中
14、,还必须考虑避免侧翻和水平旋转的情况,因此储药槽宽度 W 还必须与药盒高宽对角线、长宽对角线长度进行对比,具体流程如图 6.3所示,其 matlab 程序见附录 1.1。程序运行后,最后得出共有 5 种竖向隔板类型(储药槽宽度类型) ,这 5 种竖向隔板类型对应的药盒型号数量和药盒规格如表 6.1 所示。表 6.1 竖向隔板间距类型最少时的情况序号 竖向隔板类型(储药槽宽度 mm) 对应存放的 药盒数量 规格(mm)1 19 123 10152 31 1078 162783 39 303 28354 50 297 36465 60 118 4756第 i个药槽内最小药盒宽度计算储药槽宽度储药槽
15、宽度 m i n ( 两种对角线长度 ) = 0储药槽宽度 =m i n ( 两种对角线长度 )Y e sN o计算第 i个药槽内最大药盒宽度第 i + 1 个药槽内最小药盒宽度图 6.3 竖向隔板间距类型最少的计算流程图6.2 问题 2由于药盒与两侧竖向隔板之间的间隙超出 2mm 的部分被视为宽度冗余,则储药槽宽度与所放药盒宽度之差大于 4mm 即为此药盒在此储药槽中的宽度冗余。即第 j 个药槽类型中第 i 种药盒的宽度冗余为:= - -4 (3)jiSjWiD其中 为第 j 个药槽类型的宽度, 为其中第 i 种药盒的宽度。因此,可计jWji算得到每种类型储药槽中的总宽度冗余为:= = (4
16、)jSij ijij4根据问题一的情况,可计算得到问题一中竖向隔板间距类型最少时,每个类型所对应的总宽度冗余及其所占比例,如表 6.2 所示。其 matlab 程序见附录1.1。9表 6.2 竖向隔板间距类型最少时的宽度冗余情况储药槽宽度类型(mm)存放的药盒数量 规格(mm) 冗余(mm) 冗余比例19 123 1015 95 0.97%31 1078 1627 6653 67.96%39 303 2835 1013 10.35%50 297 3646 1310 13.38%60 118 4756 718 7.33%根据优化目标,问题 2 可以用模型描述为:(5)C_KminjS其中,C_K
17、 为药槽的竖向隔板间距类型数量。竖向隔板间距类型最少时,5 种类型的宽度冗余总量为 9789mm。为了减少冗余,必须增加储药槽的类型,即增加竖向隔板间距类型数量。在问题一的基础上,可以选择将每种储药槽的类型拆分为 2 个,即将其对应的药盒规格由 1 段拆分为 2 段,例如 1627mm 可以均匀拆分为 1621mm 和 2227mm 两段。根据此原理,将冗余较大的类型进行拆分,具体步骤如下:1.对于第 j 种类型的储药槽,根据公式(4)计算其中所有药品的宽度冗余为 ;jS2.对于所有类型的储药槽,计算总的宽度冗余为=0Sj3.将第 j 种类型的储药槽按药品规格拆分为 2 段,拆分后的宽度冗余分
18、别为 和 ,设置拆分后的宽度冗余降低率为1jS2j(6)021/)(SShjjjj4.当宽度冗余降低率 H 时,其中 H 为预先设置的阈值,表示拆分所增加j的储药槽类型会引起宽度冗余的大幅降低,必须保留此拆分的结果,即增加 1个类型;5.当宽度冗余降低率 P 时,其中 P 为预先设置的阈值,表示拆分所增加j的储药槽类型会引起平面冗余的大幅降低,必须保留此拆分的结果,即增加 1个高度类型(横向隔板间距类型) ;5.当平面冗余降低率 =C_min) index=index i;data_temp=data_temp;data(i,4:5);endendDJ=min(min(data_temp();
19、if (C_K DJ)C_K=DJ-1;C_max=C_K-4;elseindex%输出药槽宽度对应的药盒编号num=size(index) %输出药槽宽度对应药盒的数量C_K %输出药槽宽度%计算宽度冗余rongyu=0;for k=1:num(2)if ( (C_K-data(index(k),3)4 )rongyu=rongyu+(C_K-data(index(k),3)-4);endend23rongyuC_min=C_max+1;C_K=2*C_min-1;if(C_K56+4)C_K=60;C_max=56;index=;data_temp=;for i=1:N(1)if (dat
20、a(i,3)=C_min) index=index i;data_temp=data_temp;data(i,4:5);endendDJ=min(min(data_temp();if (C_K DJ)C_K=DJ-1;C_max=C_K-4;elseindex%输出药槽宽度对应的药盒编号num=size(index) %输出药槽宽度对应药盒的数量C_K %输出药槽宽度%计算宽度冗余rongyu=0;for k=1:num(2)if ( (C_K-data(index(k),3)4 )rongyu=rongyu+(C_K-data(index(k),3)-4);endendrongyuendel
21、seC_max=C_K-4;endendend附录 1.2 “问题 2”的 MATLAB 程序附录 1.3.1 “问题 3 中确定高度冗余最小时的横向隔板间距类型”的MATLAB 程序load xinghao.txtN=size(xinghao);24data=zeros(N(1),5);for i=1:N(1)data(i,1)= xinghao(i,1);data(i,2)= xinghao(i,2);data(i,3)= xinghao(i,3);data(i,4)= ceil(sqrt(xinghao(i,2)2+xinghao(i,3)2);%高宽对角线data(i,5)= ceil
22、(sqrt(xinghao(i,1)2+xinghao(i,2)2);%长高对角线endKg_min=min(xinghao(:,2);Kg_max=max(xinghao(:,2);Cg_min=Kg_min;C_G=2*Cg_min-1;Cg_max=C_G-4;while(Cg_max=Cg_min) index=index i;data_temp=data_temp;data(i,5);%只计算长高对角线endendDJ=min(data_temp();if (C_G DJ)C_G=DJ-1;Cg_max=C_G-4;elseindex%输出药槽宽度对应的药盒编号num=size(in
23、dex) %输出药槽宽度对应药盒的数量C_G %输出药槽宽度%计算宽度冗余rongyu=0;for k=1:num(2)if ( (C_G-data(index(k),2)4 )rongyu=rongyu+(C_G-data(index(k),2)-4);endendrongyuCg_min=Cg_max+1;C_G=2*Cg_min-1;if(C_GKg_max+4)25C_G=Kg_max+4;Cg_max=Kg_max;index=;data_temp=;for i=1:N(1)if (data(i,2)=Cg_min) index=index i;data_temp=data_temp
24、;data(i,5);endendDJ=min(data_temp();if (C_G DJ)C_G=DJ-1;Cg_max=C_G-4;elseindex%输出药槽宽度对应的药盒编号num=size(index) %输出药槽宽度对应药盒的数量C_G %输出药槽宽度%计算宽度冗余rongyu=0;for k=1:num(2)if ( (C_G-data(index(k),2)4 )rongyu=rongyu+(C_G-data(index(k),2)-4);endendrongyuendelseCg_max=C_G-4;endendend附录 1.3 “问题 3”的 MATLAB 程序load
25、 xinghao.txtload data_CKN=size(xinghao);data=zeros(N(1),5);for i=1:N(1)data(i,1)= xinghao(i,1);data(i,2)= xinghao(i,2);data(i,3)= xinghao(i,3);data(i,4)= ceil(sqrt(xinghao(i,2)2+xinghao(i,3)2);%高宽对角线26data(i,5)= ceil(sqrt(xinghao(i,1)2+xinghao(i,2)2);%长高对角线endKg_min=min(xinghao(:,2);Kg_max=max(xingh
26、ao(:,2);sum_rongyu=0;C_G=53 72 104 129;num_C=4;j=1;while( j=Cg_min) index=index i;endend% index%输出药槽宽度对应的药盒编号num=size(index) %输出药槽宽度对应药盒的数量C_G(j) %输出药槽高度%计算平面冗余rongyu=0;for k=1:num(2)if ( (C_G(j)-data(index(k),2)4 ) endendrongyu%分裂为 2,均分temp=floor(Cg_max-Cg_min)/2);Cg_min_1=Cg_min;Cg_max_1=Cg_min_1+
27、temp;C_G_1=Cg_max_1+4;Cg_min_2=Cg_max_1+1;27Cg_max_2=Cg_max;C_G_2=Cg_max_2+4;index_1=;for i=1:N(1)if (data(i,2)=Cg_min_1) index_1=index_1 i;endend% index_1%输出药槽宽度对应的药盒编号num=size(index_1) %输出药槽宽度对应药盒的数量C_G_1 %输出药槽宽度%计算平面冗余rongyu_1=0;for k=1:num(2)if ( (C_G_1-data(index_1(k),2)4 ) endendrongyu_1index_
28、2=;for i=1:N(1)if (data(i,2)=Cg_min_2) index_2=index_2 i;endend% index_1%输出药槽宽度对应的药盒编号num=size(index_2) %输出药槽宽度对应药盒的数量C_G_2 %输出药槽高度%计算平面冗余rongyu_2=0;for k=1:num(2)if ( (C_G_2-data(index_2(k),2)4 )endendrongyu_2%计算总冗余sum_rongyu=0;num_CC=size(C_G);28for p=1:num_CC(2)if(p=1)Cg_min_S=Kg_min;elseCg_min_S
29、=Cg_max_S+1;endCg_max_S=C_G(p)-4;index=;for i=1:N(1)if (data(i,2)=Cg_min_S) index=index i;endend% index%输出药槽宽度对应的药盒编号num=size(index) %输出药槽宽度对应药盒的数量C_G(p) %输出药槽宽度%计算平面冗余rongyu_t=0;for k=1:num(2)if ( (C_G(p)-data(index(k),2)4 )endendsum_rongyu=sum_rongyu+rongyu_t;%总冗余enddec_rongyu=rongyu-(rongyu_1+ron
30、gyu_2);if (dec_rongyu/sum_rongyu)0.04%冗余降低超过 10%,保持分裂C_G=C_G(1:j-1) C_G_1 C_G(j:num_C)num_C=num_C+1;j=j-1;if(j=1)Cg_max=C_G(j)-4;endendj=j+1;end%分裂完成,计算总冗余sum_rongyu=0;num_C=size(C_G);29for j=1:num_C(2)if(j=1)Cg_min=Kg_min;elseCg_min=Cg_max+1;endCg_max=C_G(j)-4;index=;for i=1:N(1)if (data(i,2)=Cg_mi
31、n) index=index i;endend% index%输出药槽宽度对应的药盒编号num=size(index) %输出药槽宽度对应药盒的数量C_G(j) %输出药槽宽度%计算宽度冗余rongyu=0;for k=1:num(2)if ( (C_G(j)-data(index(k),2)4 )endendrongyusum_rongyu=sum_rongyu+rongyu;%保存每种药品的储药槽高for k=1:num(2)data_CG(index(k),1)=C_G(j);endendsum_rongyusave data_CG;%保存每种药品的储药槽宽附录 1.4 “问题 4”的
32、MATLAB 程序load xinghao.txtload data_CK%每种药的储药槽宽 12 类load data_CG%每种药的储药槽高 13 类N=size(xinghao);data=zeros(N(1),5);C_number=zeros(N(1),1);30num_Yaogui=1;% *for i=1:N(1)data(i,1)= xinghao(i,1);%长data(i,2)= xinghao(i,2);%高data(i,3)= xinghao(i,3);%宽data(i,4)= ceil(sqrt(xinghao(i,2)2+xinghao(i,3)2);%高宽对角线d
33、ata(i,5)= ceil(sqrt(xinghao(i,1)2+xinghao(i,3)2);%长宽对角线endload liang.txtfor i=1:N(1)n=floor(1500/data(i,1);%长C_number(i)=ceil(liang(i)/n);%每种药品的药槽数量end%需求量大的药优先摆放,同一种药的药槽放在一起(同一行相邻摆放) ,同样高的药槽放在同一行sum_CK=zeros(N(1),1);for i=1:N(1)sum_CK(i)=data_CK(i)*C_number(i);%编号 i 的药的药槽总宽endindex_already=;i=1;num
34、_already=0;CG_all=0;%计算药槽高度累加CG_sum=0;%计算所有药槽累计的总高度while( num_alreadyN(1) )%从最小编号的药开始(编号越小需求量越大)index_sameline=; index_sameline=index_sameline i;sum_long=0;num_line=1;if sum_CK(i)2500%储药柜宽度为 2500mmsum_long=sum_CK(i);CG_temp=data_CG(i);data_CG(i)=0;for j=2:N(1)if CG_temp=data_CG(j);%寻找相同槽高的最小编号的药(最小编号的药需求量最大)sum_long=sum_long+sum_CK(j);if sum_long=2500%储药柜宽度为 2500mmindex_sameline=index_sameline j;num_line=num_line+1;%这一行增加一种药data_CG(j)=0;%清除为 0,不参与下一次摆放