1.算法描述
遗传算法的起源可追溯到20世纪60年代初期。1967年,美国密歇根大学J. Holland教授的学生 Bagley在他的博士论文中首次提出了遗传算法这一术语,并讨论了遗传算法在博弈中的应用,但早期研究缺乏带有指导性的理论和计算工具的开拓。1975年, J. Holland等提出了对遗传算法理论研究极为重要的模式理论,出版了专著《自然系统和人工系统的适配》,在书中系统阐述了遗传算法的基本理论和方法,推动了遗传算法的发展。20世纪80年代后,遗传算法进入兴盛发展时期,被广泛应用于自动控制、生产计划、图像处理、机器人等研究领域。
遗传算法的基本运算过程如下:
(1)初始化:设置进化代数计数器t=0,设置最大进化代数T,随机生成M个个体作为初始群体P(0)。
(2)个体评价:计算群体P(t)中各个个体的适应度。
(3)选择运算:将选择算子作用于群体。选择的目的是把优化的个体直接遗传到下一代或通过配对交叉产生新的个体再遗传到下一代。选择操作是建立在群体中个体的适应度评估基础上的。
(4)交叉运算:将交叉算子作用于群体。遗传算法中起核心作用的就是交叉算子。
(5)变异运算:将变异算子作用于群体。即是对群体中的个体串的某些基因座上的基因值作变动。群体P(t)经过选择、交叉、变异运算之后得到下一代群体P(t+1)。
(6)终止条件判断:若t=T,则以进化过程中所得到的具有最大适应度个体作为最优解输出,终止计算。
遗传操作包括以下三个基本遗传算子(genetic operator):选择(selection);交叉(crossover);变异(mutation)。
1.1选择
从群体中选择优胜的个体,淘汰劣质个体的操作叫选择。选择算子有时又称为再生算子。选择的目的是把优化的个体(或解)直接遗传到下一代或通过配对交叉产生新的个体再遗传到下一代。选择操作是建立在群体中个体的适应度评估基础上的,常用的选择算子有以下几种:适应度比例方法、随机遍历抽样法、局部选择法。
1.2交叉
在自然界生物进化过程中起核心作用的是生物遗传基因的重组(加上变异)。同样,遗传算法中起核心作用的是遗传操作的交叉算子。所谓交叉是指把两个父代个体的部分结构加以替换重组而生成新个体的操作。通过交叉,遗传算法的搜索能力得以飞跃提高。
1.3变异
变异算子的基本内容是对群体中的个体串的某些基因座上的基因值作变动。依据个体编码表示方法的不同,可以有以下的算法:
a)实值变异。
b)二进制变异。
GDOP((Geometric Dilution of Precision)几何精度因子,是衡量GNSS(Global Navigation Satellite System)全球导航卫星系统定位精度的指标。其分量包括:
PDOP( position dilution of precision ) 三维精度因子;
HDOP(horizontal dilution of precision) 水平精度因子;
VDOP(vertical dilution of precision)垂直几何精度因子;
TDOP(time dilution of precision)时间精度因子;
对于经常要使用RTK的测量人来说,掌握一些使用过程中经常用到的专业术语是很有必要的,比如GDOP、差分测量、静态定位等等,了解这些有助于更加熟练地使用RTK,从而高效地进行测量作业。GDOP(Geometric dilution of precision)几何精度因子:包括经度,纬度,高程和时间等因子,称为几何精度因子。
本算法的主要目的是通过优化布局策略,使得GDOP达到最小值。
2.仿真效果预览
matlab2022a仿真结果如下:
3.MATLAB核心程序
for tt=1:1%为了仿真速度快点,这里只显示某一个时刻的部署结果 %输出每一时刻的无人机位置 if mod(tt,1000) == 1%每1000s更新一次部署,这个1000可以自己修改 target_pos= [1e3, 10e3, 0]'; end N = 3;%机动站个数,自己可以调整,调整后重新运行即可。 MAXGEN = 100; NIND = 50; Nums = 3*N; % Chrom = crtbp(NIND,Nums*10); %sh Areas = []; %设置地图的最大范围 for i = 1:2*N Areas = [Areas,[-SCALE;SCALE]];%雷达最大部署范围距离 end for i = 1:N Areas = [Areas,[0;100]];%雷达最大部署范围距离 end FieldD = [rep([10],[1,Nums]);Areas;rep([0;0;0;0],[1,Nums])]; gen = 0; %计算对应的目标值 tmps = repmat([400],[1,Nums]); X = tmps;%初始值 [fobj,Vgdop] = func_obj(X,target_pos); E = fobj; Js = E*ones(NIND,1); Objv = (Js+eps); gen = 0; while gen < MAXGEN; gen rng(gen); Pe0 = 0.995; pe1 = 0.005; FitnV=ranking(Objv); Selch=select('sus',Chrom,FitnV); Selch=recombin('xovsp', Selch,Pe0); Selch=mut( Selch,pe1); phen1=bs2rv(Selch,FieldD); for a=1:1:NIND X1 = phen1(a,:); %计算对应的目标值 [fobj,Vgdop]= func_obj(X1,target_pos); JJ(a,1) = fobj; XYp{a} = X1; Vp{a} = Vgdop; end Objvsel=(JJ); [Chrom,Objv]=reins(Chrom,Selch,1,1,Objv,Objvsel); gen=gen+1; %保存参数收敛过程和误差收敛过程以及函数值拟合结论 Error(gen) = mean(JJ); end figure; plot(Error,'linewidth',2); grid on xlabel('迭代次数'); ylabel('遗传算法优化过程'); %根据优化结果输出部署结果 figure; [V,I] = min(JJ); XY = XYp{I}; Gdop = Vp{a}; X = XY(1:length(XY)/3); Y = XY(1+length(XY)/3:2*length(XY)/3); Z = XY(1+2*length(XY)/3:end); JZ_pos= [X',Y',Z']; x =-2*SCALE:STEPS:2*SCALE; y =-2*SCALE:STEPS:2*SCALE; xx = [0:0.5:20]; [c,handle]=contour(x/1e3,y/1e3,Gdop,xx); clabel(c,handle); hold on; plot(JZ_pos(:,1)/1e3,JZ_pos(:,2)/1e3,'r.'); xlabel('x(km)') ylabel('y(km)') title('GDOP图') end 02_063m
标签:GDOP,交叉,个体,XY,matlab,GA,算子,遗传算法,gen From: https://www.cnblogs.com/51matlab/p/17105574.html