所属学校:深圳信息职业技术学院;参赛队员:1. 陈志伟,2. 卢金星,3. 杨崇联。
2014高教社杯全国大学生数学建模竞赛
承 诺 书
我们仔细阅读了《全国大学生数学建模竞赛章程》和《全国大学生数学建模竞赛参赛规则》(以下简称为“竞赛章程和参赛规则”,可从全国大学生数学建模竞赛网站下载)。
我们完全明白,在竞赛开始后参赛队员不能以任何方式(包括电话、电子邮件、网上咨询等)与队外的任何人(包括指导教师)研究、讨论与赛题有关的问题。
我们知道,抄袭别人的成果是违反竞赛章程和参赛规则的,如果引用别人的成果或其他公开的资料(包括网上查到的资料),必须按照规定的参考文献的表述方式在正文引用处和参考文献中明确列出。
我们郑重承诺,严格遵守竞赛章程和参赛规则,以保证竞赛的公正、公平性。如有违反竞赛章程和参赛规则的行为,我们将受到严肃处理。
我们授权全国大学生数学建模竞赛组委会,可将我们的论文以任何形式进行公开展示(包括进行网上公示,在书籍、期刊和其他媒体进行正式或非正式发表等)。
我们参赛选择的题号是(从A/B/C/D中选择一项填写): D
我们的参赛报名号为(如果赛区设置报名号的话): 19534017
所属学校(请填写完整的全名): 深圳信息职业技术学院
参赛队员 (打印并签名) :1. 陈志伟
2. 卢金星
3. 杨崇联
指导教师或指导教师组负责人 (打印并签名):
(论文纸质版与电子版中的以上信息必须一致,只是电子版中无需签名。以上内容请仔细核对,提交后将不再允许做任何修改。如填写错误,论文可能被取消评奖资格。)
日期: 年 月 日
赛区评阅编号(由赛区组委会评阅前进行编号):
2014高教社杯全国大学生数学建模竞赛
编号专用页
赛区评阅编号(由赛区组委会评阅前进行编号):
赛区评阅记录(可供赛区评阅时使用):
|
评 阅 人
|
|
|
|
|
|
|
|
|
|
|
|
评 分
|
|
|
|
|
|
|
|
|
|
|
|
备 注
|
|
|
|
|
|
|
|
|
|
|
全国统一编号(由赛区组委会送交全国前编号):
全国评阅编号(由全国组委会评阅前进行编号):
一、 摘 要
通过分析储药柜的设计和使用要求,本文对储药柜的结构以及储药槽的规格进行了设计,主要解决了以下几个问题:
1.为避免推送药盒时出现并排重叠、侧翻和水平旋转的情况,分析出储药槽的宽度必须小于其中最小药盒宽度的2倍,也必须小于其中药盒的最小长宽对角线长度和最小高宽对角线长度;
2.在考虑应留间隙的前提下,利用matlab程序逐步推导,设计出竖向隔板间距类型(即储药槽宽度类型)最少的方案:5种类型分别为19mm,31mm,39mm,50mm,60mm;
3.在类型最少方案的基础上,采用逐步分裂的迭代算法,将可获得大幅宽度冗余降低率的竖向隔板间距类型进行拆分,以增加间距类型并减少总宽度冗余,计算出不同间距类型数量下的总宽度冗余值,并给出合理的竖向隔板间距类型数量为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.根据药品的需求量计算出每种药品所需的储药槽个数,并利用matlab程序实现穷举,给出储药槽在储药柜中的摆放方案,计算出最少需要的储药柜数量为2个。此外,本文方法还能给出具体的摆放情况,即输出每个储药柜中每一排药品的编号及其储药槽数量。
关键词:储药柜,宽度冗余,平面冗余,matlab
二、问题重述
目前,自动发药系统正在我国医院推广使用,它主要用来解决现在西药房管理混乱问题,例如药房日处理处方量大,药师工作时间长、取药易出错等。其中,储药柜的作用十分重要,它必须将药品集中摆放,能顺利推送,便于取药和放药。同时,储药柜的体积和数量还不能过多,影响系统的运行和购置成本。基于上述要求,储药柜中的储药槽必须精心设计和使用:为保证药品分拣的准确率,防止发药错误,一个储药槽内只能摆放同一种药品;为保证药品在储药槽内顺利出入,要求药盒与两侧竖向隔板之间、与上下两层横向隔板之间应留2mm的间隙;药盒在储药槽内推送过程中不会出现并排重叠、侧翻或水平旋转。为了设计出合理的储药柜,必须解决以下几个问题:
1.在忽略储药槽横向和竖向隔板厚度的前提下,根据所给的药盒规格,设计出竖向隔板间距类型最少的储药柜方案,给出相应类型的数量和每种类型所对应的药盒规格。
2. 为有效地减少宽度冗余,需适当增加竖向隔板间距类型的数量,但这也会增加储药柜的加工成本,降低储药槽的适应能力。因此,需要设计出合理的竖向隔板间距类型的数量,使总宽度冗余尽可能小,同时类型数量也尽可能少。
3.进一步考虑平面冗余的计算,根据前述问题的结果,确定合理的储药柜横向隔板间距的类型数量,使得储药柜的总平面冗余量尽可能地小,且横向隔板间距的类型数量也尽可能地少。
4. 根据每一种药品编号对应的最大日需求量,计算出每一种药品所需要的储药槽个数,并将所有药品的储药槽摆放到储药柜中以满足药房储药的需求。同时,根据单个储药柜的规格,计算最少需要多少个储药柜。
三、 问题的分析
本题的主要问题是设计储药柜的储药槽,使得槽内的药盒能够顺利推送并不会发生并排重叠、侧翻和水平旋转,这需要根据附件所给的药盒规格,设计出符合要求的储药槽宽度和高度。参考在互联网上收索到的自动送药机及其储药柜,如图3.1和图3.2所示,可以得出药品在储药槽中一般是侧面摆放,将高和宽的一面朝外,使得所需储药槽的宽度最小。此外,图中所示没有竖向支撑板影响储药槽的放置,这点与题目所给的图不同,本文将参照图3.1和图3.2的实际情况求解,忽略竖向支撑板,简化问题。

图3.1 自动送药机的储药柜

图3.2 自动送药机的储药柜
对于问题1,可采用matlab程序从最小宽度规格的药盒开始,分段设置储药槽宽度及其对应的药盒规格,使药槽能装最多的药盒并避免药盒的并排重叠、侧翻和水平旋转。问题2引入了宽度冗余的概念,宽度冗余会随着储药槽宽度类型增加而降低,随着类型的减少而提高。为了在宽度冗余和类型数量之间寻找合理点,需要计算每种类型数量下的宽度冗余值,并绘制变化曲线,通过曲线寻找合理的类型数量。问题3则进一步引入了平面冗余的概念,这需要利用问题2的结论,在确定所有药品储药槽宽度及其类型的基础上,计算出每种高度类型下的平面冗余值,并寻找合理的类型数量。问题3的优化目标虽然变为了平面冗余值,但其解题方法与问题2相似。在问题4中,需要根据储药柜的规格尺寸,将所有药品所需的储药槽放入储药柜,并确定储药柜的最小数量。由于问题2和3的目标是使得总平面冗余尽可能小,这与储药槽占储药柜空间尽可能小一致,也即所需储药柜数量少一致。因此,问题4必须根据药品的需求量计算出每种药品所需的储药槽个数,然后利用问题2和3的结论得到每种药品的储药槽的规格(包括高度和宽度),最后在实用的前提下将储药槽摆放到储药柜中。
四、模型的假设
1.假设储药柜的横向和竖向隔板的厚度忽略不计;
2.假设只考虑药槽的横向和竖向隔板,不考虑储药柜的竖向支撑板;
3.假设储药柜的横向和竖向隔板不会影响药品的放入和取出;
4.储药柜药槽的放置参考医院的实际情况,以方便实用为优先;
5.假设药盒在药槽内移动时不会发生阻塞、挤扁和变形的情况;
6.假设药盒都为符合长、高、宽描述的方形;
7.假设药盒在药槽中露出的盒面不会影响药的取出和放入,即药盒在药槽中可以侧放、平放或竖向放置;
五、符号定义及说明
|
符号 |
含 义 |
单位 |
|
K_min |
药盒型号的最小宽度 |
mm |
|
K_max |
药盒型号的最大宽度 |
mm |
|
C_K |
药槽的竖向隔板间距类型数量 |
种 |
|
C_G |
药槽的横向隔板间距类型数量 |
种 |
|
|
第j种储药槽中所有药品的宽度冗余之和 |
mm |
|
|
第j种储药槽的宽度 |
mm |
|
|
编号为i的药盒的宽度 |
mm |
|
|
宽度冗余降低率 |
|
|
H |
宽度冗余降低率门限值 |
|
|
S0 |
所有竖向隔板间距类型中所有药盒的总宽度冗余 |
mm |
|
Gj |
第j种储药槽中所有药品的高度冗余之和 |
mm |
|
Tj |
第j种储药槽的宽度 |
mm |
|
DTi |
编号为i的药盒的高度 |
mm |
|
A0 |
总平面冗余 |
mm2 |
|
kj |
平面冗余降低率 |
|
|
P |
平面冗余降低率的门限值 |
|
|
|
编号为i的药盒在一个储药槽中数量 |
个 |
|
|
编号为i的药盒的长度 |
mm |
|
|
编号为i的药盒所需的储药槽个数 |
个 |
|
|
编号为i的药品的最大日需求量 |
盒 |
六、模型的建立与求解
参考实际情况,由于药盒的侧面一般宽度较小,因此选择药盒侧放在储药槽中,露出其高和宽的一面,所需储药槽的宽度较小,可以在一定空间内放更多的药品。在忽略横向和竖向隔板厚度、忽略隔板对放药与取药的影响的前提下,药盒与两侧竖向隔板之间、与上下两层隔板之间应留2mm的间隙,则药盒在药槽中至少要比储药槽宽度(即竖向隔板类型)和高度要小4mm才能顺利出入。为了使药盒在储药槽内推送时不会出现并排重叠、侧翻和水平旋转的情况,储药槽宽度必须满足一定尺寸要求:
1. 并排重叠情况
为防止并排重叠,储药槽宽度应小于2倍药盒宽度,具体原理如图6.1所示。假设药盒宽度为D,储药槽宽度如果不小于2D,则槽内药盒会发生并排重叠;当储药槽宽度为2D-1时,就能避免这种情况。
![]()
图6.1 药盒的并排重叠
2. 侧翻情况
为防止侧翻情况,储药槽宽度(即竖向隔板类型)应大于药盒高和宽的对角线,具体原理如图6.2所示。当储药槽宽度大于药盒型号高和宽的对角线时,药盒就可能发生侧翻。

图6.2 药盒的侧翻
3. 水平旋转情况
与防止侧翻的原理相同,为防止水平旋转情况,储药槽宽度应大于药盒长和宽的对角线。
6.1 问题1
分析附件1中药盒的规格数据,可得药盒规格的最小宽度为K_min=10mm,最大宽度为K_max=56mm。为了避免并排重叠的情况,储药槽宽度应小于2倍其中药盒宽度。考虑到与两侧竖向隔板应留2mm的间隙,储药槽宽度应比其中药盒宽度至少大4mm。假设此储药槽中所放的药盒的最小宽度为Dmin,最大宽度为Dmax,则储药槽宽度W存在以下关系:
(1)
(2)
为了使储药槽宽度(竖向隔板间距)类型最少,必须使储药槽在满足上述要求的情景下尽量放最多的药盒。因此,可以从最小宽度药盒开始推导,到最大宽度药盒结束,得出以下几种类型:
1.类型1:
2*10-1=19mm,所放药盒宽度最大为
-4=15mm,即所放药盒宽度的规格为10mm~15mm;
2.类型2:参考类型1,所放药盒宽度最小应为16mm,则
2*16-1=31mm,所放药盒宽度最大为
-4=27mm,则所放药盒宽度规格为16mm~27mm;
3.类型3:参考类型2,所放药盒宽度最小应为28mm,则
2*28-1=55mm,所放药盒宽度最大为
-4=51mm,则所放药盒宽度规格为28mm~51mm;
4.类型4:参考类型3,所放药盒宽度最小应为52mm,则
2*52-1=103mm,但药盒K_max=56mm,即所放药盒宽度最大为56mm,因此
=56+4=60,所放药盒宽度规格为52mm~56mm;
在上述推导过程中,还必须考虑避免侧翻和水平旋转的情况,因此储药槽宽度W还必须与药盒高宽对角线、长宽对角线长度进行对比,具体流程如图6.3所示,其matlab程序见附录1.1。程序运行后,最后得出共有5种竖向隔板类型(储药槽宽度类型),这5种竖向隔板类型对应的药盒型号数量和药盒规格如表6.1所示。
表6.1 竖向隔板间距类型最少时的情况
|
序号 |
竖向隔板类型 (储药槽宽度mm) |
对应存放的药盒数量 |
规格(mm) |
|
1 |
19 |
123 |
10~15 |
|
2 |
31 |
1078 |
16~27 |
|
3 |
39 |
303 |
28~35 |
|
4 |
50 |
297 |
36~46 |
|
5 |
60 |
118 |
47~56 |

图6.3 竖向隔板间距类型最少的计算流程图
6.2 问题2
由于药盒与两侧竖向隔板之间的间隙超出2mm的部分被视为宽度冗余,则储药槽宽度与所放药盒宽度之差大于4mm即为此药盒在此储药槽中的宽度冗余。即第j个药槽类型中第i种药盒的宽度冗余为:
=
-
-4 (3)
其中
为第j个药槽类型的宽度,
为其中第i种药盒的宽度。因此,可计算得到每种类型储药槽中的总宽度冗余为:
=
=
(4)
根据问题一的情况,可计算得到问题一中竖向隔板间距类型最少时,每个类型所对应的总宽度冗余及其所占比例,如表6.2所示。其matlab程序见附录1.1。
表6.2 竖向隔板间距类型最少时的宽度冗余情况
|
储药槽宽度类型(mm) |
存放的药盒数量 |
规格(mm) |
冗余(mm) |
冗余比例 |
|
19 |
123 |
10~15 |
95 |
0.97% |
|
31 |
1078 |
16~27 |
6653 |
67.96% |
|
39 |
303 |
28~35 |
1013 |
10.35% |
|
50 |
297 |
36~46 |
1310 |
13.38% |
|
60 |
118 |
47~56 |
718 |
7.33% |
根据优化目标,问题2可以用模型描述为:
(5)
其中,C_K为药槽的竖向隔板间距类型数量。竖向隔板间距类型最少时,5种类型的宽度冗余总量为9789mm。为了减少冗余,必须增加储药槽的类型,即增加竖向隔板间距类型数量。在问题一的基础上,可以选择将每种储药槽的类型拆分为2个,即将其对应的药盒规格由1段拆分为2段,例如16~27mm可以均匀拆分为16~21mm和22~27mm两段。根据此原理,将冗余较大的类型进行拆分,具体步骤如下:
1.对于第j种类型的储药槽,根据公式(4)计算其中所有药品的宽度冗余为
;
2.对于所有类型的储药槽,计算总的宽度冗余为
=![]()
3.将第j种类型的储药槽按药品规格拆分为2段,拆分后的宽度冗余分别为
和
,设置拆分后的宽度冗余降低率为
(6)
4.当宽度冗余降低率
>H时,其中H为预先设置的阈值,表示拆分所增加的储药槽类型会引起宽度冗余的大幅降低,必须保留此拆分的结果,即增加1个类型;
5.当宽度冗余降低率
<=H时,表示拆分所增加的储药槽类型仅会引起宽度冗余的小幅降低,不必保留此拆分的结果,即此储药槽类型不变;
6.按上述步骤,将所有的储药槽类型都进行拆分,最后得到更新后的储药槽类型,其数量的增加会引起总宽度冗余的降低。如果预先设置的阈值H越小,则拆分出的类型越多,总的宽度冗余越小;H值设置越大,则拆分出的类型越少,总的宽度冗余越大。
根据上述方法,可分别设置不同的H值,获得不同数量的储药槽类型(竖向隔板间距类型),其matlab程序见附录1.2。经程序处理,可发现由5种类型增加到6种类型时,储药槽类型由(19,31,39,50,60)变为了(19,25,31,39,50,60),这与31mm类型储药槽的宽度冗余最大(占总量的67.96%),必须优先拆分为2类,会大幅降低宽度冗余的事实相符合。
通过调解阈值H,增加储药槽宽度类型,可得不同类型数量下的总宽度冗余值如表6.3所示。
表6.3 不同类型数量下的总宽度冗余
|
储药槽宽度类型数量 |
总的宽度冗余(mm) |
|
5 |
9789 |
|
6 |
5475 |
|
10 |
2882 |
|
11 |
2417 |
|
12 |
2084 |
|
13 |
1919 |
|
14 |
1771 |
|
15 |
1671 |
|
16 |
1513 |
|
17 |
1362 |
|
20 |
1089 |
|
21 |
1035 |
|
23 |
953 |
|
26 |
782 |
将表6.3中的数据按下式进行归一化处理,将类型数量归一化为:
=
(7)
其中47为最多的类型(药盒类型共有47种)。再将总宽度冗余归一化为:
=
(8)
其中类型数量最少时的总宽度冗余最大,即类型数量为5时的总宽度冗余9789。利用上述归一化的数据,画出以下曲线图。
由曲线图可以看出,随着类型数量的增加,总宽度冗余一直在降低,且降低幅度越来越小。两线相交的位置即为合理的竖向隔板间距类型(储药槽宽度类型)的数量,为12种类型(相交点的类型数量大于11,即取为12),此时总宽度冗余和类型数量都较小。

图6.4 归一化总宽度冗余和类型数量曲线图
12种类型为合理的类型数量,其对应的储药槽宽度分别为19,22,24,25,28,31,35,39,45,50,55,60(单位mm)。每种类型所对应的药品编号分别为:
(1)规格19mm储药槽:
4 61 80 84 87 99 107 120 122 128 151 184 197 252 253 254 255 274 303 318 332 348 372 398 405 412 456 471 476 505 520 527 539 557 570 571 572 603 609 612 620 668 669 686 687 699 702 723 731 774 775 828 834 872 875 881 909 923 928 934 962 975 1016 1022 1030 1032 1051 1070 1071 1079 1080 1081 1082 1083 1092 1097 1100 1133 1153 1169 1177 1179 1200 1297 1300 1307 1321 1335 1336 1352 1367 1370 1423 1449 1455 1464 1465 1466 1471 1482 1486 1490 1519 1535 1540 1547 1565 1591 1594 1603 1604 1612 1635 1751 1785 1791 1792 1807 1815 1827 1887 1908 1917
(2)规格22mm储药槽:
18 25 34 48 50 57 62 67 70 91 93 97 111 112 116 117 123 130 133 140 141 145 168 169 177 185 196 198 199 209 230 233 236 240 241 260 262 263 264 265 269 272 278 279 280 287 298 299 302 308 309 310 312 313 317 319 333 334 335 354 360 361 362 368 371 384 392 396 406 424 434 453 454 461 472 485 490 512 513 515 518 521 525 546 555 576 577 596 601 606 619 641 673 679 680 684 685 696 697 700 717 718 724 725 733 734 743 758 769 773 779 780 784 792 794 797 798 801 806 821 826 832 833 835 840 848 851 853 855 857 862 866 869 870 871 877 879 880 890 891 899 902 911 921 922 927 936 950 953 954 971 990 998 1004 1012 1018 1023 1049 1052 1053 1060 1065 1069 1072 1076 1085 1087 1111 1132 1135 1142 1152 1168 1170 1171 1172 1173 1175 1176 1185 1187 1188 1195 1198 1204 1209 1212 1227 1256 1258 1272 1277 1278 1279 1290 1291 1292 1293 1296 1298 1302 1318 1322 1333 1343 1353 1364 1369 1380 1402 1409 1412 1416 1424 1432 1433 1439 1441 1459 1460 1470 1476 1480 1511 1536 1537 1538 1553 1566 1592 1600 1610 1618 1620 1627 1628 1629 1631 1643 1644 1652 1680 1698 1702 1710 1717 1737 1750 1754 1771 1781 1797 1830 1868 1891 1894 1918
(3)规格24mm储药槽:
2 6 8 9 21 23 24 26 27 31 32 38 40 42 52 68 71 75 78 79 103 108 113 115 118 121 125 126 131 132 135 136 147 163 165 186 203 205 210 214 215 216 217 221 225 226 228 244 268 270 275 277 283 285 288 292 304 320 324 325 336 340 342 344 345 347 351 357 363 366 390 394 401 402 413 420 425 426 428 436 439 440 449 464 473 494 496 507 516 517 523 526 530 538 542 543 548 552 569 593 595 607 617 624 631 633 637 638 647 650 662 665 674 683 691 692 693 694 695 698 704 707 712 713 714 735 737 742 745 753 761 765 766 770 771 786 787 788 790 791 815 816 823 831 838 846 849 852 861 878 886 910 912 913 942 943 967 969 977 987 999 1001 1002 1009 1019 1020 1027 1029 1033 1036 1055 1059 1062 1067 1074 1088 1095 1099 1103 1104 1116 1118 1119 1120 1122 1123 1125 1126 1131 1146 1149 1151 1156 1199 1214 1217 1225 1226 1241 1254 1257 1260 1262 1263 1280 1281 1309 1314 1315 1320 1331 1332 1337 1342 1355 1357 1360 1361 1372 1374 1376 1377 1378 1379 1383 1384 1389 1391 1394 1397 1400 1401 1404 1405 1406 1415 1417 1418 1425 1426 1428 1430 1437 1444 1450 1451 1452 1453 1456 1457 1458 1461 1463 1472 1473 1477 1483 1491 1507 1509 1510 1512 1524 1525 1530 1546 1550 1554 1556 1571 1573 1574 1584 1590 1602 1608 1614 1617 1624 1626 1630 1632 1636 1637 1648 1650 1651 1653 1656 1661 1664 1665 1699 1701 1703 1707 1711 1712 1718 1719 1720 1725 1729 1731 1736 1738 1739 1741 1749 1758 1759 1760 1768 1770 1782 1783 1800 1802 1803 1805 1828 1833 1836 1837 1864 1865 1867 1872 1883 1884 1885 1890 1909
(4)规格25mm储药槽:
3 5 33 51 58 63 77 88 104 105 110 124 137 164 166 192 195 219 237 247 290 293 305 327 338 364 367 369 370 380 415 416 459 475 498 502 524 537 540 541 544 549 551 564 582 605 610 625 632 661 670 682 710 752 757 827 839 856 863 894 905 939 951 952 976 991 1015 1031 1046 1048 1061 1064 1075 1094 1108 1117 1174 1184 1186 1220 1222 1232 1244 1259 1264 1282 1295 1304 1338 1354 1359 1371 1385 1393 1399 1411 1474 1475 1478 1484 1513 1515 1520 1521 1522 1526 1527 1567 1580 1593 1611 1615 1623 1673 1682 1684 1685 1714 1721 1723 1730 1735 1744 1745 1769 1775 1804 1835 1879
(5)规格28mm储药槽:
1 19 30 35 44 66 73 94 98 100 101 119 179 193 222 248 250 271 284 314 326 337 352 353 358 377 378 379 386 407 408 414 478 506 510 528 550 580 583 616 618 652 653 664 675 681 705 706 715 716 721 722 726 727 728 729 730 751 754 762 764 767 768 778 781 793 795 796 802 813 829 864 876 917 949 1006 1010 1021 1047 1050 1066 1090 1109 1136 1138 1155 1157 1159 1161 1164 1178 1180 1181 1191 1207 1228 1240 1247 1316 1325 1330 1344 1347 1363 1365 1386 1413 1421 1440 1445 1446 1448 1462 1467 1492 1497 1523 1532 1533 1539 1542 1548 1551 1558 1561 1562 1569 1575 1583 1601 1625 1649 1660 1666 1674 1681 1686 1694 1697 1708 1748 1763 1764 1765 1780 1789 1795 1831 1875 1876 1877 1880 1886 1889 1896
(6)规格31mm储药槽:
7 55 56 69 76 106 114 134 144 146 175 178 194 213 218 239 246 249 251 267 281 282 286 289 301 311 315 329 331 339 343 356 381 393 427 435 451 460 469 483 486 489 493 503 522 531 532 533 534 535 536 554 565 574 590 592 597 626 627 635 654 663 667 689 708 738 740 741 748 756 776 782 804 809 810 811 837 844 868 883 887 926 946 961 978 980 992 993 1008 1014 1024 1025 1035 1037 1038 1068 1139 1140 1162 1163 1189 1210 1216 1231 1242 1243 1245 1246 1261 1267 1268 1269 1270 1308 1324 1341 1356 1366 1368 1375 1381 1387 1388 1390 1392 1396 1410 1431 1434 1435 1436 1443 1447 1479 1481 1487 1488 1489 1493 1495 1500 1501 1505 1516 1528 1534 1544 1545 1552 1570 1572 1576 1577 1581 1582 1587 1588 1589 1598 1609 1633 1641 1646 1654 1655 1657 1658 1659 1662 1663 1667 1668 1669 1671 1679 1688 1716 1726 1740 1746 1747 1755 1756 1761 1766 1774 1790 1796 1798 1801 1810 1812 1813 1817 1819 1820 1829 1870 1871 1874 1878 1892 1893 1919
(7)规格35mm储药槽:
22 28 29 36 37 59 81 82 96 102 127 174 227 234 291 297 322 349 359 365 373 374 382 385 387 391 409 410 446 448 463 466 480 481 488 495 504 545 558 559 560 561 562 563 567 575 579 594 604 621 644 651 656 676 677 732 746 777 783 812 841 850 874 882 892 919 924 929 931 960 963 970 984 986 994 1005 1073 1098 1112 1124 1143 1147 1148 1154 1193 1213 1221 1235 1239 1248 1252 1253 1255 1271 1276 1283 1288 1289 1301 1312 1313 1340 1345 1358 1373 1382 1407 1414 1427 1442 1454 1485 1496 1498 1503 1504 1506 1514 1531 1555 1563 1578 1595 1607 1619 1621 1622 1670 1675 1676 1689 1704 1705 1706 1732 1734 1752 1753 1773 1776 1779 1794 1806 1811 1856 1858 1859 1861 1863 1866 1888 1898 1900 1901 1903 1904 1913 1916
(8)规格39mm储药槽:
10 11 12 13 14 15 16 17 39 60 74 85 139 149 156 157 160 171 176 188 212 256 257 258 259 261 295 323 328 403 447 468 474 482 497 566 578 581 586 587 591 622 630 657 659 666 701 720 739 760 803 845 867 873 888 906 915 925 938 968 982 983 988 996 997 1003 1011 1013 1028 1039 1040 1041 1042 1043 1044 1045 1089 1106 1129 1130 1150 1202 1205 1208 1215 1223 1224 1266 1284 1285 1286 1287 1326 1334 1349 1350 1398 1420 1422 1468 1499 1517 1518 1529 1541 1549 1557 1585 1672 1691 1692 1693 1722 1727 1788 1793 1814 1818 1824 1825 1826 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1860 1862 1869 1882 1897 1899 1910 1915
(9)规格45mm储药槽:
20 41 46 64 65 72 86 89 90 95 129 148 152 158 159 162 167 172 180 189 200 202 207 224 242 245 273 276 296 300 316 330 341 383 397 421 423 429 430 452 462 465 470 500 568 584 585 588 589 598 600 611 613 614 629 642 658 660 671 672 678 688 719 747 750 817 818 819 820 824 854 858 859 860 885 893 896 904 907 916 930 941 957 958 964 966 979 981 985 989 1007 1034 1056 1058 1096 1102 1105 1113 1121 1128 1158 1166 1182 1183 1190 1196 1201 1230 1236 1273 1294 1303 1306 1323 1346 1348 1351 1395 1403 1429 1494 1564 1586 1647 1677 1696 1700 1713 1728 1733 1743 1762 1767 1784 1786 1816 1821 1822 1823 1834 1839 1857 1905 1906 1907 1911
(10)规格50mm储药槽:
45 53 83 92 109 138 142 150 154 155 161 170 173 181 191 201 204 206 208 211 220 229 235 238 266 307 321 375 376 389 399 400 417 418 419 431 432 433 437 438 442 455 457 458 484 487 491 492 499 501 514 529 553 573 599 608 615 628 634 640 645 646 648 649 655 703 749 755 759 772 785 789 799 800 805 814 822 825 836 842 847 865 889 897 898 900 932 933 935 937 945 948 956 965 995 1000 1054 1057 1077 1078 1084 1086 1107 1114 1115 1127 1137 1144 1167 1194 1197 1203 1229 1237 1249 1250 1251 1274 1275 1310 1317 1319 1329 1339 1362 1438 1502 1543 1559 1560 1597 1599 1605 1640 1678 1683 1690 1695 1709 1715 1724 1742 1778 1787 1799 1808 1838 1873 1881 1895 1912
(11)规格55mm储药槽:
43 47 49 54 143 153 182 183 187 190 223 231 232 243 294 306 346 350 355 395 404 411 422 450 467 477 479 508 511 519 547 602 623 636 643 690 709 736 763 807 808 830 843 884 895 901 903 908 914 918 920 944 955 959 973 974 1017 1063 1091 1093 1101 1141 1145 1165 1192 1206 1219 1233 1234 1265 1299 1305 1311 1327 1328 1469 1508 1568 1579 1596 1613 1616 1634 1638 1645 1687 1757 1772 1777 1809 1902 1914
(12)规格60mm储药槽:
388 441 443 444 445 509 556 639 711 744 940 947 972 1026 1110 1134 1160 1211 1218 1238 1408 1419 1606 1639 1642 1832
6.3 问题3
根据问题一,同理可计算得到横向隔板间距类型最少时为4类(不发生竖向重叠和旋转),高度分别为53,72,104,129(单位mm),相应的matlab程序见附录1.3.1。
由于药盒与两侧横向隔板之间的间隙超出2mm的部分被视为高度冗余,则储药槽高度(即储药槽横向隔板间距)与所放药盒高度之差大于4mm即为此药盒在此储药槽中的高度冗余。即第j个药槽类型中第i种药盒的高度冗余为:
=
-
-4 (9)
其中
为第j个药槽类型的高度,
为其中第i种药盒的高度。因此,可计算得到每种类型储药槽中的总宽度冗余为:
=
=
(10)
由于平面冗余定义为高度冗余与宽度冗余的乘积,因此第j个药槽类型中第i种药盒的平面冗余为:
=
*
(11)
其中
为其宽度冗余,已在问题2中确定了每种药盒的储药槽宽度类型,在此可直接计算得到。由此,可计算得到第j个类型储药槽中的总平面冗余为:
=
=
(12)
根据优化目标,问题3可以用模型描述为:
(13)
其中,C_G为药槽的横向隔板间距类型数量。参照问题2的解题原理,仍然对平面冗余较大的类型进行拆分,具体步骤如下:
1.对于第j种类型的储药槽,根据公式(12)计算其中所有药品的平面冗余为
;
2.对于所有类型的储药槽,计算总的平面冗余为
=![]()
3.将第j种类型的储药槽在高度上(横向隔板间距)按药品规格拆分为2段,拆分后的平面冗余分别为
和
,设置拆分后的平面冗余降低率为
(14)
4.当平面冗余降低率
>P时,其中P为预先设置的阈值,表示拆分所增加的储药槽类型会引起平面冗余的大幅降低,必须保留此拆分的结果,即增加1个高度类型(横向隔板间距类型);
5.当平面冗余降低率
<=P时,表示拆分所增加的储药槽类型仅会引起平面冗余的小幅降低,不必保留此拆分的结果,即此储药槽高度类型不变;
6.按上述步骤,将所有的储药槽类型都进行拆分,最后得到更新后的储药槽类型,其数量的增加会引起总平面冗余的降低。如果预先设置的阈值P越小,则拆分出的高度类型越多,总的平面冗余越小;P值设置越大,则拆分出的类型越少,总的平面冗余越大。
根据上述方法,可分别设置不同的P值,获得不同数量的储药槽高度类型(横向隔板间距类型)下的总平面冗余值如表6.4所示,其matlab程序见附录1.3。
表6.4不同高度类型数量下的总平面冗余
|
横向隔板间距类型数量 (储药槽高度类型数量) |
总的平面冗余(mm2) |
|
4 |
25619 |
|
5 |
16915 |
|
6 |
14171 |
|
7 |
11817 |
|
10 |
8397 |
|
12 |
6721 |
|
13 |
5581 |
|
15 |
5159 |
|
17 |
4394 |
|
18 |
3878 |
|
19 |
3752 |
|
20 |
3638 |

图6.5归一化总宽度冗余和类型数量曲线图
将表6.4中的数据按(7)(8)公式进行归一化处理,画出曲线图,如图6.5所示。由曲线图可以看出,随着类型数量的增加,总平面冗余一直在降低,且降低幅度越来越小。两线相交的位置即为合理的竖向隔板间距类型(储药槽宽度类型)的数量,为13种类型(由于相交点与13、14的平面冗余值都比较接近,取数量最少的,即为13),此时总平面冗余和横向隔板间距的类型数量都较小。13种类型为合理的类型数量,其对应的储药槽高度分别为42,48,53,63,68,72,76,80,84,88,96,104,129(单位mm)。
6.4 问题4
根据每一种药品的最大日需求量和储药槽长度(1.5m),在每天仅集中补药一次的情况下,可计算出编号为i的药盒在一条储药槽中的数量为:
=
(15)
其中
编号为
的药盒的长度。则第i种药品所需要的储药槽个数为:
=
(16)
其中
为编号为i的药品的最大日需求量。计算所用的matlab程序见附录1.4,得到每一种药品需要的储药槽个数为(以下数据从编号为1的药品开始):
23 13 12 8 10 9 9 5 7 6 6 6 6 6 6 6 7 7 6 7 7 5 7 6 7 5 6 6 6 6 5 5 6 5 5 4 5 4 5 5 3 4 4 5 4 4 4 4 3 4 3 4 3 3 4 4 4 3 3 2 2 3 4 4 2 4 3 4 4 3 3 2 4 4 3 4 4 3 3 3 4 2 2 3 2 1 4 3 3 2 3 2 3 3 3 3 3 3 2 3 3 3 3 3 3 2 3 3 3 3 3 2 3 3 3 2 3 2 3 2 3 2 3 3 2 2 2 3 2 3 2 2 2 3 2 2 3 2 2 2 2 2 2 2 2 2 2 1 1 2 2 2 2 2 2 1 1 1 1 1 2 1 2 2 2 2 1 2 2 1 1 2 2 2 2 2 2 1 2 1 1 2 1 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 1 2 1 2 1 2 2 2 2 1 2 1 1 1 1 1 1 1 1 1 2 1 2 2 2 1 2 1 2 1 1 2 1 1 2 2 2 2 1 2 1 1 2 1 2 2 2 1 2 2 1 2 2 2 2 2 2 2 1 2 1 1 1 1 1 1 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 2 2 1 1 1 1 1 2 1 2 1 1 1 2 1 1 2 1 2 2 2 2 2 1 1 1 1 2 1 2 1 1 2 1 2 1 1 1 1 1 1 1 2 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
为满足药房储药的需求,必须将上述每一种药品所需的储药槽放置到储药柜中,每一种药品所需的储药槽数量达到上述数量要求。同时,为方便取药和放药,相同的药品必须摆在同一排作集中摆放(同一横向隔板上),避免放错药品和便于寻找药品。已知储药柜的有效高度为1500mm,宽度为2500mm,放置储药槽的方案如下:
(1)由于编号越小的药品需求量越大,因此从编号1的药品开始摆放,之后再摆编号更大的药品;
(2)相同编号的药品的储药槽必须在同一行相邻摆放,即摆在同一排上;
(3)当同一排药槽没有摆满(累计宽度小于2500mm),则继续摆放同一药槽高度的药品,且这一药品的药槽能完全摆在这一排,否则摆放另一种能满足此要求的药品直至放空;
(4)当一排摆满时(累计宽度
大于等于2500mm),开始摆放新的一排,并从没有摆放的药品中编号最小的开始。累计宽度的计算如下式:
=
(17)
其中
为同一排中第i种药对应的储药槽的宽度。
(5)当摆满的排的累计高度大于等于15mm时,开始摆放到新的储药柜中,方法同上,直至所有药品的储药槽摆放完毕;
(6)每一种药品的储药槽类型在问题2和3中已确定,即储药槽宽度和高度按照问题2和3的结果。
按照上述方法,编写matlab程序实现穷举,得到储药槽在储药柜中的摆放方案,程序代码见附录1.4,程序可输出每个储药柜中每一排药品的编号及其储药槽数量。最后,可计算得出摆放完所有1919种药品的储药槽所需要的储药槽高度为2710mm,最少需要2个储药柜。
七、模型的分析
本文提出的方法有效地解决了储药槽的最优化设计问题,可有效减少储药槽宽度与平面冗余的同时,保持较少的类型数量,提高了储药槽的适应能力。尤其是问题中,本文方法对较多需求量的药品优先摆放,将同一种药集中摆放,都可提高医院工作人员的发药效率和药品分拣的准确率。但是,本文提出的方法也存在一些问题,例如matlab程序在计算不同类型数量下的冗余值时,有些类型数量的情况无法计算得到,这主要跟算法控制的步长有关系。采用逐步分裂的迭代算法增加类型数量时,得到的冗余值不是相同类型数量下的最小冗余值,有所偏差。此外,本文对问题的求解忽略了横向和竖向隔板的厚度,忽略了储药柜竖向支撑板对储药槽的影响,这些对于实际应用都会导致一些问题,需要在实践中继续改善。
参考文献:
[1] 韩中庚,数学建模方法及其应用,北京:高等教育出版社,2005。
[2] 张斐,药房全自动发药系统,物流技术(装备版),2013(5):1-3,2013。
[3] 曹卫华,郭正编,最优化技术方法及MATLAB的实现,北京:化学工业出版社2005。
[4] 阮沈勇,MATLAB程序设计,北京:电子工业出版社,2004。
附录:
附录1.1 “问题1”的MATLAB程序
load xinghao.txt
N=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));
data(i,5)= ceil(sqrt(xinghao(i,1)^2+xinghao(i,3)^2));
end
K_min=min(xinghao(:,3));
K_max=max(xinghao(:,3));
C_min=K_min;
C_K=2*C_min-1;
C_max=C_K-4;
while(C_max<K_max)
index=[];
data_temp=[];
for i=1:N(1)
if (data(i,3)<=C_max) && (data(i,3)>=C_min)
index=[index i];
data_temp=[data_temp;data(i,4:5)];
end
end
DJ=min(min(data_temp()));
if (C_K > DJ)
C_K=DJ-1;
C_max=C_K-4;
else
index%输出药槽宽度对应的药盒编号
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);
end
end
rongyu
C_min=C_max+1;
C_K=2*C_min-1;
if(C_K>56+4)
C_K=60;
C_max=56;
index=[];
data_temp=[];
for i=1:N(1)
if (data(i,3)<=C_max) && (data(i,3)>=C_min)
index=[index i];
data_temp=[data_temp;data(i,4:5)];
end
end
DJ=min(min(data_temp()));
if (C_K > DJ)
C_K=DJ-1;
C_max=C_K-4;
else
index%输出药槽宽度对应的药盒编号
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);
end
end
rongyu
end
else
C_max=C_K-4;
end
end
end
附录1.2 “问题2”的MATLAB程序
附录1.3.1 “问题3中确定高度冗余最小时的横向隔板间距类型”的MATLAB程序
load xinghao.txt
N=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));%高宽对角线
data(i,5)= ceil(sqrt(xinghao(i,1)^2+xinghao(i,2)^2));%长高对角线
end
Kg_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<Kg_max)
index=[];
data_temp=[];
for i=1:N(1)
if (data(i,2)<=Cg_max) && (data(i,2)>=Cg_min)
index=[index i];
data_temp=[data_temp;data(i,5)];%只计算长高对角线
end
end
DJ=min(data_temp());
if (C_G > DJ)
C_G=DJ-1;
Cg_max=C_G-4;
else
index%输出药槽宽度对应的药盒编号
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);
end
end
rongyu
Cg_min=Cg_max+1;
C_G=2*Cg_min-1;
if(C_G>Kg_max+4)
C_G=Kg_max+4;
Cg_max=Kg_max;
index=[];
data_temp=[];
for i=1:N(1)
if (data(i,2)<=Cg_max) && (data(i,2)>=Cg_min)
index=[index i];
data_temp=[data_temp;data(i,5)];
end
end
DJ=min(data_temp());
if (C_G > DJ)
C_G=DJ-1;
Cg_max=C_G-4;
else
index%输出药槽宽度对应的药盒编号
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);
end
end
rongyu
end
else
Cg_max=C_G-4;
end
end
end
附录1.3 “问题3”的MATLAB程序
load xinghao.txt
load data_CK
N=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));%高宽对角线
data(i,5)= ceil(sqrt(xinghao(i,1)^2+xinghao(i,2)^2));%长高对角线
end
Kg_min=min(xinghao(:,2));
Kg_max=max(xinghao(:,2));
sum_rongyu=0;
C_G=[53 72 104 129];
num_C=4;
j=1;
while( j<=num_C)
if(j==1)
Cg_min=Kg_min;
else
Cg_min=Cg_max+1;
end
Cg_max=C_G(j)-4;
index=[];
for i=1:N(1)
if (data(i,2)<=Cg_max) && (data(i,2)>=Cg_min)
index=[index i];
end
end
% index%输出药槽宽度对应的药盒编号
num=size(index) %输出药槽宽度对应药盒的数量
C_G(j) %输出药槽高度
%计算平面冗余
rongyu=0;
for k=1:num(2)
if ( (C_G(j)-data(index(k),2))>4 ) && ( (data_CK(index(k),1)-data(index(k),3))>4 )
rongyu=rongyu+(C_G(j)-data(index(k),2)-4)*(data_CK(index(k),1)-data(index(k),3)-4);
end
end
rongyu
%分裂为2,均分
temp=floor((Cg_max-Cg_min)/2);
Cg_min_1=Cg_min;
Cg_max_1=Cg_min_1+temp;
C_G_1=Cg_max_1+4;
Cg_min_2=Cg_max_1+1;
Cg_max_2=Cg_max;
C_G_2=Cg_max_2+4;
index_1=[];
for i=1:N(1)
if (data(i,2)<=Cg_max_1) && (data(i,2)>=Cg_min_1)
index_1=[index_1 i];
end
end
% 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 ) && ( (data_CK(index_1(k),1)-data(index_1(k),3))>4 )
rongyu_1=rongyu_1+(C_G_1-data(index_1(k),2)-4)*(data_CK(index_1(k),1)-data(index_1(k),3)-4);
end
end
rongyu_1
index_2=[];
for i=1:N(1)
if (data(i,2)<=Cg_max_2) && (data(i,2)>=Cg_min_2)
index_2=[index_2 i];
end
end
% 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 )&& ( (data_CK(index_2(k),1)-data(index_2(k),3))>4 )
rongyu_2=rongyu_2+(C_G_2-data(index_2(k),2)-4)*(data_CK(index_2(k),1)-data(index_2(k),3)-4);
end
end
rongyu_2
%计算总冗余
sum_rongyu=0;
num_CC=size(C_G);
for p=1:num_CC(2)
if(p==1)
Cg_min_S=Kg_min;
else
Cg_min_S=Cg_max_S+1;
end
Cg_max_S=C_G(p)-4;
index=[];
for i=1:N(1)
if (data(i,2)<=Cg_max_S) && (data(i,2)>=Cg_min_S)
index=[index i];
end
end
% index%输出药槽宽度对应的药盒编号
num=size(index) %输出药槽宽度对应药盒的数量
C_G(p) %输出药槽宽度
%计算平面冗余
rongyu_t=0;
for k=1:num(2)
if ( (C_G(p)-data(index(k),2))>4 )&& ( (data_CK(index(k),1)-data(index(k),3))>4 )
rongyu_t=rongyu_t+(C_G(p)-data(index(k),2)-4)*(data_CK(index(k),1)-data(index(k),3)-4);
end
end
sum_rongyu=sum_rongyu+rongyu_t;%总冗余
end
dec_rongyu=rongyu-(rongyu_1+rongyu_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;
end
end
j=j+1;
end
%分裂完成,计算总冗余
sum_rongyu=0;
num_C=size(C_G);
for j=1:num_C(2)
if(j==1)
Cg_min=Kg_min;
else
Cg_min=Cg_max+1;
end
Cg_max=C_G(j)-4;
index=[];
for i=1:N(1)
if (data(i,2)<=Cg_max) && (data(i,2)>=Cg_min)
index=[index i];
end
end
% index%输出药槽宽度对应的药盒编号
num=size(index) %输出药槽宽度对应药盒的数量
C_G(j) %输出药槽宽度
%计算宽度冗余
rongyu=0;
for k=1:num(2)
if ( (C_G(j)-data(index(k),2))>4 )&& ( (data_CK(index(k),1)-data(index(k),3))>4 )
rongyu=rongyu+(C_G(j)-data(index(k),2)-4)*(data_CK(index(k),1)-data(index(k),3)-4);
end
end
rongyu
sum_rongyu=sum_rongyu+rongyu;
%保存每种药品的储药槽高
for k=1:num(2)
data_CG(index(k),1)=C_G(j);
end
end
sum_rongyu
save data_CG;%保存每种药品的储药槽宽
附录1.4 “问题4”的MATLAB程序
load xinghao.txt
load data_CK%每种药的储药槽宽 12类
load data_CG%每种药的储药槽高 13类
N=size(xinghao);
data=zeros(N(1),5);
C_number=zeros(N(1),1);
num_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));%高宽对角线
data(i,5)= ceil(sqrt(xinghao(i,1)^2+xinghao(i,3)^2));%长宽对角线
end
load liang.txt
for 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的药的药槽总宽
end
index_already=[];
i=1;
num_already=0;
CG_all=0;%计算药槽高度累加
CG_sum=0;%计算所有药槽累计的总高度
while( num_already<N(1) )%从最小编号的药开始(编号越小需求量越大)
index_sameline=[];
index_sameline=[index_sameline i];
sum_long=0;
num_line=1;
if sum_CK(i)<2500%储药柜宽度为2500mm
sum_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%储药柜宽度为2500mm
index_sameline=[index_sameline j];
num_line=num_line+1;%这一行增加一种药
data_CG(j)=0;%清除为0,不参与下一次摆放
else
sum_long=sum_long-sum_CK(j);
end
end
end
end
index_sameline %输出一行药的编号
CG_temp%输出一行的高度
index_already=[index_already index_sameline];
num_already=size(index_already);
data_CG(i)=0;%清除为0,不参与下一次摆放;
k=1;
while(k<num_already(2))
for k=1:num_already(2)
if i==index_already(k)
i=i+1;
break;
end
end
end
CG_sum=CG_sum+CG_temp;
CG_all=CG_all+CG_temp;
if CG_all>1500%储药柜有效高度为1500mm
CG_all=CG_temp;
num_Yaogui=num_Yaogui+1;
end
if CG_all==1500
CG_all=0;
num_Yaogui=num_Yaogui+1;
end
end
CG_sum%输出药槽摆放后的总高度
num_Yaogui%输出储药柜数量