& d$ J! p, g0 ~! c' v, ] 模拟退火算法的依据是固体物质退火过程和组合优化问题之间的相似性。物质在加热的时候,粒子间的布朗运动增强,到达一定强度后,固体物质转化为液态,这个时候再 % Z* x# \& s. w5 ~$ D: M进行退火,粒子热运动减弱,并逐渐趋于有序,最后达到稳定。8 F9 z0 X8 b3 E, F5 M
# Y$ l2 J# y1 ?" @0 a
0 D8 [' l3 }1 B* [* E3 R' t4 U+ j I6 F 模拟退火的解不再像局部搜索那样最后的结果依赖初始点。它引入了一个接受概率p。如果新的点(设为pn)的目标函数f(pn)更好,则p=1,表示选取新点;否 8 o7 L; a4 ^( S则,接受概率p是当前点(设为pc)的目标函数f(pc),新点的目标函数f(pn)以及另一个控制参数“温度”T的函数。也就是说,模拟退火没有像局部搜索那3 B t" ^3 {2 m. B5 L( e
样每次都贪婪地寻找比现在好的点,目标函数差一点的点也有可能接受进来。随着算法的执行,系统温度T逐渐降低,最后终止于某个低温,在该温度下,系统不再接受变4 ?. z, S8 i, L7 u; r- K
化。' v0 @/ f3 J9 y% J
4 C$ l8 h* }! K' | + Q; Y. e- v$ f0 |, O& @* W: _
模拟退火的典型特征是除了接受目标函数的改进外,还接受一个衰减极限,当T较大时,接受较大的衰减,当T逐渐变小时,接受较小的衰减,当T为0时,就不再接受衰0 P. l4 u1 [" m4 h) N
减。这一特征意味着模拟退火与局部搜索相反,它能避开局部极小,并且还保持了局部搜索的通用性和简单性。 2 B6 L) C9 v" \" V; I8 l 在物理上,先加热,让分子间互相碰撞,变成无序状态,内能加大,然后降温,最后的分子次序反而会更有序,内能比没有加热前更小。就像那只兔子,它喝醉后,对比较 . V$ F7 x( Z( |- i- y近的山峰视而不见,迷迷糊糊地跳一大圈子,反而更有可能找到珠峰。/ Z8 T0 R: N7 i m- k1 Y
& j7 ?. V/ Q$ t " q% l7 z$ y r1 W 值得注意的是,当T为0时,模拟退火就成为局部搜索的一个特例。 % g4 g0 u; z0 [# J. f/ H6 J ! t* P1 L9 ~$ d9 ]1 _5 ^8 g
* s6 R% D& ?3 U1 ?8 F8 A; R
模拟退火的伪码表达:: K5 N* P- `# Q" I' ^
procedure simulated annealing 9 E, {' m, s5 Z/ W; ~
begin 1 H6 ~; G' c% `/ ~% [
t:=0; + i2 P, v* X* W* _8 f7 Q
initialize temperature T * Q7 Z) z, r/ d5 Y- I2 g0 e select a current string vc at random; & e/ |7 _, \2 V/ X evaluate vc; * \ z( ~2 g- x9 Y5 `
repeat - i S" }, K7 b1 T- J repeat 6 T* H- P8 O( }0 l* ]5 Y select a new string vn in the neighborhood of vc; (1) / e! I. K+ b6 e( D* Z8 [- O
if f(vc) then vc:=vn; 1 ]; Y/ n4 U' k, _- k; {2 G else if random [0,1] then vc:=vn; 3 x. Q# c& U; z$ o, }$ Y" k* g$ l
until (termination-condition) (3) 1 \: z0 d. J5 D- ^# | T:=g(T,t); (4) 5 ~. `+ R2 [( z& m& p |: T% X T:=t+1; + n5 h. C/ V+ _" x
until (stop-criterion) (5) 4 T5 k& S' ?7 Y5 K$ j8 B5 e' N end; ' ~8 x$ Y& P, G) n7 k
9 V: U+ Z- X6 M/ j2 S! G $ l6 b4 R# Y! t/ c
上面的程序中,关键的是(1)新状态产生函数,(2)新状态接受函数,(3)抽样稳定准则,(4)退温函数,(5)退火结束准则 # {" u8 V, |' Z( |1 b n6 m2 V (简称三函数两准则)是直接影响优化结果的主要环节。虽然实验结果证明初始值对于最后的结果没有影响,但是初温越高,得到高质量解的概率越大。所以,应该尽量选/ ^: G- U" `- v1 Z
取比较高的初温。; Q: E+ _6 n1 |) C, q) z. ]0 n
' c) I& F; Q5 ] # y& K: e+ |5 N% n+ r
上面关键环节的选取策略:9 M; N; k$ V' e7 r2 U5 j
(1)状态产生函数:候选解由当前解的邻域函数决定,可以取互换,插入,逆序等操作产生,然后根据概率分布方式选取新的解,概率可以取均匀分布、正态分布、高斯9 H0 A; f7 r0 _7 y. E2 V4 U4 _
分布、柯西分布等。6 H( b S% y; I( R4 M$ _+ b+ z
1 t1 o: n4 {2 v5 ?# W4 ?$ m # t2 t9 C: _- c8 X# [) b: U3 Y (2)状态接受函数:这个环节最关键,但是,实验表明,何种接受函数对于最后结果影响不大。所以,一般选取min . M1 b5 H1 w, p7 r' n* i9 [4 ~ [1, exp ((f (vn)-f (vc))/T)]。 7 i$ \# a% t4 D (3)抽样稳定准则:一般常用的有:检验目标函数的均值是否稳定;连续若干步的目标值变化较小;规定一定的步数;" K& p/ w9 y3 V6 L
' \* Y8 J4 Y# k$ J
* q2 g/ z! G( @$ o
(4)退温函数:如果要求温度必须按照一定的比率下降,SA算法可以采用 ! }3 L$ |' F5 F2 i ,但是温度下降很慢;快速SA中,一般采用& v2 u( d6 \4 {2 |& |# l
。目前,经常用的是 , 是一个不断变化的值。 1 r, {8 P' @/ w( A1 H. Y (5)退火结束准则:一般有:设置终止温度;设置迭代次数;搜索到的最优值连续多次保持不变;检验系统熵是否稳定。" Q' V9 M5 W u2 @
N/ s% w( M: f) n" D) T; v
' Z0 ~, b J7 @: m5 h 为了保证有比较优的解,算法往往采取慢降温、多抽样、以及把“终止温度”设的比较低等方式,导致算法运行时间比较长,这也是模拟退火的最大缺点。人喝醉了酒办起 " Y$ H" F0 O4 I事来都不利索,何况兔子?, Q; y/ q8 }' @5 Q! U! d) `4 o* p
0 y) c* z% w; B. M3 x1 g 7 ^$ h; ]4 r& B5 v* @6 p: P
遗传算法(Genetic Algorithm, GA) . J' z3 B. L( Q5 n! h' d- h$ q 5 J S$ m9 h" e A5 X2 g+ Y6 e/ A0 s' c# ~" x
“物竞天择,适者生存”,是进化论的基本思想。遗传算法就是模拟自然界想做的事。遗传算法可以很好地用于优化问题,若把它看作对自然过程高度理想化的模拟,更能 3 l& X9 Y4 c: j- b: C5 _) I显出它本身的优雅——虽然生存竞争是残酷的。2 p" T( E5 u( t& s# W
& E' v8 [& V% K6 L
8 v- g+ R" {3 g$ ~& t 遗传算法以一种群体中的所有个体为对象,并利用随机化技术指导对一个被编码的参数空间进行高效搜索。其中,选择、交叉和变异构成了遗传算法的遗传操作;参数编码 * _4 t" D0 N/ D/ }, P、初始群体的设定、适应度函数的设计、遗传操作设计、控制参数设定五个要素组成了遗传算法的核心内容。 8 @: [, D7 V! Y: B2 q" B& v8 s 作为一种新的全局优化搜索算法,遗传算法以其简单通用、健壮性强、适于并行处理以及高效、实用等显著特点,在各个领域得到了广泛应用,取得了良好效果,并逐渐成6 t# F5 x( g5 r, r/ t2 L
为重要的智能算法之一。 $ T' V6 u* Q' @: K4 V) E v * p( F& c! b7 _8 U6 i + p& D2 n0 U3 B+ p; K 遗传算法的伪码: / F3 D( R- i6 v7 h% ~ : t1 m! j( H5 } 2 K& \9 ]+ N9 J# K
procedure genetic algorithm , `( k# q+ u) M9 s% |; \8 p begin & r% M! n i4 J3 v2 m3 E" t; z, Y
initialize a group and evaluate the fitness value ; (1)! D6 }( |0 X- Z' T$ z
while not convergent (2) - X- p+ k& } |4 b begin $ M! J) J6 v) O, j, Q
select; (3) & i- U6 z! F _% b; A if random[0,1] crossover; (4) / g) W5 H+ j& _! T. O* I$ d ^; ? if random (0,1) mutation; (5)0 } z% v7 F, L) f4 e
end; ; s( A0 p) M3 \3 z( q" t
end & Q/ \/ c; O/ N: N4 D 上述程序中有五个重要的环节: 6 n+ Z% i- \1 y3 h8 }2 D. c" h (1)编码和初始群体的生成:GA在进行搜索之前先将解空间的解数据表示成遗传空间的基因型串结构数据,这些串结构数据的不同组合便构成了不同的点。然后随机产: q- X% E% J, m( X
生N个初始串结构数据,每个串结构数据称为一个个体, 4 O4 ]3 C/ A* D, B" q1 {: ^8 \ N个体构成了一个群体。GA以这N个串结构数据作为初始点开始迭代。" I$ x3 ?2 S6 Q6 g) K/ v
7 U- ~/ y+ f7 q, N W
$ ]8 A- Y* W6 o2 c6 a, w
比如,旅行商问题中,可以把商人走过的路径进行编码,也可以对整个图矩阵进行编码。编码方式依赖于问题怎样描述比较好解决。初始群体也应该选取适当,如果选取的& I( e# ?% Q2 \! M6 g
过小则杂交优势不明显,算法性能很差(数量上占了优势的老鼠进化能力比老虎强),群体选取太大则计算量太大。 ( R2 G/ y$ i& n, c0 I 7 i0 C+ F# Z8 X- S; P+ |+ n * A# v, c7 V, A: v
(2)检查算法收敛准则是否满足,控制算法是否结束。可以采用判断与最优解的适配度或者定一个迭代次数来达到。 9 `2 A8 Q# X+ h# T 0 ~* Q- d4 R" W! o8 Z- n / d, f$ R( T- x0 s* B" j, y% d
(3)适应性值评估检测和选择:适应性函数表明个体或解的优劣性,在程序的开始也应该评价适应性,以便和以后的做比较。不同的问题,适应性函数的定义方式也不同& p2 u/ W L/ x4 O
。根据适应性的好坏,进行选择。选择的目的是为了从当前群体中选出优良的个体,使它们有机会作为父代为下一代繁殖子孙。遗传算法通过选择过程体现这一思想,进行/ ?2 q) S- D. a
选择的原则是适应性强的个体为下一代贡献一个或多个后代的概率大。选择实现了达尔文的适者生存原则。 5 z. o! A* ~% y X 6 A0 I6 b0 p! M4 d- } 6 ^: i8 Q [& r! ^ (4)杂交:按照杂交概率(pc)进行杂交。杂交操作是遗传算法中最主要的遗传操作。通过杂交操作可以得到新一代个体,新个体组合了其父辈个体的特性。杂交体现3 |+ g6 @2 d+ p+ q7 Z9 H1 K9 q5 Y, V
了信息交换的思想。3 o2 @& s' t, ]9 C6 W. t2 L" ~
. o3 j1 [3 C d
7 N* t! r! ?% W$ ?, r7 p5 F8 q& N 可以选定一个点对染色体串进行互换,插入,逆序等杂交,也可以随机选取几个点杂交。杂交概率如果太大,种群更新快,但是高适应性的个体很容易被淹没,概率小了搜( k o' {" m/ _& e2 d
索会停滞。 & K7 D, {9 j9 I: k" o! o ! l3 c5 O5 C) c$ @: h( p * f D; k& f+ E+ V& `8 @ (5)变异:按照变异概率(pm)进行变异。变异首先在群体中随机选择一个个体,对于选中的个体以一定的概率随机地改变串结构数据中某个串的值。同生物界一样, GA中变异发生的概率很低。变异为新个体的产生提供了机会。 / v, E: w x9 k% A- e( M, u' W $ I {' E; z$ o - |0 Z: x3 e; Y. X B& ~ 变异可以防止有效基因的缺损造成的进化停滞。比较低的变异概率就已经可以让基因不断变更,太大了会陷入随机搜索。想一下,生物界每一代都和上一代差距很大,会是 & F# T7 {& |0 R. F/ v/ K/ v! \0 x n怎样的可怕情形。 : @8 N( C% A) o0 _1 j( O 1 |6 g- C: w, N5 {
6 u$ X: W! `0 ~7 n
就像自然界的变异适和任何物种一样,对变量进行了编码的遗传算法没有考虑函数本身是否可导,是否连续等性质,所以适用性很强;并且,它开始就对一个种群进行操作 3 U! b1 C) f5 P0 k. C! \,隐含了并行性,也容易找到“全局最优解”。+ _$ T0 `+ W) j$ t& ? M
5 P# W# I& }+ i! A! y4 n$ p 6 `6 B1 q, u4 W% }* i( V
禁忌搜索算法(Tabu Search,TS)5 m- A, X! \0 G
8 B% ^7 r- B2 L6 f
( s- Q! e- [ N; z) j7 f+ k
为了找到“全局最优解”,就不应该执着于某一个特定的区域。局部搜索的缺点就是太贪婪地对某一个局部区域以及其邻域搜索,导致一叶障目,不见泰山。禁忌搜索就是0 a2 Y8 p! \1 _
对于找到的一部分局部最优解,有意识地避开它(但不是完全隔绝),从而获得更多的搜索区间。兔子们找到了泰山,它们之中的一只就会留守在这里,其他的再去别的地 $ s# y6 r9 m& e: B1 h/ m' P" r方寻找。就这样,一大圈后,把找到的几个山峰一比较,珠穆朗玛峰脱颖而出。 7 Z; v) K) J+ s - d- R' s. n2 {' B8 ]5 x
; a) c3 v; Y* d2 U: a6 t& |1 T. G
当兔子们再寻找的时候,一般地会有意识地避开泰山,因为他们知道,这里已经找过,并且有一只兔子在那里看着了。这就是禁忌搜索中“禁忌表(tabu 3 g' ~5 d$ ^/ {5 [/ B, R list)”的含义。那只留在泰山的兔子一般不会就安家在那里了,它会在一定时间后重新回到找最高峰的大军,因为这个时候已经有了许多新的消息,泰山毕竟也有一) |- I$ Y2 k' q) Z! ^
个不错的高度,需要重新考虑,这个归队时间,在禁忌搜索里面叫做“禁忌长度(tabu ' `+ Z; f" S% u2 V length)”;如果在搜索的过程中,留守泰山的兔子还没有归队,但是找到的地方全是华北平原等比较低的地方,兔子们就不得不再次考虑选中泰山,也就是说,当 7 D1 j: o7 i8 E m一个有兔子留守的地方优越性太突出,超过了“best 8 e* Q2 @/ \( `3 `, u7 z2 c
to 0 V! b( c3 B7 W* n. l
far”的状态,就可以不顾及有没有兔子留守,都把这个地方考虑进来,这就叫“特赦准则(aspiration 3 K" S p8 q& o9 g
criterion)”。这三个概念是禁忌搜索和一般搜索准则最不同的地方,算法的优化也关键在这里。- N- p( T0 h! M9 w- t- \4 x3 n; k
4 n$ l. r# p' a. q# I
6 a1 G) i8 e/ @8 K8 H 伪码表达:1 W( p( s& l& e. z/ ?% I0 g2 f
procedure tabu search; * q% q% f$ I E0 e1 `& G
begin - N& [ X; t: F2 ]: S1 q9 T6 O
initialize a string vc at random,clear up the tabu list; 8 V1 n1 Y/ e! [, A cur:=vc; 4 i! ^ }- N& K repeat 3 b7 `/ b, C4 ]$ e select a new string vn in the neighborhood of vc; 2 `% W3 B7 [0 J" {
if va>best_to_far then {va is a string in the tabu list} ( N% P: ^6 H) Y2 n' d% g4 q4 X
begin 4 o( { A! `* o" R0 n$ j' P cur:=va; ) I" w7 A. q' N; n/ a8 l" t let va take place of the oldest string in the tabu list; # ^( [( G( G+ a: P* p) S, m! k best_to_far:=va; ; _& F# L# w$ i& q, I; \: c
end else 7 ^4 |* E1 B0 ?+ U
begin ( i) d/ V1 E' _- m6 V
cur:=vn; " D; w a2 _3 {) u: E$ } let vn take place of the oldest string in the tabu list; - b" M2 ^6 k: ~1 P' A& I
end; * H9 k1 w- h; j8 ^; M1 ^ until (termination-condition); $ [# L- F' h; {# l- T3 J end; 5 |# |7 `, ^3 {7 t* [- g( | $ P( }: d/ t2 B8 ^, }; V
/ O) N8 z& Y1 B' i$ g 以上程序中有关键的几点:! ^" C! t% S( O0 y; k/ f
(1)禁忌对象:可以选取当前的值(cur)作为禁忌对象放进tabu 7 {4 @% t- S" r list,也可以把和当然值在同一“等高线”上的都放进tabu - {" _( u' Z1 r1 N list。' m/ o! Q& J4 g- j" o* ^0 H/ J6 D% n1 s
(2)为了降低计算量,禁忌长度和禁忌表的集合不宜太大,但是禁忌长度太小容易循环搜索,禁忌表太小容易陷入“局部极优解”。 , p: n, ] r. g" \3 Y& N3 x( l 1 ^$ `+ w* C; J5 d+ s n2 L , V1 Z p: r0 M' T (3)上述程序段中对best_to_far的操作是直接赋值为最优的“解禁候选解”,但是有时候会出现没有大于best_to_far的,候选解也全部被禁的 “死锁”状态,这个时候,就应该对候选解中最佳的进行解禁,以能够继续下去。 # V1 m+ _0 k: s/ B+ [ . l; H3 G0 w. E" Z0 q 9 G$ r3 b! v9 E (4)终止准则:和模拟退火,遗传算法差不多,常用的有:给定一个迭代步数;设定与估计的最优解的距离小于某个范围时,就终止搜索;当与最优解的距离连续若干步 / e1 w& s) u" }9 G# [/ |保持不变时,终止搜索; # C; B6 y/ D1 [% B* | / q3 B$ c2 a3 {- B' d; C
: q/ i& e$ e3 ]) b, l! a$ q 禁忌搜索是对人类思维过程本身的一种模拟,它通过对一些局部最优解的禁忌(也可以说是记忆)达到接纳一部分较差解,从而跳出局部搜索的目的。 ! b% T4 `* V6 ` - h& R( W5 \( f6 j0 ^6 C- S8 e$ w # K+ p" d! m3 u+ P( m4 Y2 p
人工神经网络(Artificial Neural Network,ANN)' o+ o' h; u1 w+ }* [& A# G3 W
( U+ D) u7 K- s( d, G4 Y
, G6 p7 N, ?9 O
神经网络从名字就知道是对人脑的模拟。它的神经元结构,它的构成与作用方式都是在模仿人脑,但是也仅仅是粗糙的模仿,远没有达到完美的地步。和冯·诺依曼机不同 . |& @" L$ D' X( X7 E,神经网络计算非数字,非精确,高度并行,并且有自学习功能。 - N y& t; O6 ^4 L& N- Y" ?" | 0 f7 D+ r* Q# n' J8 n- s" I5 f- }
! d5 a7 D! L$ j 生命科学中,神经细胞一般称作神经元,它是整个神经结构的最基本单位。每个神经细胞就像一条胳膊,其中像手掌的地方含有细胞核,称作细胞体,像手指的称作树突, 7 Q1 Q- g: y: |5 @! c7 b' [' x是信息的输入通路,像手臂的称作轴突,是信息的输出通路;神经元之间错综复杂地连在一起,互相之间传递信号,而传递的信号可以导致神经元电位的变化,一旦电位高! z" q+ g; U/ S; v% ^+ x) i
出一定值,就会引起神经元的激发,此神经元就会通过轴突传出电信号。7 s5 {+ E2 A+ b
# }* L4 a$ \( t) A+ M# L0 q* @2 {
, |) U% M3 j. g! W u% A
而如果要用计算机模仿生物神经,就需要人工的神经网络有三个要素:(1)形式定义人工神经元;(2)给出人工神经元的连接方式,或者说给出网络结构;(3)给出. {' B c7 d; |$ j \7 H9 Y$ x/ w
人工神经元之间信号强度的定义。, f2 Y+ u& f1 j, K7 E5 l$ O, q
! Q: ?& P( }* x- L6 ], w/ b
/ @. A/ O$ h M 历史上第一个人工神经网络模型称作M-P模型,非常简单:' a6 L0 N+ P/ ?# C4 e. U3 G" r
- p9 J4 }; q' f( p
+ k" T0 U% [, ^2 t% q& W 其中, 3 s3 U; S- H5 L- i 表示神经元i在t时刻的状态,为1表示激发态,为0表示抑制态; / w2 s4 A$ K5 b: b 是神经元i和j之间的连接强度; $ X- I/ c0 A X' R! {/ r! S/ Z 表示神经元i的阈值,超过这个值神经元才能激发。 , A5 i2 [* s5 k 这个模型是最简单的神经元模型。但是功能已经非常强大:此模型的发明人McCulloch和Pitts已经证明,不考虑速度和实现的复杂性,它可以完成当前数字 ' g' e6 `3 i8 |9 ^; B$ L$ U7 I计算机的任何工作。! d$ U+ R8 T* z9 h! m1 I
6 Z, t8 a* }3 |9 h
/ F' I" D. }* u3 W5 z
以上这个M-P模型仅仅是一层的网络,如果从对一个平面进行分割的方面来考虑的话,M-P网络只能把一个平面分成个半平面,却不能够选取特定的一部分。而解决的4 A7 m( o5 l) b
办法就是“多层前向网路”。 4 s1 _% D5 q: C: b8 ?8 F$ n F. _0 z7 h3 o3 L, A. G# Q) A4 l3 D
+ ]# O `. ~6 c+ s' p2 ^8 N7 a
图2 " R7 ~8 d% B5 U9 J) W2 t2 ]
图2是多层前向网络的示意图。最下面的 2 J: j/ G! T, V4 A$ X 称作输入层,最上面一层称作输出层,任何一个中间层都接受来自前一层的所有输入,加工后传入后一层。每一层的神经元之间没有联系,输入输出层之间也没有直接联系6 A: ~8 O# A1 Z+ \3 Y- o
,并且仅仅是单向联系,没有反馈。这样的网络被称作“多层前向网络”。数据在输入后,经过每一层的加权,最后输出结果。 / M- s8 T5 N6 n" @2 E . J: Q9 L- F5 \/ F 1 T. l# e3 x# R' B 图3 * c! c5 D7 r# Q q% v 如图3,用可覆盖面来说明多层网络的功能:单层网络只能把平面分成两部分,双层网络就可以分割任意凸域,多层网络则可以分割任意区域。1 w$ v. x4 B, ~$ V
为了让这种网络有合适的权值,必须给网络一定的激励,让它自己学习,调整。一种方法称作“向后传播算法(Back - o# C8 V/ k; G% B0 {9 o Propagation,BP)”,其基本思想是考察最后输出解和理想解的差异,调整权值,并把这种调整从输出层开始向后推演,经过中间层,达到输入层。 " e9 l" B& _1 k. g1 o5 e * O# E. x5 x0 t; a4 Z- }3 [
' C4 z! n4 @% q) s) t 可见,神经网络是通过学习来达到解决问题的目的,学习没有改变单个神经元的结构和工作方式,单个神经元的特性和要解决的问题之间也没有直接联系,这里学习的作用 7 h$ l* k2 ~& b是根据神经元之间激励与抑制的关系,改变它们的作用强度。学习样本中的任何样品的信息都包含在网络的每个权值之中。6 @- @4 o( v/ m# u" B* F
, F7 k! |4 e) D. ] N7 A
. ~( g; j2 ?) E8 u6 u
BP算法中有考察输出解和理想解差异的过程,假设差距为w,则调整权值的目的就是为了使得w最小化。这就又包含了前文所说的“最小值”问题。一般的BP算法采用/ `3 n. F6 V r8 r/ i* h3 q
的是局部搜索,比如最速下降法,牛顿法等,当然如果想要得到全局最优解,可以采用模拟退火,遗传算法等。当前向网络采用模拟退火算法作为学习方法的时候,一般成 9 n1 r+ h6 Y0 w为“波尔兹曼网络”,属于随机性神经网络。# C" Q! J) M$ B
' \, ]5 M7 F+ j- |- ^5 `4 r/ }