自动化立体仓库课程设计_第1页
自动化立体仓库课程设计_第2页
自动化立体仓库课程设计_第3页
自动化立体仓库课程设计_第4页
自动化立体仓库课程设计_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目录1.绪论12.货位规划12.1设计条件12.2计算系数矩阵22.2.1符号假设22.2.2已知条件22.2.3计算系数矩阵32.3运用匈牙利算法求解42.4最终的货位规划图112.5运行结果122.6设计总结123.堆垛机径路规划133.1设计条件133.2计算节点相对距离133.2.1符号假设143.2.2已知条件143.2.3计算节点相对距离143.3规划堆垛机合理线路163.3.1最近邻点法163.3.2最近插入法183.3.3两种方法的程序运行结果233.4分析结果233.5设计总结24参考文献25附录261.绪论自动化立体仓库作为现代物流行业的重中之重,发挥着十分重要的作用,实现

2、这些功能的直接机构包括:(1)自动仓储设备(自动化立体仓库)(2)其他货架(平面托盘货架和流动货架等)(3)各种输送机(皮带输送机、升降移载机、提升机等)(4)各种分拣设备(5)无人台车(agv、rgv、lgv)(6)其他各种辅助设备。运用一流的集成化物流理念,采用先进的控制、总线、通讯和信息技术,通过以上设备的协调动作,按照用户的需要完成指定货物的自动有序、快速准确、高效的入库出库作业。自动化立体仓库是现代物流系统中迅速发展的一个重要组成部分,它具有节约用地、减轻劳动强度、消除差错、提高仓储自动化水平及管理水平、提高管理自动化立体仓库是现代物流系统中迅速发展的重要组成部分,它具有和操作人员素

3、质、降低储运损耗、有效地减少流动资金的积压、提高物流效率等诸多优点。与厂级计算机管理信息系统联网以及与生产线紧密相连的自动化立体仓库更是当今必不可少的关键环节。自动化所围绕自动化仓储系统开发了多种自动化系统硬件设备及软件产品,如:不同类型的管理软件、系统仿真软件、图形控制及调度软件、堆垛机输送机控制软件、条形码识别跟踪系统、搬运机器人、码垛机械手、自动运行小车、货物分选系统、堆垛机认址检测系统、货位探测器、高度检测器、输送系统、码垛系统、自动输送小车等产品。2.货位规划2.1设计条件某自动化立体仓库采用2行3列的单元货格式货架存放货物,一共有6个货格,每个货格存放一个托盘货物。货格以按列编码的

4、形式进行编号,如图2.1所示。已知其它参数假定如下:假设堆垛机在水平方向的行驶速度vx=3.0m/s,在垂直方向的行驶速度vy=2m/s;货格大小为l(长)w(宽)h(高)=1m1m0.8m;堆垛机初始状态在原点0处;货格j的横坐标和纵坐标就是其所在的列和行,如货格6的坐标为(3,2)。现有6个托盘货物需要存放到货架上,货物的出入库频率如表2.1所示。vy2461350vx图2.1原始货格图表2.1 托盘货物出入库频率表货物频率货物频率货物频率a6c15e4b30d9f20根据以上条件,利用匈牙利算法合理安排各托盘货物的存放位置。2.2计算系数矩阵2.2.1符号假设1.为第i种货物的出入库频率

5、(次数),i=a,b,c,d,e,f;2,分别为货格j的横坐标和纵坐标,即货格j所在的列和行(距离巷道口最近的列记为第1列,最底层记为第1层),j=1,2,3,4,5,6;3为水平方向的行驶速度;4.为垂直方向的行驶速度;5.l为货格的长;6.w为货格的宽;7.h为货格的高;8.为堆垛机运行之货格j所用时间,该时间是堆垛机行进过程中水平方向和垂直方向所用时间的最大值,j=1,2,3,4,5,6;9. 为堆垛机将货物i向货格j存取时所花费的时间。2.2.2已知条件=6,=30,=15,=9,=4,=20;=3.0m/s, =2.0m/s;lwh=1m1m0.8m;货格1的坐标为(,)=(1,1)

6、;货格2的货格为(,)=(1,2);货格3的坐标为(,)=(2,1);货格4的坐标为(,)=(2,2);货格5的坐标为(,)=(3,1);货格6的坐标为(,)=(3,2)。2.2.3计算系数矩阵1.计算:公式为=max (2.1)=max=max=1/3=max=max=2/5=max=max=2/3=max=max=2/3=max=max=1=max=max=12.计算系数矩阵中的系数:= (2.2)=61/3=2, =301/3=10, =151/3=5,=91/3=3, =41/3=4/3,=201/3=20/3;=62/5=12/5,=302/5=12,=152/5=6,=92/5=1

7、8/5,=42/5=8/5,=202/5=8;=62/3=4,=302/3=20,=152/3=10,=92/3=6,=42/3=8/3,=202/3=40/3;=62/3=4,=302/3=20,=152/3=10,=92/3=6,=42/3=8/3,=202/3=40/3;=61=6,=301=30,=151=15,=91=9,=41=4,=201=20;=61=6,=301=30,=151=15,=91=9,=41=4,=201=20;得到系数矩阵表: 表2.2系数矩阵表abcdef1210534/320/3212/512618/58/5834201068/340/344201068/3

8、40/3563015942066301594202.3运用匈牙利算法求解1. 匈牙利算法的步骤第一步:建等效矩阵。(1) 从系数矩阵的每行元素中减去该行的最小元素。(2) 再从所得系数矩阵的每列元素中减去该列的最小元素。第二步:找独立0元素,进行试指派。(1)从只有一个0元素的行(或列)开始,给这个0元素加括号(0),表示这行所代表的货格已有一种货物分配。然后划去(0)所在列(或行)的其它0元素,记作“”,表示这列所代表的货物已指派。(2)对只有一个0元素的列(或行)的0元素加括号(0),然后划去(0)所在行(或列)的0元素,记作“”。如果在(1),(2)两步中,遇到每一行和每一列都有两个或两

9、个以上的0元素,可任选一个加括号,同时把其所在行和列的0元素都划去。(3)重复(1),(2)两步,直到所有0元素都被加括号或打叉。(4)加括号的0元素即为独立0元素,若其个数m等于矩阵的阶数n,则已得到问题的最优解。若mn,则转入第三步。第三步:用最少的直线覆盖所有0元素。(1)对没有独立0元素的行打“”。(2)对以打“”的行中所含0元素的列打“”。(3)再对(2),(3),直到得不到新的打“”的行、列为止。(4)将没有打“”的行和以打“”的列用直线覆盖,且直线的数目一定等于独立0元素的个数。转第四步。第四步:增加0元素。 从没有被直线覆盖的元素中找出最小元素。未被覆盖的元素都减去该最小元素,

10、而被两条线覆盖的元素都加上该最小元素,其它元素不变。这样得到新系数矩阵,转第二步,重新确定独立0元素。2应用过程(1)给系数矩阵表乘以15, 从系数矩阵的每行元素中减去该行的最小元素, 再从所得系数矩阵的每列元素中减去该列的最小元素,得到等效矩阵。 (2)从只有一个0元素的第2行开始,给这个0元素加括号(0),表示这行所代表的货格已有一种货物分配。然后划去(0)所在列的其它0元素,记作“”,表示这列所代表的货物已指派。对只有一个0元素的第1列的0元素加括号(0),然后划去(0)所在行的0元素,记作“”。 独立0元素的个数m=2矩阵的阶数n=6,转入下一步。(3)用最少的直线覆盖所有0元素。对第

11、3、4、5、6行打“”。对第5列打“”。得不到新的打“”的行、列,停止。将没有打“”的行和已打“”的列用直线覆盖,且直线的数目一定等于独立0元素的个数。 (4)增加0元素。 从没有被直线覆盖的元素中找出最小元素2。未被覆盖的元素都减去该最小元素,而被两条线覆盖的元素都加上该最小元素,其它元素不变。这样得到新系数矩阵,然后重新确定独立0元素。矩阵中独立0元素的个数m=3n=6,用最少的直线覆盖所有0元素。mn重新确定独立0元素用直线覆盖 (5)继续增加0元素,即从未被直线覆盖的元素中找出一个最小元素,未被覆盖的元素都减去该最小元素,而被两条线覆盖的元素都加上该最小元素,其它元素不变。这样得到新系

12、数矩阵,然后重新确定独立0元素。矩阵中独立0元素的个数m=3n=6,用最少的直线覆盖所有0元素。重新确定独立0元素 用直线覆盖 mn (6)继续增加0元素,即从未被直线覆盖的元素中找出一个最小元素,未被覆盖的元素都减去该最小元素,而被两条线覆盖的元素都加上该最小元素,其它元素不变。这样得到新系数矩阵,然后重新确定独立0元素。矩阵中独立0元素的个数m=4n=6,用最少的直线覆盖所有0元素。mn重新确定独立0元素用直线覆盖 (7)继续增加0元素,即从未被直线覆盖的元素中找出一个最小元素,未被覆盖的元素都减去该最小元素,而被两条线覆盖的元素都加上该最小元素,其它元素不变。这样得到新系数矩阵,然后重新

13、确定独立0元素。矩阵中独立0元素的个数m=4n=6,用最少的直线覆盖所有0元素。重新确定独立0元素mn用直线覆盖 (8)继续增加0元素,即从未被直线覆盖的元素中找出一个最小元素,未被覆盖的元素都减去该最小元素,而被两条线覆盖的元素都加上该最小元素,其它元素不变。这样得到新系数矩阵,然后重新确定独立0元素。矩阵中独立0元素的个数m=4n=6,用最少的直线覆盖所有0元素。mn重新确定独立0元素用直线覆盖 (9)继续增加0元素,即从未被直线覆盖的元素中找出一个最小元素,未被覆盖的元素都减去该最小元素,而被两条线覆盖的元素都加上该最小元素,其它元素不变。这样得到新系数矩阵,然后重新确定独立0元素。矩阵

14、中独立0元素的个数m=5n=6,用最少的直线覆盖所有0元素。重新确定独立0元素mn用直线覆盖 (10)继续增加0元素,即从未被直线覆盖的元素中找出一个最小元素,未被覆盖的元素都减去该最小元素,而被两条线覆盖的元素都加上该最小元素,其它元素不变。这样得到新系数矩阵,然后重新确定独立0元素。矩阵中独立0元素的个数m=5n=6,用最少的直线覆盖所有0元素。mn用直线覆盖重新确定独立0元素 (11)继续增加0元素,即从未被直线覆盖的元素中找出一个最小元素,未被覆盖的元素都减去该最小元素,而被两条线覆盖的元素都加上该最小元素,其它元素不变。这样得到新系数矩阵,然后重新确定独立0元素。矩阵中独立0元素的个

15、数m=5n=6,用最少的直线覆盖所有0元素。重新确定独立0元素mn用直线覆盖 (12)继续增加0元素,即从未被直线覆盖的元素中找出一个最小元素,未被覆盖的元素都减去该最小元素,而被两条线覆盖的元素都加上该最小元素,其它元素不变。这样得到新系数矩阵,然后重新确定独立0元素。矩阵中独立0元素的个数m=n=6,所以问题已得最优解,将矩阵中的非0元素变为0,将独立0元素变为1。重新确定独立0元素m=n 由解可得最优分配方案:a货物放5货格,b货物放1货格,c货物放3货格,d货物放4货格,e货物放6货格,f货物放2货格。2.4最终的货位规划图2(货物f)4(货物d)6(货物e)1(货物b)3(货物c)5

16、(货物a) 图2.2最终的规划货位图2.5运行结果2.6设计总结 通过这个设计我了解了自动化立体仓库货位规划问题,并掌握了解决这个问题的方法:匈牙利算法。利用匈牙利算法对货位进行规划,合理安排各托板货物的存放位置。将学到的计算方法灵活运用到现实问题中,可以量化的解决问题,增加了我的知识储备。在此过程中,培养了我的细心计算和认真检查能力。更重要的是,我学会了这种学习的方法,而这是日后最实用的,真的是受益匪浅,也感觉到了收获的喜悦。3.堆垛机径路规划3.1设计条件随机从图3.1中的25个货格中抽出7个货格的货物,分别用节点v1,v2,v3,v4,v5,v6,v7表示。节点间的距离用直角距离公式求解

17、。分别用最近邻点法和最近插入法找出堆垛机存取7个托盘货物的合理路线。vy5 (o)10 (u)15 (w)20 (x)25 (y)4 (g)9 (k)14 (t)19 (n)24 (q)3 (d)8 (j)13 (h)18 (e)23 (s)2 (b)7 (f)12 (i)17 (v)22 (r)1 (a)6 (c)11 (m)16 (p)21 (l)ovx图3.1 最终的货位规划图3.2计算节点相对距离从图3.1中随机抽出7个货格的货物b、j、i、t、p、x、s,分别用节点,,表示。货格和节点的相对位置如图3.2、图3.3所示。vy5 (o)10 (u)15 (w)20 (x)25 (y)4

18、 (g)9 (k)14 (t)19 (n)24 (q)3 (d)8 (j)13 (h)18 (e)23 (s)2 (b)7 (f)12 (i)17 (v)22 (r)1 (a)6 (c)11 (m)16 (p)21 (l)ovx图3.2货格相对位置图 图3.3节点相对位置图 3.2.1符号假设1. 表示节点i,i=1,2,3,4,5,6,7;2.为节点与之间的直角距离;3. 为节点i的横坐标; 为节点j的纵坐标;4. l为货格的长;5.w为货格的宽;6.h为货格的高;3.2.2已知条件节点的坐标为(,)=(1,2),节点的坐标为(,)=(2,3), 节点的坐标为(,)=(3,2), 节点的坐标

19、为(,)=(3,4), 节点的坐标为(,)=(4,1), 节点的坐标为(,)=(4,5), 节点的坐标为(,)=(5,3);lwh=1m1m0.8m;两货格相对距离相等。3.2.3计算节点相对距离计算出所有节点之间的相对距离,直角距离公式为: (3.1)=|2-1|1+|3-2|0.8=1.8=|3-1|1+|2-2|0.8=2=|3-1|1+|4-2|0.8=3.6=|4-1|1+|1-2|0.8=3.8=|4-1|1+|5-2|0.8=5.4=|5-1|1+|3-2|0.8=4.8=|3-2|1+|2-3|0.8=1.8=|3-2|1+|4-3|0.8=1.8=|4-2|1+|1-3|0.

20、8=3.6=|4-2|1+|5-3|0.8=3.6=|5-2|1+|3-3|0.8=3=|3-3|1+|4-2|0.8=1.6=|4-3|1+|1-2|0.8=1.8=|4-3|1+|5-2|0.8=3.4=|5-3|1+|3-2|0.8=2.8=|4-3|1+|1-4|0.8=3.4=|4-3|1+|5-4|0.8=1.8=|5-3|1+|3-4|0.8=2.8=|4-4|1+|5-1|0.8=3.2=|5-4|1+|3-1|0.8=2.6=|5-4|1+|3-5|0.8=2.6得到节点相对距离表: 表3.1节点相对距离表元素v1v2v3v4v5v6v7v11.823.63.85.44.8v

21、21.81.83.63.63v31.61.83.42.8v43.41.82.8v53.22.6v62.6v73.3规划堆垛机合理线路3.3.1最近邻点法1最近邻点法的思路 (1)从零点开始,作为整个回路的起点。 (2)找到离刚刚加入到回路中的顶点最近的一个顶点,并将其加入到回路中。(3)重复步骤(2),直到所有顶点都加入到回路中。(4)最后,将最后一个加入的顶点和起点连接起来。2.应用过程 (1)先将节点加入回路中,t=。(2)从节点出发,比较其到节点,的距离,选择其最小值,加入到回路中。 min|in,1i7,且i1=1.8因此将加入到回路中,t=,,其结果如图3.4。 图3.4步骤2图(3

22、)从节点出发,在节点,中,找出离最近的节点。min|in,1i7,且i1,2=1.8这样就是最近的点,将加入回路中,t=,其结果如图3.5。图3.5步骤3图(4)从节点出发,在,中,找出离最近的节点。min|in,1i7,且i1,2,3=1.6这样就是最近的点,将加入回路中,t= ,其结果如图3.6所示。图3.6步骤4图(5)从节点出发,观察离最近的节点。min|in,1i7,且i1,2,3,4=1.8这样就是最近的点,将加入到回路中,t= ,其结果如图3.7所示。 图3.7步骤5图(6)从节点出发,观察离最近的节点。min|in,1i7,且i1,2,3,4,6=2.6这样就是最近的点,将加入

23、到回路中,t= ,其结果如图3.8所示。图3.8步骤6图(7)从节点出发,是最后一个点,直接加入就可以加入了。然后,将和相连,得到最后的解为 ,其结果如图3.9。 图3.9步骤7图 所以堆垛机运行线路为:281214202316即取送货物次序为:bjitxsp堆垛机总行驶距离为: f=1.8+1.8+1.6+1.8+2.6+2.6+3.8=163.3.2最近插入法1.最近插入法的思路(1)先将节点加入到回路中,找到最小的节点,形成一个子回路,t=,。(2)在剩下的节点中,寻找一个离子回路中某一节点最近的节点。(3)在子回路中找到一条弧(,),使得里程增量+最小。如果有多条满足条件,任选一条,然

24、后将节点插入到和之间,用两条新的弧(,)和(,)代替原来的弧(,),并将节点加入到子回路中。(4)重复步骤(2)和(3),直到所有的节点都加入到子回路中。2.应用过程(1)比较货格相对距离表中从出发的所有路径的大小 min|in,1i7,且i1=1.8这样就由节点和构成的子回路,t=,如图3.10所示。图3.10步骤1图(2)然后考虑剩下的节点,到和中某一个节点的最小距离:min,|in,1i7,且i1,2=1.8(3)由于对称性,无论将插入到和之间往返路径中,结果都是一样的,这样,构成一个新的子回路t=,其结果如图3.11所示。图3.11步骤2图(4)接着考虑剩下的节点,到,中某一个节点的最

25、小距离:min,|in,1i7,且i1,2,3=1.6(5)由图3.11可知,节点有3个位置(条弧线)可以插入。现在分析将加入到哪里合适: 插入到(,)间, =+=3.6+1.81.8=3.6 插入到(,)间, =+=1.8+1.61.8=1.6插入到(,)间, =+=1.6+3.61.8=2.4 比较上面3中情况增量,插入(,)之间的增量最小,所以将节点加入到(,),所以结果为:t= ,其子回路则变为如图3.12所示。图3.12步骤3图(6)接着考虑剩下的节点,到,中某一个节点的最小距离:min,|in,1i7,且i1,2,3,4=1.8由图3.12可知,节点有4个位置(条弧线)可以插入。现

26、在分析将加入到哪里合适:插入到(,)间, =+=5.4+3.61.8=7.2 插入到(,)间, =+=3.6+1.81.8=3.6插入到(,)间, =+=1.8+3.41.6=3.6插入到(,)间, =+=3.4+5.42=6.8比较上面4中情况增量,可将插入到(,)(,)的增量最小,现选其一,这里将节点加入到(,)间,结果为:t= ,其子回路则变为如图3.13所示。图3.13步骤4图(7)接着考虑剩下的节点,到,中某一个节点的最小距离:min,|in,1i7,且i1,2,3,4,6=1.8由图3.13可知,节点有5个位置(条弧线)可以插入。现在分析将加入到哪里合适:插入到(,)间, =+=3

27、.8+3.61.8=5.6 插入到(,)间, =+=3.6+3.41.8=5.2插入到(,)间, =+=3.4+3.61.8=5.2插入到(,)间, =+=3.2+1.83.4=1.6插入到(,)间, =+=1.8+3.82=3.6比较上面5中情况增量,插入(,)之间的增量最小,所以将节点加入到(,)间,结果为:t= ,其子回路则变为如图3.14所示。图3.14步骤5图(8)在最后考虑剩下的节点到,中某一节点的最小距离:min,|in,1i7,且i1,2,3,4,5,6=2.6有6个位置(条弧线)可以插入。现在分析将加入到哪里合适:插入到(,)间, =+=4.8+31.8=6 插入到(,)间,

28、 =+=3+2.81.8=4插入到(,)间, =+=2.8+2.61.8=3.6插入到(,)间, =+=2.6+2.63.2=2插入到(,)间, =+=2.6+2.81.8=3.6插入到(,)间, =+=2.8+4.82=5.6 比较上面6种情况增量,插入到(,)间的增量最小,所以将节点加入到(,)间,结果为:t= ,其子回路则变为如图3.15所示。图3.15步骤6图利用最近插入法所得的解为:t= ,所以堆垛机运行路线为:281420231612即取送货物次序为:bjtxspi总距离为:f=1.8+1.8+1.8+2.6+2.6+1.8+2=14.4节省路程为:16-14.4=1.63.3.3

29、两种方法的程序运行结果程序运行结果与手算结果一致。c+程序见附录。我通过这次实践发现运用c+等编程工具得出的结论准确,且比人工手算快捷方便。在以后的学习实践中应多加运用和提高。3.4分析结果从3.3的结果可知,最近插入法求得的运行路线比最近邻点法求得的运行路线更优。最近邻点法的算法十分简单,但是得到的方案并不十分理想,有很大的改善余地,故此法可作为进一步优化的初始方案。与之相比,最近插入法比较复杂,但是可以得到相对满意的方案。两种方法都有各自的优势,如果遇到简单的问题,比如只有三五个节点,用最近邻点法就能得出最优方案。如果遇到复杂的问题,就要采用最近插入法才能得出最优方案。3.5设计总结通过这

30、个设计我深入了解了自动化立体仓库堆垛机径路优化问题,并掌握了解决这个问题的方法:最近邻点法和最近插入法。利用这两种方法对堆垛机径路进行了优化,得出了最优方案,通过对这两种方法的计算结果进行比较分析,让我对这两种方法有了更透彻的理解。在设计过程中,我认真对待每一步,珍惜每一分一秒,学到最多的知识和方法,锻炼自己的能力,为以后从事相关工作打下了坚实的基础。参考文献【1】焦永兰.管理运筹学. 北京:中国铁道出版社.2000年3月 【2】蔡临宁.物流系统规划建模及实例分析. 北京:机械工业出版社【3】李霞.区域物流规划与管理. 北京:经济科学出版社.2008【4】钱颂迪.运筹学(第三版).北京:清华大

31、学出版社.2005【5】郝勇.张丽.黄健伟.物流系统规划与设计. 北京:清华大学出版社.2008【6】刘昌祺.董良.自动化立体仓库设计. 北京:机械工业出版社.2004【7】贾争现.物流配送中心规划与设计. 北京:机械工业出版社.2008【8】何善君.自动小车存取系统的建模及若干关键技术研究.d.厦门大学,2008.【9】李梅娟.自动化仓储系统优化方法的研究.d.大连理工大学,2008.【10】商允伟、刘长有.自动化仓库货位分配优化问题研究.j.计算工程与应用,2004.【11】魏飞、周燕飞.自动化立体仓库中复合出入库作业的优化.起重运输机械,2007(07).【12】周奇才.自动化仓库系统运

32、行的优化控制.j.起重机械,2000(03).【13】周奇才.基于现代物流的自动化立体仓库系统管理.d西南交通大学,2002.【14】邹晖华、胡吉全.自动化立体仓库分配策略优化研究.j.科技资讯,2006(17). 附录1.匈牙利算法源程序代码#include stdio.h#include fstream.h#include iostream#include #define true 1#define false 0#define bool intusing std:ios_base;bool output(double *,int);void maxsubstract(double *a,

33、int n);double getmaxitem(double *a,int n);double min(double *,int,int,int =0);/求某一行或列的最小值int adjust(double *,int);/调整效率矩阵使每一行列都含有零元素int record(double *,double *,int ,int *,int *);int mincount(double *,int,double *);/找出含有零元素最少的某行(列)int choose(double *,int,int *,int *,int,int,int,int&,int *,int *);int

34、 localfirst(double *,int,int,int =1);/找出独立零的位置int change(double *,double *,int ,int *,int *,int *r,int *c);/覆盖int allot(double *,double *,int ,int *,int *);/全局分配void print(double *a,double *m,int n,int *row,int *col,int *p,int *q,int *p1=null,int *q1=null);/画出分配的步骤ofstream myfile(匈牙利算法演算过程.txt,ios_b

35、ase:out);int main() int n = 6;double r16 = 30,150,75,45,20,100; double r26 = 36,180,90,54,24,120; double r36 = 60,300,150,90,40,200;double r46 = 60,300,150,90,40,200;double r56 = 90,450,225,135,60,300;double r66 = 90,450,225,135,60,300;double *k6 = r1,r2,r3,r4,r5,r6;double *a = k;double *m=null;if (

36、n0) m=new double*n;for (int i=0;in;i+)mi=new doublen;for (i=0;in;i+)for (int j=0;jn;j+)int *row=new intn;int *col=new intn;for (int i=0;in;i+)rowi=coli=0;/cout=原矩阵=endl;myfile原矩阵:endl;output(a,n);for (i=0;in;i+)for (int j=0;jn;j+)coutsetiosflags(ios_base:fixed);coutsetw(8)setprecision(4)aij;coutendl

37、;coutendl;myfileendl;adjust(a,n);record(a,m,n,row,col);allot(a,m,n,row,col);coutendl;coutendlendl;return 0; bool output(double *a,int n)for (int i=0;in;i+)for (int j=0;jn;j+)/coutsetiosflags(ios_base:fixed);/coutsetw(8)setprecision(4)aij;myfilesetiosflags(ios_base:fixed);myfilesetw(8)setprecision(8)

38、aij;/coutendl;myfileendl; return true;double getmaxitem(double *a,int n) double max = a00;for (int i=0;in;i+) for (int j=0;jn;j+) if (max aij) max = aij;/cout获取最大元素值得:maxendl;/coutendl;return max; void maxsubstract(double *a,int n) int max = getmaxitem(a,n);for (int i=0;in;i+) for (int j=0;jn;j+) ai

39、j = max - aij;/cout最大元素都减去每个元素得矩阵:endl;/output(a,n);/找出第n行(列)中最小的值/flag=1表示行/flag=0表示列double min(double *a,int n,int rc,int flag)double min;if (flag)min=arc0;for (int j=1;jarcj) min=arcj;elsemin=a0rc;for (int i=1;iairc) min=airc;return min;/调整效应矩阵使每行列都含有0元素int adjust(double *a,int n)double min;for (

40、int i=0;in;i+)min=min(a,n,i,1);/求第i行中最小值if (min!=0)for (int j=0;jn;j+) aij-=min; /cout=每行都减去该行最小元素得矩阵=endl;myfileendl;myfile每行都减去该行最小元素得:endl;output(a,n);for (int j=0;jn;j+)min=min(a,n,j,0);if (min!=0)for (i=0;in;i+) aij-=min;/cout=每列都减去该列最小元素得矩阵=endl;myfileendl;myfile每列都减去该列最小元素得:endl;output(a,n);r

41、eturn 1;int record(double *a,double *m,int n,int *row,int *col)for (int k=0;kn;k+) rowk=colk=0;for (int i=0;in;i+)for (int j=0;jn;j+)if (mij=(aij=0) rowi+=1;/计算每行零的个数 colj+=1;/计算每列零的个数return true;int result(int *row,int *col,int n)int flag=1;for (int i=0;in;i+)if (rowi!=1|coli!=1)flag=0;break;return

42、 flag;/找出没有被分配且零最少的行或列(不计算不含零元素的列)int mincount(int *rc,int n,int *p)int min=10000000;int k=-1;for (int i=0;irci)min = rci;k=i;return k;/k=-1表示没有零元素/找出某行或某列独立零元素的位置或多个零元素的第一个零的位置int localfirst(double *m,int n,int rc,int flag)int i=0;if (flag)/flag=1表示查找行中的零for (i=0;in&mrci!=1;i+);elsefor (i=0;in&mirc

43、!=1;i+);return i=n?-1:i;/-1表示没有零元素/选中独立零并划去同行或同列的零/flag1: 0 按列分配独立零 1 按行分配独立零/flag2: 0 一行(列)中有一个零 2 一行(列)中有多个零int choose(double *m,int n,int *row,int *col,int rc,int flag1,int flag2,int &m,int *p,int *q)if (flag1)/行int col=localfirst(m,n,rc,1);/col:独立零所在列for (int i=0;in;i+)if (micol=1)/给独立零所在列的其他行零画micol=-1;/画colcol-=1;/该列的零的个数减一,这里连独立零都给画掉了rowi-=1;colcol+=1;/多减了一个独立零,就得加上rowrc+=1;if (flag2)/如果该行有多个零,需要进行试分配for (int j=0;jn;j+)if (mrcj=1)/把该行其他的零画mrcj=-1;rowrc-=1;/该行的零划掉一个就减一

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论