首页  |  活动  |  数学建模old
1D1901_D005储药槽的设计-深圳信息职业技术学院-论文下载
全国大学生数学建模竞赛组委会 2014-11-18
2014高教社杯全国大学生数学建模竞赛优秀论文 声明:未经全国大学生数学建模竞赛组委会书面许可,不得转载。 所属学校:深圳信息职业技术学院;参赛队员:1. 陈志伟,2. 卢金星,3. 杨崇联。

所属学校:深圳信息职业技术学院;参赛队员:1. 陈志伟,2. 卢金星,3. 杨崇联。


1D1901_D005.rar




 

 

2014高教社杯全国大学生数学建模竞赛

 

   

 

我们仔细阅读了《全国大学生数学建模竞赛章程》和《全国大学生数学建模竞赛参赛规则》(以下简称为“竞赛章程和参赛规则”,可从全国大学生数学建模竞赛网站下载)。

我们完全明白,在竞赛开始后参赛队员不能以任何方式(包括电话、电子邮件、网上咨询等)与队外的任何人(包括指导教师)研究、讨论与赛题有关的问题。

我们知道,抄袭别人的成果是违反竞赛章程和参赛规则的,如果引用别人的成果或其他公开的资料(包括网上查到的资料),必须按照规定的参考文献的表述方式在正文引用处和参考文献中明确列出。

我们郑重承诺,严格遵守竞赛章程和参赛规则,以保证竞赛的公正、公平性。如有违反竞赛章程和参赛规则的行为,我们将受到严肃处理。

我们授权全国大学生数学建模竞赛组委会,可将我们的论文以任何形式进行公开展示(包括进行网上公示,在书籍、期刊和其他媒体进行正式或非正式发表等)。

 

我们参赛选择的题号是(从A/B/C/D中选择一项填写):        D              

       我们的参赛报名号为(如果赛区设置报名号的话):       19534017                    

所属学校(请填写完整的全名):             深圳信息职业技术学院                             

参赛队员 (打印并签名) 1.            陈志伟                                   

                       2.             卢金星                                

                       3.             杨崇联                                 

指导教师指导教师组负责人  (打印并签名)                              

       (论文纸质版与电子版中的以上信息必须一致,只是电子版中无需签名。以上内容请仔细核对,提交后将不再允许做任何修改。如填写错误,论文可能被取消评奖资格。)

 

                                              日期:               

 

 


赛区评阅编号(由赛区组委会评阅前进行编号):

2014高教社杯全国大学生数学建模竞赛

 

 

 

 

赛区评阅编号(由赛区组委会评阅前进行编号):

 

 

 

赛区评阅记录(可供赛区评阅时使用):

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

全国统一编号(由赛区组委会送交全国前编号):

 

 

 

 

 

全国评阅编号(由全国组委会评阅前进行编号):

 

 

 

 


 

 储药槽的设计

一、   

通过分析储药柜的设计和使用要求,本文对储药柜的结构以及储药槽的规格进行了设计,主要解决了以下几个问题:

1.为避免推送药盒时出现并排重叠、侧翻和水平旋转的情况,分析出储药槽的宽度必须小于其中最小药盒宽度的2倍,也必须小于其中药盒的最小长宽对角线长度和最小高宽对角线长度;

2.在考虑应留间隙的前提下,利用matlab程序逐步推导,设计出竖向隔板间距类型(即储药槽宽度类型)最少的方案:5种类型分别为19mm,31mm,39mm,50mm,60mm

3.在类型最少方案的基础上,采用逐步分裂的迭代算法,将可获得大幅宽度冗余降低率的竖向隔板间距类型进行拆分,以增加间距类型并减少总宽度冗余,计算出不同间距类型数量下的总宽度冗余值,并给出合理的竖向隔板间距类型数量为12种,其对应的宽度分别为192224252831353945505560(单位mm)。此外,也给出了每种类型对应的药品编号;

4.进一步考虑平面冗余,采用逐步分裂的迭代算法,将可获得大幅平面冗余降低率的横向隔板间距类型进行拆分,以增加间距类型并减少总平面冗余,计算出合理的横向隔板间距类型数量为13种,其对应的宽度分别为4248536368727680848896104129(单位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中,需要根据储药柜的规格尺寸,将所有药品所需的储药槽放入储药柜,并确定储药柜的最小数量。由于问题23的目标是使得总平面冗余尽可能小,这与储药槽占储药柜空间尽可能小一致,也即所需储药柜数量少一致。因此,问题4必须根据药品的需求量计算出每种药品所需的储药槽个数,然后利用问题23的结论得到每种药品的储药槽的规格(包括高度和宽度),最后在实用的前提下将储药槽摆放到储药柜中。

 

 

 

四、模型的假设

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.类型12*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

1015

2

31

1078

1627

3

39

303

2835

4

50

297

3646

5

60

118

4756

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

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_K药槽的竖向隔板间距类型数量。竖向隔板间距类型最少时,5种类型的宽度冗余总量为9789mm。为了减少冗余,必须增加储药槽的类型,即增加竖向隔板间距类型数量。在问题一的基础上,可以选择将每种储药槽的类型拆分为2个,即将其对应的药盒规格由1段拆分为2段,例如1627mm可以均匀拆分为1621mm2227mm两段。根据此原理,将冗余较大的类型进行拆分,具体步骤如下:

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,2531,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种类型为合理的类型数量,其对应的储药槽宽度分别为192224252831353945505560(单位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类(不发生竖向重叠和旋转),高度分别为5372104129(单位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种类型(由于相交点与1314的平面冗余值都比较接近,取数量最少的,即为13),此时总平面冗余和横向隔板间距的类型数量都较小。13种类型为合理的类型数量,其对应的储药槽高度分别为4248536368727680848896104129(单位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)每一种药品的储药槽类型在问题23中已确定,即储药槽宽度和高度按照问题23的结果。

按照上述方法,编写matlab程序实现穷举,得到储药槽在储药柜中的摆放方案,程序代码见附录1.4,程序可输出每个储药柜中每一排药品的编号及其储药槽数量。最后,可计算得出摆放完所有1919种药品的储药槽所需要的储药槽高度为2710mm,最少需要2个储药柜。

七、模型的分析

本文提出的方法有效地解决了储药槽的最优化设计问题,可有效减少储药槽宽度与平面冗余的同时,保持较少的类型数量,提高了储药槽的适应能力。尤其是问题中,本文方法对较多需求量的药品优先摆放,将同一种药集中摆放,都可提高医院工作人员的发药效率和药品分拣的准确率。但是,本文提出的方法也存在一些问题,例如matlab程序在计算不同类型数量下的冗余值时,有些类型数量的情况无法计算得到,这主要跟算法控制的步长有关系。采用逐步分裂的迭代算法增加类型数量时,得到的冗余值不是相同类型数量下的最小冗余值,有所偏差。此外,本文对问题的求解忽略了横向和竖向隔板的厚度,忽略了储药柜竖向支撑板对储药槽的影响,这些对于实际应用都会导致一些问题,需要在实践中继续改善。

 

参考文献:

[1] 韩中庚,数学建模方法及其应用,北京:高等教育出版社,2005

[2] 张斐,药房全自动发药系统,物流技术(装备版)20135):1-32013

[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程序

fid=fopen('F:\数学建模\2014\D\index.txt','w');

fclose(fid);

 

load xinghao.txt

N=size(xinghao);

data=zeros(N(1),5);

data_CK=zeros(N(1),2);%保存每种药品的储药槽宽

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));

 

sum_rongyu=0;

C_K=[19 31 39 50 60]

 

num_C=5;

j=1;

while( j<=num_C)

    if(j==1)

        C_min=K_min;

    else

        C_min=C_max+1;

    end

  C_max=C_K(j)-4;

    index=[];

    for i=1:N(1)

        if (data(i,3)<=C_max) &&  (data(i,3)>=C_min)

            index=[index i];

        end

    end

%     index%输出药槽宽度对应的药盒编号

    num=size(index) %输出药槽宽度对应药盒的数量

    C_K(j) %输出药槽宽度

    %计算宽度冗余

    rongyu=0;

    for k=1:num(2)

        if ( (C_K(j)-data(index(k),3))>4 )

             rongyu=rongyu+(C_K(j)-data(index(k),3)-4);

         end

    end

    rongyu

   

 

    %分裂为2,均分

    temp=floor((C_max-C_min)/2);

    C_min_1=C_min;

  C_max_1=C_min_1+temp;

    C_K_1=C_max_1+4;

    C_min_2=C_max_1+1;

  C_max_2=C_max;

    C_K_2=C_max_2+4;

    index_1=[];

    for i=1:N(1)

        if (data(i,3)<=C_max_1) &&  (data(i,3)>=C_min_1)

            index_1=[index_1 i];

        end

    end

%     index_1%输出药槽宽度对应的药盒编号

    num=size(index_1) %输出药槽宽度对应药盒的数量

    C_K_1 %输出药槽宽度

    %计算宽度冗余

    rongyu_1=0;

    for k=1:num(2)

        if ( (C_K_1-data(index_1(k),3))>4 )

             rongyu_1=rongyu_1+(C_K_1-data(index_1(k),3)-4);

         end

    end

    rongyu_1

    index_2=[];

    for i=1:N(1)

        if (data(i,3)<=C_max_2) &&  (data(i,3)>=C_min_2)

            index_2=[index_2 i];

        end

    end

%     index_1%输出药槽宽度对应的药盒编号

    num=size(index_2) %输出药槽宽度对应药盒的数量

    C_K_2 %输出药槽宽度

    %计算宽度冗余

    rongyu_2=0;

    for k=1:num(2)

        if ( (C_K_2-data(index_2(k),3))>4 )

             rongyu_2=rongyu_2+(C_K_2-data(index_2(k),3)-4);

         end

    end

    rongyu_2

   

    %计算总冗余

    sum_rongyu=0;

    num_CC=size(C_K);

    for p=1:num_CC(2)

        if(p==1)

            C_min_S=K_min;

        else

            C_min_S=C_max_S+1;

        end

        C_max_S=C_K(p)-4;

        index=[];

        for i=1:N(1)

            if (data(i,3)<=C_max_S) &&  (data(i,3)>=C_min_S)

                index=[index i];

            end

        end

    %     index%输出药槽宽度对应的药盒编号

        num=size(index) %输出药槽宽度对应药盒的数量

        C_K(p) %输出药槽宽度

        %计算宽度冗余

        rongyu_t=0;

        for k=1:num(2)

            if ( (C_K(p)-data(index(k),3))>4 )

                 rongyu_t=rongyu_t+(C_K(p)-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.07%冗余降低超过10%,保持分裂

        C_K=[C_K(1:j-1) C_K_1 C_K(j:num_C)]

        num_C=num_C+1;

        j=j-1;

        if(j>=1)

            C_max=C_K(j)-4;

        end

    end

    j=j+1;

end

 

 

%分裂完成,计算总冗余

sum_rongyu=0;

num_C=size(C_K);

for j=1:num_C(2)

    if(j==1)

        C_min=K_min;

    else

        C_min=C_max+1;

    end

  C_max=C_K(j)-4;

    index=[];

    for i=1:N(1)

        if (data(i,3)<=C_max) &&  (data(i,3)>=C_min)

            index=[index i];

        end

    end

%     index%输出药槽宽度对应的药盒编号

    num=size(index) %输出药槽宽度对应药盒的数量

    C_K(j) %输出药槽宽度

    fid=fopen('F:\数学建模\2014\D\index.txt','a');

    fprintf(fid,'%d  ',index);

    fprintf(fid,'\n');

    fclose(fid);

    %计算宽度冗余

    rongyu=0;

    for k=1:num(2)

        if ( (C_K(j)-data(index(k),3))>4 )

             rongyu=rongyu+(C_K(j)-data(index(k),3)-4);

         end

    end

    rongyu

    sum_rongyu=sum_rongyu+rongyu;

   

    %保存每种药品的储药槽宽

    for k=1:num(2)

        data_CK(index(k),1)=C_K(j);

       

    end

   

end

sum_rongyu

save data_CK;%保存每种药品的储药槽宽

 

附录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%输出储药柜数量

 

 


  

[责任编辑:刘宇宏]
2014高教社杯全国大学生数学建模竞赛优秀论文 声明:未经全国大学生数学建模竞赛组委会书面许可,不得转载。 所属学校:深圳信息职业技术学院;参赛队员:1. 陈志伟,2. 卢金星,3. 杨崇联。