最短移臂调度算法_论文 | 一种有趣的装配序列规划算法

一种有趣的装配序列规划算法

作者:张楠

(浙江大学 在读博士)

7c3704424ab3b7766e82e59ef8d2cbee.png

精要导读

7c3704424ab3b7766e82e59ef8d2cbee.png

问题背景

在正式介绍装配序列规划之前,多嘴几句。学过数据结构的同学们可能听说过TSP(Travel Salesman Problem),旅行商问题。这是一个计算机科学领域里一个非常著名的问题,著名就著名在它的模型简单明确,然而这么多年过去了,仍找到行之有效的多项式时间内的算法(就是快的算法)。

6f3ebac999cb564e3536d95947c1692b.png

cfdecb0d555db3dd6da08364bd073a1c.png

这个问题是这样的,有一位旅行商,他要去几个不同的城市(假设是5个吧),同时想确保旅程(目标函数)最短,那他能怎么走呢?

他可以这样走(北京-南京-杭州-台湾-上海):

ef965bfbdad6f83d4c82880f103b7b74.png

也可以这样走(北京-上海-南京-杭州-台湾):

ef7f6556a72a87712e8cf0724713e0d7.png

还可以这样走(南京-北京-上海-杭州-台湾):

3a96bc823556fab4b27401b5bdc00343.png

这样的话,一共有5!=120种走法,想要知道最短的路线就得走120次才能选出来。是不是听起来也还行,也就120种,你再瞅瞅:

7d382b64c3a5e3af32ee0544db89f114.png

随着城市数量的增长,可以选择的路线数量就指数爆炸地增长,运行时间为O(n!),这个时间有多可怕呢(假设每秒10次操作(当然是往小了说( ͡°ᴥ ͡° ʋ))):

8c47b5c2126f126608f63bef515e8066.png

看见没,16个城市就6W年,就问你怕不怕(咳咳...)。旅行商就是这么个求路线序列的问题,总而言之是很难的(如果你想要最好的结果)。

言归正传,装配序列规划也是这么个问题,简单来说,就是装配一个产品的顺序。我们先来看下面这个笔:

ec4ddf2b0b961a77d27c768fbc2a5223.png

这个笔由五部分组成,笔帽,笔头,笔芯,笔夹,笔身。显然我们有很多种方式可以把它组装起来(笔帽-笔头-笔芯-笔夹-笔身,笔头-笔芯-笔夹-笔身-笔帽,等等...),但如果我们把笔芯放在最后呢?这个笔是不是就装不成了(笔芯是最里面的那玩意,外面都装好了,里面的还能塞进去麽)。这个时候约束就来了,笔芯要在笔头或笔夹装完,大概(就只是大概)是这么个样子

f96af0e75c4abb8ce54e6efcdd1040b4.png

有了这个约束,是不是方便了很多!解空间一下子小了很多(非常完美)!不过这个领域(虽然已经老掉牙了ლ( ლ))用这种图表述约束也不是特别频繁,还有很多其他方式,优先矩阵啦,干涉矩阵啦,其他一堆乱七八糟的。

上面这个笔看起来这样装,那样装好像并没有啥区别,都能装上的样子。但对于一个复杂的机械产品来说,就不那么容易了,每一个工序都可能涉及到复杂的装配流程、装配工具、blablabla,总之就是难(HEHE)!所以目标函数又来了!我们要优化的就是这玩意:

6097f4a0eb17fb083e8aaed9b35b7f35.png

这是装配序列规划的一个基本的目标函数,D代表装配方向,T代表装配工具,他们的权重和就是要优化的目标值,越小越好。

这一段落告一段落((・◇・))。

一个还行的算法

装配序列规划这一块儿的通用编码规则是实数编码,就是【1,2,3,4,5,6,7,8,9】这样的,表示一个产品的完整的装配顺序,也不用解码,简单粗暴。

这一块儿大家是怎么优化的呢,刚开始的时候各种精确算法也在提,还是那问题,计算量大,而且这领域也不一定非要最优值,近几年基本就是采用各种元启发算法(metaheuristic)(进化算法,种群算法,模拟退火,禁忌算法),计算速度也不错,优化结果也不错。各种元启发算法的本质(我猜的,小声哔哔)是交换序列的顺序,可能是个体(1-2变2-1),可能是子段(123-456换成456-123),然后加上各种花里胡哨的迭代技巧。当然还有一部分Estimation of distribution algorithms,是依靠概率分布来猜测最优序列的,我复现过的分布估计算法效果都很一般,所以没有再深挖(欢迎探讨)。

上述的这些都是把序列都当做一个整体来对待的,先生成序列,再优化序列。那如果从局部出发呢?动态规划?贪婪算法?那如果把种群的概念再引进来呢,是不是就肥肠优秀了。

优先约束图这时候就发挥出了作用(为你骄傲)!用下面这个图来解释一下:

70f669a2a8dd180c8c741357fa922e59.png

65d5f794c6ea8ef8d6d966626d8555ba.png

很多文献中序列是随机生成的,然后用优先关系,干涉矩阵去判断它是否满足约束,这就导致生成和判定解的可行性花去了很多时间(大把的光阴啊,浪费可耻)。那如果直接利用上图中的优先关系来生成序列,就不存在不满足约束的解,大大缩小了解空间(就这么简单)。好了,第一步怎么生成可行解已经解决了。我们来看第二步,怎么来寻优

这个算法的精髓是从局部出发,在构造完整序列的过程中引入种群的概念(其实就是在多个解里面挑选)。下面这个gif完整地展现了算法的寻优过程。

a8dc24d4f2a8a2a4fa01a6e87e115dd1.gif

看懂了吗?就问你是不是肥肠简单(〃'▽'〃)?首先设定好种群数目(gif里是5),然后利用优先权关系生成个体下一代的子集,再根据目标函数排个序(Attention!!!不仅仅是根据目标值的好坏排序,也考虑了差异性),选好下一代的种群,就万事大吉啦!寻优就这么结束啦!

这个算法还有一个好处(─━ _ ─━✧王婆卖瓜):就是它的迭代次数!由于是从局部出发,所以整个算法的迭代次数只需要【零件的个数】次,有多少个零件,就迭代多少次!这个就很**(优秀的意思)了啊,毕竟迭代次数的减少就以为着计算时间的减少

算法讲完了,我们再告一段落((・◇・)?)。

爆锤其它算法

懒得作图了(╭(╯^╰)╮),直接贴表。

6e2b72fdc2e8e8afe594b1604848a157.png

这里对三个产品,五种算法进行测试,分别是Rack,9个零件;Vise,19个零件,Train,40个零件。我们可以看到,无论是最优(Min)还是是平均(Average),方差(SD),尤其在计算时间上(Ave CPU),这个算法都取得明显的优势(是不是很棒呀o( ̄▽ ̄)d)。这个算法后续应用在并列装/拆领域(类似于车间调度),仍然取得非常不错的结果。当然,虽然这个算法在这些领域有很不错的效果,但仍然存在很明显的漏洞与不足(o(╥﹏╥)o,不告诉你),我暂时没想到很好的改进机制,希望有兴趣的同学可以一起探讨一下~

告最后一段落((・◇・)?)。。。

还是做个总结吧

由于个人精力和能力有限,只对这个领域内的方法进行了研究与比较。但我知道在某个我还未注意到的角落里存在着更加有趣好玩的算法,做这篇推文的目的也是想获得更多不同领域内大佬的关注,用你们的算法来解决我们的问题。

希望大家多多分享,有交流碰撞才有磕盐的火花嘛~让我们一起做点有趣的事。(O(∩_∩)O)

祝大家永葆赤子之心。

从这抄来的

1.Aditya Bhargava, 袁国忠(译), 算法图解:像小说一样有趣的算法入门书, 人民邮电出版社

2.Mohd Fadzil Faisae Ab Rashid, A hybrid Ant-Wolf Algorithm to optimize assembly sequence planning problem, Assembly Automation

3.N. Zhang, Z. Y. Liu, et al. A Fast and Effective Assembly Sequence Planning using Precedence Graph-based Assembly Subsets Prediction Method, Assembly Automation

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值