2022年打孔机论文

上传人:cl****1 文档编号:567311493 上传时间:2024-07-19 格式:PDF 页数:22 大小:492.14KB
返回 下载 相关 举报
2022年打孔机论文_第1页
第1页 / 共22页
2022年打孔机论文_第2页
第2页 / 共22页
2022年打孔机论文_第3页
第3页 / 共22页
2022年打孔机论文_第4页
第4页 / 共22页
2022年打孔机论文_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《2022年打孔机论文》由会员分享,可在线阅读,更多相关《2022年打孔机论文(22页珍藏版)》请在金锄头文库上搜索。

1、福建工程学院2012年第九届数学建模竞赛答卷论文D 题打孔机生产效能的提高小组成员:陈晓星 男邱振涛 男留雅珊 女日期:2012-5-20 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 1 页,共 22 页打孔机生产效能的提高摘要本文就打孔机生产效能的提高,运用jave 和分析法建立数学模型,针对实际问题,分别考虑两条原则:,路径和转换方式最优原则,时间最优原则建立模型。由于两个问题都为优化问题,我们用类似最小生成树方法求解钻头行进路程的最短路径,以图论结合的方法分析最优刀具转换方式。针对问题一,根据题目提供的印刷线路板过孔中心坐标数据,我们利用

2、matlab 画出了坐标分布图见附录。分析其点分布,发现defghabcdef 这种刀具转换方式不仅能保证每个点都打到且转换次数最少,这样就不仅降低了转换成本, 而且也使转换时间缩小到最少的。运用java 程序模仿最小生成树设计快速算法,求出各种孔型各自分布点的最短路径及路径的首尾坐标。根据各种孔型之间的打孔顺序将前一种孔型求出的最短路径的最后一点坐标与后一孔型的第一点坐标相连,即得到钻头行进的最优路径。经过我们的反复计算,最终行进总路程为,行进时间为,作业成本为元。对于问题一,我们仿照问题二分区域的方法,进行了优化,用牺牲刀具的转动时间来做到减短钻头所行总路线,将其划分为三个区域,钻头根据区

3、域依次行走,经过计算得出最终行进总路程为1475.96 cm,行进时间为 s,作业成本为 948.58 元,相比原本的方法,此种方法虽时间稍微多一些,但钻头行进路程变短了,也降低了成本。针对问题二 ,由于是双钻头的打孔机,且作业是独立的,但为防止钻头间的触碰和干扰,我们采取了分区域的做法,即两个钻头分开作业。根据分析,决定将其分为四个区域并根据各个区域各种孔型分布特点,求出最短刀具转换方式,除了其中第二个区域是 fghabcdef ,其余皆为defghabcdef ,求解方法与问题一相似,经过统计和计算,最终行进总路程为 cm ,行进时间为,作业成本为。与单钻头比较时间效率提高了,缩短了钻头的

4、行进路程,成本降低了元。关键字 : java matlab 最小生成树精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 2 页,共 22 页1 1问题的提出打孔机主要用于制造印刷线路板流程中的打孔作业。为提高生产效能,需进行合理的作业安排,设计加工一块线路板的最优计划,需考虑以下几个方面:(1) 单个过孔的钻孔作业时间,这是由生产工艺决定;(2) 打孔机在加工作业时,钻头的行进时间;(3) 针对不同孔型加工作业时,刀具的转换时间。在给定的某种砖头,上面装有8 种刀具 a,b.c ,h, 依次排列呈圆环状,如图 1 所示:图 1:某种钻头 8 种刀具的

5、分布情况而且 8 种刀具的顺序固定,不能调换。加工作业时,一种刀具使用完毕后,可以转换使用另一种刀具。相邻两刀具的转换时间为18s。作业时,可采用顺逆时针旋转的方式转换刀具。将任一刀具转换至其它刀具处,所需时间是相应转换时间的累加。为简化问题,假定钻头的行进速度是相同的,为180mm/s ,行进成本为 0.06 元/mm ,刀具转换的时间成本为7 元/min 。刀具在行进过程中可以同时进行刀具转换,但相应费用不减。不同刀具加工不同孔型,表一列出了10 种孔型所需加工刀具及加工次序标*者表示该孔型对刀具加工次序没有限制。表 1:10 种孔型所需加工刀具及加工次序孔型A B C D E F G H

6、 I J 所需刀具a b a, c d, e* c, f g, h* d, g, f h e, c f, c 同一线路板上的过孔不要求加工完毕一个孔,再加工令一个孔,即对于须用两种或两种以上刀具加工的过孔,只要保证所需刀具加工次序正确即可。要求:根据提供的数据给出单钻头的最优作业线路包括刀具转换方案、行进时间和作业成本;(2)设计一种双钻头的打孔机,每个钻头的形状与单钻头相同,两钻头可以同时作业,且作业是独立的,即可以两个钻头同时进行打孔,也可以一个钻头打孔,另一个钻头行进或转换刀具。为防止钻头间的触碰和干扰,在过孔加工的任何时刻必须保持两钻头间距不小于3cm称为两钻头合作间距。为使问题简化,

7、可以将钻头看作质点。(i) 针对附件 1 的数据,给出双钻头作业时的最优作业线路、行进时间和作业成本,并与传统单钻头打孔机进行比较,其生产效能提高多少?(ii) 研究打孔机的两钻头合作间距对作业路线和生产效能产生的影响。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 3 页,共 22 页2 2问题分析问题一分析:此题为优化问题,主要是考虑钻头行进的成本和时间,以及转换刀具的成本和时间,找到走遍所有点的最优路径,使得打孔机的生产效能到达最高。根据题目提供了印刷线路板过孔中心坐标的数据,我们利用matlab 画出了坐标分布图见附录 1。发现同种孔型,有

8、分布集中的,也有分布较为分散的。又由于钻头行进速度,行进成本和刀具转换时间成本不变,因此只要尽可能找到钻头行进的最短路程及求出刀具的最少转换次数即可。为确定钻头行进的行进路程,我们采用了类似最小生成树的方法,求出各种孔型各自分布点的最短路径及路径的首尾坐标。通过画图与分析,找到了最优的刀具转换方式,并因此确定各种孔型之间的打孔顺序。最后根据各种孔型之间的打孔顺序将前一种孔型求出的最短路径的最后一点坐标与后一孔型的第一点坐标相连,即得到钻头行进的最优路径。问题二分析:此题的主要问题与问题一差不多,也是要求打孔机的最高生产效能。印刷线路板过孔中心坐标的数据与问题一一样,不同的是,此题是双钻头的打孔

9、机每个钻头的形状与单钻头相同,且作业是独立的,但为防止钻头间的触碰和干扰,在过孔加工的任何时间必须保持两钻头间距不小于3cm 。基于这两个条件,我们采取了分区域的做法,即两个钻头分开作业,这样就能够很好地防止钻头间的触碰和干扰。由点的分布图分析,最终分成四块区域,按照区域分布特点,确定刀具转换方式与各种孔型之间的打孔顺序。按照问题一的方法依次求出各个区域最短行进路程,加总即为最路程。3. 模型假设(1)打孔时的时间;(2) 钻头行进过程平稳,不发生故障;(3) 钻头行进灵活,可自由改变方向;(4) 钻头行进速度是相同的;(5) 相邻刀具转换时间是固定的;(6) 钻头看作质点。S.钻头行进的路程

10、T. 加工一块板所需时间Q.加工一块板总的成本1Q. 钻头行进的成本2Q. 刀具的转换成本C.刀具的转换次数0t n .表示打孔的次数精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 4 页,共 22 页3 1p.刀具行进的单价 (元/mm)2p.转换刀具的单价 (元/min)v.钻头行进的速度iq .对应下标区域钻头的行进成本i=1 ,2,3ks 对应区域内钻头的行进路程k=1,2,3iS.按顺序不同刀具行进的路程ijS第 i 个刀具转到第 j 个刀具时所走的路程ks.第 k 个钻头所走的路程1kt .第 k 个钻头的刀具转换时间 k=1,2kn

11、.第 k 个刀具打到的钻孔的个数k=1,21t.转换刀具所花费的时间2t.钻头的行进时间3t.打孔时间问题一:一模型的分析与建立:求最短距离时,我们采用了类似最小生成树的原理。例如:假设有五个顶点1,2,3,4,5,原理如下:精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 5 页,共 22 页4 原理说明:从图 A各条路径中选出最短路径,即2,顶点为 3 和 4,标记顶点 3 和顶点4,连接最短路,得到图B;接着以顶点 3 和 4 为顶点,找出与顶点3 和 4 相连的最短路,即为 3,顶点为 2 和 3,并作标记,连接最短路,得到图C;如此一来,顶

12、点3 被标记两次,视为无效点即不可再被标记,接着以顶点2 和 4 为顶点同理可得图 D ,图 E,最终最短路径为或相反方向。最优化刀具转换方式分析:虽然孔型 A和孔型 B的数量占据了很大一部分,但是由于它们都是单刀具型的,对钻头转换方式没什么影响。另外,虽然钻型D和钻型 F 需要两种刀具,但是它们并没有要求顺序,对钻头转换方式也基本没有什么大的影响,所以我们去除了孔型A、B、D和 F,优先考虑其他孔型。在不考虑单钻头和没有次序限制的钻孔下,对剩下的钻孔的钻头转换进行详细列出,得图 2:图 2:钻头转换方式分析图孔型 G需要有三种刀具,所以我们选择优先考虑孔型G的钻头转换方式,通过与其他钻孔钻头

13、进行比较由图2 中箭头表达,我们确定了一条比较理想的钻头转换方式线路:defghabcdef 又根据确定的刀具转化方式,我们可以确定各种孔型之间的打孔顺序,如图3所示:C: abc ahgfedc E: cdef cbahgf G: defg gf dcbahg ghabcdef I: efghabc 有很大的相似之处 edc J: fghabc fedc 表示箭头尾部的钻头方式属于箭头指向方式的一部分4 5 3 2 1 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 6 页,共 22 页5 图 3:打孔顺序排列因为在刀具转换的时候,钻头本身还可以

14、保持移动,且钻头的移动速度非常快,所以图上两个空方框之间就无需再考虑时间问题,即只需考虑其转换时间。因此:成本=转换刀具的花费 +每个时期对应刀具的钻头行进路程的花费即:Min 12QQQ123Tttt11112ccciijiijSSS11SpQv12260t pQ118tC2Stv30tt n二模型的求解:运用类似最小生成树的方法,用java 设计程序见附录2,求得钻头行走各种孔型最短路径的各个端点坐标及路程,见表1:表 1:各种孔型最短路径的端点坐标及路径的相关信息孔型端点一坐标 (x,y)cm端点二坐标 (x,y)cm路程cm时间sA 精选学习资料 - - - - - - - - - 名

15、师归纳总结 - - - - - - -第 7 页,共 22 页6 B C D E F G H I J 通过比较坐标图中所有钻孔线路的端点,获得每种刀具及转换时所走的路程,如下表所示:表二:使用各刀具所走路程及其他相关信息刀具为孔型所需要最短路程所有孔点及不同孔点之间的和 (cm) 转换下一刀具的路程(cm) 路程之和(cm) 时间 s打的孔数(个) d GD 0 232 e DI 222 f J 29 g GF 54 h FH 40 a AC 1030 b B 787 c CJIE 0 404 d - - 0 0 0 e 0 0 0 f EG 0 115 合计:- - - 2913 结果:t1

16、=18*10=180s s t3=2913 T=t1+t2+t3=1727,21s 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 8 页,共 22 页7 Q=0.06*10*1633.72+10*18/60*7=1001.23元问题一的优化:为了优化问题:我们设计了分区域打孔,从坐标图我们肉眼直观的分为三个区域,第一区域为 x-5cm,y 不限制的长方形区域,第二部分为-5cmx,且 y15cm的长方形区域。第三部分为 -5cm15cm的长方形区域。min 12QQQ123Tttt1123Qqqq111121,2,3ccckiijiijsSSk1

17、1,2,3iis pqiv12260t pQ118tC321iistV30tt n每个区域的刀片转动的顺序还是d-e-f-g-h-a-b-c-f,我们用牺牲刀具的转动时间来做到减短钻头所行总路线,下面是我们针对每个区域所求的时间和所行的最短径。表三:第一区域路程及时间刀具所需大的最短路程所有转换下一路程之和时间 s打的精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 9 页,共 22 页8 孔点孔点及不同孔点之间的和 (cm) 刀具的路程(cm) (cm) 孔数(个) d GD 0 101 e DI 91 f J 10 g GF 120 h FH 6

18、 a AC 55 b B 167 c CIJE 77 d - - 0 0 0 0 e 0 0 0 0 f EG 27 合计:- 654 表四:第二区域路程及时间刀具所需大的孔点最短路程所有孔点及不同孔点之间的和 (cm) 转换下一刀具的路程(cm) 路程之和 (cm) 时间 s打的孔数(个) d GD 0 54 e DI 54 f J 14 g GF 10 h FH 14 a AC 838 b B 588 c CIJE 259 d - - 0 0 0 0 e 0 0 0 0 f EG 59 合计:- 1890 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - -

19、- -第 10 页,共 22 页9 表五:第三区域的路程及时间结果:t1=18*10*3=540s S=371.01+801.54+303.41=1475.96 cm Q=0.06*10*+3* 10*18/60*7=948.58元问题二:(一)模型的分析与建立:由于是双钻头的打孔机,且作业是独立的,但为防止钻头间的触碰和干扰,在过孔加工的任何时刻必须保持两钻头间距不小于3cm,因此我们采取了分区域的做法,即两个钻头分开作业,这样能够很好地防止钻头间的触碰和干扰。根据分析,决定将其分为四个区域,设两个钻头为钻头A和钻头 B,钻头 A行走区域一 x-5和区域二5x0,钻头 B行走区域三0x5,当

20、钻头 A走区域一时,钻头 B走区域三,并根据各个区域各种孔型分布特点,得出各个区域刀具转换形式,见以下各表:刀具所需大的孔点最短路程所有孔点及不同孔点之间的和 (cm) 转换下一刀具的路程(cm) 路程之和 (cm) 时间 s打的孔数(个) d GD 77 e DI 77 f J 5 g GF 24 h FH 20 a AC 37 b B 32 c CIJE 68 d - - 0 0 0 0 e 0 0 0 0 f EG 0 29 合计:- 369 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 11 页,共 22 页10 区域一、三、四的刀具转换

21、方式:区域二的刀具转换方式:目标函数: min 2 11Qp tp S12kkSss11max()ktt10+kkkksTtt nvmax()kTT(二)模型的求解:同样地运用类似最小生成树的方法,用java 设计程序见附录3,求得各个区域钻头 A,B行走各种孔型最短路径的各个端点坐标及路程,结果见以下各表:表六:区域一 x-5钻头 A所走的路程及时间刀具所需大的孔点最短路程所有孔点及不同孔点之间的和 (cm) 转换下一刀具的路程(cm) 路程之和(cm) 时间 s打的孔数(个) d GD 48.27 0 48.27 101 e DI 40.97 8.00 4 91 f J 1 10 g GF

22、 0 9.64 20 h FH 6 a AC 34.46 38.87 55 b B 5 10.40 6 167 c CIJE 40.47 0 40.47 71 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 12 页,共 22 页11 d - - 0 0 0 0 e 0 0 0 0 f EG 0 27 合计:- 323.75 548 表七:区域二 -5x0钻头 A所走的路程及时间表八:区域三 (0x5) 钻头 B所走的路程及时间刀具所需大的孔点最短路程所有孔点及不同孔点之间的和 (cm) 转换下一刀具的路程(cm) 路程之和 (cm) 时间 s打的

23、孔数(个) d GD 42.06 0 42.06 19 e DI 40.61 41.85 18/ f J 8 g GF 0 31 h FH 29 a AC 26.26 31.99 276 b B 154 c CIJE 61 0 6 117 d - 0 0 0 0 e - 0 0 0 0 f EG 0 47 合计:- 699 t1=18*10*3+18*8=684s ;t2=s;t3=699+917*0.5=808s ;T=t1+t2+t3=s S=1407.86 cm Q=0.06*10*1407.86+10*18*3+18*8 元优点:由于打孔的数量太多 , 如果以传统的遗传算法或者是蚂蚁算

24、法去求解问题,这将会花费非常多的时间在计算孔点的距离。通过我们自行设计的快速算法,可以在较短时间内得到孔点间相对较优的路程。另外,通过分析刀具转换方式与孔点的关系,我们设计的刀具转换方式也大大缩小了加工钢板的时间,这对于加工厂来说,就能过大大地提高产量。缺点:虽然我们缩短了计算孔点之间的距离,但由于我们算法也存在一定的缺陷,所以在获得最短路程上,我们可能得不到最短的路径,导致加工钢板的成本会比较高。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 14 页,共 22 页13 参考文献:1刘焕彬 库在强,数学模型与实验,北京:科学出版社,20082姜启

25、源,谢金星等,数学模型,北京:高等教育出版社,2011 3肖华勇,数学建模竞赛优秀论文精选与点评,西北工业大学出版社,20074 Fred Buckley 等著,李慧霸等译图论简明教程,清华大学出版社,2005 5韩明等,数学实验,同济大学出版社,2009附录一孔点分布图:孔点分布图:精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 15 页,共 22 页14 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 16 页,共 22 页15 附录二程序:一:public class T public T() /

26、 TODO Auto-generated constructor stub public String row1() return ./bin/three/AC1.txt; public String row2() return ./bin/three/AC2.txt; void min() int p1=new Zh().read(new T().row1(); / 读取文件我们要的是个数int p2=new Zh().read(new T().row2(); / 读取文件我们要的是个数int p=new intp1.length; / 储存位置多少点的数组/int q=new intp1.

27、length; for(int i=0;ip1.length;i+) pi=i+1; /qi=i+1; /* * 规划坐标的位置点数例:第五个坐标我们设为5 */ int k=new int2; / 定义储存在运行的点的数组int dox=0; /表示被定义为无效点的个数double sum=0; / 路程值int m1=0,m2=0,m = 0; /临时值,储存临时的位置double w=new Zh().row(); / 获得两点之间的距离for(int i=0;ip1.length;i+) for(int j=0;jp1.length;j+) if(wij=0) wij=99999999

28、999.9999999;/ 设为无穷大 /* * 将无效距离既自己与自己的距离设为无穷大 */ /System.out.println(wij); double min=w00; / 设一开始的最短距离为无穷大for(int i=0;ip1.length;i+) for(int j=0;jp1.length;j+) if(wijmin) min=wij; k0=i; k1=j; 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 17 页,共 22 页16 /* * 在存有众多距离的数组中找出最短距离,作为开始 */ sum=sum+min; /Sys

29、tem.out.println(sum); while(doxp1.length-2) for(int i=0;ip.length;i+) if(pi!=0) m=pi; break; /* * 找出运行到还有效的位置;无效为0 */ min=wk0m-1; m1=k0; m2=m-1; /* * 设循环这一次最初的最小距离min; * 临时的 m1 和 m2位置既它有可能成为k数组的值 */ for(int j=0;jp.length;j+) if(pj!=0) / 排除为 0 的无效位置 if(pj-1)!=k1&wk0pj-1min) /排除路线会围成一圈 min=wk0pj-1; m1

30、=k0; m2=pj-1; /* * 得到临时的 min 值和它的位置; */ if(pj-1)!=k0&wk1pj-1min) /排除路线会围成一圈 min=wk1pj-1; m1=k1; m2=pj-1; /* * 得到临时的 min 值和它的位置; */ 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 18 页,共 22 页17 sum+=min; /当前路程if(m1=k0) dox+; /无效位置个数循环一次加一pk0=0; / 无效位置设为 0 k0=m2; /替换被围绕运行的位置 else dox+; /无效位置个数循环一次加一pk1

31、=0; / 无效位置设为 0 k1=m2; /替换被围绕运行的位置 for(int i=0;ip.length;i+) if(pi!=0) System.out.println(p1pi-1*0.0000254+ +p2pi-1*0.0000254); /* * 得到最后还有效的两个位置,确定起点和终点 */ System.out.println(sum*0.0000254); /* * param args */ public static void main(String args) / TODO Auto-generated method stub new T().min(); 二:im

32、port java.io.BufferedReader; import java.io.FileReader; public class Zh /* * */ public Zh() / TODO Auto-generated constructor stub 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 19 页,共 22 页18 public int read(String s) BufferedReader dos=null; StringBuffer s2=new StringBuffer(); try dos=new BufferedR

33、eader(new FileReader(s); String fos=null; s2.append(dos.readLine(); while(fos=dos.readLine()!=null) s2.append( +fos); /System.out.print(s2); catch(Exception e) e.printStackTrace(); finally try dos.close(); catch(Exception e) e.printStackTrace(); String s3=s2.toString().split( ); int s4=new ints3.len

34、gth; for(int i=0;is3.length;i+) s4i=Integer.parseInt(s3i); return s4; public double row() Zh zh=new Zh(); int p1=zh.read(new T().row1(); int p2=zh.read(new T().row2(); int p=new intp1.length; int q=new intp1.length; double w=new doublep1.lengthp2.length; for(int i=0;ip1.length;i+) pi=i+1; qi=i+1; fo

35、r(int i=0;ip1.length;i+) for(int j=0;jp2.length;j+) wij=Math.sqrt ( (Math.pow(p1i-p1j), 2)+Math.pow(p2i-p2j), 2) ); 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 20 页,共 22 页19 return w; /* * param args */ public static void main(String args) / TODO Auto-generated method stub new Zh().row(); 三:publi

36、c class Xz public static void main(String args) / TODO Auto-generated method stub int p1=new Zh().read(new T().row1(); int p2=new Zh().read(new T().row2(); StringBuffer s=new StringBuffer(); for(int i=0;ip1.length;i+) if(p1i-196850) s.append(i+:); System.out.print(p1i+ ); System.out.println(); Strin

37、g p3=s.toString().split(:); for(int i=0;ip3.length;i+) System.out.print(p2Integer.parseInt(p3i)+ ); 四:public class Xz2 public static void main(String args) / TODO Auto-generated method stub int p1=new Zh().read(./bin/shuju/C1.txt); int p2=new Zh().read(./bin/shuju/C2.txt); StringBuffer s=new StringB

38、uffer(); for(int i=0;ip1.length;i+) if(-196850p1i) s.append(i+:); String p3=s.toString().split(:); for(int i=0;ip3.length;i+) if(p2Integer.parseInt(p3i)590551) System.out.print(p1Integer.parseInt(p3i)+ ); 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 21 页,共 22 页20 System.out.println(); for(int j=0;

39、jp3.length;j+) if(p2Integer.parseInt(p3j)590551) System.out.print(p2Integer.parseInt(p3j)+ ); 五:public class Hz3 public static void main(String args) / TODO Auto-generated method stub int p1=new Zh().read(./bin/shuju/J1.txt); int p2=new Zh().read(./bin/shuju/J2.txt); StringBuffer s=new StringBuffer(

40、); for(int i=0;ip1.length;i+) if(-196850p1i) s.append(i+:); String p3=s.toString().split(:); for(int i=0;i590551) System.out.print(p1Integer.parseInt(p3i)+ ); System.out.println(); for(int j=0;j590551) System.out.print(p2Integer.parseInt(p3j)+ ); 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 22 页,共 22 页

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号