打孔论文
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2012年“深圳杯”全国大学生数学建模竞赛
承诺书
我们仔细阅读了中国大学生数学建模竞赛的竞赛规则.
我们完全明白,在竞赛开始后参赛队员不能以任何方式(包括电话、电子邮件、网上咨询等)与队外的任何人(包括指导教师)研究、讨论与赛题有关的问题。
我们知道,抄袭别人的成果是违反竞赛规则的, 如果引用别人的成果或其他公开的资料(包括网上查到的资料),必须按照规定的参考文献的表述方式在正文引用处和参考文献中明确列出。
我们郑重承诺,严格遵守竞赛规则,以保证竞赛的公正、公平性。
如有违反竞赛规则的行为,我们将受到严肃处理。
我们参赛选择的题号是(从A/B/C/D中选择一项填写): D
我们的参赛报名号为(如果赛区设置报名号的话):
所属学校(请填写完整的全名):
参赛队员(打印并签名) :1.
2.
3.
指导教师或指导教师组负责人(打印并签名):马志宏
日期: 2012 年 5 月 20 日赛区评阅编号(由赛区组委会评阅前进行编号):
2012年“深圳杯”全国大学生数学建模竞赛
编号专用页
赛区评阅编号(由赛区组委会评阅前进行编号):
全国统一编号(由赛区组委会送交全国前编号):全国评阅编号(由全国组委会评阅前进行编号):
打孔机生产效能的提高
摘要
本文对印刷电路板过孔的生产效益如何提高进行了研究。
打孔机在加工作业时,钻头的行进时间和刀具的转换时间是影响生产效益的两个因素。
在完成一个电路板的过孔加工时,钻头行进时间和刀具转换总时间越短,生产效益越高。
钻头行进总时间由钻头进行路线决定,而刀具转换总时间由线路板上由各孔的位置以及钻头行进方案决定。
对于第一问,根据数据的分析整理,知道钻头钻孔方式采用一种刀具钻完对应的全部孔,再转换到其他刀具进行打孔。
所以我们构造出刀具的最优转换方案,为d→e →f→g→h→a→b→c→d→e→f→e→d,再采用遗传算法算法求出各刀具过孔的最优路径,并求出其运行总路程15532.85mm、运行时间302.29s和费用为957.17元。
对于第二问,当打孔机设计成双钻头时,由于作业时各钻在要求范围之内。
得出双钻头运行时间与费用后,再与单钻头最优加工路径相比较头相互独立,且有合作间距的限制,因此在解决双钻头最优作业方案时,我们在单钻头作业的基础上再加上另一个钻头作业所需的各种费用并增加约束条件,还是优先构造出甲乙两个刀具的转换方案,钻头甲:a→b→c→d→e→f→g→h→a;钻头乙:b→a→h→g→f→e→d→c→b,利用遗传算法得出钻头甲的最优路径图,求出钻头甲行进总路程为8870.81mm,花费时间为193.28s,钻头甲行进总路程为7758.69mm,花费时间为197.10s,综合后得到双钻头模型行进总路程为16629.50mm,花费时间为197.10s,费用为1031.37元。
比较单钻头方案与双钻头方案,双钻头方案能大大缩打孔机加工时间,有效提高了打孔机的加工质量、加工效率、生产效能。
关键词: 遗传算法优化模型路径优化生产效益
一、 问题的重述
过孔是印刷线路板(也称为印刷电路板)的重要组成部分之一,过孔的加工费用通常占制板费用的30%到40%,打孔机主要用于在制造印刷线路板流程中的打孔作业。
本问题旨在提高某类打孔机的生产效能。
打孔机的生产效能主要取决于以下几方面:(1)单个过孔的钻孔作业时间,这是由生产工艺决定,为了简化问题,这里假定对于同一孔型钻孔作业时间都是相同的;(2)打孔机在加工作业时,钻头的行进时间;(3)针对不同孔型加工作业时,刀具的转换时间。
目前,实际采用的打孔机普遍是单钻头作业,即一个钻头进行打孔。
现有某种钻头,上面装有8种刀具a ,b ,c ,… , h ,依次排列呈圆环状(如图1所示),
图1:某种钻头上8种刀具的分布情况
而且8种刀具的顺序固定,不能调换。
在加工作业时,一种刀具使用完毕后,可以转换使用另一种刀具。
相邻两刀具的转换时间是18 s ,例如,由刀具a 转换到刀具b 所用的时间是18s ,其他情况以此类推。
作业时,可以采用顺时针旋转的方式转换刀具,例如,从刀具a 转换到刀具b ;也可以采用逆时针的方式转换刀具,例如,从刀具a 转换到刀具h 。
将任一刀具转换至其它刀具处,所需时间是相应转换时间的累加,例如,从刀具a 转换到刀具c ,所需的时间是36s (采用顺时针方式)。
为了简化问题,假定钻头的行进速度是相同的,为180 mm/s ,行进成本为0.06元/mm ,刀具转换的时间成本为7元/min 。
刀具在行进过程中可以同时进行刀具转换,但相应费用不减。
不同的刀具加工不同的孔型,有的孔型只需一种刀具来完成,如孔型A 只用到刀具a 。
有的孔型需要多种刀具及规定的加工次序来完成,如孔型C 需要刀具a 和刀具c
,b c d e f g
h
a
且加工次序为a ,c 。
表1列出了10种孔型所需加工刀具及加工次序(标*者表示该孔型对刀具加工次序没有限制)。
表1:10种孔型所需加工刀具及加工次序
一块线路板上的过孔全部加工完成后,再制作另一线路板。
但在同一线路板上的过孔不要求加工完毕一个孔,再加工另一个孔,即对于须用两种或两种以上刀具加工的过孔,只要保证所需刀具加工次序正确即可。
请建立相应的数学模型,并完成以下问题:
(1)附件1提供了某块印刷线路板过孔中心坐标的数据,单位是1/100mil (mil 也称为毫英寸,1 inch=1000 mil ),(坐标图如图2所示),请给出单钻头作业的最优作业线路(包括刀具转换方案)、行进时间和作业成本。
-4-3-2-101234
5x 105
5图2:印刷版孔坐标图
(2)为提高打孔机效能,现在设计一种双钻头的打孔机(每个钻头的形状与单钻头相同),两钻头可以同时作业,且作业是独立的,即可以两个钻头同时进行打孔,也
可以一个钻头打孔,另一个钻头行进或转换刀具。
为避免钻头间的触碰和干扰,在过孔加工的任何时刻必须保持两钻头间距不小于3cm (称为两钻头合作间距)。
为使问题简化,可以将钻头看作质点。
(i )针对附件1的数据,给出双钻头作业时的最优作业线路、行进时间和作业成本,并与传统单钻头打孔机进行比较,其生产效能提高多少?
(ii )研究打孔机的两钻头合作间距对作业路线和生产效能产生的影响。
二、 问题的分析
印刷线路板过孔加工费用有以下三个因素决定:
1、单个过孔的做空作业时间;
2、打孔机钻头行进时间;
3、针对不同孔型加工作业时,刀具转换时间;
给出最优作业方案,就要使总加工费用最小。
而单个过孔的钻孔作业时间是由生产工艺决定的,在不同打孔方式下不变。
因此,最优作业方案由2、3两个因素决定。
钻头行进时间和刀具转换时间越小,加工总费用越小,作业路线最优。
并且加工总费用Z =刀具行进费用1Z +刀具转换费用2Z 。
钻头行进的路线的确定我们用遗传算法模拟。
令{}0,1ij e ∈,1ij e =当表示(,)i j 在得到的最优路径上;当0ij e =表示(,)i j 不在得到的最优路径上。
通过这个变量建立起路线与费用的桥梁关系,进而写出总费用的表达式。
对此,我们建立优化模型{}{}12min ,..0,1,1,2,ij Z Z Z s t e i j N =+∈∈ 、,
通过遗传算法能较为准确的求出最优解,进而确定最优路线,行进时间和作业成本。
当打孔机设计成双钻头时,由于作业时各钻头相互独立,且有合作间距的限制,因此在解决双钻头最优作业方案时,我们在单钻头作业的基础上再加上另一个钻头作业所需的各种费用并增加约束条件,保证合作间距在要求范围之内。
三、 基本假设
1、单个过孔的钻孔作业时间,这是由生产工艺决定,为了简化问题,这里假设对于同
一孔型钻孔作业时间都是相同的;
2、在计算两孔之间距离时,为了简化问题,这里假设打孔机的钻头看作一个质点;
3、为了计算行进费用,需要计算行进时间,为了简化问题,这里假设打孔机的行进是
一个匀速运动。
4、为避免钻头间的触碰和干扰,假定保持两钻头间距不小于3cm
四、 符号说明
::(,)(,):::ij i i j j i j i j N d i j x y x y i j a b 、孔、孔;
:线路板上所有孔数;
孔到孔之间的距离;
、孔、孔的位置坐标;
单位距离行进费用;
单位时间刀具转换费用;
五、 模型的建立与求解
问题一 单钻头打孔作业
为了提高打孔机的生产效能,就要使印刷线路板的过孔的总费用最小。
而总费用=钻孔作业费用+钻头行进费用+刀具转换费用,并且本题中,生产工艺决定同一孔型作业时间相同,因此线路板的钻空作业费用一定。
所以要使钻头行进费用、刀具转换费用之和最小。
(1)钻头行进费用
11,1N N ij ij i j i j Z ad e ==≠=
∑∑
其中ij d ={}0,1ij e ∈,当1ij e =表示(,)i j 在得到的最优路径上;当0ij e =表示(,)i j 不在得到的最优路径上。
(2)刀具转换费用
①由附件所给数据,我们可以建立各孔的位置坐标与其对应孔型的映射(,)i i f x y ,即若已知某孔的坐标为(,)i i x y ,则其孔型为(,)i i f x y ;
②考虑从i 孔到j 孔的刀具转换的方式,所有可能的转换方法为
{},1,2,3m n i j f f m n →∈、
m i f 表示打i 孔需要m 种刀具;n j f 表示打j 孔需要n 种刀具。
把刀具,,,,a b c h 依次标为1,2,3,,8 。
已知转换相邻两个刀具的时间为18T s =; ③再由钻头上的8种刀具,,,,a b c h 的位置关系可求出由一种刀具转换成另一种刀具所需要的最短时间为T w ⋅,其中w 是由刀具位置关系构造出的函数
4,(mod 4)(mod 0)(mod 4)(mod 0),(mod 4)(mod 0)m n m
n m n i j w i j i j =⎧⎪=⎨-≠⎪⎩ 综合①②③的讨论,刀具的转换费用
21,1N N ij i j i j Z bTwe ==≠=
∑∑
(3)根据题目所给说明,我们知道同种钻孔作业费用是一定,并且印刷线路板上的孔的属性一定,所以完成一个印刷线路板的过孔加工总费用为
12Z Z Z =+
于是,求单钻头作业的最优方案就是如下的优化问题
问题二 双钻头打孔作业
设计双钻头打孔机,两钻头可以同时作业并且两钻头作业相互独立,要使印刷线路板的过孔的总费用最小,只要使钻头行进费用、作业费用之和最小,给出最优作业方案。
由于两个钻头工作是相互独立的,且合作间距已知不小于3cm 。
因此在解决双钻头{}{}12min ..0,1,1,2,ij Z Z Z s t e i j N =+∈∈ 、
最优作业方案时,我们在单钻头作业的基础上再加上另一个钻头作业所需的各种费用并增加约束条件,保证合作间距在要求范围之内。
若钻头1打i孔时钻头2打i'孔,记i孔与i'孔之间的距离为'
ii
d
3,2,1{ ,
,
)
100
/1(
118110
d
}1,0{
..
)
(
)
(
min
'
ii
2
2
1
1
'
''
'
N
i j
i mil
e t s
Z
Z
Z
Z
Z
ij
∈>
∈
+
+
+
=
利用遗传算法求解
遗传算法简述
遗传算法(Genetic Algorithm)是一类借鉴生物界的进化规律(适者生存,优胜劣汰遗传机制)演化而来的随机化搜索方法,是由美国的J.Holland教授1975年首先提出,在组合优化、机器学习、信号处理、自适应控制和人工生命等领域有广泛的应用。
其做法是把问题参数编码为染色体,再利用迭代的方式进行选择、交叉以及变异等运算来交换种群中染色体的信息,最终生成符合优化目标的染色体。
实践证明,遗传算法对于解决TSP 问题等组合优化问题具有较好的寻优性能。
遗传算法的主要特点是直接对结构对象进行操作,不存在求导和函数连续性的限定,具有内在的隐并行性和更好的全局寻优能力,采用概率化的寻优方法,能自动获取和指导优化的搜索空间,自适应地调整搜索方向,不需要确定的规则。
遗传算法的一般流程如图所示。
图3:遗传算法一般流程图
遗传算法的基本运算过程如下:
(1)初始化设置进化代数计数器t=0,设置最大进化代数T,随机生成M个个体作为初始群体P(0)。
(2)个体评价计算群体P(t)中各个个体的适应度。
(3)选择运算将选择算子作用于群体。
选择的目的是把优化的个体直接遗传到下一代或通过配对交叉产生新的个体再遗传到下一代。
(4)交叉运算将交叉算子作用于群体。
所谓交叉是指把两个父代个体的部分结构加以替换重组而生成新个体的操作。
(5)变异运算将变异算子作用于群体。
即是对群体中的个体串的某些基因值作变动。
群体P(t)经过选择、交叉、变异运算之后得到下一代群体P(t1)。
(6)终止判断若t >T,则以进化过程中所得到的具有最大适应度个体作为最优解输出,终止计算。
单钻头模型的求解
转换一次相邻刀具需要18s,刀具转换的时间成本为7元/min,
钻头行进成本为0.06元/mm,1mm=3937.0078740157(1/100mil)
即转换一次相邻刀具的金钱成本可以使得钻头行进35mm=137795.28(1/100mil),该行进距离相对于整块印刷版来说比较长,不可以忽略,在钻头行进时为了专门打另一种刀具所要打的孔型而暂时放下该刀具所进行的工作,为了继续进行原来的刀具工作,还得将刀具转化回去,所以该动作得转换了两次以上的刀具,大大增加了刀具转换的金钱成本,这是不合理的。
因此我们优先考虑最优刀具转换方案。
经过排序得出最优刀具转换方案为:
d→e→f→g→h→a→b→c→d→e→f→e→d
各刀具所要打的孔型对应如(表2)所示
表2:各刀具所要打的孔型对应表
利用matlab 中遗传算法解决tsp 问题可以得出个各刀具对应孔型的最短距离跟最优路线图:如下
x 10
5
5
Total Distance = 5743032.3048
、x 10
5
5
Total Distance = 5696995.2075
图4:DG 孔型路线图 5:DI 孔型路线
x 10
5
5
Total Distance = 4614998.1832
x 10
5
5
Total Distance = 3148879.2262
图6:J 孔型路线图 7:FG 孔型路线
x 10
5
5
Total Distance = 3128594.7342
x 10
5
5
Total Distance = 12842662.9763
图8:FH 孔型路线图 9:AC 孔型路线
510
x 10
5
x 10
5
5
2
4
6
8
10x 10
4
0.51
1.52
2.5
x 10
5
5
Total Distance = 10190620.9218
图10:B 孔型路线图 11:CEIJ 孔型路线
5
x 105
图12:EG孔型路线
表3:刀具转换方案
为了使线路完整,需要将这9个回路组合成一个完整的线路,可以在每个回路中各取一个点,将这些点连接,就能形成完整回路,该些点也是每个回路的起始点,由于数据比较多,这些点的选择对总路程的影响不大,于是可以按照回路图粗略的将这
些点选择出来。
这些点为(-265274,129400);(-265274,129400);(-268400,-65200);(-311300,-52400); (-311300,-52400);(-268400,-54200);(-236000,-59200);(-268400,-54200); (-268400,-65200),按次序连接后路径长度为358905(1/100mil)
钻头行进总路程为60794052+358905=61152957(1/100mil)即15532.85mm 钻头行进时间15532.85mm/180(mm/s)=86.29s 刀具转换总时间为12*18s=216s=3.6min 行进总时间为86.29s+216s=302.29s
完成一个印刷线路板的过孔加工总费用最小为
min 12Z Z Z =+=0.06元/mm *15532.85mm+7元/min*3.6min=957.17元
双钻头模型的求解
由第一问可知,行进总时间为302.29s ,钻头转换的时间为216s ,占了一大部分。
用两个钻头打孔,两个钻头行进总路程之和与单钻头行进总路程相差不会太大,因此双钻头模型主要优化两个钻头的刀具转换方案,使得刀具转换时间尽可能短,同时使得两个钻头工作量尽可能平均。
如下是两个钻头的分配方案:
x 10
5
5
Total Distance = 9579041.6964
x 10
5
5
Total Distance = 6498987.5384
图13:CE 孔型路线图 14:EJ 孔型路线
x 10
5
5
Total Distance = 2268628.2634
x 10
5
5
Total Distance = 4740009.7782
图15:G 孔型路线图 16:IJ 孔型路线
在钻头甲的4个回路图选择的四个点分别为
(436700,907900);(437900,907900),(312200,898200);(447700,907900)
按次序连接后路径长度为260730(1/100mil); 在钻头乙的6个回路图选择的六个点分别为
(-236000,-59200);(-311300,-52400);(-311300,-52400);(-301300,-62400);
(-265274,129400);(-268400,-65200) 按次序连接后路径长度为479528(1/100mil);
钻头甲行进总路程为34924454.52(1/100mil)即8870.81mm
钻头甲行进时间为8870.81mm/180(mm/s)=49.28s 钻头甲刀具转换时间为8*18s=144s=2.4min 钻头甲行进总时间为49.28s+144s=193.28s
钻头乙行进总路程为30545939.27(1/100mil)即7758.69mm 钻头乙行进时间为7758.69mm/180(mm/s)=43.10s
钻头乙刀具转换时间为8*18s=144s=2.4min 钻头乙行进总时间为43.10s+144s=197.10s
钻头甲所花时间多余钻头乙所花时间,所以按照钻头甲计时,所以行进总时间为193.2s
完成一个印刷线路板的过孔加工总费用最小为 min 12Z Z Z =+
=0.06元/mm*(8870.81mm+7758.69mm)+7元/min*(2.4min+2.4min) =997.77元+33.6元=1031.37元
双钻头方案与单钻头相比,费用虽然多花费了74.20元,但是时间却由原来的302.29s 缩短到197.10s ,节约的时间为105.19s ,大大提高了打孔机的生产效能。
由题意可知,打孔机的双钻头合作间距不小于3厘米,在保证此要求的前提下,还需缩短打孔机的作业、刀具转换的、钻头行进时间,以提高生产效能及优化作业路线,则需选择一个合适的打孔机的两钻头合作间距,以得到最优路径,进而减少行进成本以及作业成本。
由于,打孔机的双钻头合作间距会影响作业路线,合作间距控制不合理将会浪费资源,即而会导致两个钻头不同时作业,使加工效率、加工质量降低,以使整体工作时间加长、产品质量下降,且作业总时间与作业成本有直接联系,作业成本与生产效能亦息息相关。
必须选择最合理的合作间距以提高工作效率、工作质量、打孔速度、缩短时间成本,即而缩短作业成本,以达到提高生产效能目的。
路径的最优是缩短钻头的加工路径长度来降低钻头移动时间,其与间距的合理设置密切相关,综上所述,生产效能的提高归根结底是合作间距的合理性。
六、 模型的评价
为了提高打孔机过孔效能,我们使打孔机作业路线最优,作业费用最小,而且加工总费用Z =刀具行进费用1Z +刀具转换费用2Z ,我们建立了优化模型,该模型能够很好的描述NP 不可解问题。
但是对于模型的求解,理论上是把非线性模型化为线性模型,但是实际操作发现无法做到,我们又运用“遗传算法”程序求解,又发现结果不是非常的准确。
在实际打孔机运行时也会出现各种问题,如有的打孔机的走刀线路并非直线,也可能为折线等。
七、参考文献
[1] 姜昌华,胡幼华.一种求解旅行商问题的高效混合遗传算法[J].计算机工程与应用,
2004。
40(22):67.70
[2]李擎,张伟,尹怡欣,等.一种用于最优路径规划的改进遗传算法[J]. 信息与控制,
2006,35(4):444-447.
[3]王霄.PCB 数控钻孔最佳走刀路线的建模与求解[J].计算机辅助设计与图形学学
报,2001,13(7):590.593
[4]周明,孙树栋.遗传算法原理及应用[M].北京:国防工业出版社,1999
[5]田贵超,黎明,韦雪洁.旅行商问题(TSP )的几种求解方法[J].计算机仿真,2006.23(8):153-157.
八、附录
附录一:(孔型坐标部分数据)
附录二:matlab代码
function [opt_rte,opt_brk,min_dist] = mtsp_ga(xy,dmat,salesmen,...
pop_size,num_iter,singles,show_plots,show_waitbar)
if ~nargin % Initialize Example Inputs
n = 孔的数目; dims = 2;
xy = [孔的坐标];
salesmen = 1;
pop_size = 80;
num_iter = 1e4;
singles = 0;
show_plots = 1;
show_waitbar = 1;
try % Compute the Distance Matrix
dmat = distmat(xy); % File Exchange Contribution #15145 catch
a = reshape(xy,1,n,dims);
b = reshape(xy,n,1,dims);
dmat = sqrt(sum((a(ones(n,1),:,:)-b(:,ones(n,1),:)).^2,3));
end
else % Process the Given Inputs
n = size(xy,1);
[nr,nc] = size(dmat);
if nr ~= n || nc ~= n
error('Invalid inputs XY and/or DMA T');
end
end
% Verify Inputs
salesmen = max(1,min(n,round(real(salesmen(1)))));
if ~singles
salesmen = min(floor(n/2),salesmen);
end
pop_size = max(8,8*ceil(pop_size(1)/8));
num_iter = max(2,round(real(num_iter(1))));
singles = logical(singles(1));
show_plots = logical(show_plots(1));
show_waitbar = logical(show_waitbar(1));
% Plot the Cities and the Distance Matrix
if show_plots
hfig = figure('Name','MTSPGA','Numbertitle','off');
subplot(2,2,1);
plot(xy(:,1),xy(:,2),'.');
for k = 1:n
text(xy(k,1),xy(k,2),[' ' num2str(k)],'FontWeight','b');
end
title('City Locations')
subplot(2,2,2);
imagesc(dmat);
colormap(flipud(gray));
title('Distance Matrix');
end
% Initializations for Route Break Point Selection
num_brks = salesmen-1;
addto = ones(1,n-2*num_brks-1);
for k = 2:num_brks
addto = cumsum(addto);
end
cum_prob = cumsum(addto)/sum(addto);
% Initialize the Populations
pop_rte = zeros(pop_size,n); % population of routes
pop_brk = zeros(pop_size,num_brks); % population of breaks for k = 1:pop_size
pop_rte(k,:) = randperm(n);
pop_brk(k,:) = randbreaks();
end
tmp_pop_rte = zeros(8,n);
tmp_pop_brk = zeros(8,num_brks);
new_pop_rte = zeros(pop_size,n);
new_pop_brk = zeros(pop_size,num_brks);
% Select the Colors for the Plotted Routes
clr = [1 0 0; 0 0 1; 0.67 0 1; 0 1 0; 1 0.5 0];
if salesmen > 5
clr = hsv(salesmen);
end
% Run the GA
global_min = Inf;
total_dist = zeros(1,pop_size);
dist_history = zeros(1,num_iter);
if show_plots
pfig = figure('Name','Current Best Solution','Numbertitle','off'); end
if show_waitbar
wb = waitbar(0,'Searching ... Please Wait');
end
for iter = 1:num_iter
% Evaluate Members of the Population
for p = 1:pop_size
d = 0;
p_rte = pop_rte(p,:);
p_brk = pop_brk(p,:);
rng = [[1 p_brk+1];[p_brk n]]';
for m = 1:salesmen
d = d + dmat(p_rte(rng(m,2)),p_rte(rng(m,1)));
for k = rng(m,1):rng(m,2)-1
d = d + dmat(p_rte(k),p_rte(k+1));
end
end
total_dist(p) = d;
end
% Find the Best Route in the Population
[min_dist,index] = min(total_dist);
dist_history(iter) = min_dist;
if min_dist < global_min
global_min = min_dist;
opt_rte = pop_rte(index,:);
opt_brk = pop_brk(index,:);
rng = [[1 opt_brk+1];[opt_brk n]]';
% Plot the Best Route
if show_plots
figure(pfig); hold off;
for m = 1:salesmen
rte = [opt_rte(rng(m,1):rng(m,2)) opt_rte(rng(m,1))];
plot(xy(rte,1),xy(rte,2),'.-','Color',clr(m,:));
title(sprintf('Total Distance = %1.4f',min_dist));
hold on;
end
end
end
% Genetic Algorithm Operators
rand_grouping = randperm(pop_size);
for p = 8:8:pop_size
rtes = pop_rte(rand_grouping(p-7:p),:);
brks = pop_brk(rand_grouping(p-7:p),:);
dists = total_dist(rand_grouping(p-7:p));
[ignore,idx] = min(dists);
best_of_8_rte = rtes(idx,:);
best_of_8_brks = brks(idx,:);
rte_ins_pts = sort(ceil(n*rand(1,2)));
I = rte_ins_pts(1);
J = rte_ins_pts(2);
for k = 1:8 % Generate New Solutions
tmp_pop_rte(k,:) = best_of_8_rte;
tmp_pop_brk(k,:) = best_of_8_brks;
switch k
case 2 % Flip
tmp_pop_rte(k,I:J) = fliplr(tmp_pop_rte(k,I:J));
case 3 % Swap
tmp_pop_rte(k,[I J]) = tmp_pop_rte(k,[J I]);
case 4 % Slide
tmp_pop_rte(k,I:J) = tmp_pop_rte(k,[I+1:J I]);
case 5 % Modify Breaks
tmp_pop_brk(k,:) = randbreaks();
case 6 % Flip, Modify Breaks
tmp_pop_rte(k,I:J) = fliplr(tmp_pop_rte(k,I:J));
tmp_pop_brk(k,:) = randbreaks();
case 7 % Swap, Modify Breaks
tmp_pop_rte(k,[I J]) = tmp_pop_rte(k,[J I]);
tmp_pop_brk(k,:) = randbreaks();
case 8 % Slide, Modify Breaks
tmp_pop_rte(k,I:J) = tmp_pop_rte(k,[I+1:J I]);
tmp_pop_brk(k,:) = randbreaks();
otherwise % Do Nothing
end
end
new_pop_rte(p-7:p,:) = tmp_pop_rte;
new_pop_brk(p-7:p,:) = tmp_pop_brk;
end
pop_rte = new_pop_rte;
pop_brk = new_pop_brk;
if show_waitbar, waitbar(iter/num_iter,wb); end
end
if show_waitbar, close(wb); end
% Plot the Results
if show_plots
rng = [[1 opt_brk+1];[opt_brk n]]';
figure(hfig); subplot(2,2,3); hold off;
for m = 1:salesmen
rte = [opt_rte(rng(m,1):rng(m,2)) opt_rte(rng(m,1))];
plot(xy(rte,1),xy(rte,2),'.-','Color',clr(m,:));
title(sprintf('Total Distance = %1.4f',min_dist));
hold on;
end
subplot(2,2,4);
plot(dist_history,'r','LineWidth',2);
title('Best Solution History');
set(gca,'XLim',[1 num_iter],'YLim',[0 1.1*max(dist_history)]); end
% Generate Random Set of Break Points
function breaks = randbreaks()
if singles % No Constraints on Breaks
tmp_brks = randperm(n-1);
breaks = sort(tmp_brks(1:num_brks));
else % Force Breaks to be At Least Two Apart
num_adjust = find(rand < cum_prob,1)-1;
spaces = ceil(num_brks*rand(1,num_adjust));
adjust = zeros(1,num_brks);
for kk = 1:num_brks
adjust(kk) = sum(spaces == kk);
end
breaks = 2*(1:num_brks) + cumsum(adjust);
end
end
end。