一种基于alns改进模拟退火的排产优化方法

文档序号:8820 发布日期:2021-09-17 浏览:26次 英文

一种基于ALNS改进模拟退火的排产优化方法

技术领域

本发明涉及生产排产

技术领域

,尤其涉及一种基于ALNS改进模拟退火的排产优化方法。

背景技术

排产问题是制造企业中共同存在的问题,它是实际生产调度问题的简化,解决好这一问题,能够利用好企业现有的资源,合理制定工厂生产计划,优化生产过程,提高人员、流程的效率,提高交付率,设备利用率等,从而实现客户满意度的提高。随着市场的竞争加剧,按订单生产的企业中,保证最终产品交付期是企业的核心竞争力之一,但当工厂的设备、人员和订单增多后,普通的人工排产表现出明显的局限性,所以企业需要一种智能方法,能够在较短的时间内求解多变量多约束的排产问题,提高生产效率。

目前求解排产优化问题的方法有遗传法、启发式法、分支定界法、整数规划法和拉格朗日松弛法等多种方法,这些在求解较大规模的排产优化问题上表现出求解速度慢、内存消耗严重、运行门槛高、模型复杂和方法实现成本高等缺点,且大多数方法对于排产的研究都只是针对零散零件,对于带有装配关系的排产研究较少。

发明内容

针对背景技术提出的问题,本发明的目的在于提出一种基于ALNS改进模拟退火的排产优化方法,可以较快地搜索出符合约束条件且总工时消耗较少的生产顺序,得到的结果更加科学,且计算时间更短,有效提高了企业生产效率,能够有效指导企业进行生产计划安排和任务管理,解决了现有排产方法求解速度慢、内存消耗严重、运行门槛高、模型复杂和方法实现成本高的问题。

为达此目的,本发明采用以下技术方案:

一种基于ALNS改进模拟退火的排产优化方法,包括以下步骤:

步骤S1、构建初始编码链:集合商品的各个半成品所需要的子工序,并对每个所述子工序进行编号排列,每个所述子工序对应一个编号,完成初始编码链的构建,每个编号在所述初始编码链中的个数代表所述初始编码链的对应的子工序至少需要工作的次数;

步骤S2、对初始编码链进行解码:自左向右遍历所述初始编码链,判断当前指向的编号所对应的子工序是否符合所有加工条件,若是,则将当前指向的编号所对应的子工序添加到结果集合中,更新资源占用后继续进行遍历,若否,则继续进行遍历直至所述初始编码链的长度为0,获取当前结果集合并计算该结果对应的总工时;

步骤S3、生成新编码链:设有多组破坏算子和修复算子,采用自适应大邻域搜索算法,使用所述破坏算子破坏当前编码链,然后使用所述修复算子修复被破坏的编码链,生成新编码链,所述自适应大邻域搜索算法在迭代时基于所述破坏算子和所述修复算子的权重选择算子;

步骤S4、对新编码链进行解码:对所述步骤S3生成的新编码链进行解码,解码方法与对所述初始编码链进行解码的方法相同;

步骤S5、通过判断当前解是否优于最优解以及采用模拟退火算法Metropolis准则判断是否以概率P接受劣解,从而判断是否将当前解替换最优解,以及是否将当前结果集合替换最优结果集合;

步骤S6、判断是否达到迭代次数,若是则输出最优结果集合,若否则跳转至所述步骤S3。

更进一步说明,所述步骤S2具体包括以下步骤:

步骤S21、自左向右遍历所述初始编码链,遍历时判断当前指向的编号所对应的子工序是否符合所有加工条件,若是,则将当前指向的编号所对应的子工序添加到结果集合中,并将该编号从所述初始编码链中删除,更新资源占用,并跳转至步骤S22,若否,则跳转至步骤S23;

步骤S22、判断所述初始编码链的长度是否为0,若是,则获取当前结果集合并计算该结果对应的总工时,若否,则跳转至步骤S23;

步骤S23、判断是否已经遍历到所述初始编码链的最右端,若是,则设置当前位置跳转至编码链的最左端,然后从当前位置继续往右遍历所述初始编码链,若否,则从当前位置继续往右遍历所述初始编码链,遍历时判断当前指向的编号所对应的子工序是否符合所有加工条件,若是,则将当前指向的编号所对应的子工序添加到结果集合中,并将该编号从所述初始编码链中删除,更新资源占用,并跳转至步骤S22,若否,则重复步骤S23。

更进一步说明,所述步骤S2中,所述加工条件至少包括以下三个加工条件:

(1)前置子工序的完工数量≥后置子工序的开工数量;

(2)当前的资源剩余量≥所述子工序的资源需求量;

(3)所述子工序的结束时间与开始时间在同一天。

更进一步说明,所述步骤S1中,所述子工序包括多个装配工序和多个加工工序,所述装配工序位于所述初始编码链的最左端。

更进一步说明,所述步骤S3中,使用所述破坏算子破坏当前编码链中的所述加工工序,然后使用所述修复算子修复被破坏的编码链中的所述加工工序,采用多次随机互换两个工序位置的方法对所述装配工序的排列进行更新,生成新编码链。

更进一步说明,所述步骤S3中,对所述破坏算子和所述修复算子进行权重更新,所述自适应大邻域搜索算法在迭代时,基于所述破坏算子和所述修复算子的权重以及轮盘赌的方式选择算子。

更进一步说明,所述步骤S3中,采用以下公式对所述破坏算子和所述修复算子进行权重更新:

其中wd为算子权重,sd为算子分数,ud为算子的使用次数,ρ为权重更新系数。

更进一步说明,所述算子分数的计算方法为在每个迭代过程根据所述破坏算子和所述修复算子的表现情况进行加分,包括以下加分情况:

若所述破坏算子对当前编码链进行破坏后或者所述修复算子对被破坏的编码链进行修复后得到新的最优解,则加1.5分;

和当所述破坏算子对当前编码链进行破坏后或者所述修复算子对被破坏的编码链进行修复后没有得到新的最优解时:

若采用模拟退火算法Metropolis准则以概率P接受劣解,则加0.8分;

若不接受采用模拟退火算法Metropolis准则得出的劣解,则加0.3分。

更进一步说明,所述步骤S5中,采用模拟退火算法Metropolis准则判断是否以概率P接受劣解,采用以下公式计算所述概率P:

P=e(-|bestTime-tempTime|)/T

其中e为自然底数,bestTime为当前最优结果集合对应消耗的总工时,tempTime为当前结果集合对应消耗的总工时,T为当前迭代温度。

更进一步说明,所述步骤S5具体包括以下步骤:

步骤S51、判断当前解是否优于最优解,若是,则将当前解替换最优解以及将当前结果集合替换最优结果集合,降温并更新解后跳转至步骤S6,若否,则跳转至下一步;

步骤S52、判断是否以概率P接受劣解,若是,则将当前解替换最优解以及将当前结果集合替换最优结果集合,降温并更新解后跳转至步骤S6,若否,则直接跳转至步骤S6。

与现有技术相比,本发明的实施例具有以下有益效果:

1、通过采用自适应大邻域搜索算法,即根据以往表现对各个所述破坏算子和所述修复算子进行权重调整,得到新的权重后,算法对所述破坏算子和所述修复算子进行选择,使所述破坏算子和所述修复算子被选中的概率与其权重表现成正比,使用高效的组合方法,提高算法寻优能力,找到较优解,避免了盲目随机搜索带来的完全随机性;

2、由于在搜索过程中,若只接受优解容易陷入局部最优,为了避免这种情况,本发明通过采用模拟退火算法Metropolis准则,在一定概率P下接受劣解,加强了方法的跳出局部最优的能力;

3、本发明采用启发式的思想,用少量的解的质量换取大量的时间上的节省,即在较短的时间内获取一个可以接受的与最优解相差不大的较优解。与整数规划法相比,本发明方法具有求解速度快,收敛速度快,节省内存,运行门槛低等特点,同时也能很好的适用在较大规模排产优化问题的求解上。

4、由于目前已有的大多数方法对于排产的研究都只是针对零散零件,对于带有装配关系的排产研究较少,本发明采用装配与零件加工分治的思想,可以在只研究零散零件时将装配工序去掉后正常计算即可,既适用于零散零件,也适用于带有装配关系的排产优化问题,对两者都有较好的求解效果,普适性强,而且在大规模的排产优化问题下,本发明能快速求解出一个与最优解相差不大的、可以接受的理想较优解,且用时比整数规划法等方法的时间要少。

附图说明

图1是本发明一个实施例的基于ALNS改进模拟退火的排产优化方法的流程图;

图2是本发明一个实施例的基于ALNS改进模拟退火的排产优化方法的步骤S1构建初始编码链的示意图;

图3是本发明一个实施例的基于ALNS改进模拟退火的排产优化方法的步骤S2对初始编码链进行解码的示意图;

图4是本发明一个实施例的基于ALNS改进模拟退火的排产优化方法的步骤S3生成新编码链时使用破坏算子破坏当前编码链的示意图;

图5是本发明一个实施例的基于ALNS改进模拟退火的排产优化方法的步骤S3生成新编码链时使用修复算子修复被破坏的编码链的示意图。

具体实施方式

下面详细描述本发明的实施方式,实施方式的示例在附图中示出,其中,相同或类似的标号自始至终表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施方式是示例性的,仅用于解释本发明,而不能理解为对本发明的限制。

流程图中或在此以其他方式描述的任何过程或方法描述可以被理解为,表示包括一个或更多个用于实现特定逻辑功能或过程的步骤的可执行指令的代码的模块、片段或部分,并且本发明的优选实施方式的范围包括另外的实现,其中可以不按所示出或讨论的顺序,包括根据所涉及的功能按基本同时的方式或按相反的顺序,来执行功能,这应被本发明的实施例所属技术领域的技术人员所理解。

如图1所示,一种基于ALNS改进模拟退火的排产优化方法,包括以下步骤:

步骤S1、构建初始编码链:集合商品的各个半成品所需要的子工序,并对每个所述子工序进行编号排列,每个所述子工序对应一个编号,完成初始编码链的构建,每个编号在所述初始编码链中的个数代表所述初始编码链的对应的子工序至少需要工作的次数;

步骤S2、对初始编码链进行解码:自左向右遍历所述初始编码链,判断当前指向的编号所对应的子工序是否符合所有加工条件,若是,则将当前指向的编号所对应的子工序添加到结果集合中,更新资源占用后继续进行遍历,若否,则继续进行遍历直至所述初始编码链的长度为0,获取当前结果集合并计算该结果对应的总工时;

步骤S3、生成新编码链:设有多组破坏算子和修复算子,采用自适应大邻域搜索算法,使用所述破坏算子破坏当前编码链,然后使用所述修复算子修复被破坏的编码链,生成新编码链,所述自适应大邻域搜索算法在迭代时基于所述破坏算子和所述修复算子的权重选择算子;

步骤S4、对新编码链进行解码:对所述步骤S3生成的新编码链进行解码,解码方法与对所述初始编码链进行解码的方法相同;

步骤S5、通过判断当前解是否优于最优解以及采用模拟退火算法Metropolis准则判断是否以概率P接受劣解,从而判断是否将当前解替换最优解,以及是否将当前结果集合替换最优结果集合;

步骤S6、判断是否达到迭代次数,若是则输出最优结果集合,若否则跳转至所述步骤S3。

如图2所示,首先找出每种商品所关联的半成品,然后找出每个半成品所需要的子工序,将所有商品的半成品的子工序集合在一起,给予所有子工序从0~85(子工序种类数-1)的编号(在本实施例中,编号为0~85),每一个数字对应着一个子工序,这样就创建了一个子工序编码链,这条初始编码链代表车间所要完成的所有订单,每个编号对应的子工序在编码链中的个数代表该子工序至少需要工作的次数,例如编号0和编号4对应的子工序至少需要工作两次才能完成所有订单,编号80对应的子工序,至少需要工作一次才可以完成所有订单。其中,每个子工序至少需要工作的次数是根据商品数量层层递推得到子工序需要加工的半成品的数量,然后默认每个子工序都会以自身最大的加工数量进行加工得到的,例如所有订单共有11个某类半成品需要经过编号0对应的子工序的加工才能获得,且编号0对应的子工序一次性最多可以加工6个该类半成品,那么完成所有订单至少需要编号0对应的子工序工作2次;

有了编码链之后,问题就变成如何将这些子工序进行排序才能使得所有订单完成的时间最短。本发明将每一个子工序看成一个独立的子链体,编码链由一个个子链体组合而成,如图3所示,通过从左往右遍历编码链,判断当前指向的链体对应的子工序是否符合加工条件,如果满足所有加工条件,那么便将其放入一个结果集合中,那么可以把当前指向的链体对应的子工序添加到结果集合中,更新资源占用(更新资源占用指假设当前资源剩余量为100,某子工序资源占用量为15,则当该子工序被添加到结果集合后,对资源剩余量进行更新为85)后继续往后遍历,如果不符合所有加工条件,则不会对该子工序做任何操作,继续对后面的子工序进行遍历,结果集合可以看做是一个个分钟块组成的,每一块中的子工序代表该子工序在那一分钟开始加工。这个结果集合的长度是可变的,结果集合的长度就代表完成所有订单需要的时间,对此,本发明以完成所有订单所用的时间作为目标函数,使用基于模拟退火Metropolis准则的自适应大领域搜索算法对最低目标函数值进行搜索。

由于一个编码链对应着一个结果集合,一个结果集合对应着用该结果集合中子工序的顺序完成所有订单所需要的消耗的总时间。为了寻找消耗总工时较少的结果集合,需要获得更多可能的编码链,本发明采用基于ALNS自适应大邻域搜索思想以一定数量的破坏算子和一定规则破坏编码链,然后用修复算子重新对破坏后的编码链进行修复,从而获得新的编码链。在对新编码链进行解码后,通过判断当前解是否优于最优解以及采用模拟退火算法Metropolis准则判断是否以概率P接受劣解,从而判断是否将当前解替换最优解,以及是否将当前结果集合替换最优结果集合,搜索过程中,若只接受优解容易陷入局部最优,为了避免这种情况,本发明采用一定准则接受劣解,本发明采用模拟退火算法Metropolis准则,以一定概率P接受劣解。

本发明采用了自适应大邻域搜索算法,即根据以往表现对各个所述破坏算子和所述修复算子进行权重调整,得到新的权重后,算法对所述破坏算子和所述修复算子进行选择,使所述破坏算子和所述修复算子被选中的概率与其权重表现成正比,使用高效的组合方法,提高算法寻优能力,找到较优解,避免了盲目随机搜索带来的完全随机性;

进一步地,本发明采用了模拟退火算法Metropolis准则,由于在搜索过程中,若只接受优解容易陷入局部最优,为了避免这种情况,本发明采用所述模拟退火算法Metropolis准则,在一定概率P下接受劣解,加强了方法的跳出局部最优的能力;

进一步地,本发明采用启发式的思想,用少量的解的质量换取大量的时间上的节省,即在较短的时间内获取一个可以接受的与最优解相差不大的较优解。与整数规划法相比,本发明方法具有求解速度快,收敛速度快,节省内存,运行门槛低等特点,同时也能很好的适用在较大规模排产优化问题的求解上。

本发明采用基于ALNS改进模拟退火的方法,可以较快地搜索出符合约束条件且总工时消耗较少的生产顺序,与传统人工排产方式相比,得到的结果更加科学,且计算时间更短,有效提高了企业生产效率,且对企业的生产计划安排和任务管理起到较大的指导作用。

更进一步说明,所述步骤S2具体包括以下步骤:

步骤S21、自左向右遍历所述初始编码链,遍历时判断当前指向的编号所对应的子工序是否符合所有加工条件,若是,则将当前指向的编号所对应的子工序添加到结果集合中,并将该编号从所述初始编码链中删除,更新资源占用,并跳转至步骤S22,若否,则跳转至步骤S23;

步骤S22、判断所述初始编码链的长度是否为0,若是,则获取当前结果集合并计算该结果对应的总工时,若否,则跳转至步骤S23;

步骤S23、判断是否已经遍历到所述初始编码链的最右端,若是,则设置当前位置跳转至编码链的最左端,然后从当前位置继续往右遍历所述初始编码链,若否,则从当前位置继续往右遍历所述初始编码链,遍历时判断当前指向的编号所对应的子工序是否符合所有加工条件,若是,则将当前指向的编号所对应的子工序添加到结果集合中,并将该编号从所述初始编码链中删除,更新资源占用,并跳转至步骤S22,若否,则重复步骤S23。

所述步骤S2中,循环遍历直到编码链长度为0(即所有编码都被存进了结果集合),每次遍历到编码链最右端又会返回到编码链最左端重新往右遍历,每一次从编码链最右端返回到编码链最左端的过程就是加一分钟的过程,即从上一分钟到下一分钟的过程,如果遍历一次之后,有子工序不满足任意一个条件,那么就跳到下一分钟进行遍历(在分钟跳转时,资源和前后置约束都将会进行更新,比如上一分钟有些子工序可能占用了资源,但是下一分钟,这些子工序正好工作完毕,那么在下一分钟的遍历中,原本不满足任意一个约束的工序将有可能满足资源约束条件,从而有可能被选进结果集合),最终获取到工序顺序的结果集合,解码方法简单。

更进一步说明,所述步骤S2中,所述加工条件至少包括以下三个加工条件:

(1)前置子工序的完工数量≥后置子工序的开工数量;

(2)当前的资源剩余量≥所述子工序的资源需求量;

(3)所述子工序的结束时间与开始时间在同一天。

由于有一些子工序需要等待前面的一些子工序加工完毕之后才可以运行,也就是只有当前置子工序的完工数量≥后置子工序的开工数量时,后置子工序才可以进行工作,从而保证前置子工序完工数量足够支撑后置子工序的运行;限定当前的资源剩余量≥所述子工序的资源需求量,保证当前时刻的资源足够支撑子工序的运行;所述子工序的结束时间与开始时间在同一天,使得子工序的加工不会延迟上班时间,保证解码效果。

更进一步说明,所述步骤S1中,所述子工序包括多个装配工序和多个加工工序,所述装配工序位于所述初始编码链的最左端。

所述装配工序位于所述初始编码链的最左端,考虑到装配车间和加工车间的资源是相互独立的,为了提高效率,一旦有符合加工条件的装配工序,此时立刻执行它是最好的选择,由于装配工序往往需要在第一时间被执行,即只要装配工序的所有前置产品准备就绪,那么我们就会立即进行装配,因此装配工序需要始终位于编码链的最左端,而本方法的遍历顺序是从左往右依次遍历的,所以将装配工序置于编码链的最左端可以在第一时间遍历到装配工序并将其放入到结果集合,提高遍历效率。

本发明所述基于ALNS改进模拟退火的排产优化方法的普适性强,由于目前已有的大多数方法对于排产的研究都只是针对零散零件,对于带有装配关系的排产研究较少,本发明采用装配与零件加工分治的思想,可以在只研究零散零件时将装配工序去掉后正常计算即可,既适用于零散零件,也适用于带有装配关系的排产优化问题,对两者都有较好的求解效果,而且在大规模的排产优化问题下,本发明也能快速求解出一个与最优解相差不大的、可以接受的理想较优解,且用时比整数规划法等方法的时间要少。

更进一步说明,所述步骤S3中,使用所述破坏算子破坏当前编码链中的所述加工工序,然后使用所述修复算子修复被破坏的编码链中的所述加工工序,采用多次随机互换两个工序位置的方法对所述装配工序的排列进行更新,生成新编码链。

如图4和图5所示,所述破坏算子用于破坏编码链,随机破坏移除节点(由于所述装配工序需要始终位于编码链最左,所以破坏算子的作用仅限于加工工序),所述修复算子用于修复被破坏的编码链,对于所述装配工序,本发明采用多次随机互换两个工序的位置的方法进行更新,也即所述破坏算子仅限于所述加工工序,避免所述加工工序插入到所述装配工序的左边,始终保持所述装配工序位于编码链的最左端。

其中,“多次随机互换两个工序位置”的方法具体如下:比如一组数字[1,2,3,4],进行一次随机两个数字互换位置后得到[3,2,1,4],多次重复这个过程就是“多次随机互换”,采用该方法对所述装配工序的排列进行更新,实现简单,运行速度快。

更进一步说明,所述步骤S3中,对所述破坏算子和所述修复算子进行权重更新,所述自适应大邻域搜索算法在迭代时,基于所述破坏算子和所述修复算子的权重以及轮盘赌的方式选择算子。

本发明所述步骤S3中,通过动态调整所述破坏算子和修复算子的权重并选择(自适应过程),算法在迭代时根据算子权重和轮盘赌的方式调整、选择所述破坏算子和修复算子,通过设计多组所述破坏算子和修复算子,扩大了编码链空间更新范围,对当前编码链进行更新,表现好的破坏和修复方法相应地得到高分,权重也越高。在每次迭代中,根据以往表现对各个破坏和修复算子进行选择和权重调整,使用高效的组合方法,提算法寻优能力,从而找到较优解。

更进一步说明,所述步骤S3中,采用以下公式对所述破坏算子和所述修复算子进行权重更新:

其中wd为算子权重,sd为算子分数,ud为算子的使用次数,ρ为权重更新系数。

所述破坏算子和所述修复算子的权重按公式1进行更新,式中,wd为算子权重,sd为算子分数,ud为算子的使用次数,ρ为权重更新系数(控制权重变化的速度)。其实就是:算子新权重=算子旧权重×(1-系数)+系数×(累加分数÷累加次数),将算子权重与以往表现挂钩,得到新的权重后,算法基于轮盘赌的思想对算子进行选择,使算子被选中的概率与其权重表现成正比,提高算法寻优能力,找到较优解。

更进一步说明,所述算子分数的计算方法为在每个迭代过程根据所述破坏算子和所述修复算子的表现情况进行加分,包括以下加分情况:

若所述破坏算子对当前编码链进行破坏后或者所述修复算子对被破坏的编码链进行修复后得到新的最优解,则加1.5分;

和当所述破坏算子对当前编码链进行破坏后或者所述修复算子对被破坏的编码链进行修复后没有得到新的最优解时:

若采用模拟退火算法Metropolis准则以概率P接受劣解,则加0.8分;

若不接受采用模拟退火算法Metropolis准则得出的劣解,则加0.3分。

在开始时,所有所述破坏算子和所述修复算子均具有相同的权重和分数,而所述破坏算子和所述修复算子的分数,则是在每个迭代过程中,根据算子的不同表现情况阶梯式给分,得分越高表明算子表现越好,得到新的权重后,算法基于轮盘赌的思想对算子进行选择,使算子被选中的概率与其权重表现成正比,提高算法寻优能力,找到较优解。

更进一步说明,所述步骤S5中,采用模拟退火算法Metropolis准则判断是否以概率P接受劣解,采用以下公式计算所述概率P:

P=e(-|bestTime-tempTime|)/T,其中e为自然底数,bestTime为当前最优结果集合对应消耗的总工时,tempTime为当前结果集合对应消耗的总工时,T为当前迭代温度。

搜索过程中,若只接受优解容易陷入局部最优,为了避免这种情况应,本发明采用模拟退火算法Metropolis准则以一定概率P接受劣解,其中bestTime为当前最优结果集合对应消耗的总工时,tempTime为当前结果集合对应消耗的总工时,采用此公式的好处在于,可以根据当前解与最优解之间的差距和当前迭代温度T,动态地调整接受劣解概率P的大小,在迭代温度T一定时,当前解与最优解相差越大,概率P越小;当前解与最优解差距一定时,迭代温度T越大,概率P越大,即在迭代前期,本方法会以较大概率P接受劣解,且会以更大概率接受与最优解相差较小的当前解,这样做增加了方法跳出局部最优的概率,使得本方法具有更好的搜索能力。

更进一步说明,所述步骤S5具体包括以下步骤:

步骤S51、判断当前解是否优于最优解,若是,则将当前解替换最优解以及将当前结果集合替换最优结果集合,降温并更新解后跳转至步骤S6,若否,则跳转至下一步;

步骤S52、判断是否以概率P接受劣解,若是,则将当前解替换最优解以及将当前结果集合替换最优结果集合,降温并更新解后跳转至步骤S6,若否,则直接跳转至步骤S6。

通过判断当前解是否优于最优解以及采用模拟退火算法Metropolis准则判断是否以概率P接受劣解,从而判断是否将当前解替换最优解,以及是否将当前结果集合替换最优结果集合,本发明采用所述模拟退火算法Metropolis准则,在一定概率P下接受劣解,加强了方法的跳出局部最优的能力。

尽管已经示出和描述了本发明的实施例,本领域的普通技术人员可以理解:在不脱离本发明的原理和宗旨的情况下可以对这些实施例进行多种变化、修改、替换和变型,本发明的范围由权利要求及其等同物限定。

完整详细技术资料下载
上一篇:石墨接头机器人自动装卡簧、装栓机
下一篇:基于服务水平的城市防疫封锁线优化设计软件

网友询问留言

已有0条留言

还没有人留言评论。精彩留言会获得点赞!

精彩留言,会给你点赞!