|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
5 L* D3 Y( g" |. `0 ]1 背景介绍
6 v2 w# j! X) m假定某群岛海域有20个小岛,每个岛屿各产不同种类的海鲜,现需对各岛屿的海鲜进行外向运输,选取一个中心岛屿作为中心枢纽,(以下称其为中心岛);各个岛屿的货物运送到中心枢纽岛屿,然后从中心岛运往大陆,其中参考各方因素确定最优的运送路线,各个岛屿到中心岛运送的船只有两种船型;并对船只进行选择。运用matlab编程,禁忌搜索方法。
; j s1 Q2 A" _) X+ I
7 {/ |$ p( ~6 A& [7 c2 s鉴于偏远岛屿的地理特点,其交通网络一般由三个节点组成:大陆港口、中心岛和卫星岛。大陆港口是海岛依托大陆的物流运输通道;中心岛是收集周围岛屿输送物资的枢纽;卫星岛是供应生产物资到中心岛物资的末端岛屿。
7 {! K" ?. i2 i& _) L% Z: E3 H: a& Z2 H* m5 G$ ? J
首先,由于海上航行受台风影响很大,需要防止岛间运输物资中断,分析了该地区台风发生的统计资料,并结合各岛的生活资料,通过数据拟合得到台风影响时间的概率分布曲线。在一定的保证率下,每个岛屿的日平均生产量在不腐坏的前提下,建立运输模型。那么,对中心岛的位置和交通的优化是必须的。其中运输系统结构包括航线数量、运输组织形式及到达顺序、每条航线的船型及时刻表、各岛码头规模等;建立和优化存储系统(包括存储容量和周期性供应等)。) v. u0 X; ?: i0 g
$ Z: h! [5 N2 Y4 G, h$ u
显然,运输系统成本和存储系统是优化目标统一成本的两个矛盾方面,即如果某一航线的船舶尽可能满载,则可以延长运输计划的间隔,从而降低运输计划运输成本,但同时也会增加货物储存和仓库建设成本;如果船型不变,增加航线上的供应岛它可以减少航线数量和船舶采购、集货周期和库存成本,以及库存引起的货物存储成本和仓库建设的成本,但是运输距离的增加和路线的延长会导致运输成本的增加,从而导致系统总成本的变化。此外,中心岛的位置将直接影响路径规划和运输组织形式的选择,从而间接影响仓储系统的优化。5 [* G" D+ {+ E1 m
8 x; v$ L( S ]4 f7 z在优化远洋集团货物海运系统的过程中,除了上述传统的LIRP问题外,还应考虑选址、运输和仓储的决策问题。除了相互作用外,我们还需要考虑航运系统本身的特点:①由于船舶的负荷一般远大于岛上的日生产量,所以双向装货路线与单方向运输相比,双向运输可以延长装货周期,大大降低运输频率。虽然运输距离有所增加,但运输成本可能会相对降低。即使库存和由此产生的货物储存成本和仓库建设成本增加,最终系统的总成本也可能降低。具体运输组织形式的选择应根据线路岛屿的数量和距离确定。
' g9 m( p& A( R# a" [7 }% z/ ~4 `0 j2 z& r1 q0 {5 A
② 与小船型相比,如果选择航线,应根据航线中岛屿的数量和距离确定,大型船型可以成倍定期装货,延长输送周期,减少运输次数,降低运输成本,但船舶采购成本和码头总建设成本、库存及由此产生的货物储存成本和仓库建设成本都会增加,导致系统总成本的变化。* p1 \$ Y, e. ^6 a1 b% v) d
( |6 y! b. m+ E# T
在运输系统中,无论有多少条线路,所有卫星岛的终端总数都是固定的,但由于不同航线的船型不同,所以卫星岛码头的规模不同和由此带来的码头建设成本也不尽相同,而且每增加一种船型,中心岛都需要配备更多相应的船型的码头。因此,它对码头的建设成本有很大的影响。综上所述,离岛海运物流系统的优化应基于以上特点选出中心岛,为卫星岛运输划分路线组,建立各条线路(循环运输)的运输组织形式,配置不同船型,制定航次。在线路换班时设置各岛的存储容量,以便在台风等影响下求得偏远岛屿的整个群岛物流系统总成本得最低。# Y( j1 _( K. C; S3 }
* W5 Z3 h. F0 u l
2、算法描述及实现
( ^$ P' ?9 y9 I r! z5 ~2.1、遗传算法概述
7 y+ ^# C/ f. n9 L# k遗传算法(GA,Genetic Algorithm),也称为进化算法。遗传算法是受达尔文的进化论的启发,借鉴生物进化过程而提出的一种启发式搜索算法。其主要特点是直接对结构对象进行操作,因此不同于其他求解最优解的算法,遗传算法不存在求导和对函数连续性的限定,采用概率化的寻优方法,不需要确定的规则就能自动获取和指导优化的搜索空间,自适应地调整搜索方向。/ @# w9 l, M0 g% a
9 o& ]8 x7 Y& j v* ]" ?4 G
以上是对遗传算法相对抽象的总结,为了更具体形象的解释遗传算法的一般原理,我们首先介绍一些生物学上的概念:
4 H' z3 ^# P' U2 B: v: s7 L& Z* h1 w
! {1 F* V: a# Q! Y1 x①种群:不同生物个体形成的群体,生物的进化以群体的形式进行,这样的一个群体称为种群;& x; f2 f5 O! q
0 }2 h5 r. |3 P3 t1 V0 W
②个体:组成种群的单个生物; P5 r7 }2 X+ p. ~3 X
/ Z: A) i& w# y( Z3 ?③基因:带有遗传信息的DNA片段,可以通俗的将基因理解为一段信息,这段信息决定的生物个体的性状;% l" [" v) m/ N) v1 a/ O8 T# h: i
# v$ y6 f2 L) g
④表现型:根据基因形成的个体的外部表现;
- U* B. ?: e1 `. r
& `2 E& v6 C' m# M6 ]9 x5 j⑤适应度:生物个体对于生存环境的适应程度,越适应那么其得以存活和繁衍的概率就越大;$ T6 j' E8 w3 b$ ?5 _3 r7 `
- R2 B: w; S c& J. A7 P" _0 R
⑥遗传:通过繁殖过程,子代将从父母双方各获取一部分基因,形成新的自己的基因,这个过程中,会发生基因的复制、交叉,也会以较低的概率发生基因突变;$ v6 Y) s q2 V
7 M- Q0 i* t# P# t$ S8 Z% j$ o% M1 L⑦自然选择:物竞天择,适者生存的自然淘汰机制。具体为对环境适应度高的个体参与繁殖的机会比较多,后代就会越来越多。适应度低的个体参与繁殖的机会比较少,后代就会越来越少;" ^( W* T5 ?3 z
* A* c' W' h; u1 D3 s8 U
⑧进化:种群通过代际繁衍不断适应生存环境的过程,在这个过程中,以对外界环境的适应度为评判标准,生物的性状不断得到改良。
0 C0 ~6 Y( f \ Z" E3 `4 J' P& Q5 G. M$ S' p( \ h" N
了解了这些术语的含义,我们就可以进一步说说生物进化的过程了。由于自然选择是客观存在的,即生物只能改变自己去适应环境,那么在自然选择的过程中,适应度低的个体会被淘汰,适应度高的个体被保留,高适应度的父体与母体又有更高的概率繁衍出适应度高的子代,因此在一代又一代的繁衍之后,高适应度的个体在种群中所占的比例越来越大,种群就这样完成了进化。
9 V) Q: R0 F- {$ d8 b2 A3 S' ?8 f9 p$ }. N% J }6 y# C' y& K
现在我们要参考生物进化的过程来设计算法解决求最优解的问题。对此,遗传算法的思路是,将要解决的问题模拟成一个生物进化的过程,通过进化来寻找最优解。以我们题目中寻找多峰函数的最大值这个问题为例:! |! S4 P9 M$ ^0 @7 K7 n0 T
3 V' `' L: W# g# @/ B将(x, y)这一可能的解作为一个个体;将多峰函数的函数值f(x, y)作为个体的适应度;对(x, y)进行编码作为个体的基因;以适应度为标准不断筛选生物个体;通过遗传算子(如复制、交叉、变异等)不断产生下一代。如此不断循环迭代,完成进化。最终,根据设定的迭代次数,可得到最后一代种群,该种群中的个体适应度都较高,而多峰函数的最大值就有比较大的概率存在于这一群解中,以种群中适应度最高的个体作为问题的解,则可以说该解有比较高的概率就是我们希望求得的最优解。8 N/ I- x! P# a
; m2 C, S8 I) ]8 C3 X& X6 ]* X文字述说终究还是不如图表好理解,因此还是看图吧(下图将本题与自然遗传联系了起来):* \) k! ^: o/ m w( t& M1 {
% f _ U' s7 ]8 _
, I8 z0 [ p4 N7 l7 w
! k* w$ y# r; `( ?
通过以上描述,我们不难看出,遗传算法不能保证一定能求得最优解,而只能以一定的概率求最优解。但是使用遗传算法时,我们可以不用关心具体如何去找最优解,要做的只是简单的否定一些表现不好的个体。这一优点也是遗传算法能够取得广泛应用的原因之一。
$ g- [& G3 p3 H2 \6 J4 H* W8 B: O3 }' V8 |, i4 C0 k' }6 j
2.2、算法的流程
7 T' l7 v( g- Q5 Z8 x- y通过上文的阐述,对于如何模拟自然进化来求题中多峰函数的最优解已经比较明晰了。这里我将列出遗传算法的主要步骤,并一一解析:% \/ C9 r' ~5 Z% W1 S/ f6 K4 S
+ m; d( A' |7 `9 j& k' `
第一步:随机产生一个种群,作为问题的初代解(通常,初代解可能与最优解相差较大,这是可以容忍的,只要保证初代解是随机产生的,以确保个体基因的多样性即可);4 U: d0 y; R0 T/ I+ ?
) n$ g U; o! l5 \, N! R# v8 a
第二步:寻找一种合适的编码方案对种群中的个体进行编码,可以选择如浮点数编码或二进制编码等常用编码方案(需要指出的是,不同的编码方案直接影响后续遗传算子的实现细节);
( J4 _1 |/ S- g8 [# Q0 l1 d/ Z G; f% O
第三步:以多峰函数的函数值 作为个体的适应度,计算种群中每个个体的适应度(算出的适应度将为后续的个体选择提供依据);
$ i0 t- N) S Q% L9 L! m1 m- ^
8 ]4 w8 e6 Z9 P) T第四步:根据适应度的高低选择参与繁衍的父体与母体,选择的原则是适应度越高的个体越可能被选中(以此不断淘汰适应度低的个体);
8 P6 p) Q2 L: | E1 S
* p w G6 @: ]6 W9 C第五步:对被选出的父体与母体执行遗传操作,即复制父体与母体的基因,并采用交叉、变异等算子产生出子代(在较大程度保留优秀基因的基础上,变异增加了基因的多样性,从而提高找到最优解的概率);0 s6 D; g) M0 c/ D3 @4 {' _
% \9 ~1 U6 |* }/ K/ _第六步:根据一定的准则判断是继续执行算法,还是找出所有子代中适应度最高个体作为解返回并结束程序(判断的准则可以是设定的解的阈值、指定的迭代次数等)。, H$ A3 u0 u/ l4 _
O8 }' ?5 F1 s+ W2 w3 ?( a) p7 M
( m7 G. M' K' I' u' y* [
' d" E9 s# C- ?! j' a% P) M/ u9 U二、源代码, \, f9 Y$ o+ H( {7 b/ r
\1 [# T0 E' ^2 l
- clc
- close all
- clear all
- %% 模型参数
- n=20;
- Axes=[35,44;13,36;22,59;30,79
- 39,60;31,26;25,21;40,16;52,38
- 63,17;66,71;62,50;41,29;71,35
- 91,37;25,33;82,74;52,80;49,11
- 22,11];
- Land=[-8,65];
- Dom=((Axes(1,1)-Land(1))^2+(Axes(1,2)-Land(2))^2)^0.5;
- Dist=getdist(Axes);
- Output=[122,77,75,68,87,96,90,110,127,...
- 155,141,135,103,163,170,81,147,145,129,95];
- Ship.Cp=[1300000,2100000,1e15];
- Ship.Ctr=[65,90,1e15];
- Ship.V=[18,14,1e15];
- T.all=15*365-1;
- T.main=7;
- %% Ga参数
- GenMax=200;
- Pc=0.5;
- Pv=0.5;
- Gen=0;
- Popnum=100;
- Chrom=struct;
- NewChrom=struct;
- %% 生成初始种群
- for i =1:Popnum
- Chrom(i).Index=randperm(n-1)+1;
- Chrom(i).RouteNum=randi(n-1,1);
- Chrom(i).Routes=getdivide(Chrom(i).RouteNum,Chrom(i).Index,n);
- end
- while Gen < GenMax
- Gen=Gen+1;
- for i=1:size(Chrom_all,2)
- ship=[];
- RouteL=[];
- ShipNum=Chrom_all(i).RouteNum;
- for j=1:ShipNum
- EachL=0;
- Route=Chrom_all(i).Routes{j};
- EachOutput(j)=sum(Output(Route(2:end-1)));
- if EachOutput(j)<=300
- ship(j)=1;
- elseif EachOutput(j)<=500
- ship(j)=2;
- else
- ship(j)=3;
- end
- for k=1:length(Route)-1
- EachL=EachL+Dist(Route(k),Route(k+1));
- end
- RouteL(j)=EachL;
- end
- Chrom_all(i).Ship=ship;
- Chrom_all(i).Length=RouteL;
- end
- [bestC,ind]=getbest(Chrom_all,Ship,Dom,T);
- Chrom=Chrom_all(ind(1:Popnum));
- Best(Gen).Gen=Chrom_all(ind(1));
- Best(Gen).C=bestC(1);
- end
- % %% 淘汰
- plot([Best.C])
- title('总成本进化曲线');
- xlabel('迭代次数')
- ylabel('总成本')
- %
- % end
- 4 I' a; }1 ~1 q% P1 h3 I0 r. ]" d6 g
0 B& G- H. s6 b1 [* B `. D9 \: v* o! k/ t) @
" f) }8 m8 O( z* w6 G三、运行结果
& s3 o: \/ }- E9 `
( P' U0 v; Q! z2 D* t
1 a, Q$ g+ @) u0 e& [& q9 k6 X |
|