路径规划中的典型算法,路径规划软件
【路径规划-TSP问题】基于遗传算法求解旅行商问题附矩阵实验室代码_MATLAB仿真博客的技术博客_博客
一内容介绍首先分析了用矩阵实验室语言设计遗传算法程序的优越性,接着以遗传算法求解一茶匙的量问题为例,深入讨论了各个遗传算子的程序实现,并通过分析实验数据,得到各个遗传算子在搜索寻优过程中所起的作用,最后指出了用矩阵实验室语言编码同用其它高级程序语言编程的差异所在。
2完整代码函数varargout=tsp_ga(varargin)
%TSP_GA找到了旅行推销员问题(TSP)的(接近)最优解
%通过设置遗传算法(GA)来搜索最短
%路径(恰好到达每个城市一次所需的最短距离)
%
% TSP_GA(城市数量)其中城市数量是表示数字的整数
有城市的百分比(默认值=50)
%
%例如TSP_GA(25)求解25个随机城市的一茶匙的量
%
% TSP_GA(城市)其中城市是代表X/Y的Nx2矩阵
用户指定城市的坐标百分比
%
%例如TSP _ GA(10 *兰特(30,2))求解30随机的一茶匙的量
(10 *兰特(30,2))矩阵中的城市百分比
%
% TSP_GA(.选项)或TSP_GA(选项),其中选项包括一个或
以下任意顺序的%以上:
" "-没有情节"关闭显示通用航空进度的绘图
" "-结果"打开显示最终结果的图
%以及以下参数对:
% POPSIZE ,VAL设置通用航空人口中的公民数量
% VAL应为正整数(可被四整除)
% -默认值=100
% MRATE ,VAL设置遗传算法的变异率
% VAL应该是介于0和一之间的浮点数,包括0和一
% -默认值=0.85
% NUMITER ,值设置通用航空的迭代(代)数
% VAL应为正整数
% -默认值=500
%
%示例:
% %使用60,000的人口规模求解20个随机城市的TSP,
% % 75%的突变率和250加仑迭代
% tsp_ga(20, popsize ,60, mrate ,0.75, numiter ,250);
%
%示例:
% %求解30个随机城市的TSP,不使用进度图
%[排序_城市,最佳_路线,距离]=tsp_ga(30,-无情节);
%
%示例:
% %使用1000次遗传算法迭代求解40个随机城市的TSP,并
% %绘制结果
% cities=10*rand(40,2);
%[已排序的城市]=tsp_ga(城市,数字,1000,结果);
%
%注意:TSP_GA有可能从
%前一组城市,方法是将排序后的城市输出矩阵用作
%输入,如下例所示:
% cities=10*rand(60,2);
% sorted_cities=tsp_ga(cities, numiter ,100);
%图;情节(已排序城市(:1),已排序城市(:2),。-)
% sorted _ cities 2=tsp _ ga(sorted _ cities);
%图;plot(sorted_cities2(:1),sorted_cities2(:2), .-)
%作者:约瑟夫柯克2007年年一月
%电子邮件:jdkirk630在gmail dot com
error(nargchk(0,9,nargin));
num _ cities=50 cities=10 * rand(num _ cities,2);
pop _ size=100n um _ ITER=500 mutate _ rate=0.85
show _ progress=1;show _ results=0;
%流程输入
city _ flag=0;option _ flag=0;
for var=varargin
如果选项_标志
if ~isfloat(var{1}),error([ option upper(option)的无效值)]);目标
开关选项
case popsize ,pop _ size=4 * ceil(real(var { 1 }(1))/4);option _ flag=0;
case mrate ,mutate _ rate=min(ABS(real(var { 1 }(1))),1);option _ flag=0;
case numiter ,num _ ITER=round(real(var { 1 }(1)));option _ flag=0;
否则,错误([无效选项上部(可选)])
目标
elseif ischar(var{1})
降低开关(var{1})
case -noplot ,show _ progress=0;
case -results ,show _ results=1;
否则,option=lower(var { 1 });option _ flag=1;
目标
elseif isfloat(var{1})
if cities_flag,错误( cities或城市数量可以指定,但不能同时指定);目标
if length(var{1})==1
num _ cities=round(real(var { 1 });
如果数量城市2,错误(数量城市必须是大于一的整数);目标
cities=10*rand(num_cities,2);city _ flag=1;
其他
cities=real(var { 1 });
[北卡罗来纳州城市数量]=大小(城市);city _ flag=1;
如果或(城市数2,nc ~=2)
错误("城市必须是一个Nx2浮点矩阵,N为1")
目标
目标
其他
错误("无效的输入参数。")
目标
目标
%构建距离矩阵
dist_matx=零(数字城市);
对于ii=2:数量_城市
对于jj=1:ii-1
dist_matx(ii,jj)=sqrt(sum((cities(ii,)-cities(jj,)).^2));
dist_matx(jj,ii)=dist_matx(ii,jj);
目标
目标
%绘制城市和距离矩阵图
如果显示_进度
图(1)
次要情节(2,2,1)
情节(城市(:1),城市(:2), b .)
如果数量_城市75
对于c=1:城市数量
文本(城市(c,1),城市(c,2),[ num2str(c)], Color , k , FontWeight , b )
目标
目标
标题([num2str(num_cities)"城市"])
次要情节(2,2,2)
imagesc(dist_matx)
标题("距离矩阵")
色彩映射表(灰色)
目标
%初始化群体
pop=zeros(pop_size,num _ cities);
pop(1,=(1:num _ cities);
对于k=2:流行大小
pop(k,)=rand perm(num _ cities);
目标
如果num_cities 25,display _ rate=1;否则display _ rate=10目标
健身=零(1,pop _ size);
best_fitness=zeros(1,num _ ITER);
对于iter=1:数量iter
对于p=1:弹出大小
d=dist_matx(pop(p,1),pop(p,num _ cities));
for city=2:num_cities
d=d dist_matx(pop(p,city-1),pop(p,city));
目标
适合度(p)=d;
目标
[best _ fitness(ITER)指数]=min(fitness);
best_route=pop(index,);
%绘图
如果和(显示进度,~mod(iter,显示速率))
图(1)
次要情节(2,2,3)
route=cities([best _ route best _ route(1)],);
情节(路线(:1),路线(:2), b.-)
标题([最佳GA路线(dist= num 2 str(Best _ fitness(ITER)))])
次要情节(2,2,4)
plot(best_fitness(1:iter), r , LineWidth ,2)
轴([1 max(2,iter) 0 max(best_fitness)*1.1])
目标
%遗传算法搜索
pop=iteratic _ algorithm(pop,fitness,mutate _ rate);
目标
如果显示_进度
图(1)
次要情节(2,2,3)
route=cities([best _ route best _ route(1)],);
情节(路线(:1),路线(:2), b.-)
标题([最佳GA路线(dist= num 2 str(Best _ fitness(ITER)))])
次要情节(2,2,4)
plot(best_fitness(1:iter), r , LineWidth ,2)
标题("最佳健身效果")
xlabel(“一代")
伊拉贝尔(“距离")
轴([1 max(2,iter) 0 max(best_fitness)*1.1])
目标
如果显示_结果
图(二)
imagesc(dist_matx)
标题("距离矩阵")
色彩映射表(灰色)
图(三)
plot(best_fitness(1:iter), r , LineWidth ,2)
标题("最佳健身效果")
xlabel(“一代")
伊拉贝尔(“距离")
轴([1 max(2,iter) 0 max(best_fitness)*1.1])
图(4)
route=cities([best _ route best _ route(1)],);
情节(路线(:1),路线(:2), b.-)
对于c=1:城市数量
文本(城市(c,1),城市(c,2),[ num2str(c)], Color , k , FontWeight , b )
目标
标题([最佳GA路线(dist= num 2 str(Best _ fitness(ITER)))])
目标
[未使用的indx]=最小值(最佳路线);
best _ ga _ route=[best _ route(indx:num _ cities)best _ route(1:indx-1)];
如果最佳遗传路线(2)最佳遗传路线(城市数量)
best _ ga _ route(2:num _ cities)=fliplr(best _ ga _ route(2:num _ cities));
目标
varargout { 1 }=cities(best _ ga _ route,);
varargout { 2 }=最佳路线
varargout { 3 }=best _ fitness(ITER);
% -
%遗传算法函数
% -
函数new _ pop=iteratic _ algorithm(流行,适应度,变异率)
[p,n]=size(pop);
%锦标赛选择-第一轮
new_pop=zeros(p,n);
ts _ R1=兰德彼尔姆(p);
winners_r1=zeros(p/2,n);
tmp_fitness=zeros(1,p/2);
对于i=2:2:p
如果适应度(ts_r1(i-1))适应度(ts_r1(i))
winners_r1(i/2,)=pop(ts_r1(i),);
tmp _ fitness(I/2)=fitness(ts _ R1(I));
其他
winners_r1(i/2,)=pop(ts_r1(i-1),);
tmp _ fitness(I/2)=fitness(ts _ R1(I-1));
目标
目标
%锦标赛选择-第二轮
ts _ R2=兰德彼尔姆(p/2);
赢家=零(p/4,n);
对于i=2:2:p/2
如果tmp _ fitness(ts _ R2(I-1))
winners(i/2,)=winners_r1(ts_r2(i),);
其他
winners(i/2,)=winners_r1(ts_r2(i-1),);
目标
目标
new_pop(1:p/4,)=赢家;
new_pop(p/2 1:3*p/4,)=赢家;
交叉百分比
交叉=兰德彼尔姆(p/2);
孩子=零(p/4,n);
对于i=2:2:p/2
parent1=winners_r1(交叉(i-1),);
parent2=winners_r1(交叉(一),);
儿童=父母2;
ndx=ceil(n*sort(rand(1,2)));
而ndx(1)==ndx(2)
ndx=ceil(n*sort(rand(1,2)));
目标
tmp=parent 1(ndx(1):ndx(2));
对于j=1:长度(tmp)
child(find(child==tmp(j)))=0;
目标
child=[child(1:ndx(1))tmp child(ndx(1)1:n)];
child=non zeros(child);
children(i/2),=child
目标
new_pop(p/4 1:p/2,)=儿童;
new_pop(3*p/4 1:p,)=儿童;
%突变
mutate=rand perm(p/2);
num _ mutate=round(mutate _ rate * p/2);
对于i=1:num_mutate
ndx=ceil(n*sort(rand(1,2)));
而ndx(1)==ndx(2)
ndx=ceil(n*sort(rand(1,2)));
目标
new_pop(p/2 mutate(i),ndx(1):ndx(2))=.
fliplr(new_pop(p/2 mutate(i),ndx(1):ndx(2)));
目标
3运行结果
四参考文献[1]温清芳。遗传算法求解一茶匙的量问题的矩阵实验室实现[J]的缩写.韶关学院学报, 2007, 28(6):5.
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。