最优路径规划算法设计报告

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

最优路径规划算法设计
一、 问题概述
兵力机动模型的功能是支持实施机动的实体按照指定路线,由作战空间的一点向另外一点的位置移动,并带入实体在移动过程中发生变化的状态信息。

兵力机动模型包括行军模型、战斗转移模型、机动能力评估模型。

涉及的关键算法包括最优路径规划、行军长径计算、行军时间计算、行军所需油料计算、行军方案评估与优选等。

最优路径问题又称最短路问题。

是网络优化中的基本问题,如TSP 问题等。

下面先举例说明该问题。

最短路问题(SPP -shortest path problem )
一名货柜车司机奉命在最短的时间内将一车货物从甲地运往乙地。

从甲地
到乙地的公路网纵横交错,因此有多种行车路线,这名司机应选择哪条线路呢?假设货柜车的运行速度是恒定的,那么这一问题相当于需要找到一条从甲地到乙地的最短路。

旅行商问题(TSP -traveling salesman problem )
一名推销员准备前往若干城市推销产品。

如何为他(她)设计一条最短的旅行路线(从驻地出发,经过每个城市恰好一次,最后返回驻地?)
最短路问题是组合优化中的经典问题,它是通过数学方法寻找离散时间的最优编排、分组、次序、或筛选等,这类问题可用数学模型描述为
min )(x f
..t s 0)( x g
D x ∈.
其中,)(x f 为目标函数,)(x g 为约束函数,x 为决策变量,D 表示有限个点组成的集合。

一个组合最优化问题可用三个参数),,(f F D 表示,其中D 表示决策变量的定义域,F 表示可行解区域}0)(,|{≥∈=x g D x x F ,F 中的任何一个元素称为该问题的可行解,f 表示目标函数,满足}|)(m in{)(*F x x f x f ∈=的可行解*x 称为该问题的最优解。

组合最优化的特点是可行解集合为有限点集。

由直观可知,只要将D 中有限个点逐一判别是否满足0)(≥x g 的约束并比较目标值的大小,就可以得到该问题的最优解。

以上述TSP 问题为例,具体阐述组合优化问题:
此模型研究对称TSP 问题,一个商人欲到n 个城市推销产品,两个城市i 和j 之间的距离ji ij d d =,用数学模型描述为
∑≠j
i ij ij x d min
1..1=∑=n
j ij x t s n i ,,2,1Λ=,
1..1=∑=n
i ij x t s n j ,,2,1Λ=,
},,,2,1{,2||2,1||,n s n s s x s j i ij Λ⊂-≤≤-≤∑∈
j i n j i x ij ≠=∈,,,2,1,},1,0{Λ
约束条件决策变量1=ij x 表示商人行走的路线包含从城市i 到j 的路,而0=ij x 表示商人没有选择走这条路;j i ≠的约束可以减少变量的个数,使得模型中共有)1(-⨯n n 个决策变量。

每一个组合优化问题都可以通过完全枚举的方法求得最优解。

枚举是以时
间为代价的,在TSP问题中,用n个城市的一个排列表示商人按这个排列序推
( n个枚举。

以计算机s1
销并返回起点。

若固定一个城市为起终点,则需要)!1
可以完成24个城市所有路径枚举为单位,则25个城市的计算时间为:以第1个城市为起点,第2个到达城市有可能是第2个、第3个、……、第25个城市。

决定前两个城市的顺序后,余下是23个城市的所有排列,枚举这23个城市的排列需要s1,所以,25个城市的枚举需要24s。

类似地归纳,城市数与计算时间的关系如表1所示。

表1 枚举时城市数与计算时间的关系
通过表1可以看出,随着城市数的增加,计算时间增加非常之快,当城市数增加到30时,计算时间约为10.8年,实际计算中已无法承受。

在城市数较多时,枚举已不可取,我们可以采用一些别的方法缩短计算时间。

TSP问题是NP难问题,其可能的路径数目与城市数目n是成指数型增长的,所以一般很难求出其最优解,因而一般是找出其有效的近似求解算法。

遗传算法可以用来解决一些较为复杂的系统问题,显然旅行商问题是需要编码运算的,而遗传算法本身的特征正好为解决这一问题提供了很好的途径。

NP问题:是指非确定多项式问题类。

若存在一个多项式函数)(x
g和一个验证算法H,使得:判定问题A的任何一个实例I为“是”实例当且仅当存在一个验证字符串S,满足其输入长度)(S
d为I的输入长
d
g,其中)(I
d不超过))
(
(I
度,且算法H验证实例I为“是”实例的计算时间)
d
g,则称判定
(I
(H
f不超过))
(
问题A 是非确定多项式的。

对于判定问题A ,若NP 中的任何一个问题可在多项式时间内归约为判定问题A ,则称A 为NP 难问题。

二、 知识准备
根据实际需求,本文拟给出三种算法针对不同的情况做出解答。

分别是基于图论和网络优化的Dijkstra 和Floyd —Warshall 算法。

这两种算法用来解决起点与终点不重合的问题。

最后根据现有智能优化计算中的遗传算法计算哈密尔顿回路问题,即起点与终点重合问题。

1、 图论基本知识
有向图的定义:一个有向图G 是由一个非空有限集合)(G V 和)(G V 中某些元素的有序对集合)(G E 构成的二元组,记为))(),((G E G V G =。

其中},...,,{)(21n v v v G V =称为图G 的顶点集,)(G V 中的每一个元素),...,2,1(n i v i =,称为该图的一个顶点;},...,,{)(21m e e e G E =称为图G 的弧集,记为),(j i k v v e =,记有向图),(E V G =
(a ) 和(c )是无向图,(b )是有向图
2、 邻接矩阵表示法
图),(E V G =的邻接矩阵C 是如下定义的:C 是一个n n ⨯的0-1矩阵,即
n n n n ij c C ⨯⨯∈=}1,0{)(,⎩⎨⎧∈∉=A
j i A j i c ij ),(,1),(,0,也就是说,如果两节点之间有一条弧,则邻接矩阵中对应元素为1,否则为0.
图(a )和图(b )的邻接表矩阵即为
3、 ⎪⎪⎪⎪⎪⎪⎭⎫ ⎝⎛00010001001000100001
00110y x w v u y x
w v u
在计算机中用二维数组表示,两节点之间有弧相应的元素为1.
必须指出的是:目前为止,一切最短路算法都只对不含负有向圈的网络有效。

实际上,对于含负有向圈的网络,其最短路问题是NP-hard 。

因此,除非特别说明,一律假定网络不包含负有向圈。

此外在实际问题中也会遇到无向网络上的最短路问题,这时原问题一般可以转化为有向网络中上的最短路问题。

如果所有弧上的权ij w 全为非负数,只需将无向图的一条边代之以两条对称的有向弧即可。

如果弧上的权ij w 有负有正,一般来说问题要复杂得多,要具体问题具体分析。

本文中所要解决的问题都取权值为正,无向图皆采取两条对称的有向弧问题。

k k v e e v e v W ...2110=,其中k j G V v k i G E e j i ≤≤∈≤≤∈0),(,1),(,i e 与i i v v ,1-关
联,称W 是图G 的一条道路,k 为路长,顶点0v 和k v 分别称为W 的起点和终点,而121,...,,-k v v v 称为他的内部顶点。

若道路W 的边互不相同,则W 称为迹。

若道路W 的顶点互不相同,则W 称为轨。

称一条道路是闭的,如果它有正的长且起点和终点相同。

起点和终点重合
的轨叫做圈(cycle)。

若图G 的两个顶点u , v 间存在道路,则称u 和v 连通(connected)。

u , v 间的最短轨的长叫做u , v 间的距离。

记作d (u ,v )。

若图G 的任二顶点均连通,则称G 是连通图。

显然有:
(i)图P 是一条轨的充要条件是P 是连通的,且有两个一度的顶点,其余顶点的度为2;
(ii)图C 是一个圈的充要条件是C 是各顶点的度均为2 的连通图
三、应用
以行军途中各目标为图G 的顶点,两目标之间的连线为图G 相应两顶点间的边,得图G 。

对G 的每一边e ,赋以一个实数w (e )—两目标之间的距离长度,称为e 的权,得到赋权图G 。

G 的子图的权是指子图的各边的权和。

问题就是求赋权图G 中指定的两个顶点00,v u 间的具最小权的轨。

这条轨叫做00,v u 间的最短路,它的权叫做00,v u 间的距离,亦记作),(00v u d 。

四、算法设计 1 Dijkstra 算法
1.1 定义预览:
Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。

主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。

Dijkstra 算法是很有代表性的最短路径算法,注意该算法要求图中不存在负权边。

1.2算法描述
1)算法思想:
设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径, 就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。

在加入的过程中,总保持从源点v 到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。

此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。

2)算法步骤:
a.初始时,S只包含源点,即S={v},v的距离为0。

U包含除v外的其他顶点,即:U={其余顶点},若v与U中顶点u有边,则<u,v>正常有权值,若u不是v的出边邻接点,则<u,v>权值为∞。

b.从U中选取一个距离v最小的顶点k,把k加入S中(该选定的距离就是v到k的最短路径长度)。

c.以k为新考虑的中间点,修改U中各顶点的距离;若从源点v到顶点u的距离(经过顶点k)比原来距离(不经过顶点k)短,则修改顶点u的距离值,修改后的距离值的顶点k的距离加上边上的权。

d.重复步骤b和c直到所有顶点都包含在S中。

3)算法实例
for (i=1;i<=n;++i)
{
dist[i]=c[v][i];
s[i]=false;
if(dist[i]==MAX)
prev[i]=0;
else
prev[i]=v;
}
dist[v]=0;
s[v]=true;
for (i=2;i<=n;++i)
{
int t=MAX;
int u=v;
for (j=1;j<=n;++j) {
if ((!s[j])&&dist[j]<t)
{
u=j;
t=dist[j];
}
s[u]=true;
for (j=1;j<=n;++j)
if((!s[j])&&c[u][j]<MAX)
{
int newdist=dist[u]+c[u][j];
if (newdist<dist[j])
{
dist[j]=newdist;
prev[j]=u;
}
}
}
}
输入:以二维数组的形式表示邻接矩阵,即相应的弧及其权值,数组下标表示弧。

输出:最短路径所经过的节点及其距离值
运行实例,得到邻接矩阵和最短路径
2Floyd算法
2.1 定义预览
Floyd-Warshall算法(Floyd-Warshall algorithm)是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题,同时也被用
于计算有向图的传递闭包。

Floyd-Warshall算法的时间复杂度为O(N3),空间复杂度为O(N2)。

2.2 算法描述
1)算法思想原理
Floyd算法是一个经典的动态规划算法。

用通俗的语言来描述的话,首先
我们的目标是寻找从点i到点j的最短路径。

从动态规划的角度看问题,我们需要为这个目标重新做一个诠释(这个诠释正是动态规划最富创造力的精华所在)
从任意节点i到任意节点j的最短路径不外乎2种可能,1是直接从i到j,2是从i经过若干个节点k到j。

所以,我们假设Dis(i,j)为节点u到节点v的最短路径的距离,对于每一个节点k,我们检查Dis(i,k) + Dis(k,j) < Dis(i,j)是否成立,如果成立,证明从i到k再到j的路径比i直接到j的路径短,我们便设置Dis(i,j)
= Dis(i,k) + Dis(k,j),这样一来,当我们遍历完所有节点k ,Dis(i,j)中记录的便是i 到j 的最短路径的距离。

假设图G 权的邻接矩阵为0A ,⎥⎥⎥⎥⎦
⎤⎢
⎢⎢⎢⎣⎡=
nn n n n n a a a a a a a a a A Λ
M ΛM M ΛΛ2122221112110 来存放各边长度,其中:
0=ii a ;,,2,1n i Λ=
∞=ij a j i ,之间没有边,在程序中以各边都不可能达到的充分大数代替
ij ij w a = ij ji w a = ij w 是j i ,之间边的长度,n j i ,,2,1,Λ=。

递推产生一个矩阵序列n k A A A A ,,,,,10ΛΛ,其中),(j i A k 表示从顶点i v 到顶点j v 的路径上所经过的顶点序号不大于k 的最短路径长度。

计算时用迭代公式:
)),(),(),,(m in(),(111j k A k i A j i A j i A k k k k ---+=
k 是迭代次数,n k j i ,,2,1,,Λ=。

最后,当n k =时,n A 即是各顶点之间的最短通路值。

2) 算法描述
a.从任意一条单边路径开始。

所有两点之间的距离是边的权,如果两点之间没有边相连,则权为无穷大。

b.对于每一对顶点 u 和 v ,看看是否存在一个顶点 w 使得从 u 到 w 再到 v 比己知的路径更短。

如果是更新它。

for(j=1;j<=g->n;j++)
if(A[i][k]!=0&&A[k][j]!=0&&A[i][j]>(A[i][k]+A[k][j]))
{
A[i][j]=A[i][k]+A[k][j];
path[i][j]=k;
}
}
cout<<endl;
cout<<"输出最短路径"<<endl;
i=g->n;
dispath(A,path,i);}
运行结果如下
3遗传算法
3、1 算法简介
遗传算法(Genetic Algorithms ,简称 GA )是一种基于自然选择原理和自然遗传机制的搜索(寻优)算法,它是模拟自然界中的生命进化机制,在人工系统中实现特定目标的优化。

遗传算法的实质是通过群体搜索技术,根据适者生存的原则逐代进化,最终得到最优解或准最优解。

它必须做以下操作:初始群体的产生、求每一个体的适应度、根据适者生存的原则选择优良个体(评估适应度)、被选出的优良个体两两配对,通过随机交叉其染色体的基因并随机变异某些染色体的基因后生成下一代群体,按此方法使群体逐代进化,直到满足进化终止条件。

其实现方法如下:
(1) 根据具体问题确定可行解域,确定一种编码方法,能用数值串或字符串表示可行解域的每一解。

(2) 对每一解应有一个度量好坏的依据,它用一函数表示,叫做适应度函数,适应度函数应为非负函数。

(3) 确定进化参数群体规模M 、交叉概率c p 、变异概率m p 、进化终止条件。

为便于计算,一般来说,每一代群体的个体数目都取相等。

群体规模越大、越容
易找到最优解,但由于受到计算机的运算能力的限制,群体规模越大,计算所需要的时间也相应的增加。

进化终止条件指的是当进化到什么时候结束,它可以设定到某一代进化结束,也可能根据找出近似最优是否满足精度要求来确定。

表1 列出了生物遗传概念在遗传算法中的对应关系。

表1 生物遗传概念在遗传算法中的对应关系
遗传算法是一种数值求解的方法, 是一个有普适性的方法, 对目标函数的性质几乎没有要求, 甚至都不一定要显式地写出目标函数,遗传算法所具有的特点是记录一个群体, 它可以记录多个解。

遗传算法在给问题的决策变量编码后, 其计算过程是比较简单的,且可以较快得到一个满意解。

3.2 遗传算法的主要构造过程
图 3 遗传算法的主要构造过程示意图
3.3 模型与算法
应用举例:
已知100个目标的经度、纬度如表2所示。

表2 目标经度和纬度
我方有一个基地,经度和纬度为(70,40),假设我方有一部队乘坐飞机从基地出发,侦察完所有目标,再返回原来的基地。

假设飞机的速度为1000公里/小时,到达每一目标之后不做停留,求侦察完所有目标之后花费的时间。

显然这是一个旅行商问题。

我们依次给基地编号为1,目标依次编号为2,3,…101,最后我方基地再重复编号为102。

距离矩阵102102)(⨯=ij d D ,其中ij d 表
示j i ,两点的距离,102,...,
2,1,=j i ,这里D 为实对称矩阵。

则问题就是,求一个从点1出发,走遍所有中间点,到达点102的一个最短路径。

上面问题中给定的是地理坐标(经度和纬度),我们必须要求两点间的实
际距离。

设B A ,两点的地理坐标为),(),,(2211y x y x ,过B A ,两点的大圆的劣弧长即为两点的实际距离。

以地心为坐标原点O ,以赤道平面为XOY 平面,以0度经线圈所在的平面为XOZ 平面建立三维直角坐标系。

则B A ,两点的直角坐标分别为:
)sin ,cos sin ,cos cos (11111y R y x R y x R A )sin ,cos sin ,cos cos (22222y R y x R y x R B 其中6370=R 为地球半径。

B A ,两点的实际距离
⎫⎛=R d arccos ,
化简得
]sin sin cos cos )(arccos[cos 212121y y y y x x R d +-=。

求解的遗传算法的参数设定如下: 种群大小:50=M 最大代数:1000=G
交叉率:1=c p ,交叉概率为1能保证种群的充分进化。

变异率:1.0=m p ,一般而言,变异发生的可能性较小。

(1) 编码策略
采用十进制编码,用随机数列10221...ωωω作为染色体,其中1
0<<i ω;1,0),101,...3,2(1021===ωωi 每一个随机序列都和种群中的一个个体相对应,例如一个9城市问题的一个染色体为
]78.0,69.0,56.0,11.0,87.0,74.0,45.0,82.0,23.0[
其中编码位置i 代表城市i ,位置i 的随机数表示城市i 在巡回中的顺序,我们将这些随机数按升序排列得到如下巡回:
529487316--------
(2) 初始种群
本文中我们先利用经典的近似算法—改良圈算法求得一个较好的初始种群。

即对于初始圈,1012,.........10211111≤<≤=+-+-v u C v v v u u u ππππππππ1012≤<≤v u ππ,交换u 与v 之间的顺序,此时的新路径为:
10211111.........ππππππππ++--v u u v v u
记0),()(1111<∇+-+=∇+-+-f d d d d f v v u u v u v u ππππππππ,则以新的路径修改旧的路径,直到不能修改为止。

(3) 目标函数
目标函数为侦察所有目标的路径长度,适应度函数就取为目标函数,我们要求
∑=+=101
1102211),...,,(min i i i d f πππππ
(4) 交叉操作
我们的交叉操作采用单点交叉。

设计如下,对于选定的两个父代个体
'
102'2'12102211...,...ωωωωωω==f f ,我们随机地选取第t 个基因处为交叉点,则经
过交叉运算后得到的子代编码为1s 和2s ,1s 的基因由1f 的前t 个基因和2f 的后
t -102个基因构成,2s 的基因由2f 的前t 个基因和1f 的后t -102个基因构成,例
如:
]1,19.0,...,54.0,29.0|,27.0,25.0,14.0,0[1=f
]1,24.0,...,21.0,74.0|,56.0,44.0,23.0,0[2=f
设交叉点为第四个基因处,则
]1,24.0,...,21.0,74.0|,27.0,25.0,14.0,0[1=s ]1,19.0,...,54.0,29.0|,56.0,44.0,23.0,0[2=s
交叉操作的方式有很多种选择,我们应该尽可能选取好的交叉方式,保证子代能继承父代的优良特性。

同时这里的交叉操作也蕴含了变异操作。

(5) 变异操作
变异也是实现群体多样性的一种手段,同时也是全局寻优的保证。

具体设计如下,按照给定的变异率,对选定变异的个体,随机地取三个整数,满足
1021<<<<w v u ,把u ,v 之间(包括u 和v )的基因段插到w 后面。

(6) 选择
采用确定性的选择策略,也就是说选择目标函数值最小的M 个个体进化到下一代,这样可以保证父代的优良特性被保存下来。

3.3 模型求解与结论
经由matlab 编程可得 path =
Columns 1 through 16
1 17 3 45 67 7
2 14 27 48 82 2 92 87 8
3 7
4 30 Columns 17 through 32
20 42 15 51 80 50 9 60 40 18 10 84 97 31 79 77
Columns 33 through 48
85 65 64 11 76 69 94 70 19 63 62 26 29 34 66 90
Columns 49 through 64
86 8 39 78 88 61 49 28 57 47 23 58 81 25 68 7
Columns 65 through 80
22 71 37 32 13 24 16 91 41 4 73 33 75 5 54 53
Columns 81 through 96
12 89 6 96 55 44 38 98 100 56 21 99 101 52 46 59
Columns 97 through 102
93 43 36 35 95 102
long =
4.0054e+04
所花时间为40小时左右,其中一个侦察路径图如图2所示
图2 侦察路径图
算法说明:输入为各个目标的地理坐标,以文件的形式导入。

load sj.txt%加载敌方100个目标数据
输出为最优路径所经过的各节点及其路径图
五、模型扩展
遗传算法作为现代优化算法之一,其主要特点是对非线性极值问题能以概
率1跳出局部最优解,找到全局最优解。

而遗传算法这种跳出局部最优寻找全局最优特性都基于算法中的交叉和变异。

在传统遗传算法的结构中,变异操作在
交叉操作基础上进行,强调的是交叉作用,认为变异只是一个生物学背景机制。

在具体交叉操作中,通常采用断点交叉法(段交叉)多点交叉与均匀交叉,其
中断点交叉是指随机地在基因序列中选择一个断点,然后交换双亲上断点右端
的所有染色体。

在变异操作中,变异算子一般是用Guassian分布的随机变异来
实现。

本文根据以上特点对基于求解最优路径规划的遗传算法进行改进,首先
将变异操作从交叉操作中分离出来,使其成为独立的并列于交叉的寻优操作,在具体遗传操作中,混沌与遗传操作联系在一起,在交叉操作中,以“门当户对”原则进行个体配对,利用混沌序列确定交叉点,实行强度最弱的单点交叉,以确保算法收敛精度,削弱和避免寻优抖振问题:在变异操作中,利用混沌序列对染色体中多个基因进行变异,以避免算法早熟(过早收敛于局部的最优解,其原因为群体的规模是有限的,可以预见当群体经过若干代的进化后,以指数级增长的具有较高平均适应度的模式将在种群中占绝大多数,而其他的模式将迅速消失。

) 1、 模型及算法
对交叉算子和变异算子做了如下两点改进。

(1) 交叉操作
交叉操作设计如下:首先以“门当户对”原则,对父代个体进行配对,即对父代以适应度函数(目标函数)值进行排序,目标函数小的与小的配对,目标函数大的与大的配对。

然后利用混沌序列确定交叉点的位置,最后对确定的交
叉项进行交叉。

例如),(21ΩΩ配对,他们的染色体分别是110212111ωωωΛ=Ω,2
10222212ωωωΛ=Ω,采用Logistic 混沌序列))(1)((4)1(n x n x n x -=+产生一个2到
101之间的正整数,具体步骤如下:
取一个(0,1)随机初始值,然后利用))(1)((4)1(n x n x n x -=+迭代一次产生1个(0,1)上的混沌值,保存以上混沌值作为产生下一代交叉项的混沌迭代初值,再把这个值分别乘以100并加上2,最后取整即可。

假如这个数为33,那
么我们对),(21ΩΩ染色体中相应的基因进行交叉,得到新的染色体),('2'
1
ΩΩ ΛΛΛ1
611601342331514131211'1ωωωωωωωωω=Ω
ΛΛΛ2
612602341332524232221'2ωωωωωωωωω=Ω
(2) 变异操作
变异也是实现群体多样性的一种手段,是跳出局部最优,全局最优的重要保证。

在本文具体变异算子设计如下,首先根据给定的变异率,随机地取两个在2到101之间的整数,对这两个数对应位置的基因进行变异,具体变异以当前的基因值,从而得到新的染色体。

2、 改进的交叉算子和变异算子 (1) 算法代码如下
A=J;
for k=1:dai %产生0~1之间随机数列进行编码 B=A;
%交配产生子代B for i=1:2:w
ch0=rand;ch(1)=4*ch0*(1-ch0); for j=2:50
ch(j)=4*ch(j-1)*(1-ch(j-1)); end
ch=2+floor(100*ch); temp=B(i,ch); B(i,ch)=B(i+1,ch); B(i+1,ch)=temp; end
%变异产生子代C
by=find(rand(1,w)<0.1);
if length(by)==0
by=floor(w*rand(1))+1;
end
C=A(by,:);
L3=length(by);
for j=1:L3
bw=2+floor(100*rand(1,3));
bw=sort(bw);
C(j,:)=C(j,[1:bw(1)-1,bw(2)+1:bw(3),bw(1):bw(2),bw(3)+1:102]);
end
G=[A;B;C];
TL=size(G,1);
其运行结果
图2基于改进的遗传算法优化路径图
path =
Columns 1 through 18
1 17 3 45 67 8
2 48 72 14 27 10 84 18 40 60 79 31 97
Columns 19 through 36
77 85 65 64 11 76 69 94 70 19 63 62 26 29 34 66 90 86
Columns 37 through 54
8 39 78 47 23 58 81 25 68 7 22 71 37 32 13 24 49 28
Columns 55 through 72
57 88 61 16 91 41 4 73 33 75 5
54 53 12 89 6 96 55
Columns 73 through 90
44 38 9 80 50 15 42 20 30 74 83 87 92 2 36 43 93 46
Columns 91 through 102
59 51 98 100 56 21 99 101 52 95 35 102
long =
4.0886e+04
六、算法性能比较
最优路径规划问题是组合最优化问题,但它不是多项式可解问题,即其目标函数并不能用一个多项式函数表示。

所以此类问题还没有一个有能求得最优解的多项式时间算法,它是NP-hard问题。

但是我们可以通过一些算法找到它的近似最优解。

本文中的Dijkstra算法和Floyd-Warshall算法以及智能优化遗传算法都为解决这一类问题提供了很好的途径。

1)Dijkstra算法
局限性:该算法只适合求两个指定顶点的最短路径,且要求权值为正。

时间复杂度:O(2n)
2)Floyd-Warshall算法
局限性:时间效率低,对于多个节点之间的算法实现所需要的空间复杂度高。

时间复杂度:O(3n)
3)遗传算法
遗传算法适合数值求解那些带有多参数、多变量、多目标和在多区域但连通性较差的NP -hard 优化问题. 对多参数、多变量的NP-hard 优化问题, 通过解析求解或是计算求最优解的可能性很小, 主要依赖于数值求解. 遗传算法是一种数值求解的方法, 是一个有普适性的方法, 对目标函数的性质几乎没有要求, 甚至都不一定要显式地写出目标函数, 因此用遗传算法求解优化问题不足
为奇.
遗传算法的实现效率依赖于算子的操作和编码操作。

时间复杂度则依赖于代数和种群大小。

所以求解时对于算法的收敛性和收敛速度都要以依具体问题计算。

tic
clc,clear
load sj.txt%加载敌方100个目标数据
x=sj(:,1:2:8);x=x(:);%每隔一列取一个数
y=sj(:,2:2:8);y=y(:);
sj=[x y];
d1=[70,40];
sj0=[d1;sj;d1];
%距离矩阵d
sj=sj0*pi/180;
d=zeros(102);%产生102行1列的全零数据
for i=1:101
for j=i+1:102
temp=cos(sj(i,1)-sj(j,1))*cos(sj(i,2))*cos(sj(j,2))+sin(sj(i,2))*sin(sj(j,2));
d(i,j)=6370*acos(temp);%任取两点的实际距离
end
end
d=d+d';L=102;w=50;dai=100;%选取种群数为50,迭代100代
%通过改良圈算法选取优良父代A
for k=1:w
c=randperm(100);%产生随机排列的数组(100个0~1之间的数)
c1=[1,c+1,102];
flag=1;
while flag>0
flag=0;
for m=1:L-3
for n=m+2:L-1
if d(c1(m),c1(n))+d(c1(m+1),c1(n+1))<d(c1(m),c1(m+1))+d(c1(n),c1(n+1)) flag=1;
c1(m+1:n)=c1(n:-1:m+1);%交换基因
end
end
end
end
J(k,c1)=1:102;
end
J=J/102;%遗传概率
J(:,1)=0;J(:,102)=1;%染色体1列为0,102列为1 rand('state',sum(clock));
%遗传算法实现过程
A=J;
for k=1:dai %产生0~1间随机数列进行编码
B=A;
c=randperm(w);
%交配产生子代B
for i=1:2:w
F=2+floor(100*rand(1));%向负无穷舍入取整temp=B(c(i),F:102);
B(c(i),F:102)=B(c(i+1),F:102);
B(c(i+1),F:102)=temp;
end
%变异产生子代C
by=find(rand(1,w)<0.1);%找到随机数小于0.1的个体
if length(by)==0
by=floor(w*rand(1))+1;
end
C=A(by,:);%取by行
L3=length(by);
for j=1:L3
bw=2+floor(100*rand(1,3));
bw=sort(bw);
C(j,:)=C(j,[1:bw(1)-1,bw(2)+1:bw(3),bw(1):bw(2),bw(3)+1:102]); end
G=[A;B;C];
TL=size(G,1);
%在父代和子代中选择优良品种作为新的父代
[dd,IX]=sort(G,2);temp(1:TL)=0;
for j=1:TL
for i=1:101
temp(j)=temp(j)+d(IX(j,i),IX(j,i+1));%适应度距离函数
end
end
[DZ,IZ]=sort(temp);
A=G(IZ(1:w),:);
end
path=IX(IZ(1),:)
long=DZ(1)
toc
xx=sj0(path,1);yy=sj0(path,2); plot(xx,yy,'-o')。

相关文档
最新文档